annotate clang/lib/ASTMatchers/ASTMatchersInternal.cpp @ 176:de4ac79aef9d

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 17:13:11 +0900
parents 0572611fdcc8
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===- ASTMatchersInternal.cpp - Structural query framework ---------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 //
anatofuz
parents:
diff changeset
9 // Implements the base layer of the matcher framework.
anatofuz
parents:
diff changeset
10 //
anatofuz
parents:
diff changeset
11 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
12
anatofuz
parents:
diff changeset
13 #include "clang/ASTMatchers/ASTMatchersInternal.h"
anatofuz
parents:
diff changeset
14 #include "clang/AST/ASTContext.h"
anatofuz
parents:
diff changeset
15 #include "clang/AST/ASTTypeTraits.h"
anatofuz
parents:
diff changeset
16 #include "clang/AST/Decl.h"
anatofuz
parents:
diff changeset
17 #include "clang/AST/DeclTemplate.h"
anatofuz
parents:
diff changeset
18 #include "clang/AST/ParentMapContext.h"
anatofuz
parents:
diff changeset
19 #include "clang/AST/PrettyPrinter.h"
anatofuz
parents:
diff changeset
20 #include "clang/ASTMatchers/ASTMatchers.h"
anatofuz
parents:
diff changeset
21 #include "clang/Basic/LLVM.h"
anatofuz
parents:
diff changeset
22 #include "clang/Lex/Lexer.h"
anatofuz
parents:
diff changeset
23 #include "llvm/ADT/ArrayRef.h"
anatofuz
parents:
diff changeset
24 #include "llvm/ADT/IntrusiveRefCntPtr.h"
anatofuz
parents:
diff changeset
25 #include "llvm/ADT/None.h"
anatofuz
parents:
diff changeset
26 #include "llvm/ADT/SmallString.h"
anatofuz
parents:
diff changeset
27 #include "llvm/ADT/SmallVector.h"
anatofuz
parents:
diff changeset
28 #include "llvm/ADT/StringRef.h"
anatofuz
parents:
diff changeset
29 #include "llvm/Support/Casting.h"
anatofuz
parents:
diff changeset
30 #include "llvm/Support/ErrorHandling.h"
anatofuz
parents:
diff changeset
31 #include "llvm/Support/ManagedStatic.h"
anatofuz
parents:
diff changeset
32 #include "llvm/Support/raw_ostream.h"
anatofuz
parents:
diff changeset
33 #include <algorithm>
anatofuz
parents:
diff changeset
34 #include <cassert>
anatofuz
parents:
diff changeset
35 #include <cstddef>
anatofuz
parents:
diff changeset
36 #include <string>
anatofuz
parents:
diff changeset
37 #include <utility>
anatofuz
parents:
diff changeset
38 #include <vector>
anatofuz
parents:
diff changeset
39
anatofuz
parents:
diff changeset
40 namespace clang {
anatofuz
parents:
diff changeset
41 namespace ast_matchers {
anatofuz
parents:
diff changeset
42
anatofuz
parents:
diff changeset
43 AST_MATCHER_P(ObjCMessageExpr, hasAnySelectorMatcher, std::vector<std::string>,
anatofuz
parents:
diff changeset
44 Matches) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
45 return llvm::is_contained(Matches, Node.getSelector().getAsString());
150
anatofuz
parents:
diff changeset
46 }
anatofuz
parents:
diff changeset
47
anatofuz
parents:
diff changeset
48 namespace internal {
anatofuz
parents:
diff changeset
49
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
50 bool NotUnaryOperator(const DynTypedNode &DynNode, ASTMatchFinder *Finder,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
51 BoundNodesTreeBuilder *Builder,
150
anatofuz
parents:
diff changeset
52 ArrayRef<DynTypedMatcher> InnerMatchers);
anatofuz
parents:
diff changeset
53
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
54 bool AllOfVariadicOperator(const DynTypedNode &DynNode, ASTMatchFinder *Finder,
150
anatofuz
parents:
diff changeset
55 BoundNodesTreeBuilder *Builder,
anatofuz
parents:
diff changeset
56 ArrayRef<DynTypedMatcher> InnerMatchers);
anatofuz
parents:
diff changeset
57
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
58 bool EachOfVariadicOperator(const DynTypedNode &DynNode, ASTMatchFinder *Finder,
150
anatofuz
parents:
diff changeset
59 BoundNodesTreeBuilder *Builder,
anatofuz
parents:
diff changeset
60 ArrayRef<DynTypedMatcher> InnerMatchers);
anatofuz
parents:
diff changeset
61
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
62 bool AnyOfVariadicOperator(const DynTypedNode &DynNode, ASTMatchFinder *Finder,
150
anatofuz
parents:
diff changeset
63 BoundNodesTreeBuilder *Builder,
anatofuz
parents:
diff changeset
64 ArrayRef<DynTypedMatcher> InnerMatchers);
anatofuz
parents:
diff changeset
65
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
66 bool OptionallyVariadicOperator(const DynTypedNode &DynNode,
150
anatofuz
parents:
diff changeset
67 ASTMatchFinder *Finder,
anatofuz
parents:
diff changeset
68 BoundNodesTreeBuilder *Builder,
anatofuz
parents:
diff changeset
69 ArrayRef<DynTypedMatcher> InnerMatchers);
anatofuz
parents:
diff changeset
70
anatofuz
parents:
diff changeset
71 void BoundNodesTreeBuilder::visitMatches(Visitor *ResultVisitor) {
anatofuz
parents:
diff changeset
72 if (Bindings.empty())
anatofuz
parents:
diff changeset
73 Bindings.push_back(BoundNodesMap());
anatofuz
parents:
diff changeset
74 for (BoundNodesMap &Binding : Bindings) {
anatofuz
parents:
diff changeset
75 ResultVisitor->visitMatch(BoundNodes(Binding));
anatofuz
parents:
diff changeset
76 }
anatofuz
parents:
diff changeset
77 }
anatofuz
parents:
diff changeset
78
anatofuz
parents:
diff changeset
79 namespace {
anatofuz
parents:
diff changeset
80
anatofuz
parents:
diff changeset
81 using VariadicOperatorFunction = bool (*)(
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
82 const DynTypedNode &DynNode, ASTMatchFinder *Finder,
150
anatofuz
parents:
diff changeset
83 BoundNodesTreeBuilder *Builder, ArrayRef<DynTypedMatcher> InnerMatchers);
anatofuz
parents:
diff changeset
84
anatofuz
parents:
diff changeset
85 template <VariadicOperatorFunction Func>
anatofuz
parents:
diff changeset
86 class VariadicMatcher : public DynMatcherInterface {
anatofuz
parents:
diff changeset
87 public:
anatofuz
parents:
diff changeset
88 VariadicMatcher(std::vector<DynTypedMatcher> InnerMatchers)
anatofuz
parents:
diff changeset
89 : InnerMatchers(std::move(InnerMatchers)) {}
anatofuz
parents:
diff changeset
90
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
91 bool dynMatches(const DynTypedNode &DynNode, ASTMatchFinder *Finder,
150
anatofuz
parents:
diff changeset
92 BoundNodesTreeBuilder *Builder) const override {
anatofuz
parents:
diff changeset
93 return Func(DynNode, Finder, Builder, InnerMatchers);
anatofuz
parents:
diff changeset
94 }
anatofuz
parents:
diff changeset
95
anatofuz
parents:
diff changeset
96 private:
anatofuz
parents:
diff changeset
97 std::vector<DynTypedMatcher> InnerMatchers;
anatofuz
parents:
diff changeset
98 };
anatofuz
parents:
diff changeset
99
anatofuz
parents:
diff changeset
100 class IdDynMatcher : public DynMatcherInterface {
anatofuz
parents:
diff changeset
101 public:
anatofuz
parents:
diff changeset
102 IdDynMatcher(StringRef ID,
anatofuz
parents:
diff changeset
103 IntrusiveRefCntPtr<DynMatcherInterface> InnerMatcher)
anatofuz
parents:
diff changeset
104 : ID(ID), InnerMatcher(std::move(InnerMatcher)) {}
anatofuz
parents:
diff changeset
105
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
106 bool dynMatches(const DynTypedNode &DynNode, ASTMatchFinder *Finder,
150
anatofuz
parents:
diff changeset
107 BoundNodesTreeBuilder *Builder) const override {
anatofuz
parents:
diff changeset
108 bool Result = InnerMatcher->dynMatches(DynNode, Finder, Builder);
anatofuz
parents:
diff changeset
109 if (Result) Builder->setBinding(ID, DynNode);
anatofuz
parents:
diff changeset
110 return Result;
anatofuz
parents:
diff changeset
111 }
anatofuz
parents:
diff changeset
112
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
113 llvm::Optional<clang::TraversalKind> TraversalKind() const override {
150
anatofuz
parents:
diff changeset
114 return InnerMatcher->TraversalKind();
anatofuz
parents:
diff changeset
115 }
anatofuz
parents:
diff changeset
116
anatofuz
parents:
diff changeset
117 private:
anatofuz
parents:
diff changeset
118 const std::string ID;
anatofuz
parents:
diff changeset
119 const IntrusiveRefCntPtr<DynMatcherInterface> InnerMatcher;
anatofuz
parents:
diff changeset
120 };
anatofuz
parents:
diff changeset
121
anatofuz
parents:
diff changeset
122 /// A matcher that always returns true.
anatofuz
parents:
diff changeset
123 ///
anatofuz
parents:
diff changeset
124 /// We only ever need one instance of this matcher, so we create a global one
anatofuz
parents:
diff changeset
125 /// and reuse it to reduce the overhead of the matcher and increase the chance
anatofuz
parents:
diff changeset
126 /// of cache hits.
anatofuz
parents:
diff changeset
127 class TrueMatcherImpl : public DynMatcherInterface {
anatofuz
parents:
diff changeset
128 public:
anatofuz
parents:
diff changeset
129 TrueMatcherImpl() {
anatofuz
parents:
diff changeset
130 Retain(); // Reference count will never become zero.
anatofuz
parents:
diff changeset
131 }
anatofuz
parents:
diff changeset
132
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
133 bool dynMatches(const DynTypedNode &, ASTMatchFinder *,
150
anatofuz
parents:
diff changeset
134 BoundNodesTreeBuilder *) const override {
anatofuz
parents:
diff changeset
135 return true;
anatofuz
parents:
diff changeset
136 }
anatofuz
parents:
diff changeset
137 };
anatofuz
parents:
diff changeset
138
anatofuz
parents:
diff changeset
139 } // namespace
anatofuz
parents:
diff changeset
140
anatofuz
parents:
diff changeset
141 static llvm::ManagedStatic<TrueMatcherImpl> TrueMatcherInstance;
anatofuz
parents:
diff changeset
142
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
143 DynTypedMatcher
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
144 DynTypedMatcher::constructVariadic(DynTypedMatcher::VariadicOperator Op,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
145 ASTNodeKind SupportedKind,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
146 std::vector<DynTypedMatcher> InnerMatchers) {
150
anatofuz
parents:
diff changeset
147 assert(!InnerMatchers.empty() && "Array must not be empty.");
anatofuz
parents:
diff changeset
148 assert(llvm::all_of(InnerMatchers,
anatofuz
parents:
diff changeset
149 [SupportedKind](const DynTypedMatcher &M) {
anatofuz
parents:
diff changeset
150 return M.canConvertTo(SupportedKind);
anatofuz
parents:
diff changeset
151 }) &&
anatofuz
parents:
diff changeset
152 "InnerMatchers must be convertible to SupportedKind!");
anatofuz
parents:
diff changeset
153
anatofuz
parents:
diff changeset
154 // We must relax the restrict kind here.
anatofuz
parents:
diff changeset
155 // The different operators might deal differently with a mismatch.
anatofuz
parents:
diff changeset
156 // Make it the same as SupportedKind, since that is the broadest type we are
anatofuz
parents:
diff changeset
157 // allowed to accept.
anatofuz
parents:
diff changeset
158 auto RestrictKind = SupportedKind;
anatofuz
parents:
diff changeset
159
anatofuz
parents:
diff changeset
160 switch (Op) {
anatofuz
parents:
diff changeset
161 case VO_AllOf:
anatofuz
parents:
diff changeset
162 // In the case of allOf() we must pass all the checks, so making
anatofuz
parents:
diff changeset
163 // RestrictKind the most restrictive can save us time. This way we reject
anatofuz
parents:
diff changeset
164 // invalid types earlier and we can elide the kind checks inside the
anatofuz
parents:
diff changeset
165 // matcher.
anatofuz
parents:
diff changeset
166 for (auto &IM : InnerMatchers) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
167 RestrictKind =
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
168 ASTNodeKind::getMostDerivedType(RestrictKind, IM.RestrictKind);
150
anatofuz
parents:
diff changeset
169 }
anatofuz
parents:
diff changeset
170 return DynTypedMatcher(
anatofuz
parents:
diff changeset
171 SupportedKind, RestrictKind,
anatofuz
parents:
diff changeset
172 new VariadicMatcher<AllOfVariadicOperator>(std::move(InnerMatchers)));
anatofuz
parents:
diff changeset
173
anatofuz
parents:
diff changeset
174 case VO_AnyOf:
anatofuz
parents:
diff changeset
175 return DynTypedMatcher(
anatofuz
parents:
diff changeset
176 SupportedKind, RestrictKind,
anatofuz
parents:
diff changeset
177 new VariadicMatcher<AnyOfVariadicOperator>(std::move(InnerMatchers)));
anatofuz
parents:
diff changeset
178
anatofuz
parents:
diff changeset
179 case VO_EachOf:
anatofuz
parents:
diff changeset
180 return DynTypedMatcher(
anatofuz
parents:
diff changeset
181 SupportedKind, RestrictKind,
anatofuz
parents:
diff changeset
182 new VariadicMatcher<EachOfVariadicOperator>(std::move(InnerMatchers)));
anatofuz
parents:
diff changeset
183
anatofuz
parents:
diff changeset
184 case VO_Optionally:
anatofuz
parents:
diff changeset
185 return DynTypedMatcher(SupportedKind, RestrictKind,
anatofuz
parents:
diff changeset
186 new VariadicMatcher<OptionallyVariadicOperator>(
anatofuz
parents:
diff changeset
187 std::move(InnerMatchers)));
anatofuz
parents:
diff changeset
188
anatofuz
parents:
diff changeset
189 case VO_UnaryNot:
anatofuz
parents:
diff changeset
190 // FIXME: Implement the Not operator to take a single matcher instead of a
anatofuz
parents:
diff changeset
191 // vector.
anatofuz
parents:
diff changeset
192 return DynTypedMatcher(
anatofuz
parents:
diff changeset
193 SupportedKind, RestrictKind,
anatofuz
parents:
diff changeset
194 new VariadicMatcher<NotUnaryOperator>(std::move(InnerMatchers)));
anatofuz
parents:
diff changeset
195 }
anatofuz
parents:
diff changeset
196 llvm_unreachable("Invalid Op value.");
anatofuz
parents:
diff changeset
197 }
anatofuz
parents:
diff changeset
198
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
199 DynTypedMatcher
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
200 DynTypedMatcher::constructRestrictedWrapper(const DynTypedMatcher &InnerMatcher,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
201 ASTNodeKind RestrictKind) {
150
anatofuz
parents:
diff changeset
202 DynTypedMatcher Copy = InnerMatcher;
anatofuz
parents:
diff changeset
203 Copy.RestrictKind = RestrictKind;
anatofuz
parents:
diff changeset
204 return Copy;
anatofuz
parents:
diff changeset
205 }
anatofuz
parents:
diff changeset
206
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
207 DynTypedMatcher DynTypedMatcher::trueMatcher(ASTNodeKind NodeKind) {
150
anatofuz
parents:
diff changeset
208 return DynTypedMatcher(NodeKind, NodeKind, &*TrueMatcherInstance);
anatofuz
parents:
diff changeset
209 }
anatofuz
parents:
diff changeset
210
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
211 bool DynTypedMatcher::canMatchNodesOfKind(ASTNodeKind Kind) const {
150
anatofuz
parents:
diff changeset
212 return RestrictKind.isBaseOf(Kind);
anatofuz
parents:
diff changeset
213 }
anatofuz
parents:
diff changeset
214
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
215 DynTypedMatcher DynTypedMatcher::dynCastTo(const ASTNodeKind Kind) const {
150
anatofuz
parents:
diff changeset
216 auto Copy = *this;
anatofuz
parents:
diff changeset
217 Copy.SupportedKind = Kind;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
218 Copy.RestrictKind = ASTNodeKind::getMostDerivedType(Kind, RestrictKind);
150
anatofuz
parents:
diff changeset
219 return Copy;
anatofuz
parents:
diff changeset
220 }
anatofuz
parents:
diff changeset
221
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
222 bool DynTypedMatcher::matches(const DynTypedNode &DynNode,
150
anatofuz
parents:
diff changeset
223 ASTMatchFinder *Finder,
anatofuz
parents:
diff changeset
224 BoundNodesTreeBuilder *Builder) const {
anatofuz
parents:
diff changeset
225 TraversalKindScope RAII(Finder->getASTContext(),
anatofuz
parents:
diff changeset
226 Implementation->TraversalKind());
anatofuz
parents:
diff changeset
227
anatofuz
parents:
diff changeset
228 auto N =
anatofuz
parents:
diff changeset
229 Finder->getASTContext().getParentMapContext().traverseIgnored(DynNode);
anatofuz
parents:
diff changeset
230
anatofuz
parents:
diff changeset
231 if (RestrictKind.isBaseOf(N.getNodeKind()) &&
anatofuz
parents:
diff changeset
232 Implementation->dynMatches(N, Finder, Builder)) {
anatofuz
parents:
diff changeset
233 return true;
anatofuz
parents:
diff changeset
234 }
anatofuz
parents:
diff changeset
235 // Delete all bindings when a matcher does not match.
anatofuz
parents:
diff changeset
236 // This prevents unexpected exposure of bound nodes in unmatches
anatofuz
parents:
diff changeset
237 // branches of the match tree.
anatofuz
parents:
diff changeset
238 Builder->removeBindings([](const BoundNodesMap &) { return true; });
anatofuz
parents:
diff changeset
239 return false;
anatofuz
parents:
diff changeset
240 }
anatofuz
parents:
diff changeset
241
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
242 bool DynTypedMatcher::matchesNoKindCheck(const DynTypedNode &DynNode,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
243 ASTMatchFinder *Finder,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
244 BoundNodesTreeBuilder *Builder) const {
150
anatofuz
parents:
diff changeset
245 TraversalKindScope raii(Finder->getASTContext(),
anatofuz
parents:
diff changeset
246 Implementation->TraversalKind());
anatofuz
parents:
diff changeset
247
anatofuz
parents:
diff changeset
248 auto N =
anatofuz
parents:
diff changeset
249 Finder->getASTContext().getParentMapContext().traverseIgnored(DynNode);
anatofuz
parents:
diff changeset
250
anatofuz
parents:
diff changeset
251 assert(RestrictKind.isBaseOf(N.getNodeKind()));
anatofuz
parents:
diff changeset
252 if (Implementation->dynMatches(N, Finder, Builder)) {
anatofuz
parents:
diff changeset
253 return true;
anatofuz
parents:
diff changeset
254 }
anatofuz
parents:
diff changeset
255 // Delete all bindings when a matcher does not match.
anatofuz
parents:
diff changeset
256 // This prevents unexpected exposure of bound nodes in unmatches
anatofuz
parents:
diff changeset
257 // branches of the match tree.
anatofuz
parents:
diff changeset
258 Builder->removeBindings([](const BoundNodesMap &) { return true; });
anatofuz
parents:
diff changeset
259 return false;
anatofuz
parents:
diff changeset
260 }
anatofuz
parents:
diff changeset
261
anatofuz
parents:
diff changeset
262 llvm::Optional<DynTypedMatcher> DynTypedMatcher::tryBind(StringRef ID) const {
anatofuz
parents:
diff changeset
263 if (!AllowBind) return llvm::None;
anatofuz
parents:
diff changeset
264 auto Result = *this;
anatofuz
parents:
diff changeset
265 Result.Implementation =
anatofuz
parents:
diff changeset
266 new IdDynMatcher(ID, std::move(Result.Implementation));
anatofuz
parents:
diff changeset
267 return std::move(Result);
anatofuz
parents:
diff changeset
268 }
anatofuz
parents:
diff changeset
269
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
270 bool DynTypedMatcher::canConvertTo(ASTNodeKind To) const {
150
anatofuz
parents:
diff changeset
271 const auto From = getSupportedKind();
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
272 auto QualKind = ASTNodeKind::getFromNodeKind<QualType>();
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
273 auto TypeKind = ASTNodeKind::getFromNodeKind<Type>();
150
anatofuz
parents:
diff changeset
274 /// Mimic the implicit conversions of Matcher<>.
anatofuz
parents:
diff changeset
275 /// - From Matcher<Type> to Matcher<QualType>
anatofuz
parents:
diff changeset
276 if (From.isSame(TypeKind) && To.isSame(QualKind)) return true;
anatofuz
parents:
diff changeset
277 /// - From Matcher<Base> to Matcher<Derived>
anatofuz
parents:
diff changeset
278 return From.isBaseOf(To);
anatofuz
parents:
diff changeset
279 }
anatofuz
parents:
diff changeset
280
anatofuz
parents:
diff changeset
281 void BoundNodesTreeBuilder::addMatch(const BoundNodesTreeBuilder &Other) {
anatofuz
parents:
diff changeset
282 Bindings.append(Other.Bindings.begin(), Other.Bindings.end());
anatofuz
parents:
diff changeset
283 }
anatofuz
parents:
diff changeset
284
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
285 bool NotUnaryOperator(const DynTypedNode &DynNode, ASTMatchFinder *Finder,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
286 BoundNodesTreeBuilder *Builder,
150
anatofuz
parents:
diff changeset
287 ArrayRef<DynTypedMatcher> InnerMatchers) {
anatofuz
parents:
diff changeset
288 if (InnerMatchers.size() != 1)
anatofuz
parents:
diff changeset
289 return false;
anatofuz
parents:
diff changeset
290
anatofuz
parents:
diff changeset
291 // The 'unless' matcher will always discard the result:
anatofuz
parents:
diff changeset
292 // If the inner matcher doesn't match, unless returns true,
anatofuz
parents:
diff changeset
293 // but the inner matcher cannot have bound anything.
anatofuz
parents:
diff changeset
294 // If the inner matcher matches, the result is false, and
anatofuz
parents:
diff changeset
295 // any possible binding will be discarded.
anatofuz
parents:
diff changeset
296 // We still need to hand in all the bound nodes up to this
anatofuz
parents:
diff changeset
297 // point so the inner matcher can depend on bound nodes,
anatofuz
parents:
diff changeset
298 // and we need to actively discard the bound nodes, otherwise
anatofuz
parents:
diff changeset
299 // the inner matcher will reset the bound nodes if it doesn't
anatofuz
parents:
diff changeset
300 // match, but this would be inversed by 'unless'.
anatofuz
parents:
diff changeset
301 BoundNodesTreeBuilder Discard(*Builder);
anatofuz
parents:
diff changeset
302 return !InnerMatchers[0].matches(DynNode, Finder, &Discard);
anatofuz
parents:
diff changeset
303 }
anatofuz
parents:
diff changeset
304
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
305 bool AllOfVariadicOperator(const DynTypedNode &DynNode, ASTMatchFinder *Finder,
150
anatofuz
parents:
diff changeset
306 BoundNodesTreeBuilder *Builder,
anatofuz
parents:
diff changeset
307 ArrayRef<DynTypedMatcher> InnerMatchers) {
anatofuz
parents:
diff changeset
308 // allOf leads to one matcher for each alternative in the first
anatofuz
parents:
diff changeset
309 // matcher combined with each alternative in the second matcher.
anatofuz
parents:
diff changeset
310 // Thus, we can reuse the same Builder.
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
311 return llvm::all_of(InnerMatchers, [&](const DynTypedMatcher &InnerMatcher) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
312 return InnerMatcher.matchesNoKindCheck(DynNode, Finder, Builder);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
313 });
150
anatofuz
parents:
diff changeset
314 }
anatofuz
parents:
diff changeset
315
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
316 bool EachOfVariadicOperator(const DynTypedNode &DynNode, ASTMatchFinder *Finder,
150
anatofuz
parents:
diff changeset
317 BoundNodesTreeBuilder *Builder,
anatofuz
parents:
diff changeset
318 ArrayRef<DynTypedMatcher> InnerMatchers) {
anatofuz
parents:
diff changeset
319 BoundNodesTreeBuilder Result;
anatofuz
parents:
diff changeset
320 bool Matched = false;
anatofuz
parents:
diff changeset
321 for (const DynTypedMatcher &InnerMatcher : InnerMatchers) {
anatofuz
parents:
diff changeset
322 BoundNodesTreeBuilder BuilderInner(*Builder);
anatofuz
parents:
diff changeset
323 if (InnerMatcher.matches(DynNode, Finder, &BuilderInner)) {
anatofuz
parents:
diff changeset
324 Matched = true;
anatofuz
parents:
diff changeset
325 Result.addMatch(BuilderInner);
anatofuz
parents:
diff changeset
326 }
anatofuz
parents:
diff changeset
327 }
anatofuz
parents:
diff changeset
328 *Builder = std::move(Result);
anatofuz
parents:
diff changeset
329 return Matched;
anatofuz
parents:
diff changeset
330 }
anatofuz
parents:
diff changeset
331
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
332 bool AnyOfVariadicOperator(const DynTypedNode &DynNode, ASTMatchFinder *Finder,
150
anatofuz
parents:
diff changeset
333 BoundNodesTreeBuilder *Builder,
anatofuz
parents:
diff changeset
334 ArrayRef<DynTypedMatcher> InnerMatchers) {
anatofuz
parents:
diff changeset
335 for (const DynTypedMatcher &InnerMatcher : InnerMatchers) {
anatofuz
parents:
diff changeset
336 BoundNodesTreeBuilder Result = *Builder;
anatofuz
parents:
diff changeset
337 if (InnerMatcher.matches(DynNode, Finder, &Result)) {
anatofuz
parents:
diff changeset
338 *Builder = std::move(Result);
anatofuz
parents:
diff changeset
339 return true;
anatofuz
parents:
diff changeset
340 }
anatofuz
parents:
diff changeset
341 }
anatofuz
parents:
diff changeset
342 return false;
anatofuz
parents:
diff changeset
343 }
anatofuz
parents:
diff changeset
344
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
345 bool OptionallyVariadicOperator(const DynTypedNode &DynNode,
150
anatofuz
parents:
diff changeset
346 ASTMatchFinder *Finder,
anatofuz
parents:
diff changeset
347 BoundNodesTreeBuilder *Builder,
anatofuz
parents:
diff changeset
348 ArrayRef<DynTypedMatcher> InnerMatchers) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
349 if (InnerMatchers.size() != 1)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
350 return false;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
351
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
352 BoundNodesTreeBuilder Result(*Builder);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
353 if (InnerMatchers[0].matches(DynNode, Finder, &Result))
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
354 *Builder = std::move(Result);
150
anatofuz
parents:
diff changeset
355 return true;
anatofuz
parents:
diff changeset
356 }
anatofuz
parents:
diff changeset
357
anatofuz
parents:
diff changeset
358 inline static
anatofuz
parents:
diff changeset
359 std::vector<std::string> vectorFromRefs(ArrayRef<const StringRef *> NameRefs) {
anatofuz
parents:
diff changeset
360 std::vector<std::string> Names;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
361 Names.reserve(NameRefs.size());
150
anatofuz
parents:
diff changeset
362 for (auto *Name : NameRefs)
anatofuz
parents:
diff changeset
363 Names.emplace_back(*Name);
anatofuz
parents:
diff changeset
364 return Names;
anatofuz
parents:
diff changeset
365 }
anatofuz
parents:
diff changeset
366
anatofuz
parents:
diff changeset
367 Matcher<NamedDecl> hasAnyNameFunc(ArrayRef<const StringRef *> NameRefs) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
368 return internal::Matcher<NamedDecl>(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
369 new internal::HasNameMatcher(vectorFromRefs(NameRefs)));
150
anatofuz
parents:
diff changeset
370 }
anatofuz
parents:
diff changeset
371
anatofuz
parents:
diff changeset
372 Matcher<ObjCMessageExpr> hasAnySelectorFunc(
anatofuz
parents:
diff changeset
373 ArrayRef<const StringRef *> NameRefs) {
anatofuz
parents:
diff changeset
374 return hasAnySelectorMatcher(vectorFromRefs(NameRefs));
anatofuz
parents:
diff changeset
375 }
anatofuz
parents:
diff changeset
376
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
377 HasOpNameMatcher hasAnyOperatorNameFunc(ArrayRef<const StringRef *> NameRefs) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
378 return HasOpNameMatcher(vectorFromRefs(NameRefs));
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
379 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
380
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
381 HasOverloadOpNameMatcher
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
382 hasAnyOverloadedOperatorNameFunc(ArrayRef<const StringRef *> NameRefs) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
383 return HasOverloadOpNameMatcher(vectorFromRefs(NameRefs));
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
384 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
385
150
anatofuz
parents:
diff changeset
386 HasNameMatcher::HasNameMatcher(std::vector<std::string> N)
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
387 : UseUnqualifiedMatch(llvm::all_of(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
388 N, [](StringRef Name) { return Name.find("::") == Name.npos; })),
150
anatofuz
parents:
diff changeset
389 Names(std::move(N)) {
anatofuz
parents:
diff changeset
390 #ifndef NDEBUG
anatofuz
parents:
diff changeset
391 for (StringRef Name : Names)
anatofuz
parents:
diff changeset
392 assert(!Name.empty());
anatofuz
parents:
diff changeset
393 #endif
anatofuz
parents:
diff changeset
394 }
anatofuz
parents:
diff changeset
395
anatofuz
parents:
diff changeset
396 static bool consumeNameSuffix(StringRef &FullName, StringRef Suffix) {
anatofuz
parents:
diff changeset
397 StringRef Name = FullName;
anatofuz
parents:
diff changeset
398 if (!Name.endswith(Suffix))
anatofuz
parents:
diff changeset
399 return false;
anatofuz
parents:
diff changeset
400 Name = Name.drop_back(Suffix.size());
anatofuz
parents:
diff changeset
401 if (!Name.empty()) {
anatofuz
parents:
diff changeset
402 if (!Name.endswith("::"))
anatofuz
parents:
diff changeset
403 return false;
anatofuz
parents:
diff changeset
404 Name = Name.drop_back(2);
anatofuz
parents:
diff changeset
405 }
anatofuz
parents:
diff changeset
406 FullName = Name;
anatofuz
parents:
diff changeset
407 return true;
anatofuz
parents:
diff changeset
408 }
anatofuz
parents:
diff changeset
409
anatofuz
parents:
diff changeset
410 static StringRef getNodeName(const NamedDecl &Node,
anatofuz
parents:
diff changeset
411 llvm::SmallString<128> &Scratch) {
anatofuz
parents:
diff changeset
412 // Simple name.
anatofuz
parents:
diff changeset
413 if (Node.getIdentifier())
anatofuz
parents:
diff changeset
414 return Node.getName();
anatofuz
parents:
diff changeset
415
anatofuz
parents:
diff changeset
416 if (Node.getDeclName()) {
anatofuz
parents:
diff changeset
417 // Name needs to be constructed.
anatofuz
parents:
diff changeset
418 Scratch.clear();
anatofuz
parents:
diff changeset
419 llvm::raw_svector_ostream OS(Scratch);
anatofuz
parents:
diff changeset
420 Node.printName(OS);
anatofuz
parents:
diff changeset
421 return OS.str();
anatofuz
parents:
diff changeset
422 }
anatofuz
parents:
diff changeset
423
anatofuz
parents:
diff changeset
424 return "(anonymous)";
anatofuz
parents:
diff changeset
425 }
anatofuz
parents:
diff changeset
426
anatofuz
parents:
diff changeset
427 static StringRef getNodeName(const RecordDecl &Node,
anatofuz
parents:
diff changeset
428 llvm::SmallString<128> &Scratch) {
anatofuz
parents:
diff changeset
429 if (Node.getIdentifier()) {
anatofuz
parents:
diff changeset
430 return Node.getName();
anatofuz
parents:
diff changeset
431 }
anatofuz
parents:
diff changeset
432 Scratch.clear();
anatofuz
parents:
diff changeset
433 return ("(anonymous " + Node.getKindName() + ")").toStringRef(Scratch);
anatofuz
parents:
diff changeset
434 }
anatofuz
parents:
diff changeset
435
anatofuz
parents:
diff changeset
436 static StringRef getNodeName(const NamespaceDecl &Node,
anatofuz
parents:
diff changeset
437 llvm::SmallString<128> &Scratch) {
anatofuz
parents:
diff changeset
438 return Node.isAnonymousNamespace() ? "(anonymous namespace)" : Node.getName();
anatofuz
parents:
diff changeset
439 }
anatofuz
parents:
diff changeset
440
anatofuz
parents:
diff changeset
441 namespace {
anatofuz
parents:
diff changeset
442
anatofuz
parents:
diff changeset
443 class PatternSet {
anatofuz
parents:
diff changeset
444 public:
anatofuz
parents:
diff changeset
445 PatternSet(ArrayRef<std::string> Names) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
446 Patterns.reserve(Names.size());
150
anatofuz
parents:
diff changeset
447 for (StringRef Name : Names)
anatofuz
parents:
diff changeset
448 Patterns.push_back({Name, Name.startswith("::")});
anatofuz
parents:
diff changeset
449 }
anatofuz
parents:
diff changeset
450
anatofuz
parents:
diff changeset
451 /// Consumes the name suffix from each pattern in the set and removes the ones
anatofuz
parents:
diff changeset
452 /// that didn't match.
anatofuz
parents:
diff changeset
453 /// Return true if there are still any patterns left.
anatofuz
parents:
diff changeset
454 bool consumeNameSuffix(StringRef NodeName, bool CanSkip) {
anatofuz
parents:
diff changeset
455 for (size_t I = 0; I < Patterns.size();) {
anatofuz
parents:
diff changeset
456 if (::clang::ast_matchers::internal::consumeNameSuffix(Patterns[I].P,
anatofuz
parents:
diff changeset
457 NodeName) ||
anatofuz
parents:
diff changeset
458 CanSkip) {
anatofuz
parents:
diff changeset
459 ++I;
anatofuz
parents:
diff changeset
460 } else {
anatofuz
parents:
diff changeset
461 Patterns.erase(Patterns.begin() + I);
anatofuz
parents:
diff changeset
462 }
anatofuz
parents:
diff changeset
463 }
anatofuz
parents:
diff changeset
464 return !Patterns.empty();
anatofuz
parents:
diff changeset
465 }
anatofuz
parents:
diff changeset
466
anatofuz
parents:
diff changeset
467 /// Check if any of the patterns are a match.
anatofuz
parents:
diff changeset
468 /// A match will be a pattern that was fully consumed, that also matches the
anatofuz
parents:
diff changeset
469 /// 'fully qualified' requirement.
anatofuz
parents:
diff changeset
470 bool foundMatch(bool AllowFullyQualified) const {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
471 return llvm::any_of(Patterns, [&](const Pattern &Pattern) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
472 return Pattern.P.empty() &&
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
473 (AllowFullyQualified || !Pattern.IsFullyQualified);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
474 });
150
anatofuz
parents:
diff changeset
475 }
anatofuz
parents:
diff changeset
476
anatofuz
parents:
diff changeset
477 private:
anatofuz
parents:
diff changeset
478 struct Pattern {
anatofuz
parents:
diff changeset
479 StringRef P;
anatofuz
parents:
diff changeset
480 bool IsFullyQualified;
anatofuz
parents:
diff changeset
481 };
anatofuz
parents:
diff changeset
482
anatofuz
parents:
diff changeset
483 llvm::SmallVector<Pattern, 8> Patterns;
anatofuz
parents:
diff changeset
484 };
anatofuz
parents:
diff changeset
485
anatofuz
parents:
diff changeset
486 } // namespace
anatofuz
parents:
diff changeset
487
anatofuz
parents:
diff changeset
488 bool HasNameMatcher::matchesNodeUnqualified(const NamedDecl &Node) const {
anatofuz
parents:
diff changeset
489 assert(UseUnqualifiedMatch);
anatofuz
parents:
diff changeset
490 llvm::SmallString<128> Scratch;
anatofuz
parents:
diff changeset
491 StringRef NodeName = getNodeName(Node, Scratch);
anatofuz
parents:
diff changeset
492 return llvm::any_of(Names, [&](StringRef Name) {
anatofuz
parents:
diff changeset
493 return consumeNameSuffix(Name, NodeName) && Name.empty();
anatofuz
parents:
diff changeset
494 });
anatofuz
parents:
diff changeset
495 }
anatofuz
parents:
diff changeset
496
anatofuz
parents:
diff changeset
497 bool HasNameMatcher::matchesNodeFullFast(const NamedDecl &Node) const {
anatofuz
parents:
diff changeset
498 PatternSet Patterns(Names);
anatofuz
parents:
diff changeset
499 llvm::SmallString<128> Scratch;
anatofuz
parents:
diff changeset
500
anatofuz
parents:
diff changeset
501 // This function is copied and adapted from NamedDecl::printQualifiedName()
anatofuz
parents:
diff changeset
502 // By matching each part individually we optimize in a couple of ways:
anatofuz
parents:
diff changeset
503 // - We can exit early on the first failure.
anatofuz
parents:
diff changeset
504 // - We can skip inline/anonymous namespaces without another pass.
anatofuz
parents:
diff changeset
505 // - We print one name at a time, reducing the chance of overflowing the
anatofuz
parents:
diff changeset
506 // inlined space of the SmallString.
anatofuz
parents:
diff changeset
507
anatofuz
parents:
diff changeset
508 // First, match the name.
anatofuz
parents:
diff changeset
509 if (!Patterns.consumeNameSuffix(getNodeName(Node, Scratch),
anatofuz
parents:
diff changeset
510 /*CanSkip=*/false))
anatofuz
parents:
diff changeset
511 return false;
anatofuz
parents:
diff changeset
512
anatofuz
parents:
diff changeset
513 // Try to match each declaration context.
anatofuz
parents:
diff changeset
514 // We are allowed to skip anonymous and inline namespaces if they don't match.
anatofuz
parents:
diff changeset
515 const DeclContext *Ctx = Node.getDeclContext();
anatofuz
parents:
diff changeset
516
anatofuz
parents:
diff changeset
517 if (Ctx->isFunctionOrMethod())
anatofuz
parents:
diff changeset
518 return Patterns.foundMatch(/*AllowFullyQualified=*/false);
anatofuz
parents:
diff changeset
519
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
520 for (; Ctx; Ctx = Ctx->getParent()) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
521 // Linkage Spec can just be ignored
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
522 // FIXME: Any other DeclContext kinds that can be safely disregarded
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
523 if (isa<LinkageSpecDecl>(Ctx))
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
524 continue;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
525 if (!isa<NamedDecl>(Ctx))
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
526 break;
150
anatofuz
parents:
diff changeset
527 if (Patterns.foundMatch(/*AllowFullyQualified=*/false))
anatofuz
parents:
diff changeset
528 return true;
anatofuz
parents:
diff changeset
529
anatofuz
parents:
diff changeset
530 if (const auto *ND = dyn_cast<NamespaceDecl>(Ctx)) {
anatofuz
parents:
diff changeset
531 // If it matches (or we can skip it), continue.
anatofuz
parents:
diff changeset
532 if (Patterns.consumeNameSuffix(getNodeName(*ND, Scratch),
anatofuz
parents:
diff changeset
533 /*CanSkip=*/ND->isAnonymousNamespace() ||
anatofuz
parents:
diff changeset
534 ND->isInline()))
anatofuz
parents:
diff changeset
535 continue;
anatofuz
parents:
diff changeset
536 return false;
anatofuz
parents:
diff changeset
537 }
anatofuz
parents:
diff changeset
538 if (const auto *RD = dyn_cast<RecordDecl>(Ctx)) {
anatofuz
parents:
diff changeset
539 if (!isa<ClassTemplateSpecializationDecl>(Ctx)) {
anatofuz
parents:
diff changeset
540 if (Patterns.consumeNameSuffix(getNodeName(*RD, Scratch),
anatofuz
parents:
diff changeset
541 /*CanSkip=*/false))
anatofuz
parents:
diff changeset
542 continue;
anatofuz
parents:
diff changeset
543
anatofuz
parents:
diff changeset
544 return false;
anatofuz
parents:
diff changeset
545 }
anatofuz
parents:
diff changeset
546 }
anatofuz
parents:
diff changeset
547
anatofuz
parents:
diff changeset
548 // We don't know how to deal with this DeclContext.
anatofuz
parents:
diff changeset
549 // Fallback to the slow version of the code.
anatofuz
parents:
diff changeset
550 return matchesNodeFullSlow(Node);
anatofuz
parents:
diff changeset
551 }
anatofuz
parents:
diff changeset
552
anatofuz
parents:
diff changeset
553 return Patterns.foundMatch(/*AllowFullyQualified=*/true);
anatofuz
parents:
diff changeset
554 }
anatofuz
parents:
diff changeset
555
anatofuz
parents:
diff changeset
556 bool HasNameMatcher::matchesNodeFullSlow(const NamedDecl &Node) const {
anatofuz
parents:
diff changeset
557 const bool SkipUnwrittenCases[] = {false, true};
anatofuz
parents:
diff changeset
558 for (bool SkipUnwritten : SkipUnwrittenCases) {
anatofuz
parents:
diff changeset
559 llvm::SmallString<128> NodeName = StringRef("::");
anatofuz
parents:
diff changeset
560 llvm::raw_svector_ostream OS(NodeName);
anatofuz
parents:
diff changeset
561
anatofuz
parents:
diff changeset
562 if (SkipUnwritten) {
anatofuz
parents:
diff changeset
563 PrintingPolicy Policy = Node.getASTContext().getPrintingPolicy();
anatofuz
parents:
diff changeset
564 Policy.SuppressUnwrittenScope = true;
anatofuz
parents:
diff changeset
565 Node.printQualifiedName(OS, Policy);
anatofuz
parents:
diff changeset
566 } else {
anatofuz
parents:
diff changeset
567 Node.printQualifiedName(OS);
anatofuz
parents:
diff changeset
568 }
anatofuz
parents:
diff changeset
569
anatofuz
parents:
diff changeset
570 const StringRef FullName = OS.str();
anatofuz
parents:
diff changeset
571
anatofuz
parents:
diff changeset
572 for (const StringRef Pattern : Names) {
anatofuz
parents:
diff changeset
573 if (Pattern.startswith("::")) {
anatofuz
parents:
diff changeset
574 if (FullName == Pattern)
anatofuz
parents:
diff changeset
575 return true;
anatofuz
parents:
diff changeset
576 } else if (FullName.endswith(Pattern) &&
anatofuz
parents:
diff changeset
577 FullName.drop_back(Pattern.size()).endswith("::")) {
anatofuz
parents:
diff changeset
578 return true;
anatofuz
parents:
diff changeset
579 }
anatofuz
parents:
diff changeset
580 }
anatofuz
parents:
diff changeset
581 }
anatofuz
parents:
diff changeset
582
anatofuz
parents:
diff changeset
583 return false;
anatofuz
parents:
diff changeset
584 }
anatofuz
parents:
diff changeset
585
anatofuz
parents:
diff changeset
586 bool HasNameMatcher::matchesNode(const NamedDecl &Node) const {
anatofuz
parents:
diff changeset
587 assert(matchesNodeFullFast(Node) == matchesNodeFullSlow(Node));
anatofuz
parents:
diff changeset
588 if (UseUnqualifiedMatch) {
anatofuz
parents:
diff changeset
589 assert(matchesNodeUnqualified(Node) == matchesNodeFullFast(Node));
anatofuz
parents:
diff changeset
590 return matchesNodeUnqualified(Node);
anatofuz
parents:
diff changeset
591 }
anatofuz
parents:
diff changeset
592 return matchesNodeFullFast(Node);
anatofuz
parents:
diff changeset
593 }
anatofuz
parents:
diff changeset
594
anatofuz
parents:
diff changeset
595 // Checks whether \p Loc points to a token with source text of \p TokenText.
anatofuz
parents:
diff changeset
596 static bool isTokenAtLoc(const SourceManager &SM, const LangOptions &LangOpts,
anatofuz
parents:
diff changeset
597 StringRef Text, SourceLocation Loc) {
anatofuz
parents:
diff changeset
598 llvm::SmallString<16> Buffer;
anatofuz
parents:
diff changeset
599 bool Invalid = false;
anatofuz
parents:
diff changeset
600 // Since `Loc` may point into an expansion buffer, which has no corresponding
anatofuz
parents:
diff changeset
601 // source, we need to look at the spelling location to read the actual source.
anatofuz
parents:
diff changeset
602 StringRef TokenText = Lexer::getSpelling(SM.getSpellingLoc(Loc), Buffer, SM,
anatofuz
parents:
diff changeset
603 LangOpts, &Invalid);
anatofuz
parents:
diff changeset
604 return !Invalid && Text == TokenText;
anatofuz
parents:
diff changeset
605 }
anatofuz
parents:
diff changeset
606
anatofuz
parents:
diff changeset
607 llvm::Optional<SourceLocation>
anatofuz
parents:
diff changeset
608 getExpansionLocOfMacro(StringRef MacroName, SourceLocation Loc,
anatofuz
parents:
diff changeset
609 const ASTContext &Context) {
anatofuz
parents:
diff changeset
610 auto &SM = Context.getSourceManager();
anatofuz
parents:
diff changeset
611 const LangOptions &LangOpts = Context.getLangOpts();
anatofuz
parents:
diff changeset
612 while (Loc.isMacroID()) {
anatofuz
parents:
diff changeset
613 SrcMgr::ExpansionInfo Expansion =
anatofuz
parents:
diff changeset
614 SM.getSLocEntry(SM.getFileID(Loc)).getExpansion();
anatofuz
parents:
diff changeset
615 if (Expansion.isMacroArgExpansion())
anatofuz
parents:
diff changeset
616 // Check macro argument for an expansion of the given macro. For example,
anatofuz
parents:
diff changeset
617 // `F(G(3))`, where `MacroName` is `G`.
anatofuz
parents:
diff changeset
618 if (llvm::Optional<SourceLocation> ArgLoc = getExpansionLocOfMacro(
anatofuz
parents:
diff changeset
619 MacroName, Expansion.getSpellingLoc(), Context))
anatofuz
parents:
diff changeset
620 return ArgLoc;
anatofuz
parents:
diff changeset
621 Loc = Expansion.getExpansionLocStart();
anatofuz
parents:
diff changeset
622 if (isTokenAtLoc(SM, LangOpts, MacroName, Loc))
anatofuz
parents:
diff changeset
623 return Loc;
anatofuz
parents:
diff changeset
624 }
anatofuz
parents:
diff changeset
625 return llvm::None;
anatofuz
parents:
diff changeset
626 }
anatofuz
parents:
diff changeset
627
anatofuz
parents:
diff changeset
628 } // end namespace internal
anatofuz
parents:
diff changeset
629
anatofuz
parents:
diff changeset
630 const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAutoreleasePoolStmt>
anatofuz
parents:
diff changeset
631 autoreleasePoolStmt;
anatofuz
parents:
diff changeset
632 const internal::VariadicDynCastAllOfMatcher<Decl, TranslationUnitDecl>
anatofuz
parents:
diff changeset
633 translationUnitDecl;
anatofuz
parents:
diff changeset
634 const internal::VariadicDynCastAllOfMatcher<Decl, TypedefDecl> typedefDecl;
anatofuz
parents:
diff changeset
635 const internal::VariadicDynCastAllOfMatcher<Decl, TypedefNameDecl>
anatofuz
parents:
diff changeset
636 typedefNameDecl;
anatofuz
parents:
diff changeset
637 const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasDecl> typeAliasDecl;
anatofuz
parents:
diff changeset
638 const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasTemplateDecl>
anatofuz
parents:
diff changeset
639 typeAliasTemplateDecl;
anatofuz
parents:
diff changeset
640 const internal::VariadicAllOfMatcher<Decl> decl;
anatofuz
parents:
diff changeset
641 const internal::VariadicDynCastAllOfMatcher<Decl, LinkageSpecDecl>
anatofuz
parents:
diff changeset
642 linkageSpecDecl;
anatofuz
parents:
diff changeset
643 const internal::VariadicDynCastAllOfMatcher<Decl, NamedDecl> namedDecl;
anatofuz
parents:
diff changeset
644 const internal::VariadicDynCastAllOfMatcher<Decl, LabelDecl> labelDecl;
anatofuz
parents:
diff changeset
645 const internal::VariadicDynCastAllOfMatcher<Decl, NamespaceDecl> namespaceDecl;
anatofuz
parents:
diff changeset
646 const internal::VariadicDynCastAllOfMatcher<Decl, NamespaceAliasDecl>
anatofuz
parents:
diff changeset
647 namespaceAliasDecl;
anatofuz
parents:
diff changeset
648 const internal::VariadicDynCastAllOfMatcher<Decl, RecordDecl> recordDecl;
anatofuz
parents:
diff changeset
649 const internal::VariadicDynCastAllOfMatcher<Decl, CXXRecordDecl> cxxRecordDecl;
anatofuz
parents:
diff changeset
650 const internal::VariadicDynCastAllOfMatcher<Decl, ClassTemplateDecl>
anatofuz
parents:
diff changeset
651 classTemplateDecl;
anatofuz
parents:
diff changeset
652 const internal::VariadicDynCastAllOfMatcher<Decl,
anatofuz
parents:
diff changeset
653 ClassTemplateSpecializationDecl>
anatofuz
parents:
diff changeset
654 classTemplateSpecializationDecl;
anatofuz
parents:
diff changeset
655 const internal::VariadicDynCastAllOfMatcher<
anatofuz
parents:
diff changeset
656 Decl, ClassTemplatePartialSpecializationDecl>
anatofuz
parents:
diff changeset
657 classTemplatePartialSpecializationDecl;
anatofuz
parents:
diff changeset
658 const internal::VariadicDynCastAllOfMatcher<Decl, DeclaratorDecl>
anatofuz
parents:
diff changeset
659 declaratorDecl;
anatofuz
parents:
diff changeset
660 const internal::VariadicDynCastAllOfMatcher<Decl, ParmVarDecl> parmVarDecl;
anatofuz
parents:
diff changeset
661 const internal::VariadicDynCastAllOfMatcher<Decl, AccessSpecDecl>
anatofuz
parents:
diff changeset
662 accessSpecDecl;
anatofuz
parents:
diff changeset
663 const internal::VariadicAllOfMatcher<CXXCtorInitializer> cxxCtorInitializer;
anatofuz
parents:
diff changeset
664 const internal::VariadicAllOfMatcher<TemplateArgument> templateArgument;
anatofuz
parents:
diff changeset
665 const internal::VariadicAllOfMatcher<TemplateName> templateName;
anatofuz
parents:
diff changeset
666 const internal::VariadicDynCastAllOfMatcher<Decl, NonTypeTemplateParmDecl>
anatofuz
parents:
diff changeset
667 nonTypeTemplateParmDecl;
anatofuz
parents:
diff changeset
668 const internal::VariadicDynCastAllOfMatcher<Decl, TemplateTypeParmDecl>
anatofuz
parents:
diff changeset
669 templateTypeParmDecl;
anatofuz
parents:
diff changeset
670 const internal::VariadicAllOfMatcher<QualType> qualType;
anatofuz
parents:
diff changeset
671 const internal::VariadicAllOfMatcher<Type> type;
anatofuz
parents:
diff changeset
672 const internal::VariadicAllOfMatcher<TypeLoc> typeLoc;
anatofuz
parents:
diff changeset
673 const internal::VariadicDynCastAllOfMatcher<Stmt, UnaryExprOrTypeTraitExpr>
anatofuz
parents:
diff changeset
674 unaryExprOrTypeTraitExpr;
anatofuz
parents:
diff changeset
675 const internal::VariadicDynCastAllOfMatcher<Decl, ValueDecl> valueDecl;
anatofuz
parents:
diff changeset
676 const internal::VariadicDynCastAllOfMatcher<Decl, CXXConstructorDecl>
anatofuz
parents:
diff changeset
677 cxxConstructorDecl;
anatofuz
parents:
diff changeset
678 const internal::VariadicDynCastAllOfMatcher<Decl, CXXDestructorDecl>
anatofuz
parents:
diff changeset
679 cxxDestructorDecl;
anatofuz
parents:
diff changeset
680 const internal::VariadicDynCastAllOfMatcher<Decl, EnumDecl> enumDecl;
anatofuz
parents:
diff changeset
681 const internal::VariadicDynCastAllOfMatcher<Decl, EnumConstantDecl>
anatofuz
parents:
diff changeset
682 enumConstantDecl;
anatofuz
parents:
diff changeset
683 const internal::VariadicDynCastAllOfMatcher<Decl, TagDecl> tagDecl;
anatofuz
parents:
diff changeset
684 const internal::VariadicDynCastAllOfMatcher<Decl, CXXMethodDecl> cxxMethodDecl;
anatofuz
parents:
diff changeset
685 const internal::VariadicDynCastAllOfMatcher<Decl, CXXConversionDecl>
anatofuz
parents:
diff changeset
686 cxxConversionDecl;
anatofuz
parents:
diff changeset
687 const internal::VariadicDynCastAllOfMatcher<Decl, VarDecl> varDecl;
anatofuz
parents:
diff changeset
688 const internal::VariadicDynCastAllOfMatcher<Decl, FieldDecl> fieldDecl;
anatofuz
parents:
diff changeset
689 const internal::VariadicDynCastAllOfMatcher<Decl, IndirectFieldDecl>
anatofuz
parents:
diff changeset
690 indirectFieldDecl;
anatofuz
parents:
diff changeset
691 const internal::VariadicDynCastAllOfMatcher<Decl, FunctionDecl> functionDecl;
anatofuz
parents:
diff changeset
692 const internal::VariadicDynCastAllOfMatcher<Decl, FunctionTemplateDecl>
anatofuz
parents:
diff changeset
693 functionTemplateDecl;
anatofuz
parents:
diff changeset
694 const internal::VariadicDynCastAllOfMatcher<Decl, FriendDecl> friendDecl;
anatofuz
parents:
diff changeset
695 const internal::VariadicAllOfMatcher<Stmt> stmt;
anatofuz
parents:
diff changeset
696 const internal::VariadicDynCastAllOfMatcher<Stmt, DeclStmt> declStmt;
anatofuz
parents:
diff changeset
697 const internal::VariadicDynCastAllOfMatcher<Stmt, MemberExpr> memberExpr;
anatofuz
parents:
diff changeset
698 const internal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedMemberExpr>
anatofuz
parents:
diff changeset
699 unresolvedMemberExpr;
anatofuz
parents:
diff changeset
700 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDependentScopeMemberExpr>
anatofuz
parents:
diff changeset
701 cxxDependentScopeMemberExpr;
anatofuz
parents:
diff changeset
702 const internal::VariadicDynCastAllOfMatcher<Stmt, CallExpr> callExpr;
anatofuz
parents:
diff changeset
703 const internal::VariadicDynCastAllOfMatcher<Stmt, LambdaExpr> lambdaExpr;
anatofuz
parents:
diff changeset
704 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXMemberCallExpr>
anatofuz
parents:
diff changeset
705 cxxMemberCallExpr;
anatofuz
parents:
diff changeset
706 const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCMessageExpr>
anatofuz
parents:
diff changeset
707 objcMessageExpr;
anatofuz
parents:
diff changeset
708 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCInterfaceDecl>
anatofuz
parents:
diff changeset
709 objcInterfaceDecl;
anatofuz
parents:
diff changeset
710 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCImplementationDecl>
anatofuz
parents:
diff changeset
711 objcImplementationDecl;
anatofuz
parents:
diff changeset
712 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCProtocolDecl>
anatofuz
parents:
diff changeset
713 objcProtocolDecl;
anatofuz
parents:
diff changeset
714 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryDecl>
anatofuz
parents:
diff changeset
715 objcCategoryDecl;
anatofuz
parents:
diff changeset
716 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryImplDecl>
anatofuz
parents:
diff changeset
717 objcCategoryImplDecl;
anatofuz
parents:
diff changeset
718 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCMethodDecl>
anatofuz
parents:
diff changeset
719 objcMethodDecl;
anatofuz
parents:
diff changeset
720 const internal::VariadicDynCastAllOfMatcher<Decl, BlockDecl>
anatofuz
parents:
diff changeset
721 blockDecl;
anatofuz
parents:
diff changeset
722 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCIvarDecl> objcIvarDecl;
anatofuz
parents:
diff changeset
723 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCPropertyDecl>
anatofuz
parents:
diff changeset
724 objcPropertyDecl;
anatofuz
parents:
diff changeset
725 const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtThrowStmt>
anatofuz
parents:
diff changeset
726 objcThrowStmt;
anatofuz
parents:
diff changeset
727 const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtTryStmt> objcTryStmt;
anatofuz
parents:
diff changeset
728 const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtCatchStmt>
anatofuz
parents:
diff changeset
729 objcCatchStmt;
anatofuz
parents:
diff changeset
730 const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtFinallyStmt>
anatofuz
parents:
diff changeset
731 objcFinallyStmt;
anatofuz
parents:
diff changeset
732 const internal::VariadicDynCastAllOfMatcher<Stmt, ExprWithCleanups>
anatofuz
parents:
diff changeset
733 exprWithCleanups;
anatofuz
parents:
diff changeset
734 const internal::VariadicDynCastAllOfMatcher<Stmt, InitListExpr> initListExpr;
anatofuz
parents:
diff changeset
735 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXStdInitializerListExpr>
anatofuz
parents:
diff changeset
736 cxxStdInitializerListExpr;
anatofuz
parents:
diff changeset
737 const internal::VariadicDynCastAllOfMatcher<Stmt, ImplicitValueInitExpr>
anatofuz
parents:
diff changeset
738 implicitValueInitExpr;
anatofuz
parents:
diff changeset
739 const internal::VariadicDynCastAllOfMatcher<Stmt, ParenListExpr> parenListExpr;
anatofuz
parents:
diff changeset
740 const internal::VariadicDynCastAllOfMatcher<Stmt, SubstNonTypeTemplateParmExpr>
anatofuz
parents:
diff changeset
741 substNonTypeTemplateParmExpr;
anatofuz
parents:
diff changeset
742 const internal::VariadicDynCastAllOfMatcher<Decl, UsingDecl> usingDecl;
anatofuz
parents:
diff changeset
743 const internal::VariadicDynCastAllOfMatcher<Decl, UsingDirectiveDecl>
anatofuz
parents:
diff changeset
744 usingDirectiveDecl;
anatofuz
parents:
diff changeset
745 const internal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedLookupExpr>
anatofuz
parents:
diff changeset
746 unresolvedLookupExpr;
anatofuz
parents:
diff changeset
747 const internal::VariadicDynCastAllOfMatcher<Decl, UnresolvedUsingValueDecl>
anatofuz
parents:
diff changeset
748 unresolvedUsingValueDecl;
anatofuz
parents:
diff changeset
749 const internal::VariadicDynCastAllOfMatcher<Decl, UnresolvedUsingTypenameDecl>
anatofuz
parents:
diff changeset
750 unresolvedUsingTypenameDecl;
anatofuz
parents:
diff changeset
751 const internal::VariadicDynCastAllOfMatcher<Stmt, ConstantExpr> constantExpr;
anatofuz
parents:
diff changeset
752 const internal::VariadicDynCastAllOfMatcher<Stmt, ParenExpr> parenExpr;
anatofuz
parents:
diff changeset
753 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXConstructExpr>
anatofuz
parents:
diff changeset
754 cxxConstructExpr;
anatofuz
parents:
diff changeset
755 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXUnresolvedConstructExpr>
anatofuz
parents:
diff changeset
756 cxxUnresolvedConstructExpr;
anatofuz
parents:
diff changeset
757 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThisExpr> cxxThisExpr;
anatofuz
parents:
diff changeset
758 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBindTemporaryExpr>
anatofuz
parents:
diff changeset
759 cxxBindTemporaryExpr;
anatofuz
parents:
diff changeset
760 const internal::VariadicDynCastAllOfMatcher<Stmt, MaterializeTemporaryExpr>
anatofuz
parents:
diff changeset
761 materializeTemporaryExpr;
anatofuz
parents:
diff changeset
762 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNewExpr> cxxNewExpr;
anatofuz
parents:
diff changeset
763 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDeleteExpr> cxxDeleteExpr;
anatofuz
parents:
diff changeset
764 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNoexceptExpr>
anatofuz
parents:
diff changeset
765 cxxNoexceptExpr;
anatofuz
parents:
diff changeset
766 const internal::VariadicDynCastAllOfMatcher<Stmt, ArraySubscriptExpr>
anatofuz
parents:
diff changeset
767 arraySubscriptExpr;
anatofuz
parents:
diff changeset
768 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDefaultArgExpr>
anatofuz
parents:
diff changeset
769 cxxDefaultArgExpr;
anatofuz
parents:
diff changeset
770 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXOperatorCallExpr>
anatofuz
parents:
diff changeset
771 cxxOperatorCallExpr;
anatofuz
parents:
diff changeset
772 const internal::VariadicDynCastAllOfMatcher<Stmt, Expr> expr;
anatofuz
parents:
diff changeset
773 const internal::VariadicDynCastAllOfMatcher<Stmt, DeclRefExpr> declRefExpr;
anatofuz
parents:
diff changeset
774 const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCIvarRefExpr> objcIvarRefExpr;
anatofuz
parents:
diff changeset
775 const internal::VariadicDynCastAllOfMatcher<Stmt, BlockExpr> blockExpr;
anatofuz
parents:
diff changeset
776 const internal::VariadicDynCastAllOfMatcher<Stmt, IfStmt> ifStmt;
anatofuz
parents:
diff changeset
777 const internal::VariadicDynCastAllOfMatcher<Stmt, ForStmt> forStmt;
anatofuz
parents:
diff changeset
778 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXForRangeStmt>
anatofuz
parents:
diff changeset
779 cxxForRangeStmt;
anatofuz
parents:
diff changeset
780 const internal::VariadicDynCastAllOfMatcher<Stmt, WhileStmt> whileStmt;
anatofuz
parents:
diff changeset
781 const internal::VariadicDynCastAllOfMatcher<Stmt, DoStmt> doStmt;
anatofuz
parents:
diff changeset
782 const internal::VariadicDynCastAllOfMatcher<Stmt, BreakStmt> breakStmt;
anatofuz
parents:
diff changeset
783 const internal::VariadicDynCastAllOfMatcher<Stmt, ContinueStmt> continueStmt;
anatofuz
parents:
diff changeset
784 const internal::VariadicDynCastAllOfMatcher<Stmt, ReturnStmt> returnStmt;
anatofuz
parents:
diff changeset
785 const internal::VariadicDynCastAllOfMatcher<Stmt, GotoStmt> gotoStmt;
anatofuz
parents:
diff changeset
786 const internal::VariadicDynCastAllOfMatcher<Stmt, LabelStmt> labelStmt;
anatofuz
parents:
diff changeset
787 const internal::VariadicDynCastAllOfMatcher<Stmt, AddrLabelExpr> addrLabelExpr;
anatofuz
parents:
diff changeset
788 const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchStmt> switchStmt;
anatofuz
parents:
diff changeset
789 const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchCase> switchCase;
anatofuz
parents:
diff changeset
790 const internal::VariadicDynCastAllOfMatcher<Stmt, CaseStmt> caseStmt;
anatofuz
parents:
diff changeset
791 const internal::VariadicDynCastAllOfMatcher<Stmt, DefaultStmt> defaultStmt;
anatofuz
parents:
diff changeset
792 const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundStmt> compoundStmt;
anatofuz
parents:
diff changeset
793 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXCatchStmt> cxxCatchStmt;
anatofuz
parents:
diff changeset
794 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTryStmt> cxxTryStmt;
anatofuz
parents:
diff changeset
795 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThrowExpr> cxxThrowExpr;
anatofuz
parents:
diff changeset
796 const internal::VariadicDynCastAllOfMatcher<Stmt, NullStmt> nullStmt;
anatofuz
parents:
diff changeset
797 const internal::VariadicDynCastAllOfMatcher<Stmt, AsmStmt> asmStmt;
anatofuz
parents:
diff changeset
798 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBoolLiteralExpr>
anatofuz
parents:
diff changeset
799 cxxBoolLiteral;
anatofuz
parents:
diff changeset
800 const internal::VariadicDynCastAllOfMatcher<Stmt, StringLiteral> stringLiteral;
anatofuz
parents:
diff changeset
801 const internal::VariadicDynCastAllOfMatcher<Stmt, CharacterLiteral>
anatofuz
parents:
diff changeset
802 characterLiteral;
anatofuz
parents:
diff changeset
803 const internal::VariadicDynCastAllOfMatcher<Stmt, IntegerLiteral>
anatofuz
parents:
diff changeset
804 integerLiteral;
anatofuz
parents:
diff changeset
805 const internal::VariadicDynCastAllOfMatcher<Stmt, FloatingLiteral> floatLiteral;
anatofuz
parents:
diff changeset
806 const internal::VariadicDynCastAllOfMatcher<Stmt, ImaginaryLiteral> imaginaryLiteral;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
807 const internal::VariadicDynCastAllOfMatcher<Stmt, FixedPointLiteral>
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
808 fixedPointLiteral;
150
anatofuz
parents:
diff changeset
809 const internal::VariadicDynCastAllOfMatcher<Stmt, UserDefinedLiteral>
anatofuz
parents:
diff changeset
810 userDefinedLiteral;
anatofuz
parents:
diff changeset
811 const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundLiteralExpr>
anatofuz
parents:
diff changeset
812 compoundLiteralExpr;
anatofuz
parents:
diff changeset
813 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNullPtrLiteralExpr>
anatofuz
parents:
diff changeset
814 cxxNullPtrLiteralExpr;
anatofuz
parents:
diff changeset
815 const internal::VariadicDynCastAllOfMatcher<Stmt, ChooseExpr> chooseExpr;
anatofuz
parents:
diff changeset
816 const internal::VariadicDynCastAllOfMatcher<Stmt, GNUNullExpr> gnuNullExpr;
anatofuz
parents:
diff changeset
817 const internal::VariadicDynCastAllOfMatcher<Stmt, AtomicExpr> atomicExpr;
anatofuz
parents:
diff changeset
818 const internal::VariadicDynCastAllOfMatcher<Stmt, StmtExpr> stmtExpr;
anatofuz
parents:
diff changeset
819 const internal::VariadicDynCastAllOfMatcher<Stmt, BinaryOperator>
anatofuz
parents:
diff changeset
820 binaryOperator;
anatofuz
parents:
diff changeset
821 const internal::VariadicDynCastAllOfMatcher<Stmt, UnaryOperator> unaryOperator;
anatofuz
parents:
diff changeset
822 const internal::VariadicDynCastAllOfMatcher<Stmt, ConditionalOperator>
anatofuz
parents:
diff changeset
823 conditionalOperator;
anatofuz
parents:
diff changeset
824 const internal::VariadicDynCastAllOfMatcher<Stmt, BinaryConditionalOperator>
anatofuz
parents:
diff changeset
825 binaryConditionalOperator;
anatofuz
parents:
diff changeset
826 const internal::VariadicDynCastAllOfMatcher<Stmt, OpaqueValueExpr>
anatofuz
parents:
diff changeset
827 opaqueValueExpr;
anatofuz
parents:
diff changeset
828 const internal::VariadicDynCastAllOfMatcher<Decl, StaticAssertDecl>
anatofuz
parents:
diff changeset
829 staticAssertDecl;
anatofuz
parents:
diff changeset
830 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXReinterpretCastExpr>
anatofuz
parents:
diff changeset
831 cxxReinterpretCastExpr;
anatofuz
parents:
diff changeset
832 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXStaticCastExpr>
anatofuz
parents:
diff changeset
833 cxxStaticCastExpr;
anatofuz
parents:
diff changeset
834 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDynamicCastExpr>
anatofuz
parents:
diff changeset
835 cxxDynamicCastExpr;
anatofuz
parents:
diff changeset
836 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXConstCastExpr>
anatofuz
parents:
diff changeset
837 cxxConstCastExpr;
anatofuz
parents:
diff changeset
838 const internal::VariadicDynCastAllOfMatcher<Stmt, CStyleCastExpr>
anatofuz
parents:
diff changeset
839 cStyleCastExpr;
anatofuz
parents:
diff changeset
840 const internal::VariadicDynCastAllOfMatcher<Stmt, ExplicitCastExpr>
anatofuz
parents:
diff changeset
841 explicitCastExpr;
anatofuz
parents:
diff changeset
842 const internal::VariadicDynCastAllOfMatcher<Stmt, ImplicitCastExpr>
anatofuz
parents:
diff changeset
843 implicitCastExpr;
anatofuz
parents:
diff changeset
844 const internal::VariadicDynCastAllOfMatcher<Stmt, CastExpr> castExpr;
anatofuz
parents:
diff changeset
845 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXFunctionalCastExpr>
anatofuz
parents:
diff changeset
846 cxxFunctionalCastExpr;
anatofuz
parents:
diff changeset
847 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTemporaryObjectExpr>
anatofuz
parents:
diff changeset
848 cxxTemporaryObjectExpr;
anatofuz
parents:
diff changeset
849 const internal::VariadicDynCastAllOfMatcher<Stmt, PredefinedExpr>
anatofuz
parents:
diff changeset
850 predefinedExpr;
anatofuz
parents:
diff changeset
851 const internal::VariadicDynCastAllOfMatcher<Stmt, DesignatedInitExpr>
anatofuz
parents:
diff changeset
852 designatedInitExpr;
anatofuz
parents:
diff changeset
853 const internal::VariadicOperatorMatcherFunc<
anatofuz
parents:
diff changeset
854 2, std::numeric_limits<unsigned>::max()>
anatofuz
parents:
diff changeset
855 eachOf = {internal::DynTypedMatcher::VO_EachOf};
anatofuz
parents:
diff changeset
856 const internal::VariadicOperatorMatcherFunc<
anatofuz
parents:
diff changeset
857 2, std::numeric_limits<unsigned>::max()>
anatofuz
parents:
diff changeset
858 anyOf = {internal::DynTypedMatcher::VO_AnyOf};
anatofuz
parents:
diff changeset
859 const internal::VariadicOperatorMatcherFunc<
anatofuz
parents:
diff changeset
860 2, std::numeric_limits<unsigned>::max()>
anatofuz
parents:
diff changeset
861 allOf = {internal::DynTypedMatcher::VO_AllOf};
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
862 const internal::VariadicOperatorMatcherFunc<1, 1> optionally = {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
863 internal::DynTypedMatcher::VO_Optionally};
150
anatofuz
parents:
diff changeset
864 const internal::VariadicFunction<internal::Matcher<NamedDecl>, StringRef,
anatofuz
parents:
diff changeset
865 internal::hasAnyNameFunc>
anatofuz
parents:
diff changeset
866 hasAnyName = {};
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
867
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
868 const internal::VariadicFunction<internal::HasOpNameMatcher, StringRef,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
869 internal::hasAnyOperatorNameFunc>
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
870 hasAnyOperatorName = {};
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
871 const internal::VariadicFunction<internal::HasOverloadOpNameMatcher, StringRef,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
872 internal::hasAnyOverloadedOperatorNameFunc>
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
873 hasAnyOverloadedOperatorName = {};
150
anatofuz
parents:
diff changeset
874 const internal::VariadicFunction<internal::Matcher<ObjCMessageExpr>, StringRef,
anatofuz
parents:
diff changeset
875 internal::hasAnySelectorFunc>
anatofuz
parents:
diff changeset
876 hasAnySelector = {};
anatofuz
parents:
diff changeset
877 const internal::ArgumentAdaptingMatcherFunc<internal::HasMatcher> has = {};
anatofuz
parents:
diff changeset
878 const internal::ArgumentAdaptingMatcherFunc<internal::HasDescendantMatcher>
anatofuz
parents:
diff changeset
879 hasDescendant = {};
anatofuz
parents:
diff changeset
880 const internal::ArgumentAdaptingMatcherFunc<internal::ForEachMatcher> forEach =
anatofuz
parents:
diff changeset
881 {};
anatofuz
parents:
diff changeset
882 const internal::ArgumentAdaptingMatcherFunc<internal::ForEachDescendantMatcher>
anatofuz
parents:
diff changeset
883 forEachDescendant = {};
anatofuz
parents:
diff changeset
884 const internal::ArgumentAdaptingMatcherFunc<
anatofuz
parents:
diff changeset
885 internal::HasParentMatcher,
anatofuz
parents:
diff changeset
886 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc>,
anatofuz
parents:
diff changeset
887 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc>>
anatofuz
parents:
diff changeset
888 hasParent = {};
anatofuz
parents:
diff changeset
889 const internal::ArgumentAdaptingMatcherFunc<
anatofuz
parents:
diff changeset
890 internal::HasAncestorMatcher,
anatofuz
parents:
diff changeset
891 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc>,
anatofuz
parents:
diff changeset
892 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc>>
anatofuz
parents:
diff changeset
893 hasAncestor = {};
anatofuz
parents:
diff changeset
894 const internal::VariadicOperatorMatcherFunc<1, 1> unless = {
anatofuz
parents:
diff changeset
895 internal::DynTypedMatcher::VO_UnaryNot};
anatofuz
parents:
diff changeset
896 const internal::VariadicAllOfMatcher<NestedNameSpecifier> nestedNameSpecifier;
anatofuz
parents:
diff changeset
897 const internal::VariadicAllOfMatcher<NestedNameSpecifierLoc>
anatofuz
parents:
diff changeset
898 nestedNameSpecifierLoc;
anatofuz
parents:
diff changeset
899 const internal::VariadicDynCastAllOfMatcher<Stmt, CUDAKernelCallExpr>
anatofuz
parents:
diff changeset
900 cudaKernelCallExpr;
anatofuz
parents:
diff changeset
901 const AstTypeMatcher<BuiltinType> builtinType;
anatofuz
parents:
diff changeset
902 const AstTypeMatcher<ArrayType> arrayType;
anatofuz
parents:
diff changeset
903 const AstTypeMatcher<ComplexType> complexType;
anatofuz
parents:
diff changeset
904 const AstTypeMatcher<ConstantArrayType> constantArrayType;
anatofuz
parents:
diff changeset
905 const AstTypeMatcher<DeducedTemplateSpecializationType>
anatofuz
parents:
diff changeset
906 deducedTemplateSpecializationType;
anatofuz
parents:
diff changeset
907 const AstTypeMatcher<DependentSizedArrayType> dependentSizedArrayType;
anatofuz
parents:
diff changeset
908 const AstTypeMatcher<IncompleteArrayType> incompleteArrayType;
anatofuz
parents:
diff changeset
909 const AstTypeMatcher<VariableArrayType> variableArrayType;
anatofuz
parents:
diff changeset
910 const AstTypeMatcher<AtomicType> atomicType;
anatofuz
parents:
diff changeset
911 const AstTypeMatcher<AutoType> autoType;
anatofuz
parents:
diff changeset
912 const AstTypeMatcher<DecltypeType> decltypeType;
anatofuz
parents:
diff changeset
913 const AstTypeMatcher<FunctionType> functionType;
anatofuz
parents:
diff changeset
914 const AstTypeMatcher<FunctionProtoType> functionProtoType;
anatofuz
parents:
diff changeset
915 const AstTypeMatcher<ParenType> parenType;
anatofuz
parents:
diff changeset
916 const AstTypeMatcher<BlockPointerType> blockPointerType;
anatofuz
parents:
diff changeset
917 const AstTypeMatcher<MemberPointerType> memberPointerType;
anatofuz
parents:
diff changeset
918 const AstTypeMatcher<PointerType> pointerType;
anatofuz
parents:
diff changeset
919 const AstTypeMatcher<ObjCObjectPointerType> objcObjectPointerType;
anatofuz
parents:
diff changeset
920 const AstTypeMatcher<ReferenceType> referenceType;
anatofuz
parents:
diff changeset
921 const AstTypeMatcher<LValueReferenceType> lValueReferenceType;
anatofuz
parents:
diff changeset
922 const AstTypeMatcher<RValueReferenceType> rValueReferenceType;
anatofuz
parents:
diff changeset
923 const AstTypeMatcher<TypedefType> typedefType;
anatofuz
parents:
diff changeset
924 const AstTypeMatcher<EnumType> enumType;
anatofuz
parents:
diff changeset
925 const AstTypeMatcher<TemplateSpecializationType> templateSpecializationType;
anatofuz
parents:
diff changeset
926 const AstTypeMatcher<UnaryTransformType> unaryTransformType;
anatofuz
parents:
diff changeset
927 const AstTypeMatcher<RecordType> recordType;
anatofuz
parents:
diff changeset
928 const AstTypeMatcher<TagType> tagType;
anatofuz
parents:
diff changeset
929 const AstTypeMatcher<ElaboratedType> elaboratedType;
anatofuz
parents:
diff changeset
930 const AstTypeMatcher<SubstTemplateTypeParmType> substTemplateTypeParmType;
anatofuz
parents:
diff changeset
931 const AstTypeMatcher<TemplateTypeParmType> templateTypeParmType;
anatofuz
parents:
diff changeset
932 const AstTypeMatcher<InjectedClassNameType> injectedClassNameType;
anatofuz
parents:
diff changeset
933 const AstTypeMatcher<DecayedType> decayedType;
anatofuz
parents:
diff changeset
934 AST_TYPELOC_TRAVERSE_MATCHER_DEF(hasElementType,
anatofuz
parents:
diff changeset
935 AST_POLYMORPHIC_SUPPORTED_TYPES(ArrayType,
anatofuz
parents:
diff changeset
936 ComplexType));
anatofuz
parents:
diff changeset
937 AST_TYPELOC_TRAVERSE_MATCHER_DEF(hasValueType,
anatofuz
parents:
diff changeset
938 AST_POLYMORPHIC_SUPPORTED_TYPES(AtomicType));
anatofuz
parents:
diff changeset
939 AST_TYPELOC_TRAVERSE_MATCHER_DEF(
anatofuz
parents:
diff changeset
940 pointee,
anatofuz
parents:
diff changeset
941 AST_POLYMORPHIC_SUPPORTED_TYPES(BlockPointerType, MemberPointerType,
anatofuz
parents:
diff changeset
942 PointerType, ReferenceType));
anatofuz
parents:
diff changeset
943
anatofuz
parents:
diff changeset
944 const internal::VariadicDynCastAllOfMatcher<Stmt, OMPExecutableDirective>
anatofuz
parents:
diff changeset
945 ompExecutableDirective;
anatofuz
parents:
diff changeset
946 const internal::VariadicDynCastAllOfMatcher<OMPClause, OMPDefaultClause>
anatofuz
parents:
diff changeset
947 ompDefaultClause;
anatofuz
parents:
diff changeset
948 const internal::VariadicDynCastAllOfMatcher<Decl, CXXDeductionGuideDecl>
anatofuz
parents:
diff changeset
949 cxxDeductionGuideDecl;
anatofuz
parents:
diff changeset
950
anatofuz
parents:
diff changeset
951 } // end namespace ast_matchers
anatofuz
parents:
diff changeset
952 } // end namespace clang