Type Alias Template fix

Authored by craigt on Sep 14 2017, 12:50 PM.

Description

Type Alias Template fix

Summary:
Since Clang 3.8, libclang began exposing an CXCursor_TypeAliasTemplateDecl cursor as a result of work done by a KDevelop developer. Ironically, this feature was never actually integrated into KDevelop's clang support, and because of how cursors are dispatched in clang's DUChain builder, the default action is to recurse into any cursor enumeration not explicitly listed. This, in turn, recurses into CXCursor_TypeAliasTemplateDecl, and while that does eventually pick up a child CXCursor_TypeAliasDecl cursor, ensuring that the declaration is added to the DUChain, the foremost descendants of CXCursor_TypeAliasTemplateDecl tend to be template parameters, effectively leaking these parameters into the surrounding context.

Moreover, since the addition of CXCursorTypeAliasTemplateDecl, references from CXCursor_TemplateRef point directly to these cursors which, unfortunately, have a spelling range which covers the using keyword that introduces the name which will refer to this alias, but not the name itself. Additionally, unlike typedef cursors or CXCursor_TypeAliasDecl, CXCursor_TypeAliasTemplateDecl yields no useful information about the type it is aliasing; interestingly, CXCursor_TypeAliasDecl provides this information without fault, even if it refers to templates with template parameters. Ultimately, this means that the actual CXCursor_TypeAliasTemplateDecl cursor, for the moment, is good for little more than signalling the beginning of a new context to capture template parameters and possibly new types, and the actual, declarative unit is still a CXCursor_TypeAliasDecl cursor. Sadly, this means the procedure for building uses from cursors needs to be tweaked so lookups will make the correct association (they presently do not). Ultimately, the real fix should be in investigating the upstream implementation of CXCursor_TypeAliasTemplateDecl to see if it can be made to function more like a traditional declaration cursor.

BUG: 384580
FIXED-IN: 5.2

Test Plan: Modified extant testTypeAliasTemplate test in test_duchain-clang to verify this patch works as expected, namely, that it doesn't leak template parameters into the surrounding context, and that uses of the type alias template are correctly tracked in the DUChain. If you simply apply the changes to test_duchain.cpp on their own, the breakage of the current code model becomes apparent.

Reviewers: KDevelop, mwolff, kfunk

Reviewed By: KDevelop, mwolff

Subscribers: apol, kdevelop-devel

Tags: KDevelop

Differential Revision: https://phabricator.kde.org/D7799

Details

Committed
apolSep 14 2017, 12:51 PM
Reviewer
KDevelop
Differential Revision
D7799: Type Alias Template fix
Parents
R32:0c05bd55965f: Make it possible for IBuildSystem to provide extra arguments to the parser
Branches
Unknown
Tags
Unknown