Author: kadircet Date: Mon Feb 11 05:02:21 2019 New Revision: 353695 URL: http://llvm.org/viewvc/llvm-project?rev=353695&view=rev Log: [clang][Index] Add a knob to index function parameters in declarations
Summary: Parameters in declarations are useful for clangd, so that we can provide symbol information for them as well. It also helps clangd to be consistent whether a function's definition is accessible or not. Reviewers: hokein, akyrtzi Subscribers: ilya-biryukov, ioeric, arphaman, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D57949 Modified: cfe/trunk/include/clang/Index/IndexingAction.h cfe/trunk/lib/Index/IndexDecl.cpp cfe/trunk/lib/Index/IndexingContext.cpp cfe/trunk/lib/Index/IndexingContext.h cfe/trunk/unittests/Index/IndexTests.cpp Modified: cfe/trunk/include/clang/Index/IndexingAction.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Index/IndexingAction.h?rev=353695&r1=353694&r2=353695&view=diff ============================================================================== --- cfe/trunk/include/clang/Index/IndexingAction.h (original) +++ cfe/trunk/include/clang/Index/IndexingAction.h Mon Feb 11 05:02:21 2019 @@ -44,6 +44,8 @@ struct IndexingOptions { // callback is not available (e.g. after parsing has finished). Note that // macro references are not available in Proprocessor. bool IndexMacrosInPreprocessor = false; + // Has no effect if IndexFunctionLocals are false. + bool IndexParametersInDeclarations = false; }; /// Creates a frontend action that indexes all symbols (macros and AST decls). Modified: cfe/trunk/lib/Index/IndexDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/IndexDecl.cpp?rev=353695&r1=353694&r2=353695&view=diff ============================================================================== --- cfe/trunk/lib/Index/IndexDecl.cpp (original) +++ cfe/trunk/lib/Index/IndexDecl.cpp Mon Feb 11 05:02:21 2019 @@ -88,12 +88,11 @@ public: /*isBase=*/false, isIBType); IndexCtx.indexNestedNameSpecifierLoc(D->getQualifierLoc(), Parent); if (IndexCtx.shouldIndexFunctionLocalSymbols()) { - // Only index parameters in definitions, parameters in declarations are - // not useful. if (const ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D)) { auto *DC = Parm->getDeclContext(); if (auto *FD = dyn_cast<FunctionDecl>(DC)) { - if (FD->isThisDeclarationADefinition()) + if (IndexCtx.shouldIndexParametersInDeclarations() || + FD->isThisDeclarationADefinition()) IndexCtx.handleDecl(Parm); } else if (auto *MD = dyn_cast<ObjCMethodDecl>(DC)) { if (MD->isThisDeclarationADefinition()) @@ -102,7 +101,8 @@ public: IndexCtx.handleDecl(Parm); } } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { - if (FD->isThisDeclarationADefinition()) { + if (IndexCtx.shouldIndexParametersInDeclarations() || + FD->isThisDeclarationADefinition()) { for (auto PI : FD->parameters()) { IndexCtx.handleDecl(PI); } Modified: cfe/trunk/lib/Index/IndexingContext.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/IndexingContext.cpp?rev=353695&r1=353694&r2=353695&view=diff ============================================================================== --- cfe/trunk/lib/Index/IndexingContext.cpp (original) +++ cfe/trunk/lib/Index/IndexingContext.cpp Mon Feb 11 05:02:21 2019 @@ -40,6 +40,10 @@ bool IndexingContext::shouldIndexImplici return IndexOpts.IndexImplicitInstantiation; } +bool IndexingContext::shouldIndexParametersInDeclarations() const { + return IndexOpts.IndexParametersInDeclarations; +} + bool IndexingContext::handleDecl(const Decl *D, SymbolRoleSet Roles, ArrayRef<SymbolRelation> Relations) { Modified: cfe/trunk/lib/Index/IndexingContext.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/IndexingContext.h?rev=353695&r1=353694&r2=353695&view=diff ============================================================================== --- cfe/trunk/lib/Index/IndexingContext.h (original) +++ cfe/trunk/lib/Index/IndexingContext.h Mon Feb 11 05:02:21 2019 @@ -61,6 +61,8 @@ public: bool shouldIndexImplicitInstantiation() const; + bool shouldIndexParametersInDeclarations() const; + static bool isTemplateImplicitInstantiation(const Decl *D); bool handleDecl(const Decl *D, SymbolRoleSet Roles = SymbolRoleSet(), Modified: cfe/trunk/unittests/Index/IndexTests.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Index/IndexTests.cpp?rev=353695&r1=353694&r2=353695&view=diff ============================================================================== --- cfe/trunk/unittests/Index/IndexTests.cpp (original) +++ cfe/trunk/unittests/Index/IndexTests.cpp Mon Feb 11 05:02:21 2019 @@ -119,6 +119,21 @@ TEST(IndexTest, IndexPreprocessorMacros) EXPECT_THAT(Index->Symbols, UnorderedElementsAre()); } +TEST(IndexTest, IndexParametersInDecls) { + std::string Code = "void foo(int bar);"; + auto Index = std::make_shared<Indexer>(); + IndexingOptions Opts; + Opts.IndexFunctionLocals = true; + Opts.IndexParametersInDeclarations = true; + tooling::runToolOnCode(new IndexAction(Index, Opts), Code); + EXPECT_THAT(Index->Symbols, Contains(QName("bar"))); + + Opts.IndexParametersInDeclarations = false; + Index->Symbols.clear(); + tooling::runToolOnCode(new IndexAction(Index, Opts), Code); + EXPECT_THAT(Index->Symbols, Not(Contains(QName("bar")))); +} + } // namespace } // namespace index } // namespace clang _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits