diff --git a/clang-tools-extra/clangd/XRefs.cpp b/clang-tools-extra/clangd/XRefs.cpp --- a/clang-tools-extra/clangd/XRefs.cpp +++ b/clang-tools-extra/clangd/XRefs.cpp @@ -583,13 +583,11 @@ SourceLocation Loc, index::IndexDataConsumer::ASTNodeInfo ASTNode) override { assert(D->isCanonicalDecl() && "expect D to be a canonical declaration"); - if (!CanonicalTargets.count(D)) + const SourceManager &SM = AST.getSourceManager(); + if (!CanonicalTargets.count(D) || !isInsideMainFile(Loc, SM)) return true; const auto &TB = AST.getTokens(); - const SourceManager &SM = AST.getSourceManager(); Loc = SM.getFileLoc(Loc); - // We are only traversing decls *inside* the main file, so this should hold. - assert(isInsideMainFile(Loc, SM)); if (const auto *Tok = TB.spelledTokenAt(Loc)) References.push_back({*Tok, Roles}); return true; diff --git a/clang-tools-extra/clangd/unittests/XRefsTests.cpp b/clang-tools-extra/clangd/unittests/XRefsTests.cpp --- a/clang-tools-extra/clangd/unittests/XRefsTests.cpp +++ b/clang-tools-extra/clangd/unittests/XRefsTests.cpp @@ -1121,6 +1121,30 @@ } } +TEST(FindReferences, MainFileReferencesOnly) { + llvm::StringRef Test = + R"cpp( + void test() { + int [[fo^o]] = 1; + // refs not from main file should not be included. + #include "foo.inc" + })cpp"; + + Annotations Code(Test); + auto TU = TestTU::withCode(Code.code()); + TU.AdditionalFiles["foo.inc"] = R"cpp( + foo = 3; + )cpp"; + auto AST = TU.build(); + + std::vector> ExpectedLocations; + for (const auto &R : Code.ranges()) + ExpectedLocations.push_back(RangeIs(R)); + EXPECT_THAT(findReferences(AST, Code.point(), 0).References, + ElementsAreArray(ExpectedLocations)) + << Test; +} + TEST(FindReferences, ExplicitSymbols) { const char *Tests[] = { R"cpp(