diff options
| author | Stephen Kelly <steveire@gmail.com> | 2019-12-06 23:50:07 +0000 |
|---|---|---|
| committer | Stephen Kelly <steveire@gmail.com> | 2019-12-07 00:01:29 +0000 |
| commit | 2e8dc8590d8b412a131b127e7aa4aad0d7fc7fa0 (patch) | |
| tree | adc16c9558dafbfc798510e7ad7e5b9aea910e91 | |
| parent | 3131249204bcb85e506332ea07a3101b7f656fce (diff) | |
| download | bcm5719-llvm-2e8dc8590d8b412a131b127e7aa4aad0d7fc7fa0.tar.gz bcm5719-llvm-2e8dc8590d8b412a131b127e7aa4aad0d7fc7fa0.zip | |
Add matchDynamic convenience functions
Summary: These correspond to the existing match() free functions.
Reviewers: aaron.ballman
Subscribers: cfe-commits
Differential Revision: https://reviews.llvm.org/D54406
| -rw-r--r-- | clang/include/clang/ASTMatchers/ASTMatchFinder.h | 27 | ||||
| -rw-r--r-- | clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp | 24 |
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 |

