1 //===--- ASTMatchersInternal.cpp - Structural query framework -------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // Implements the base layer of the matcher framework.
12 //===----------------------------------------------------------------------===//
14 #include "clang/ASTMatchers/ASTMatchers.h"
15 #include "clang/ASTMatchers/ASTMatchersInternal.h"
18 namespace ast_matchers {
21 void BoundNodesTreeBuilder::visitMatches(Visitor *ResultVisitor) {
23 Bindings.push_back(BoundNodesMap());
24 for (unsigned i = 0, e = Bindings.size(); i != e; ++i) {
25 ResultVisitor->visitMatch(BoundNodes(Bindings[i]));
29 DynTypedMatcher::MatcherStorage::~MatcherStorage() {}
31 void BoundNodesTreeBuilder::addMatch(const BoundNodesTreeBuilder &Other) {
32 for (unsigned i = 0, e = Other.Bindings.size(); i != e; ++i) {
33 Bindings.push_back(Other.Bindings[i]);
37 bool AllOfVariadicOperator(const ast_type_traits::DynTypedNode DynNode,
38 ASTMatchFinder *Finder,
39 BoundNodesTreeBuilder *Builder,
40 ArrayRef<DynTypedMatcher> InnerMatchers) {
41 // allOf leads to one matcher for each alternative in the first
42 // matcher combined with each alternative in the second matcher.
43 // Thus, we can reuse the same Builder.
44 for (size_t i = 0, e = InnerMatchers.size(); i != e; ++i) {
45 if (!InnerMatchers[i].matches(DynNode, Finder, Builder))
51 bool EachOfVariadicOperator(const ast_type_traits::DynTypedNode DynNode,
52 ASTMatchFinder *Finder,
53 BoundNodesTreeBuilder *Builder,
54 ArrayRef<DynTypedMatcher> InnerMatchers) {
55 BoundNodesTreeBuilder Result;
57 for (size_t i = 0, e = InnerMatchers.size(); i != e; ++i) {
58 BoundNodesTreeBuilder BuilderInner(*Builder);
59 if (InnerMatchers[i].matches(DynNode, Finder, &BuilderInner)) {
61 Result.addMatch(BuilderInner);
68 bool AnyOfVariadicOperator(const ast_type_traits::DynTypedNode DynNode,
69 ASTMatchFinder *Finder,
70 BoundNodesTreeBuilder *Builder,
71 ArrayRef<DynTypedMatcher> InnerMatchers) {
72 for (size_t i = 0, e = InnerMatchers.size(); i != e; ++i) {
73 BoundNodesTreeBuilder Result = *Builder;
74 if (InnerMatchers[i].matches(DynNode, Finder, &Result)) {
82 } // end namespace internal
83 } // end namespace ast_matchers
84 } // end namespace clang