diff --git a/clang-tools-extra/clangd/HeaderSourceSwitch.cpp b/clang-tools-extra/clangd/HeaderSourceSwitch.cpp --- a/clang-tools-extra/clangd/HeaderSourceSwitch.cpp +++ b/clang-tools-extra/clangd/HeaderSourceSwitch.cpp @@ -9,6 +9,7 @@ #include "HeaderSourceSwitch.h" #include "AST.h" #include "Logger.h" +#include "SourceCode.h" #include "index/SymbolCollector.h" #include "clang/AST/Decl.h" @@ -96,7 +97,7 @@ // // For each symbol in the original file, we get its target location (decl or // def) from the index, then award that target file. - bool IsHeader = AST.getASTContext().getLangOpts().IsHeaderFile; + bool IsHeader = isHeaderFile(OriginalFile, AST.getASTContext().getLangOpts()); Index->lookup(Request, [&](const Symbol &Sym) { if (IsHeader) AwardTarget(Sym.Definition.FileURI); diff --git a/clang-tools-extra/clangd/index/SymbolCollector.cpp b/clang-tools-extra/clangd/index/SymbolCollector.cpp --- a/clang-tools-extra/clangd/index/SymbolCollector.cpp +++ b/clang-tools-extra/clangd/index/SymbolCollector.cpp @@ -304,7 +304,8 @@ // it's main-file only. bool IsMainFileOnly = SM.isWrittenInMainFile(SM.getExpansionLoc(ND->getBeginLoc())) && - !ASTCtx->getLangOpts().IsHeaderFile; + !isHeaderFile(SM.getFileEntryForID(SM.getMainFileID())->getName(), + ASTCtx->getLangOpts()); // In C, printf is a redecl of an implicit builtin! So check OrigD instead. if (ASTNode.OrigD->isImplicit() || !shouldCollectSymbol(*ND, *ASTCtx, Opts, IsMainFileOnly)) diff --git a/clang-tools-extra/clangd/refactor/Rename.cpp b/clang-tools-extra/clangd/refactor/Rename.cpp --- a/clang-tools-extra/clangd/refactor/Rename.cpp +++ b/clang-tools-extra/clangd/refactor/Rename.cpp @@ -76,7 +76,7 @@ } auto &ASTCtx = RenameDecl.getASTContext(); const auto &SM = ASTCtx.getSourceManager(); - bool MainFileIsHeader = ASTCtx.getLangOpts().IsHeaderFile; + bool MainFileIsHeader = isHeaderFile(MainFile, ASTCtx.getLangOpts()); bool DeclaredInMainFile = isInsideMainFile(RenameDecl.getBeginLoc(), SM); if (!DeclaredInMainFile) diff --git a/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp b/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp --- a/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp +++ b/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp @@ -178,14 +178,11 @@ } TEST_F(WorkspaceSymbolsTest, AnonymousNamespace) { - addFile("foo.h", R"cpp( + addFile("foo.cpp", R"cpp( namespace { void test() {} } )cpp"); - addFile("foo.cpp", R"cpp( - #include "foo.h" - )cpp"); EXPECT_THAT(getSymbols("test"), ElementsAre(QName("test"))); } diff --git a/clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp b/clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp --- a/clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp +++ b/clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp @@ -664,6 +664,17 @@ runSymbolCollector("", Header.code(), /*ExtraArgs=*/{"-xobjective-c++-header"}); EXPECT_THAT(Symbols, UnorderedElementsAre(QName("Foo"), QName("Func"))); + EXPECT_THAT(Refs, + UnorderedElementsAre(Pair(findSymbol(Symbols, "Foo").ID, + HaveRanges(Header.ranges("Foo"))), + Pair(findSymbol(Symbols, "Func").ID, + HaveRanges(Header.ranges("Func"))))); + + // Run the .hh file as main file (without "-x c++-header"), we should collect + // the refs as well. + TestFileName = testPath("foo.hh"); + runSymbolCollector("", Header.code()); + EXPECT_THAT(Symbols, UnorderedElementsAre(QName("Foo"), QName("Func"))); EXPECT_THAT(Refs, UnorderedElementsAre(Pair(findSymbol(Symbols, "Foo").ID, HaveRanges(Header.ranges("Foo"))), Pair(findSymbol(Symbols, "Func").ID,