[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
This commit is contained in:
Haojian Wu 2019-11-15 16:24:19 +01:00
parent 509efe5d8e
commit b221c9d09d
5 changed files with 17 additions and 7 deletions

View File

@ -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<Path> 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);

View File

@ -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))

View File

@ -76,7 +76,7 @@ llvm::Optional<ReasonToReject> 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)

View File

@ -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")));
}

View File

@ -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,