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/ASTMatchersInternal.h"
15 #include "clang/AST/ASTContext.h"
16 #include "clang/AST/ASTTypeTraits.h"
17 #include "clang/AST/Decl.h"
18 #include "clang/AST/DeclTemplate.h"
19 #include "clang/AST/PrettyPrinter.h"
20 #include "clang/ASTMatchers/ASTMatchers.h"
21 #include "clang/Basic/LLVM.h"
22 #include "llvm/ADT/ArrayRef.h"
23 #include "llvm/ADT/IntrusiveRefCntPtr.h"
24 #include "llvm/ADT/None.h"
25 #include "llvm/ADT/SmallString.h"
26 #include "llvm/ADT/SmallVector.h"
27 #include "llvm/ADT/StringRef.h"
28 #include "llvm/Support/Casting.h"
29 #include "llvm/Support/ErrorHandling.h"
30 #include "llvm/Support/ManagedStatic.h"
31 #include "llvm/Support/raw_ostream.h"
40 namespace ast_matchers {
43 bool NotUnaryOperator(const ast_type_traits::DynTypedNode &DynNode,
44 ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder,
45 ArrayRef<DynTypedMatcher> InnerMatchers);
47 bool AllOfVariadicOperator(const ast_type_traits::DynTypedNode &DynNode,
48 ASTMatchFinder *Finder,
49 BoundNodesTreeBuilder *Builder,
50 ArrayRef<DynTypedMatcher> InnerMatchers);
52 bool EachOfVariadicOperator(const ast_type_traits::DynTypedNode &DynNode,
53 ASTMatchFinder *Finder,
54 BoundNodesTreeBuilder *Builder,
55 ArrayRef<DynTypedMatcher> InnerMatchers);
57 bool AnyOfVariadicOperator(const ast_type_traits::DynTypedNode &DynNode,
58 ASTMatchFinder *Finder,
59 BoundNodesTreeBuilder *Builder,
60 ArrayRef<DynTypedMatcher> InnerMatchers);
62 void BoundNodesTreeBuilder::visitMatches(Visitor *ResultVisitor) {
64 Bindings.push_back(BoundNodesMap());
65 for (BoundNodesMap &Binding : Bindings) {
66 ResultVisitor->visitMatch(BoundNodes(Binding));
72 using VariadicOperatorFunction = bool (*)(
73 const ast_type_traits::DynTypedNode &DynNode, ASTMatchFinder *Finder,
74 BoundNodesTreeBuilder *Builder, ArrayRef<DynTypedMatcher> InnerMatchers);
76 template <VariadicOperatorFunction Func>
77 class VariadicMatcher : public DynMatcherInterface {
79 VariadicMatcher(std::vector<DynTypedMatcher> InnerMatchers)
80 : InnerMatchers(std::move(InnerMatchers)) {}
82 bool dynMatches(const ast_type_traits::DynTypedNode &DynNode,
83 ASTMatchFinder *Finder,
84 BoundNodesTreeBuilder *Builder) const override {
85 return Func(DynNode, Finder, Builder, InnerMatchers);
89 std::vector<DynTypedMatcher> InnerMatchers;
92 class IdDynMatcher : public DynMatcherInterface {
94 IdDynMatcher(StringRef ID,
95 IntrusiveRefCntPtr<DynMatcherInterface> InnerMatcher)
96 : ID(ID), InnerMatcher(std::move(InnerMatcher)) {}
98 bool dynMatches(const ast_type_traits::DynTypedNode &DynNode,
99 ASTMatchFinder *Finder,
100 BoundNodesTreeBuilder *Builder) const override {
101 bool Result = InnerMatcher->dynMatches(DynNode, Finder, Builder);
102 if (Result) Builder->setBinding(ID, DynNode);
107 const std::string ID;
108 const IntrusiveRefCntPtr<DynMatcherInterface> InnerMatcher;
111 /// \brief A matcher that always returns true.
113 /// We only ever need one instance of this matcher, so we create a global one
114 /// and reuse it to reduce the overhead of the matcher and increase the chance
116 class TrueMatcherImpl : public DynMatcherInterface {
119 Retain(); // Reference count will never become zero.
122 bool dynMatches(const ast_type_traits::DynTypedNode &, ASTMatchFinder *,
123 BoundNodesTreeBuilder *) const override {
130 static llvm::ManagedStatic<TrueMatcherImpl> TrueMatcherInstance;
132 DynTypedMatcher DynTypedMatcher::constructVariadic(
133 DynTypedMatcher::VariadicOperator Op,
134 ast_type_traits::ASTNodeKind SupportedKind,
135 std::vector<DynTypedMatcher> InnerMatchers) {
136 assert(!InnerMatchers.empty() && "Array must not be empty.");
137 assert(std::all_of(InnerMatchers.begin(), InnerMatchers.end(),
138 [SupportedKind](const DynTypedMatcher &M) {
139 return M.canConvertTo(SupportedKind);
141 "InnerMatchers must be convertible to SupportedKind!");
143 // We must relax the restrict kind here.
144 // The different operators might deal differently with a mismatch.
145 // Make it the same as SupportedKind, since that is the broadest type we are
146 // allowed to accept.
147 auto RestrictKind = SupportedKind;
151 // In the case of allOf() we must pass all the checks, so making
152 // RestrictKind the most restrictive can save us time. This way we reject
153 // invalid types earlier and we can elide the kind checks inside the
155 for (auto &IM : InnerMatchers) {
156 RestrictKind = ast_type_traits::ASTNodeKind::getMostDerivedType(
157 RestrictKind, IM.RestrictKind);
159 return DynTypedMatcher(
160 SupportedKind, RestrictKind,
161 new VariadicMatcher<AllOfVariadicOperator>(std::move(InnerMatchers)));
164 return DynTypedMatcher(
165 SupportedKind, RestrictKind,
166 new VariadicMatcher<AnyOfVariadicOperator>(std::move(InnerMatchers)));
169 return DynTypedMatcher(
170 SupportedKind, RestrictKind,
171 new VariadicMatcher<EachOfVariadicOperator>(std::move(InnerMatchers)));
174 // FIXME: Implement the Not operator to take a single matcher instead of a
176 return DynTypedMatcher(
177 SupportedKind, RestrictKind,
178 new VariadicMatcher<NotUnaryOperator>(std::move(InnerMatchers)));
180 llvm_unreachable("Invalid Op value.");
183 DynTypedMatcher DynTypedMatcher::trueMatcher(
184 ast_type_traits::ASTNodeKind NodeKind) {
185 return DynTypedMatcher(NodeKind, NodeKind, &*TrueMatcherInstance);
188 bool DynTypedMatcher::canMatchNodesOfKind(
189 ast_type_traits::ASTNodeKind Kind) const {
190 return RestrictKind.isBaseOf(Kind);
193 DynTypedMatcher DynTypedMatcher::dynCastTo(
194 const ast_type_traits::ASTNodeKind Kind) const {
196 Copy.SupportedKind = Kind;
198 ast_type_traits::ASTNodeKind::getMostDerivedType(Kind, RestrictKind);
202 bool DynTypedMatcher::matches(const ast_type_traits::DynTypedNode &DynNode,
203 ASTMatchFinder *Finder,
204 BoundNodesTreeBuilder *Builder) const {
205 if (RestrictKind.isBaseOf(DynNode.getNodeKind()) &&
206 Implementation->dynMatches(DynNode, Finder, Builder)) {
209 // Delete all bindings when a matcher does not match.
210 // This prevents unexpected exposure of bound nodes in unmatches
211 // branches of the match tree.
212 Builder->removeBindings([](const BoundNodesMap &) { return true; });
216 bool DynTypedMatcher::matchesNoKindCheck(
217 const ast_type_traits::DynTypedNode &DynNode, ASTMatchFinder *Finder,
218 BoundNodesTreeBuilder *Builder) const {
219 assert(RestrictKind.isBaseOf(DynNode.getNodeKind()));
220 if (Implementation->dynMatches(DynNode, Finder, Builder)) {
223 // Delete all bindings when a matcher does not match.
224 // This prevents unexpected exposure of bound nodes in unmatches
225 // branches of the match tree.
226 Builder->removeBindings([](const BoundNodesMap &) { return true; });
230 llvm::Optional<DynTypedMatcher> DynTypedMatcher::tryBind(StringRef ID) const {
231 if (!AllowBind) return llvm::None;
233 Result.Implementation =
234 new IdDynMatcher(ID, std::move(Result.Implementation));
235 return std::move(Result);
238 bool DynTypedMatcher::canConvertTo(ast_type_traits::ASTNodeKind To) const {
239 const auto From = getSupportedKind();
240 auto QualKind = ast_type_traits::ASTNodeKind::getFromNodeKind<QualType>();
241 auto TypeKind = ast_type_traits::ASTNodeKind::getFromNodeKind<Type>();
242 /// Mimic the implicit conversions of Matcher<>.
243 /// - From Matcher<Type> to Matcher<QualType>
244 if (From.isSame(TypeKind) && To.isSame(QualKind)) return true;
245 /// - From Matcher<Base> to Matcher<Derived>
246 return From.isBaseOf(To);
249 void BoundNodesTreeBuilder::addMatch(const BoundNodesTreeBuilder &Other) {
250 Bindings.append(Other.Bindings.begin(), Other.Bindings.end());
253 bool NotUnaryOperator(const ast_type_traits::DynTypedNode &DynNode,
254 ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder,
255 ArrayRef<DynTypedMatcher> InnerMatchers) {
256 if (InnerMatchers.size() != 1)
259 // The 'unless' matcher will always discard the result:
260 // If the inner matcher doesn't match, unless returns true,
261 // but the inner matcher cannot have bound anything.
262 // If the inner matcher matches, the result is false, and
263 // any possible binding will be discarded.
264 // We still need to hand in all the bound nodes up to this
265 // point so the inner matcher can depend on bound nodes,
266 // and we need to actively discard the bound nodes, otherwise
267 // the inner matcher will reset the bound nodes if it doesn't
268 // match, but this would be inversed by 'unless'.
269 BoundNodesTreeBuilder Discard(*Builder);
270 return !InnerMatchers[0].matches(DynNode, Finder, &Discard);
273 bool AllOfVariadicOperator(const ast_type_traits::DynTypedNode &DynNode,
274 ASTMatchFinder *Finder,
275 BoundNodesTreeBuilder *Builder,
276 ArrayRef<DynTypedMatcher> InnerMatchers) {
277 // allOf leads to one matcher for each alternative in the first
278 // matcher combined with each alternative in the second matcher.
279 // Thus, we can reuse the same Builder.
280 for (const DynTypedMatcher &InnerMatcher : InnerMatchers) {
281 if (!InnerMatcher.matchesNoKindCheck(DynNode, Finder, Builder))
287 bool EachOfVariadicOperator(const ast_type_traits::DynTypedNode &DynNode,
288 ASTMatchFinder *Finder,
289 BoundNodesTreeBuilder *Builder,
290 ArrayRef<DynTypedMatcher> InnerMatchers) {
291 BoundNodesTreeBuilder Result;
292 bool Matched = false;
293 for (const DynTypedMatcher &InnerMatcher : InnerMatchers) {
294 BoundNodesTreeBuilder BuilderInner(*Builder);
295 if (InnerMatcher.matches(DynNode, Finder, &BuilderInner)) {
297 Result.addMatch(BuilderInner);
300 *Builder = std::move(Result);
304 bool AnyOfVariadicOperator(const ast_type_traits::DynTypedNode &DynNode,
305 ASTMatchFinder *Finder,
306 BoundNodesTreeBuilder *Builder,
307 ArrayRef<DynTypedMatcher> InnerMatchers) {
308 for (const DynTypedMatcher &InnerMatcher : InnerMatchers) {
309 BoundNodesTreeBuilder Result = *Builder;
310 if (InnerMatcher.matches(DynNode, Finder, &Result)) {
311 *Builder = std::move(Result);
318 Matcher<NamedDecl> hasAnyNameFunc(ArrayRef<const StringRef *> NameRefs) {
319 std::vector<std::string> Names;
320 for (auto *Name : NameRefs)
321 Names.emplace_back(*Name);
322 return internal::Matcher<NamedDecl>(
323 new internal::HasNameMatcher(std::move(Names)));
326 HasNameMatcher::HasNameMatcher(std::vector<std::string> N)
327 : UseUnqualifiedMatch(std::all_of(
329 [](StringRef Name) { return Name.find("::") == Name.npos; })),
330 Names(std::move(N)) {
332 for (StringRef Name : Names)
333 assert(!Name.empty());
337 static bool consumeNameSuffix(StringRef &FullName, StringRef Suffix) {
338 StringRef Name = FullName;
339 if (!Name.endswith(Suffix))
341 Name = Name.drop_back(Suffix.size());
343 if (!Name.endswith("::"))
345 Name = Name.drop_back(2);
351 static StringRef getNodeName(const NamedDecl &Node,
352 llvm::SmallString<128> &Scratch) {
354 if (Node.getIdentifier())
355 return Node.getName();
357 if (Node.getDeclName()) {
358 // Name needs to be constructed.
360 llvm::raw_svector_ostream OS(Scratch);
365 return "(anonymous)";
368 static StringRef getNodeName(const RecordDecl &Node,
369 llvm::SmallString<128> &Scratch) {
370 if (Node.getIdentifier()) {
371 return Node.getName();
374 return ("(anonymous " + Node.getKindName() + ")").toStringRef(Scratch);
377 static StringRef getNodeName(const NamespaceDecl &Node,
378 llvm::SmallString<128> &Scratch) {
379 return Node.isAnonymousNamespace() ? "(anonymous namespace)" : Node.getName();
386 PatternSet(ArrayRef<std::string> Names) {
387 for (StringRef Name : Names)
388 Patterns.push_back({Name, Name.startswith("::")});
391 /// Consumes the name suffix from each pattern in the set and removes the ones
392 /// that didn't match.
393 /// Return true if there are still any patterns left.
394 bool consumeNameSuffix(StringRef NodeName, bool CanSkip) {
395 for (size_t I = 0; I < Patterns.size();) {
396 if (internal::consumeNameSuffix(Patterns[I].P, NodeName) ||
400 Patterns.erase(Patterns.begin() + I);
403 return !Patterns.empty();
406 /// Check if any of the patterns are a match.
407 /// A match will be a pattern that was fully consumed, that also matches the
408 /// 'fully qualified' requirement.
409 bool foundMatch(bool AllowFullyQualified) const {
410 for (auto& P: Patterns)
411 if (P.P.empty() && (AllowFullyQualified || !P.IsFullyQualified))
419 bool IsFullyQualified;
422 llvm::SmallVector<Pattern, 8> Patterns;
427 bool HasNameMatcher::matchesNodeUnqualified(const NamedDecl &Node) const {
428 assert(UseUnqualifiedMatch);
429 llvm::SmallString<128> Scratch;
430 StringRef NodeName = getNodeName(Node, Scratch);
431 return std::any_of(Names.begin(), Names.end(), [&](StringRef Name) {
432 return consumeNameSuffix(Name, NodeName) && Name.empty();
436 bool HasNameMatcher::matchesNodeFullFast(const NamedDecl &Node) const {
437 PatternSet Patterns(Names);
438 llvm::SmallString<128> Scratch;
440 // This function is copied and adapted from NamedDecl::printQualifiedName()
441 // By matching each part individually we optimize in a couple of ways:
442 // - We can exit early on the first failure.
443 // - We can skip inline/anonymous namespaces without another pass.
444 // - We print one name at a time, reducing the chance of overflowing the
445 // inlined space of the SmallString.
447 // First, match the name.
448 if (!Patterns.consumeNameSuffix(getNodeName(Node, Scratch),
452 // Try to match each declaration context.
453 // We are allowed to skip anonymous and inline namespaces if they don't match.
454 const DeclContext *Ctx = Node.getDeclContext();
456 if (Ctx->isFunctionOrMethod())
457 return Patterns.foundMatch(/*AllowFullyQualified=*/false);
459 for (; Ctx && isa<NamedDecl>(Ctx); Ctx = Ctx->getParent()) {
460 if (Patterns.foundMatch(/*AllowFullyQualified=*/false))
463 if (const auto *ND = dyn_cast<NamespaceDecl>(Ctx)) {
464 // If it matches (or we can skip it), continue.
465 if (Patterns.consumeNameSuffix(getNodeName(*ND, Scratch),
466 /*CanSkip=*/ND->isAnonymousNamespace() ||
471 if (const auto *RD = dyn_cast<RecordDecl>(Ctx)) {
472 if (!isa<ClassTemplateSpecializationDecl>(Ctx)) {
473 if (Patterns.consumeNameSuffix(getNodeName(*RD, Scratch),
481 // We don't know how to deal with this DeclContext.
482 // Fallback to the slow version of the code.
483 return matchesNodeFullSlow(Node);
486 return Patterns.foundMatch(/*AllowFullyQualified=*/true);
489 bool HasNameMatcher::matchesNodeFullSlow(const NamedDecl &Node) const {
490 const bool SkipUnwrittenCases[] = {false, true};
491 for (bool SkipUnwritten : SkipUnwrittenCases) {
492 llvm::SmallString<128> NodeName = StringRef("::");
493 llvm::raw_svector_ostream OS(NodeName);
496 PrintingPolicy Policy = Node.getASTContext().getPrintingPolicy();
497 Policy.SuppressUnwrittenScope = true;
498 Node.printQualifiedName(OS, Policy);
500 Node.printQualifiedName(OS);
503 const StringRef FullName = OS.str();
505 for (const StringRef Pattern : Names) {
506 if (Pattern.startswith("::")) {
507 if (FullName == Pattern)
509 } else if (FullName.endswith(Pattern) &&
510 FullName.drop_back(Pattern.size()).endswith("::")) {
519 bool HasNameMatcher::matchesNode(const NamedDecl &Node) const {
520 assert(matchesNodeFullFast(Node) == matchesNodeFullSlow(Node));
521 if (UseUnqualifiedMatch) {
522 assert(matchesNodeUnqualified(Node) == matchesNodeFullFast(Node));
523 return matchesNodeUnqualified(Node);
525 return matchesNodeFullFast(Node);
528 } // end namespace internal
530 const internal::VariadicDynCastAllOfMatcher<Decl, TranslationUnitDecl>
532 const internal::VariadicDynCastAllOfMatcher<Decl, TypedefDecl> typedefDecl;
533 const internal::VariadicDynCastAllOfMatcher<Decl, TypedefNameDecl>
535 const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasDecl> typeAliasDecl;
536 const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasTemplateDecl>
537 typeAliasTemplateDecl;
538 const internal::VariadicAllOfMatcher<Decl> decl;
539 const internal::VariadicDynCastAllOfMatcher<Decl, LinkageSpecDecl>
541 const internal::VariadicDynCastAllOfMatcher<Decl, NamedDecl> namedDecl;
542 const internal::VariadicDynCastAllOfMatcher<Decl, LabelDecl> labelDecl;
543 const internal::VariadicDynCastAllOfMatcher<Decl, NamespaceDecl> namespaceDecl;
544 const internal::VariadicDynCastAllOfMatcher<Decl, NamespaceAliasDecl>
546 const internal::VariadicDynCastAllOfMatcher<Decl, RecordDecl> recordDecl;
547 const internal::VariadicDynCastAllOfMatcher<Decl, CXXRecordDecl> cxxRecordDecl;
548 const internal::VariadicDynCastAllOfMatcher<Decl, ClassTemplateDecl>
550 const internal::VariadicDynCastAllOfMatcher<Decl,
551 ClassTemplateSpecializationDecl>
552 classTemplateSpecializationDecl;
553 const internal::VariadicDynCastAllOfMatcher<Decl, DeclaratorDecl>
555 const internal::VariadicDynCastAllOfMatcher<Decl, ParmVarDecl> parmVarDecl;
556 const internal::VariadicDynCastAllOfMatcher<Decl, AccessSpecDecl>
558 const internal::VariadicAllOfMatcher<CXXCtorInitializer> cxxCtorInitializer;
559 const internal::VariadicAllOfMatcher<TemplateArgument> templateArgument;
560 const internal::VariadicAllOfMatcher<TemplateName> templateName;
561 const internal::VariadicDynCastAllOfMatcher<Decl, NonTypeTemplateParmDecl>
562 nonTypeTemplateParmDecl;
563 const internal::VariadicDynCastAllOfMatcher<Decl, TemplateTypeParmDecl>
564 templateTypeParmDecl;
565 const internal::VariadicAllOfMatcher<QualType> qualType;
566 const internal::VariadicAllOfMatcher<Type> type;
567 const internal::VariadicAllOfMatcher<TypeLoc> typeLoc;
568 const internal::VariadicDynCastAllOfMatcher<Stmt, UnaryExprOrTypeTraitExpr>
569 unaryExprOrTypeTraitExpr;
570 const internal::VariadicDynCastAllOfMatcher<Decl, ValueDecl> valueDecl;
571 const internal::VariadicDynCastAllOfMatcher<Decl, CXXConstructorDecl>
573 const internal::VariadicDynCastAllOfMatcher<Decl, CXXDestructorDecl>
575 const internal::VariadicDynCastAllOfMatcher<Decl, EnumDecl> enumDecl;
576 const internal::VariadicDynCastAllOfMatcher<Decl, EnumConstantDecl>
578 const internal::VariadicDynCastAllOfMatcher<Decl, CXXMethodDecl> cxxMethodDecl;
579 const internal::VariadicDynCastAllOfMatcher<Decl, CXXConversionDecl>
581 const internal::VariadicDynCastAllOfMatcher<Decl, VarDecl> varDecl;
582 const internal::VariadicDynCastAllOfMatcher<Decl, FieldDecl> fieldDecl;
583 const internal::VariadicDynCastAllOfMatcher<Decl, FunctionDecl> functionDecl;
584 const internal::VariadicDynCastAllOfMatcher<Decl, FunctionTemplateDecl>
585 functionTemplateDecl;
586 const internal::VariadicDynCastAllOfMatcher<Decl, FriendDecl> friendDecl;
587 const internal::VariadicAllOfMatcher<Stmt> stmt;
588 const internal::VariadicDynCastAllOfMatcher<Stmt, DeclStmt> declStmt;
589 const internal::VariadicDynCastAllOfMatcher<Stmt, MemberExpr> memberExpr;
590 const internal::VariadicDynCastAllOfMatcher<Stmt, CallExpr> callExpr;
591 const internal::VariadicDynCastAllOfMatcher<Stmt, LambdaExpr> lambdaExpr;
592 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXMemberCallExpr>
594 const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCMessageExpr>
596 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCInterfaceDecl>
598 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCImplementationDecl>
599 objcImplementationDecl;
600 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCProtocolDecl>
602 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryDecl>
604 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryImplDecl>
605 objcCategoryImplDecl;
606 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCMethodDecl>
608 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCIvarDecl> objcIvarDecl;
609 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCPropertyDecl>
611 const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtThrowStmt>
613 const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtTryStmt> objcTryStmt;
614 const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtCatchStmt>
616 const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtFinallyStmt>
618 const internal::VariadicDynCastAllOfMatcher<Stmt, ExprWithCleanups>
620 const internal::VariadicDynCastAllOfMatcher<Stmt, InitListExpr> initListExpr;
621 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXStdInitializerListExpr>
622 cxxStdInitializerListExpr;
623 const internal::VariadicDynCastAllOfMatcher<Stmt, ImplicitValueInitExpr>
624 implicitValueInitExpr;
625 const internal::VariadicDynCastAllOfMatcher<Stmt, ParenListExpr> parenListExpr;
626 const internal::VariadicDynCastAllOfMatcher<Stmt, SubstNonTypeTemplateParmExpr>
627 substNonTypeTemplateParmExpr;
628 const internal::VariadicDynCastAllOfMatcher<Decl, UsingDecl> usingDecl;
629 const internal::VariadicDynCastAllOfMatcher<Decl, UsingDirectiveDecl>
631 const internal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedLookupExpr>
632 unresolvedLookupExpr;
633 const internal::VariadicDynCastAllOfMatcher<Decl, UnresolvedUsingValueDecl>
634 unresolvedUsingValueDecl;
635 const internal::VariadicDynCastAllOfMatcher<Decl, UnresolvedUsingTypenameDecl>
636 unresolvedUsingTypenameDecl;
637 const internal::VariadicDynCastAllOfMatcher<Stmt, ParenExpr> parenExpr;
638 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXConstructExpr>
640 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXUnresolvedConstructExpr>
641 cxxUnresolvedConstructExpr;
642 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThisExpr> cxxThisExpr;
643 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBindTemporaryExpr>
644 cxxBindTemporaryExpr;
645 const internal::VariadicDynCastAllOfMatcher<Stmt, MaterializeTemporaryExpr>
646 materializeTemporaryExpr;
647 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNewExpr> cxxNewExpr;
648 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDeleteExpr> cxxDeleteExpr;
649 const internal::VariadicDynCastAllOfMatcher<Stmt, ArraySubscriptExpr>
651 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDefaultArgExpr>
653 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXOperatorCallExpr>
655 const internal::VariadicDynCastAllOfMatcher<Stmt, Expr> expr;
656 const internal::VariadicDynCastAllOfMatcher<Stmt, DeclRefExpr> declRefExpr;
657 const internal::VariadicDynCastAllOfMatcher<Stmt, IfStmt> ifStmt;
658 const internal::VariadicDynCastAllOfMatcher<Stmt, ForStmt> forStmt;
659 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXForRangeStmt>
661 const internal::VariadicDynCastAllOfMatcher<Stmt, WhileStmt> whileStmt;
662 const internal::VariadicDynCastAllOfMatcher<Stmt, DoStmt> doStmt;
663 const internal::VariadicDynCastAllOfMatcher<Stmt, BreakStmt> breakStmt;
664 const internal::VariadicDynCastAllOfMatcher<Stmt, ContinueStmt> continueStmt;
665 const internal::VariadicDynCastAllOfMatcher<Stmt, ReturnStmt> returnStmt;
666 const internal::VariadicDynCastAllOfMatcher<Stmt, GotoStmt> gotoStmt;
667 const internal::VariadicDynCastAllOfMatcher<Stmt, LabelStmt> labelStmt;
668 const internal::VariadicDynCastAllOfMatcher<Stmt, AddrLabelExpr> addrLabelExpr;
669 const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchStmt> switchStmt;
670 const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchCase> switchCase;
671 const internal::VariadicDynCastAllOfMatcher<Stmt, CaseStmt> caseStmt;
672 const internal::VariadicDynCastAllOfMatcher<Stmt, DefaultStmt> defaultStmt;
673 const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundStmt> compoundStmt;
674 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXCatchStmt> cxxCatchStmt;
675 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTryStmt> cxxTryStmt;
676 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThrowExpr> cxxThrowExpr;
677 const internal::VariadicDynCastAllOfMatcher<Stmt, NullStmt> nullStmt;
678 const internal::VariadicDynCastAllOfMatcher<Stmt, AsmStmt> asmStmt;
679 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBoolLiteralExpr>
681 const internal::VariadicDynCastAllOfMatcher<Stmt, StringLiteral> stringLiteral;
682 const internal::VariadicDynCastAllOfMatcher<Stmt, CharacterLiteral>
684 const internal::VariadicDynCastAllOfMatcher<Stmt, IntegerLiteral>
686 const internal::VariadicDynCastAllOfMatcher<Stmt, FloatingLiteral> floatLiteral;
687 const internal::VariadicDynCastAllOfMatcher<Stmt, UserDefinedLiteral>
689 const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundLiteralExpr>
691 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNullPtrLiteralExpr>
692 cxxNullPtrLiteralExpr;
693 const internal::VariadicDynCastAllOfMatcher<Stmt, GNUNullExpr> gnuNullExpr;
694 const internal::VariadicDynCastAllOfMatcher<Stmt, AtomicExpr> atomicExpr;
695 const internal::VariadicDynCastAllOfMatcher<Stmt, StmtExpr> stmtExpr;
696 const internal::VariadicDynCastAllOfMatcher<Stmt, BinaryOperator>
698 const internal::VariadicDynCastAllOfMatcher<Stmt, UnaryOperator> unaryOperator;
699 const internal::VariadicDynCastAllOfMatcher<Stmt, ConditionalOperator>
701 const internal::VariadicDynCastAllOfMatcher<Stmt, BinaryConditionalOperator>
702 binaryConditionalOperator;
703 const internal::VariadicDynCastAllOfMatcher<Stmt, OpaqueValueExpr>
705 const internal::VariadicDynCastAllOfMatcher<Decl, StaticAssertDecl>
707 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXReinterpretCastExpr>
708 cxxReinterpretCastExpr;
709 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXStaticCastExpr>
711 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDynamicCastExpr>
713 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXConstCastExpr>
715 const internal::VariadicDynCastAllOfMatcher<Stmt, CStyleCastExpr>
717 const internal::VariadicDynCastAllOfMatcher<Stmt, ExplicitCastExpr>
719 const internal::VariadicDynCastAllOfMatcher<Stmt, ImplicitCastExpr>
721 const internal::VariadicDynCastAllOfMatcher<Stmt, CastExpr> castExpr;
722 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXFunctionalCastExpr>
723 cxxFunctionalCastExpr;
724 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTemporaryObjectExpr>
725 cxxTemporaryObjectExpr;
726 const internal::VariadicDynCastAllOfMatcher<Stmt, PredefinedExpr>
728 const internal::VariadicDynCastAllOfMatcher<Stmt, DesignatedInitExpr>
730 const internal::VariadicOperatorMatcherFunc<
731 2, std::numeric_limits<unsigned>::max()>
732 eachOf = {internal::DynTypedMatcher::VO_EachOf};
733 const internal::VariadicOperatorMatcherFunc<
734 2, std::numeric_limits<unsigned>::max()>
735 anyOf = {internal::DynTypedMatcher::VO_AnyOf};
736 const internal::VariadicOperatorMatcherFunc<
737 2, std::numeric_limits<unsigned>::max()>
738 allOf = {internal::DynTypedMatcher::VO_AllOf};
739 const internal::VariadicFunction<internal::Matcher<NamedDecl>, StringRef,
740 internal::hasAnyNameFunc>
742 const internal::ArgumentAdaptingMatcherFunc<internal::HasMatcher> has = {};
743 const internal::ArgumentAdaptingMatcherFunc<internal::HasDescendantMatcher>
745 const internal::ArgumentAdaptingMatcherFunc<internal::ForEachMatcher> forEach =
747 const internal::ArgumentAdaptingMatcherFunc<internal::ForEachDescendantMatcher>
748 forEachDescendant = {};
749 const internal::ArgumentAdaptingMatcherFunc<
750 internal::HasParentMatcher,
751 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc>,
752 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc>>
754 const internal::ArgumentAdaptingMatcherFunc<
755 internal::HasAncestorMatcher,
756 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc>,
757 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc>>
759 const internal::VariadicOperatorMatcherFunc<1, 1> unless = {
760 internal::DynTypedMatcher::VO_UnaryNot};
761 const internal::VariadicAllOfMatcher<NestedNameSpecifier> nestedNameSpecifier;
762 const internal::VariadicAllOfMatcher<NestedNameSpecifierLoc>
763 nestedNameSpecifierLoc;
764 const internal::VariadicDynCastAllOfMatcher<Stmt, CUDAKernelCallExpr>
766 const AstTypeMatcher<BuiltinType> builtinType;
767 const AstTypeMatcher<ArrayType> arrayType;
768 const AstTypeMatcher<ComplexType> complexType;
769 const AstTypeMatcher<ConstantArrayType> constantArrayType;
770 const AstTypeMatcher<DependentSizedArrayType> dependentSizedArrayType;
771 const AstTypeMatcher<IncompleteArrayType> incompleteArrayType;
772 const AstTypeMatcher<VariableArrayType> variableArrayType;
773 const AstTypeMatcher<AtomicType> atomicType;
774 const AstTypeMatcher<AutoType> autoType;
775 const AstTypeMatcher<FunctionType> functionType;
776 const AstTypeMatcher<FunctionProtoType> functionProtoType;
777 const AstTypeMatcher<ParenType> parenType;
778 const AstTypeMatcher<BlockPointerType> blockPointerType;
779 const AstTypeMatcher<MemberPointerType> memberPointerType;
780 const AstTypeMatcher<PointerType> pointerType;
781 const AstTypeMatcher<ObjCObjectPointerType> objcObjectPointerType;
782 const AstTypeMatcher<ReferenceType> referenceType;
783 const AstTypeMatcher<LValueReferenceType> lValueReferenceType;
784 const AstTypeMatcher<RValueReferenceType> rValueReferenceType;
785 const AstTypeMatcher<TypedefType> typedefType;
786 const AstTypeMatcher<EnumType> enumType;
787 const AstTypeMatcher<TemplateSpecializationType> templateSpecializationType;
788 const AstTypeMatcher<UnaryTransformType> unaryTransformType;
789 const AstTypeMatcher<RecordType> recordType;
790 const AstTypeMatcher<TagType> tagType;
791 const AstTypeMatcher<ElaboratedType> elaboratedType;
792 const AstTypeMatcher<SubstTemplateTypeParmType> substTemplateTypeParmType;
793 const AstTypeMatcher<TemplateTypeParmType> templateTypeParmType;
794 const AstTypeMatcher<InjectedClassNameType> injectedClassNameType;
795 const AstTypeMatcher<DecayedType> decayedType;
796 AST_TYPELOC_TRAVERSE_MATCHER_DEF(hasElementType,
797 AST_POLYMORPHIC_SUPPORTED_TYPES(ArrayType,
799 AST_TYPELOC_TRAVERSE_MATCHER_DEF(hasValueType,
800 AST_POLYMORPHIC_SUPPORTED_TYPES(AtomicType));
801 AST_TYPELOC_TRAVERSE_MATCHER_DEF(
803 AST_POLYMORPHIC_SUPPORTED_TYPES(BlockPointerType, MemberPointerType,
804 PointerType, ReferenceType));
806 } // end namespace ast_matchers
807 } // end namespace clang