[PATCH] D70235: [clangd] Add isHeaderFile helper.
Haojian Wu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Nov 14 05:02:04 PST 2019
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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D70235.229280.patch
Type: text/x-patch
Size: 2996 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20191114/8b5e9a0b/attachment-0001.bin>
More information about the cfe-commits
mailing list