85 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===--- ASTMatchersInternal.cpp - Structural query framework -------------===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| //  Implements the base layer of the matcher framework.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #include "clang/ASTMatchers/ASTMatchers.h"
 | |
| #include "clang/ASTMatchers/ASTMatchersInternal.h"
 | |
| 
 | |
| namespace clang {
 | |
| namespace ast_matchers {
 | |
| namespace internal {
 | |
| 
 | |
| void BoundNodesTreeBuilder::visitMatches(Visitor *ResultVisitor) {
 | |
|   if (Bindings.empty())
 | |
|     Bindings.push_back(BoundNodesMap());
 | |
|   for (unsigned i = 0, e = Bindings.size(); i != e; ++i) {
 | |
|     ResultVisitor->visitMatch(BoundNodes(Bindings[i]));
 | |
|   }
 | |
| }
 | |
| 
 | |
| DynTypedMatcher::MatcherStorage::~MatcherStorage() {}
 | |
| 
 | |
| void BoundNodesTreeBuilder::addMatch(const BoundNodesTreeBuilder &Other) {
 | |
|   for (unsigned i = 0, e = Other.Bindings.size(); i != e; ++i) {
 | |
|     Bindings.push_back(Other.Bindings[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| bool AllOfVariadicOperator(const ast_type_traits::DynTypedNode DynNode,
 | |
|                            ASTMatchFinder *Finder,
 | |
|                            BoundNodesTreeBuilder *Builder,
 | |
|                            ArrayRef<DynTypedMatcher> InnerMatchers) {
 | |
|   // allOf leads to one matcher for each alternative in the first
 | |
|   // matcher combined with each alternative in the second matcher.
 | |
|   // Thus, we can reuse the same Builder.
 | |
|   for (size_t i = 0, e = InnerMatchers.size(); i != e; ++i) {
 | |
|     if (!InnerMatchers[i].matches(DynNode, Finder, Builder))
 | |
|       return false;
 | |
|   }
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| bool EachOfVariadicOperator(const ast_type_traits::DynTypedNode DynNode,
 | |
|                             ASTMatchFinder *Finder,
 | |
|                             BoundNodesTreeBuilder *Builder,
 | |
|                             ArrayRef<DynTypedMatcher> InnerMatchers) {
 | |
|   BoundNodesTreeBuilder Result;
 | |
|   bool Matched = false;
 | |
|   for (size_t i = 0, e = InnerMatchers.size(); i != e; ++i) {
 | |
|     BoundNodesTreeBuilder BuilderInner(*Builder);
 | |
|     if (InnerMatchers[i].matches(DynNode, Finder, &BuilderInner)) {
 | |
|       Matched = true;
 | |
|       Result.addMatch(BuilderInner);
 | |
|     }
 | |
|   }
 | |
|   *Builder = Result;
 | |
|   return Matched;
 | |
| }
 | |
| 
 | |
| bool AnyOfVariadicOperator(const ast_type_traits::DynTypedNode DynNode,
 | |
|                            ASTMatchFinder *Finder,
 | |
|                            BoundNodesTreeBuilder *Builder,
 | |
|                            ArrayRef<DynTypedMatcher> InnerMatchers) {
 | |
|   for (size_t i = 0, e = InnerMatchers.size(); i != e; ++i) {
 | |
|     BoundNodesTreeBuilder Result = *Builder;
 | |
|     if (InnerMatchers[i].matches(DynNode, Finder, &Result)) {
 | |
|       *Builder = Result;
 | |
|       return true;
 | |
|     }
 | |
|   }
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| } // end namespace internal
 | |
| } // end namespace ast_matchers
 | |
| } // end namespace clang
 | 
