Manuel Klimek | 04616e4 | 2012-07-06 05:48:52 +0000 | [diff] [blame] | 1 | //===--- ASTMatchersInternal.cpp - Structural query framework -------------===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | // |
| 10 | // Implements the base layer of the matcher framework. |
| 11 | // |
| 12 | //===----------------------------------------------------------------------===// |
| 13 | |
| 14 | #include "clang/ASTMatchers/ASTMatchers.h" |
| 15 | #include "clang/ASTMatchers/ASTMatchersInternal.h" |
| 16 | |
| 17 | namespace clang { |
| 18 | namespace ast_matchers { |
| 19 | namespace internal { |
| 20 | |
Manuel Klimek | 021d56f | 2012-08-28 23:26:39 +0000 | [diff] [blame] | 21 | void BoundNodesMap::copyTo(BoundNodesTreeBuilder *Builder) const { |
| 22 | for (IDToNodeMap::const_iterator It = NodeMap.begin(); |
| 23 | It != NodeMap.end(); |
| 24 | ++It) { |
Manuel Klimek | fdf9876 | 2012-08-30 19:41:06 +0000 | [diff] [blame] | 25 | Builder->setBinding(It->first, It->second); |
Manuel Klimek | 021d56f | 2012-08-28 23:26:39 +0000 | [diff] [blame] | 26 | } |
| 27 | } |
| 28 | |
| 29 | void BoundNodesMap::copyTo(BoundNodesMap *Other) const { |
Daniel Jasper | 94a5685 | 2012-11-16 18:39:22 +0000 | [diff] [blame] | 30 | for (IDToNodeMap::const_iterator I = NodeMap.begin(), |
| 31 | E = NodeMap.end(); |
| 32 | I != E; ++I) { |
| 33 | Other->NodeMap[I->first] = I->second; |
| 34 | } |
Manuel Klimek | 021d56f | 2012-08-28 23:26:39 +0000 | [diff] [blame] | 35 | } |
| 36 | |
Manuel Klimek | 04616e4 | 2012-07-06 05:48:52 +0000 | [diff] [blame] | 37 | BoundNodesTree::BoundNodesTree() {} |
| 38 | |
| 39 | BoundNodesTree::BoundNodesTree( |
Manuel Klimek | 021d56f | 2012-08-28 23:26:39 +0000 | [diff] [blame] | 40 | const BoundNodesMap& Bindings, |
Manuel Klimek | 04616e4 | 2012-07-06 05:48:52 +0000 | [diff] [blame] | 41 | const std::vector<BoundNodesTree> RecursiveBindings) |
Manuel Klimek | 021d56f | 2012-08-28 23:26:39 +0000 | [diff] [blame] | 42 | : Bindings(Bindings), |
Manuel Klimek | 04616e4 | 2012-07-06 05:48:52 +0000 | [diff] [blame] | 43 | RecursiveBindings(RecursiveBindings) {} |
| 44 | |
| 45 | void BoundNodesTree::copyTo(BoundNodesTreeBuilder* Builder) const { |
Manuel Klimek | 021d56f | 2012-08-28 23:26:39 +0000 | [diff] [blame] | 46 | Bindings.copyTo(Builder); |
Manuel Klimek | 04616e4 | 2012-07-06 05:48:52 +0000 | [diff] [blame] | 47 | for (std::vector<BoundNodesTree>::const_iterator |
| 48 | I = RecursiveBindings.begin(), |
| 49 | E = RecursiveBindings.end(); |
| 50 | I != E; ++I) { |
| 51 | Builder->addMatch(*I); |
| 52 | } |
| 53 | } |
| 54 | |
Manuel Klimek | 04616e4 | 2012-07-06 05:48:52 +0000 | [diff] [blame] | 55 | void BoundNodesTree::visitMatches(Visitor* ResultVisitor) { |
Manuel Klimek | 021d56f | 2012-08-28 23:26:39 +0000 | [diff] [blame] | 56 | BoundNodesMap AggregatedBindings; |
Daniel Jasper | 33806cd | 2012-11-11 22:14:55 +0000 | [diff] [blame] | 57 | visitMatchesRecursively(ResultVisitor, AggregatedBindings); |
Manuel Klimek | 04616e4 | 2012-07-06 05:48:52 +0000 | [diff] [blame] | 58 | } |
| 59 | |
| 60 | void BoundNodesTree:: |
| 61 | visitMatchesRecursively(Visitor* ResultVisitor, |
Daniel Jasper | 33806cd | 2012-11-11 22:14:55 +0000 | [diff] [blame] | 62 | const BoundNodesMap& AggregatedBindings) { |
| 63 | BoundNodesMap CombinedBindings(AggregatedBindings); |
| 64 | Bindings.copyTo(&CombinedBindings); |
Manuel Klimek | 04616e4 | 2012-07-06 05:48:52 +0000 | [diff] [blame] | 65 | if (RecursiveBindings.empty()) { |
Daniel Jasper | 33806cd | 2012-11-11 22:14:55 +0000 | [diff] [blame] | 66 | ResultVisitor->visitMatch(BoundNodes(CombinedBindings)); |
Manuel Klimek | 04616e4 | 2012-07-06 05:48:52 +0000 | [diff] [blame] | 67 | } else { |
| 68 | for (unsigned I = 0; I < RecursiveBindings.size(); ++I) { |
| 69 | RecursiveBindings[I].visitMatchesRecursively(ResultVisitor, |
Daniel Jasper | 33806cd | 2012-11-11 22:14:55 +0000 | [diff] [blame] | 70 | CombinedBindings); |
Manuel Klimek | 04616e4 | 2012-07-06 05:48:52 +0000 | [diff] [blame] | 71 | } |
| 72 | } |
| 73 | } |
| 74 | |
| 75 | BoundNodesTreeBuilder::BoundNodesTreeBuilder() {} |
| 76 | |
Manuel Klimek | 04616e4 | 2012-07-06 05:48:52 +0000 | [diff] [blame] | 77 | void BoundNodesTreeBuilder::addMatch(const BoundNodesTree& Bindings) { |
| 78 | RecursiveBindings.push_back(Bindings); |
| 79 | } |
| 80 | |
| 81 | BoundNodesTree BoundNodesTreeBuilder::build() const { |
Manuel Klimek | 021d56f | 2012-08-28 23:26:39 +0000 | [diff] [blame] | 82 | return BoundNodesTree(Bindings, RecursiveBindings); |
Manuel Klimek | 04616e4 | 2012-07-06 05:48:52 +0000 | [diff] [blame] | 83 | } |
| 84 | |
| 85 | } // end namespace internal |
| 86 | } // end namespace ast_matchers |
| 87 | } // end namespace clang |