[clang-tools-extra] 1425c72 - [clangd] Add isKeyword function.
Haojian Wu via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 5 06:12:09 PDT 2020
Author: Haojian Wu
Date: 2020-10-05T15:11:24+02:00
New Revision: 1425c72236766ad9107d86cb645ee8c6a3ee0eb1
URL: https://github.com/llvm/llvm-project/commit/1425c72236766ad9107d86cb645ee8c6a3ee0eb1
DIFF: https://github.com/llvm/llvm-project/commit/1425c72236766ad9107d86cb645ee8c6a3ee0eb1.diff
LOG: [clangd] Add isKeyword function.
This will be used in rename for doing basic name validation.
Differential Revision: https://reviews.llvm.org/D88810
Added:
Modified:
clang-tools-extra/clangd/SourceCode.cpp
clang-tools-extra/clangd/SourceCode.h
clang-tools-extra/clangd/unittests/SourceCodeTests.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clangd/SourceCode.cpp b/clang-tools-extra/clangd/SourceCode.cpp
index 0432097b4348..c6279177eba9 100644
--- a/clang-tools-extra/clangd/SourceCode.cpp
+++ b/clang-tools-extra/clangd/SourceCode.cpp
@@ -633,6 +633,12 @@ std::vector<Range> collectIdentifierRanges(llvm::StringRef Identifier,
return Ranges;
}
+bool isKeyword(llvm::StringRef NewName, const LangOptions &LangOpts) {
+ // Keywords are initialized in constructor.
+ clang::IdentifierTable KeywordsTable(LangOpts);
+ return KeywordsTable.find(NewName) != KeywordsTable.end();
+}
+
namespace {
struct NamespaceEvent {
enum {
diff --git a/clang-tools-extra/clangd/SourceCode.h b/clang-tools-extra/clangd/SourceCode.h
index 128f985a5266..be78e2f86436 100644
--- a/clang-tools-extra/clangd/SourceCode.h
+++ b/clang-tools-extra/clangd/SourceCode.h
@@ -248,6 +248,10 @@ struct SpelledWord {
const LangOptions &LangOpts);
};
+/// Return true if the \p TokenName is in the list of reversed keywords of the
+/// language.
+bool isKeyword(llvm::StringRef TokenName, const LangOptions &LangOpts);
+
/// Heuristically determine namespaces visible at a point, without parsing Code.
/// This considers using-directives and enclosing namespace-declarations that
/// are visible (and not obfuscated) in the file itself (not headers).
diff --git a/clang-tools-extra/clangd/unittests/SourceCodeTests.cpp b/clang-tools-extra/clangd/unittests/SourceCodeTests.cpp
index 9c3ae4df51ff..c05515f2c094 100644
--- a/clang-tools-extra/clangd/unittests/SourceCodeTests.cpp
+++ b/clang-tools-extra/clangd/unittests/SourceCodeTests.cpp
@@ -789,6 +789,19 @@ TEST(SourceCodeTests, isHeaderFile) {
EXPECT_TRUE(isHeaderFile("header.h", LangOpts));
}
+TEST(SourceCodeTests, isKeywords) {
+ LangOptions LangOpts;
+ LangOpts.CPlusPlus20 = true;
+ EXPECT_TRUE(isKeyword("int", LangOpts));
+ EXPECT_TRUE(isKeyword("return", LangOpts));
+ EXPECT_TRUE(isKeyword("co_await", LangOpts));
+
+ // these are identifiers (not keywords!) with special meaning in some
+ // contexts.
+ EXPECT_FALSE(isKeyword("final", LangOpts));
+ EXPECT_FALSE(isKeyword("override", LangOpts));
+}
+
} // namespace
} // namespace clangd
} // namespace clang
More information about the cfe-commits
mailing list