Index: include/clang/ASTMatchers/ASTMatchFinder.h =================================================================== --- include/clang/ASTMatchers/ASTMatchFinder.h +++ include/clang/ASTMatchers/ASTMatchFinder.h @@ -310,6 +310,31 @@ return std::move(Callback.Nodes); } +inline SmallVector +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 +SmallVector +matchDynamic(internal::DynTypedMatcher Matcher, const NodeT &Node, ASTContext &Context) { + return matchDynamic(Matcher, ast_type_traits::DynTypedNode::create(Node), Context); +} + +inline SmallVector +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 Index: unittests/ASTMatchers/ASTMatchersNodeTest.cpp =================================================================== --- unittests/ASTMatchers/ASTMatchersNodeTest.cpp +++ unittests/ASTMatchers/ASTMatchersNodeTest.cpp @@ -1719,5 +1719,28 @@ 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("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("method"); + EXPECT_EQ(MethodNode, GlobalMethodNode); +} + } // namespace ast_matchers } // namespace clang