forked from OSchip/llvm-project
[clang][Index] Visit the default parameter arguements in libindex.
Summary: We are missing the default parmeter arguments when IndexFunctionLocals is true. Fixes https://github.com/clangd/clangd/issues/285. Reviewers: kadircet Subscribers: kristof.beyls, ilya-biryukov, jkorous, arphaman, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D74610
This commit is contained in:
parent
dd4d093762
commit
af8b0cd58d
clang-tools-extra/clangd/unittests
clang
|
@ -943,6 +943,11 @@ TEST(FindReferences, WithinAST) {
|
|||
int x = [[MACRO]]([[MACRO]](1));
|
||||
}
|
||||
)cpp",
|
||||
|
||||
R"cpp(
|
||||
int [[v^ar]] = 0;
|
||||
void foo(int s = [[var]]);
|
||||
)cpp",
|
||||
};
|
||||
for (const char *Test : Tests) {
|
||||
Annotations T(Test);
|
||||
|
|
|
@ -90,6 +90,12 @@ public:
|
|||
Parent->getLexicalDeclContext(),
|
||||
/*isBase=*/false, isIBType);
|
||||
IndexCtx.indexNestedNameSpecifierLoc(D->getQualifierLoc(), Parent);
|
||||
auto IndexDefaultParmeterArgument = [&](const ParmVarDecl *Parm,
|
||||
const NamedDecl *Parent) {
|
||||
if (Parm->hasDefaultArg() && !Parm->hasUninstantiatedDefaultArg() &&
|
||||
!Parm->hasUnparsedDefaultArg())
|
||||
IndexCtx.indexBody(Parm->getDefaultArg(), Parent);
|
||||
};
|
||||
if (IndexCtx.shouldIndexFunctionLocalSymbols()) {
|
||||
if (const ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D)) {
|
||||
auto *DC = Parm->getDeclContext();
|
||||
|
@ -106,7 +112,8 @@ public:
|
|||
} else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
|
||||
if (IndexCtx.shouldIndexParametersInDeclarations() ||
|
||||
FD->isThisDeclarationADefinition()) {
|
||||
for (auto PI : FD->parameters()) {
|
||||
for (const auto *PI : FD->parameters()) {
|
||||
IndexDefaultParmeterArgument(PI, D);
|
||||
IndexCtx.handleDecl(PI);
|
||||
}
|
||||
}
|
||||
|
@ -116,9 +123,7 @@ public:
|
|||
if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
|
||||
if (FD->isThisDeclarationADefinition()) {
|
||||
for (const auto *PV : FD->parameters()) {
|
||||
if (PV->hasDefaultArg() && !PV->hasUninstantiatedDefaultArg() &&
|
||||
!PV->hasUnparsedDefaultArg())
|
||||
IndexCtx.indexBody(PV->getDefaultArg(), D);
|
||||
IndexDefaultParmeterArgument(PV, D);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -319,6 +319,21 @@ TEST(IndexTest, InjecatedNameClass) {
|
|||
WrittenAt(Position(4, 14)))));
|
||||
}
|
||||
|
||||
TEST(IndexTest, VisitDefaultArgs) {
|
||||
std::string Code = R"cpp(
|
||||
int var = 0;
|
||||
void f(int s = var) {}
|
||||
)cpp";
|
||||
auto Index = std::make_shared<Indexer>();
|
||||
IndexingOptions Opts;
|
||||
Opts.IndexFunctionLocals = true;
|
||||
Opts.IndexParametersInDeclarations = true;
|
||||
tooling::runToolOnCode(std::make_unique<IndexAction>(Index, Opts), Code);
|
||||
EXPECT_THAT(Index->Symbols,
|
||||
Contains(AllOf(QName("var"), HasRole(SymbolRole::Reference),
|
||||
WrittenAt(Position(3, 20)))));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace index
|
||||
} // namespace clang
|
||||
|
|
Loading…
Reference in New Issue