[clang] d3bccdc - [ASTMatchers ]Make MatcherDescriptors indicate the node type they match
Stephen Kelly via cfe-commits
cfe-commits at lists.llvm.org
Sun Feb 7 07:15:03 PST 2021
Author: Stephen Kelly
Date: 2021-02-07T15:13:28Z
New Revision: d3bccdcd50e392469c5d115eda29a308914e19ae
URL: https://github.com/llvm/llvm-project/commit/d3bccdcd50e392469c5d115eda29a308914e19ae
DIFF: https://github.com/llvm/llvm-project/commit/d3bccdcd50e392469c5d115eda29a308914e19ae.diff
LOG: [ASTMatchers ]Make MatcherDescriptors indicate the node type they match
Added:
Modified:
clang/include/clang/ASTMatchers/Dynamic/Registry.h
clang/lib/ASTMatchers/Dynamic/Marshallers.h
clang/lib/ASTMatchers/Dynamic/Registry.cpp
clang/unittests/ASTMatchers/Dynamic/RegistryTest.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/ASTMatchers/Dynamic/Registry.h b/clang/include/clang/ASTMatchers/Dynamic/Registry.h
index 215206b2f50c..9ce77c33d6d8 100644
--- a/clang/include/clang/ASTMatchers/Dynamic/Registry.h
+++ b/clang/include/clang/ASTMatchers/Dynamic/Registry.h
@@ -66,6 +66,8 @@ class Registry {
public:
Registry() = delete;
+ static ASTNodeKind nodeMatcherType(MatcherCtor);
+
/// Look up a matcher in the registry by name,
///
/// \return An opaque value which may be used to refer to the matcher
diff --git a/clang/lib/ASTMatchers/Dynamic/Marshallers.h b/clang/lib/ASTMatchers/Dynamic/Marshallers.h
index 411062392dad..71d7443c91ca 100644
--- a/clang/lib/ASTMatchers/Dynamic/Marshallers.h
+++ b/clang/lib/ASTMatchers/Dynamic/Marshallers.h
@@ -309,6 +309,8 @@ class MatcherDescriptor {
ArrayRef<ParserValue> Args,
Diagnostics *Error) const = 0;
+ virtual ASTNodeKind nodeMatcherType() const { return ASTNodeKind(); }
+
/// Returns whether the matcher is variadic. Variadic matchers can take any
/// number of arguments, but they must be of the same type.
virtual bool isVariadic() const = 0;
@@ -576,6 +578,8 @@ class VariadicFuncMatcherDescriptor : public MatcherDescriptor {
LeastDerivedKind);
}
+ ASTNodeKind nodeMatcherType() const override { return RetKinds[0]; }
+
private:
const RunFunc Func;
const std::string MatcherName;
@@ -611,6 +615,8 @@ class DynCastAllOfMatcherDescriptor : public VariadicFuncMatcherDescriptor {
}
}
+ ASTNodeKind nodeMatcherType() const override { return DerivedKind; }
+
private:
const ASTNodeKind DerivedKind;
};
diff --git a/clang/lib/ASTMatchers/Dynamic/Registry.cpp b/clang/lib/ASTMatchers/Dynamic/Registry.cpp
index 0887eb7e0881..908a9ee8ae62 100644
--- a/clang/lib/ASTMatchers/Dynamic/Registry.cpp
+++ b/clang/lib/ASTMatchers/Dynamic/Registry.cpp
@@ -562,6 +562,10 @@ RegistryMaps::~RegistryMaps() = default;
static llvm::ManagedStatic<RegistryMaps> RegistryData;
+ASTNodeKind Registry::nodeMatcherType(MatcherCtor Ctor) {
+ return Ctor->nodeMatcherType();
+}
+
// static
llvm::Optional<MatcherCtor> Registry::lookupMatcherCtor(StringRef MatcherName) {
auto it = RegistryData->constructors().find(MatcherName);
diff --git a/clang/unittests/ASTMatchers/Dynamic/RegistryTest.cpp b/clang/unittests/ASTMatchers/Dynamic/RegistryTest.cpp
index 7d6c51f965ec..386fd523bb24 100644
--- a/clang/unittests/ASTMatchers/Dynamic/RegistryTest.cpp
+++ b/clang/unittests/ASTMatchers/Dynamic/RegistryTest.cpp
@@ -497,6 +497,12 @@ TEST_F(RegistryTest, Completion) {
"Matcher<CXXRecordDecl> isSameOrDerivedFrom(string|Matcher<NamedDecl>)"));
}
+TEST_F(RegistryTest, NodeType) {
+ EXPECT_TRUE(Registry::nodeMatcherType(*lookupMatcherCtor("callExpr")).isSame(ASTNodeKind::getFromNodeKind<CallExpr>()));
+ EXPECT_TRUE(Registry::nodeMatcherType(*lookupMatcherCtor("has")).isNone());
+ EXPECT_TRUE(Registry::nodeMatcherType(*lookupMatcherCtor("allOf")).isNone());
+}
+
TEST_F(RegistryTest, HasArgs) {
Matcher<Decl> Value = constructMatcher(
"decl", constructMatcher("hasAttr", StringRef("attr::WarnUnused")))
More information about the cfe-commits
mailing list