[clangd] Fix irrelevant declaratations in goto definition (on macros).

Summary:
DeclrationAndMacrosFinder will find some declarations (not macro!) that are
referened inside the macro somehow, isSearchedLocation() is not sufficient, we
don't know whether the searched source location is macro or not.

Reviewers: ilya-biryukov

Subscribers: klimek, jkorous-apple, ioeric, cfe-commits

Differential Revision: https://reviews.llvm.org/D44293

llvm-svn: 327387
This commit is contained in:
Haojian Wu 2018-03-13 12:30:59 +00:00
parent 797f32e084
commit 2658cb65bd
2 changed files with 19 additions and 0 deletions

View File

@ -127,6 +127,16 @@ private:
MacroInfo *MacroInf = MacroDef.getMacroInfo();
if (MacroInf) {
MacroInfos.push_back(MacroDecl{IdentifierInfo->getName(), MacroInf});
// Clear all collected delcarations if this is a macro search.
//
// In theory, there should be no declarataions being collected when we
// search a source location that refers to a macro.
// The occurrence location returned by `handleDeclOccurence` is
// limited (FID, Offset are from expansion location), we will collect
// all declarations inside the macro.
//
// FIXME: Avoid adding decls from inside macros in handlDeclOccurence.
Decls.clear();
}
}
}

View File

@ -213,6 +213,15 @@ TEST(GoToDefinition, All) {
#undef macro
)cpp",
R"cpp(// Macro
class TTT { public: int a; };
#define [[FF(S) if (int b = S.a) {}]]
void f() {
TTT t;
F^F(t);
}
)cpp",
R"cpp(// Forward class declaration
class Foo;
class [[Foo]] {};