From 13553b75f535a142a1c30ef711202f48112f55f1 Mon Sep 17 00:00:00 2001 From: Kadir Cetinkaya Date: Mon, 11 Feb 2019 13:02:21 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@353695 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Index/IndexingAction.h | 2 ++ lib/Index/IndexDecl.cpp | 8 ++++---- lib/Index/IndexingContext.cpp | 4 ++++ lib/Index/IndexingContext.h | 2 ++ unittests/Index/IndexTests.cpp | 15 +++++++++++++++ 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/include/clang/Index/IndexingAction.h b/include/clang/Index/IndexingAction.h index 36b3c75a65..8b3d5415c0 100644 --- a/include/clang/Index/IndexingAction.h +++ b/include/clang/Index/IndexingAction.h @@ -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). diff --git a/lib/Index/IndexDecl.cpp b/lib/Index/IndexDecl.cpp index aa73d937df..eb0b3d4a70 100644 --- a/lib/Index/IndexDecl.cpp +++ b/lib/Index/IndexDecl.cpp @@ -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(D)) { auto *DC = Parm->getDeclContext(); if (auto *FD = dyn_cast(DC)) { - if (FD->isThisDeclarationADefinition()) + if (IndexCtx.shouldIndexParametersInDeclarations() || + FD->isThisDeclarationADefinition()) IndexCtx.handleDecl(Parm); } else if (auto *MD = dyn_cast(DC)) { if (MD->isThisDeclarationADefinition()) @@ -102,7 +101,8 @@ public: IndexCtx.handleDecl(Parm); } } else if (const FunctionDecl *FD = dyn_cast(D)) { - if (FD->isThisDeclarationADefinition()) { + if (IndexCtx.shouldIndexParametersInDeclarations() || + FD->isThisDeclarationADefinition()) { for (auto PI : FD->parameters()) { IndexCtx.handleDecl(PI); } diff --git a/lib/Index/IndexingContext.cpp b/lib/Index/IndexingContext.cpp index 0bbd739d74..3d2d7d4ff0 100644 --- a/lib/Index/IndexingContext.cpp +++ b/lib/Index/IndexingContext.cpp @@ -40,6 +40,10 @@ bool IndexingContext::shouldIndexImplicitInstantiation() const { return IndexOpts.IndexImplicitInstantiation; } +bool IndexingContext::shouldIndexParametersInDeclarations() const { + return IndexOpts.IndexParametersInDeclarations; +} + bool IndexingContext::handleDecl(const Decl *D, SymbolRoleSet Roles, ArrayRef Relations) { diff --git a/lib/Index/IndexingContext.h b/lib/Index/IndexingContext.h index 1de38513c6..7765fa73f8 100644 --- a/lib/Index/IndexingContext.h +++ b/lib/Index/IndexingContext.h @@ -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(), diff --git a/unittests/Index/IndexTests.cpp b/unittests/Index/IndexTests.cpp index 147f7a714a..2b574a53fc 100644 --- a/unittests/Index/IndexTests.cpp +++ b/unittests/Index/IndexTests.cpp @@ -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(); + 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 -- 2.40.0