diff options
author | Manuel Klimek <klimek@google.com> | 2013-02-01 13:41:35 +0000 |
---|---|---|
committer | Manuel Klimek <klimek@google.com> | 2013-02-01 13:41:35 +0000 |
commit | 60969f5f6be1cbf7ac2384cc5ad571d28adf6bf1 (patch) | |
tree | eb4289dc7e56f28df24063bad3b2c148bd5b87de /lib/ASTMatchers/ASTMatchFinder.cpp | |
parent | ae54121c15cdd38f415f6fdda48215ab5e4dcee1 (diff) |
Re-design the convenience interfaces on MatchFinder.
First, this implements a match() method on MatchFinder; this allows us
to get rid of the findAll implementation, as findAll is really a special
case of recursive matchers on match.
Instead of findAll, provide a convenience function match() that lets
users iterate easily over the results instead of needing to implement
callbacks.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@174172 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ASTMatchers/ASTMatchFinder.cpp')
-rw-r--r-- | lib/ASTMatchers/ASTMatchFinder.cpp | 49 |
1 files changed, 23 insertions, 26 deletions
diff --git a/lib/ASTMatchers/ASTMatchFinder.cpp b/lib/ASTMatchers/ASTMatchFinder.cpp index 3c797982ad..3a3c1fb6e1 100644 --- a/lib/ASTMatchers/ASTMatchFinder.cpp +++ b/lib/ASTMatchers/ASTMatchFinder.cpp @@ -467,6 +467,26 @@ public: return matchesAncestorOfRecursively(Node, Matcher, Builder, MatchMode); } + // Matches all registered matchers on the given node and calls the + // result callback for every node that matches. + void match(const ast_type_traits::DynTypedNode& Node) { + for (std::vector<std::pair<const internal::DynTypedMatcher*, + MatchCallback*> >::const_iterator + I = MatcherCallbackPairs->begin(), E = MatcherCallbackPairs->end(); + I != E; ++I) { + BoundNodesTreeBuilder Builder; + if (I->first->matches(Node, this, &Builder)) { + BoundNodesTree BoundNodes = Builder.build(); + MatchVisitor Visitor(ActiveASTContext, I->second); + BoundNodes.visitMatches(&Visitor); + } + } + } + + template <typename T> void match(const T &Node) { + match(ast_type_traits::DynTypedNode::create(Node)); + } + // Implements ASTMatchFinder::getASTContext. virtual ASTContext &getASTContext() const { return *ActiveASTContext; } @@ -544,24 +564,6 @@ private: return false; } - // Matches all registered matchers on the given node and calls the - // result callback for every node that matches. - template <typename T> - void match(const T &node) { - for (std::vector<std::pair<const internal::DynTypedMatcher*, - MatchCallback*> >::const_iterator - I = MatcherCallbackPairs->begin(), E = MatcherCallbackPairs->end(); - I != E; ++I) { - BoundNodesTreeBuilder Builder; - if (I->first->matches(ast_type_traits::DynTypedNode::create(node), - this, &Builder)) { - BoundNodesTree BoundNodes = Builder.build(); - MatchVisitor Visitor(ActiveASTContext, I->second); - BoundNodes.visitMatches(&Visitor); - } - } - } - std::vector<std::pair<const internal::DynTypedMatcher*, MatchCallback*> > *const MatcherCallbackPairs; ASTContext *ActiveASTContext; @@ -777,16 +779,11 @@ ASTConsumer *MatchFinder::newASTConsumer() { return new internal::MatchASTConsumer(&MatcherCallbackPairs, ParsingDone); } -void MatchFinder::findAll(const Decl &Node, ASTContext &Context) { - internal::MatchASTVisitor Visitor(&MatcherCallbackPairs); - Visitor.set_active_ast_context(&Context); - Visitor.TraverseDecl(const_cast<Decl*>(&Node)); -} - -void MatchFinder::findAll(const Stmt &Node, ASTContext &Context) { +void MatchFinder::match(const clang::ast_type_traits::DynTypedNode &Node, + ASTContext &Context) { internal::MatchASTVisitor Visitor(&MatcherCallbackPairs); Visitor.set_active_ast_context(&Context); - Visitor.TraverseStmt(const_cast<Stmt*>(&Node)); + Visitor.match(Node); } void MatchFinder::registerTestCallbackAfterParsing( |