From b221c9d09dd12bde75f00f3541c8f344925d4d59 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Fri, 15 Nov 2019 16:24:19 +0100 Subject: [PATCH] [clangd] Replace getLangOpts().isHeaderFile usage with isHeaderFile helper. Summary: The helper is more correct to detect header file, this would fix our issues caused by false positive before. Reviewers: sammccall Reviewed By: sammccall Subscribers: merge_guards_bot, ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D70299 --- clang-tools-extra/clangd/HeaderSourceSwitch.cpp | 3 ++- clang-tools-extra/clangd/index/SymbolCollector.cpp | 3 ++- clang-tools-extra/clangd/refactor/Rename.cpp | 2 +- clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp | 5 +---- clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp | 11 +++++++++++ 5 files changed, 17 insertions(+), 7 deletions(-) diff --git a/clang-tools-extra/clangd/HeaderSourceSwitch.cpp b/clang-tools-extra/clangd/HeaderSourceSwitch.cpp index 06ad71d..698f246 100644 --- 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 @@ llvm::Optional getCorrespondingHeaderOrSource(const Path &OriginalFile, // // 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 index 06fe854..00adbd8 100644 --- a/clang-tools-extra/clangd/index/SymbolCollector.cpp +++ b/clang-tools-extra/clangd/index/SymbolCollector.cpp @@ -304,7 +304,8 @@ bool SymbolCollector::handleDeclOccurence( // 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 index a594f7a..3969f3e 100644 --- a/clang-tools-extra/clangd/refactor/Rename.cpp +++ b/clang-tools-extra/clangd/refactor/Rename.cpp @@ -76,7 +76,7 @@ llvm::Optional renamableWithinFile(const Decl &RenameDecl, } 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 index beaf8df..8d46336 100644 --- a/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp +++ b/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp @@ -178,14 +178,11 @@ TEST_F(WorkspaceSymbolsTest, Namespaces) { } 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 index 798c5bb..d737862 100644 --- a/clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp +++ b/clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp @@ -664,6 +664,17 @@ TEST_F(SymbolCollectorTest, HeaderAsMainFile) { 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, -- 2.7.4