hokein created this revision. hokein added a reviewer: sammccall. Herald added subscribers: usaxena95, kadircet, arphaman, jkorous, MaskRay, ilya-biryukov. Herald added a project: clang.
we have a few places using `ASTCtx.getLangOpts().IsHeaderFile` to determine a header file, but it relies on "-x c-header" compiler flag, if the compilation command doesn't have this flag, we will get a false positive. We are encountering this issue in bazel build system. To solve this problem, we infer the file from file name, actual changes will come in follow-ups. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D70235 Files: clang-tools-extra/clangd/SourceCode.cpp clang-tools-extra/clangd/SourceCode.h clang-tools-extra/clangd/index/Background.cpp clang-tools-extra/clangd/unittests/SourceCodeTests.cpp Index: clang-tools-extra/clangd/unittests/SourceCodeTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/SourceCodeTests.cpp +++ clang-tools-extra/clangd/unittests/SourceCodeTests.cpp @@ -701,6 +701,20 @@ collectIdentifierRanges("Foo", Code.code(), LangOpts)); } +TEST(SourceCodeTests, isHeaderFile) { + EXPECT_TRUE(isHeaderFile("foo.h")); + EXPECT_TRUE(isHeaderFile("foo.hh")); + EXPECT_TRUE(isHeaderFile("foo.hpp")); + + EXPECT_FALSE(isHeaderFile("foo.cpp")); + EXPECT_FALSE(isHeaderFile("foo.c++")); + EXPECT_FALSE(isHeaderFile("foo.cxx")); + EXPECT_FALSE(isHeaderFile("foo.cc")); + EXPECT_FALSE(isHeaderFile("foo.c")); + EXPECT_FALSE(isHeaderFile("foo.mm")); + EXPECT_FALSE(isHeaderFile("foo.m")); +} + } // namespace } // namespace clangd } // namespace clang Index: clang-tools-extra/clangd/index/Background.cpp =================================================================== --- clang-tools-extra/clangd/index/Background.cpp +++ clang-tools-extra/clangd/index/Background.cpp @@ -205,11 +205,7 @@ } void BackgroundIndex::boostRelated(llvm::StringRef Path) { - namespace types = clang::driver::types; - auto Type = - types::lookupTypeForExtension(llvm::sys::path::extension(Path).substr(1)); - // is this a header? - if (Type != types::TY_INVALID && types::onlyPrecompileType(Type)) + if (isHeaderFile(Path)) Queue.boost(filenameWithoutExtension(Path), IndexBoostedFile); } Index: clang-tools-extra/clangd/SourceCode.h =================================================================== --- clang-tools-extra/clangd/SourceCode.h +++ clang-tools-extra/clangd/SourceCode.h @@ -292,10 +292,13 @@ llvm::StringRef Name; const MacroInfo *Info; }; -// Gets the macro at a specified \p Loc. +/// Gets the macro at a specified \p Loc. llvm::Optional<DefinedMacro> locateMacroAt(SourceLocation Loc, Preprocessor &PP); +/// Retruns true if the file is a header. This is inferred from the file name. +bool isHeaderFile(llvm::StringRef FileName); + } // namespace clangd } // namespace clang #endif Index: clang-tools-extra/clangd/SourceCode.cpp =================================================================== --- clang-tools-extra/clangd/SourceCode.cpp +++ clang-tools-extra/clangd/SourceCode.cpp @@ -17,6 +17,7 @@ #include "clang/Basic/SourceLocation.h" #include "clang/Basic/SourceManager.h" #include "clang/Basic/TokenKinds.h" +#include "clang/Driver/Types.h" #include "clang/Format/Format.h" #include "clang/Lex/Lexer.h" #include "clang/Lex/Preprocessor.h" @@ -1122,5 +1123,12 @@ return ER; } +bool isHeaderFile(llvm::StringRef FileName) { + namespace types = clang::driver::types; + auto Lang = types::lookupTypeForExtension( + llvm::sys::path::extension(FileName).substr(1)); + return Lang != types::TY_INVALID && types::onlyPrecompileType(Lang); +} + } // namespace clangd } // namespace clang
Index: clang-tools-extra/clangd/unittests/SourceCodeTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/SourceCodeTests.cpp +++ clang-tools-extra/clangd/unittests/SourceCodeTests.cpp @@ -701,6 +701,20 @@ collectIdentifierRanges("Foo", Code.code(), LangOpts)); } +TEST(SourceCodeTests, isHeaderFile) { + EXPECT_TRUE(isHeaderFile("foo.h")); + EXPECT_TRUE(isHeaderFile("foo.hh")); + EXPECT_TRUE(isHeaderFile("foo.hpp")); + + EXPECT_FALSE(isHeaderFile("foo.cpp")); + EXPECT_FALSE(isHeaderFile("foo.c++")); + EXPECT_FALSE(isHeaderFile("foo.cxx")); + EXPECT_FALSE(isHeaderFile("foo.cc")); + EXPECT_FALSE(isHeaderFile("foo.c")); + EXPECT_FALSE(isHeaderFile("foo.mm")); + EXPECT_FALSE(isHeaderFile("foo.m")); +} + } // namespace } // namespace clangd } // namespace clang Index: clang-tools-extra/clangd/index/Background.cpp =================================================================== --- clang-tools-extra/clangd/index/Background.cpp +++ clang-tools-extra/clangd/index/Background.cpp @@ -205,11 +205,7 @@ } void BackgroundIndex::boostRelated(llvm::StringRef Path) { - namespace types = clang::driver::types; - auto Type = - types::lookupTypeForExtension(llvm::sys::path::extension(Path).substr(1)); - // is this a header? - if (Type != types::TY_INVALID && types::onlyPrecompileType(Type)) + if (isHeaderFile(Path)) Queue.boost(filenameWithoutExtension(Path), IndexBoostedFile); } Index: clang-tools-extra/clangd/SourceCode.h =================================================================== --- clang-tools-extra/clangd/SourceCode.h +++ clang-tools-extra/clangd/SourceCode.h @@ -292,10 +292,13 @@ llvm::StringRef Name; const MacroInfo *Info; }; -// Gets the macro at a specified \p Loc. +/// Gets the macro at a specified \p Loc. llvm::Optional<DefinedMacro> locateMacroAt(SourceLocation Loc, Preprocessor &PP); +/// Retruns true if the file is a header. This is inferred from the file name. +bool isHeaderFile(llvm::StringRef FileName); + } // namespace clangd } // namespace clang #endif Index: clang-tools-extra/clangd/SourceCode.cpp =================================================================== --- clang-tools-extra/clangd/SourceCode.cpp +++ clang-tools-extra/clangd/SourceCode.cpp @@ -17,6 +17,7 @@ #include "clang/Basic/SourceLocation.h" #include "clang/Basic/SourceManager.h" #include "clang/Basic/TokenKinds.h" +#include "clang/Driver/Types.h" #include "clang/Format/Format.h" #include "clang/Lex/Lexer.h" #include "clang/Lex/Preprocessor.h" @@ -1122,5 +1123,12 @@ return ER; } +bool isHeaderFile(llvm::StringRef FileName) { + namespace types = clang::driver::types; + auto Lang = types::lookupTypeForExtension( + llvm::sys::path::extension(FileName).substr(1)); + return Lang != types::TY_INVALID && types::onlyPrecompileType(Lang); +} + } // namespace clangd } // namespace clang
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits