summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/include/clang/ASTMatchers/ASTMatchFinder.h27
-rw-r--r--clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp24
2 files changed, 51 insertions, 0 deletions
diff --git a/clang/include/clang/ASTMatchers/ASTMatchFinder.h b/clang/include/clang/ASTMatchers/ASTMatchFinder.h
index 4c8dd87cecb..f8160d552c0 100644
--- a/clang/include/clang/ASTMatchers/ASTMatchFinder.h
+++ b/clang/include/clang/ASTMatchers/ASTMatchFinder.h
@@ -309,6 +309,33 @@ match(MatcherT Matcher, ASTContext &Context) {
return std::move(Callback.Nodes);
}
+inline SmallVector<BoundNodes, 1>
+matchDynamic(internal::DynTypedMatcher Matcher,
+ const ast_type_traits::DynTypedNode &Node, ASTContext &Context) {
+ internal::CollectMatchesCallback Callback;
+ MatchFinder Finder;
+ Finder.addDynamicMatcher(Matcher, &Callback);
+ Finder.match(Node, Context);
+ return std::move(Callback.Nodes);
+}
+
+template <typename NodeT>
+SmallVector<BoundNodes, 1> matchDynamic(internal::DynTypedMatcher Matcher,
+ const NodeT &Node,
+ ASTContext &Context) {
+ return matchDynamic(Matcher, ast_type_traits::DynTypedNode::create(Node),
+ Context);
+}
+
+inline SmallVector<BoundNodes, 1>
+matchDynamic(internal::DynTypedMatcher Matcher, ASTContext &Context) {
+ internal::CollectMatchesCallback Callback;
+ MatchFinder Finder;
+ Finder.addDynamicMatcher(Matcher, &Callback);
+ Finder.matchAST(Context);
+ return std::move(Callback.Nodes);
+}
+
} // end namespace ast_matchers
} // end namespace clang
diff --git a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp
index 4c557cfe833..02514f77afd 100644
--- a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp
+++ b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp
@@ -1827,5 +1827,29 @@ void x(int x) {
EXPECT_TRUE(notMatchesWithOpenMP(Source4, Matcher));
}
+TEST(MatchFinderAPI, matchesDynamic) {
+
+ std::string SourceCode = "struct A { void f() {} };";
+ auto Matcher = functionDecl(isDefinition()).bind("method");
+
+ auto astUnit = tooling::buildASTFromCode(SourceCode);
+
+ auto GlobalBoundNodes = matchDynamic(Matcher, astUnit->getASTContext());
+
+ EXPECT_EQ(GlobalBoundNodes.size(), 1u);
+ EXPECT_EQ(GlobalBoundNodes[0].getMap().size(), 1u);
+
+ auto GlobalMethodNode = GlobalBoundNodes[0].getNodeAs<FunctionDecl>("method");
+ EXPECT_TRUE(GlobalMethodNode != nullptr);
+
+ auto MethodBoundNodes =
+ matchDynamic(Matcher, *GlobalMethodNode, astUnit->getASTContext());
+ EXPECT_EQ(MethodBoundNodes.size(), 1u);
+ EXPECT_EQ(MethodBoundNodes[0].getMap().size(), 1u);
+
+ auto MethodNode = MethodBoundNodes[0].getNodeAs<FunctionDecl>("method");
+ EXPECT_EQ(MethodNode, GlobalMethodNode);
+}
+
} // namespace ast_matchers
} // namespace clang
OpenPOWER on IntegriCloud