kadircet updated this revision to Diff 187341. kadircet marked 2 inline comments as done. kadircet added a comment.
- Fix handling of TemplateTemplateTypeParams Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D58293/new/ https://reviews.llvm.org/D58293 Files: include/clang/Index/IndexingAction.h lib/Index/IndexSymbol.cpp lib/Index/IndexTypeSourceInfo.cpp lib/Index/IndexingContext.cpp lib/Index/IndexingContext.h unittests/Index/IndexTests.cpp
Index: unittests/Index/IndexTests.cpp =================================================================== --- unittests/Index/IndexTests.cpp +++ unittests/Index/IndexTests.cpp @@ -93,6 +93,7 @@ IndexingOptions Opts; }; +using testing::AllOf; using testing::Contains; using testing::Not; using testing::UnorderedElementsAre; @@ -134,6 +135,28 @@ EXPECT_THAT(Index->Symbols, Not(Contains(QName("bar")))); } +TEST(IndexTest, IndexTypeParmDecls) { + std::string Code = R"cpp( + template <typename T, int I, template<typename> class C> struct Foo { + T t = I; + C<int> x; + }; + )cpp"; + auto Index = std::make_shared<Indexer>(); + IndexingOptions Opts; + tooling::runToolOnCode(new IndexAction(Index, Opts), Code); + EXPECT_THAT(Index->Symbols, AllOf(Not(Contains(QName("Foo::T"))), + Not(Contains(QName("Foo::I"))), + Not(Contains(QName("Foo::C"))))); + + Opts.IndexTemplateParmDecls = true; + Index->Symbols.clear(); + tooling::runToolOnCode(new IndexAction(Index, Opts), Code); + EXPECT_THAT(Index->Symbols, + AllOf(Contains(QName("Foo::T")), Contains(QName("Foo::I")), + Contains(QName("Foo::C")))); +} + } // namespace } // namespace index } // namespace clang Index: lib/Index/IndexingContext.h =================================================================== --- lib/Index/IndexingContext.h +++ lib/Index/IndexingContext.h @@ -63,6 +63,8 @@ bool shouldIndexParametersInDeclarations() const; + bool shouldIndexTemplateParmDecls() const; + static bool isTemplateImplicitInstantiation(const Decl *D); bool handleDecl(const Decl *D, SymbolRoleSet Roles = SymbolRoleSet(), Index: lib/Index/IndexingContext.cpp =================================================================== --- lib/Index/IndexingContext.cpp +++ lib/Index/IndexingContext.cpp @@ -44,6 +44,10 @@ return IndexOpts.IndexParametersInDeclarations; } +bool IndexingContext::shouldIndexTemplateParmDecls() const { + return IndexOpts.IndexTemplateParmDecls; +} + bool IndexingContext::handleDecl(const Decl *D, SymbolRoleSet Roles, ArrayRef<SymbolRelation> Relations) { @@ -76,8 +80,11 @@ if (!shouldIndexFunctionLocalSymbols() && isFunctionLocalSymbol(D)) return true; - if (isa<NonTypeTemplateParmDecl>(D) || isa<TemplateTypeParmDecl>(D)) + if (!shouldIndexTemplateParmDecls() && + (isa<NonTypeTemplateParmDecl>(D) || isa<TemplateTypeParmDecl>(D) || + isa<TemplateTemplateParmDecl>(D))) { return true; + } return handleDeclOccurrence(D, Loc, /*IsRef=*/true, Parent, Roles, Relations, RefE, RefD, DC); Index: lib/Index/IndexTypeSourceInfo.cpp =================================================================== --- lib/Index/IndexTypeSourceInfo.cpp +++ lib/Index/IndexTypeSourceInfo.cpp @@ -45,6 +45,13 @@ return false; \ } while (0) + bool VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TTPL) { + SourceLocation Loc = TTPL.getNameLoc(); + TemplateTypeParmDecl *TTPD = TTPL.getDecl(); + return IndexCtx.handleReference(TTPD, Loc, Parent, ParentDC, + SymbolRoleSet()); + } + bool VisitTypedefTypeLoc(TypedefTypeLoc TL) { SourceLocation Loc = TL.getNameLoc(); TypedefNameDecl *ND = TL.getTypedefNameDecl(); Index: lib/Index/IndexSymbol.cpp =================================================================== --- lib/Index/IndexSymbol.cpp +++ lib/Index/IndexSymbol.cpp @@ -55,9 +55,6 @@ if (isa<ParmVarDecl>(D)) return true; - if (isa<TemplateTemplateParmDecl>(D)) - return true; - if (isa<ObjCTypeParamDecl>(D)) return true; Index: include/clang/Index/IndexingAction.h =================================================================== --- include/clang/Index/IndexingAction.h +++ include/clang/Index/IndexingAction.h @@ -46,6 +46,7 @@ bool IndexMacrosInPreprocessor = false; // Has no effect if IndexFunctionLocals are false. bool IndexParametersInDeclarations = false; + bool IndexTemplateParmDecls = false; }; /// Creates a frontend action that indexes all symbols (macros and AST decls).
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits