[PATCH] D54406: Add matchDynamic convenience functions
Stephen Kelly via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 12 14:42:25 PST 2018
steveire updated this revision to Diff 173768.
steveire added a comment.
Update
Repository:
rC Clang
https://reviews.llvm.org/D54406
Files:
include/clang/ASTMatchers/ASTMatchFinder.h
unittests/ASTMatchers/ASTMatchersNodeTest.cpp
Index: unittests/ASTMatchers/ASTMatchersNodeTest.cpp
===================================================================
--- unittests/ASTMatchers/ASTMatchersNodeTest.cpp
+++ unittests/ASTMatchers/ASTMatchersNodeTest.cpp
@@ -1719,5 +1719,29 @@
EXPECT_FALSE(matchesObjC(ObjCStringNoPool, autoreleasePoolStmt()));
}
+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
Index: include/clang/ASTMatchers/ASTMatchFinder.h
===================================================================
--- include/clang/ASTMatchers/ASTMatchFinder.h
+++ include/clang/ASTMatchers/ASTMatchFinder.h
@@ -310,6 +310,33 @@
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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D54406.173768.patch
Type: text/x-patch
Size: 2558 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20181112/1c40b86b/attachment.bin>
More information about the cfe-commits
mailing list