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 {
42 AST_MATCHER_P(ObjCMessageExpr, hasAnySelectorMatcher, std::vector<std::string>,
44 std::string SelString = Node.getSelector().getAsString();
45 for (const std::string &S : Matches)
53 bool NotUnaryOperator(const ast_type_traits::DynTypedNode &DynNode,
54 ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder,
55 ArrayRef<DynTypedMatcher> InnerMatchers);
57 bool AllOfVariadicOperator(const ast_type_traits::DynTypedNode &DynNode,
58 ASTMatchFinder *Finder,
59 BoundNodesTreeBuilder *Builder,
60 ArrayRef<DynTypedMatcher> InnerMatchers);
62 bool EachOfVariadicOperator(const ast_type_traits::DynTypedNode &DynNode,
63 ASTMatchFinder *Finder,
64 BoundNodesTreeBuilder *Builder,
65 ArrayRef<DynTypedMatcher> InnerMatchers);
67 bool AnyOfVariadicOperator(const ast_type_traits::DynTypedNode &DynNode,
68 ASTMatchFinder *Finder,
69 BoundNodesTreeBuilder *Builder,
70 ArrayRef<DynTypedMatcher> InnerMatchers);
72 void BoundNodesTreeBuilder::visitMatches(Visitor *ResultVisitor) {
74 Bindings.push_back(BoundNodesMap());
75 for (BoundNodesMap &Binding : Bindings) {
76 ResultVisitor->visitMatch(BoundNodes(Binding));
82 using VariadicOperatorFunction = bool (*)(
83 const ast_type_traits::DynTypedNode &DynNode, ASTMatchFinder *Finder,
84 BoundNodesTreeBuilder *Builder, ArrayRef<DynTypedMatcher> InnerMatchers);
86 template <VariadicOperatorFunction Func>
87 class VariadicMatcher : public DynMatcherInterface {
89 VariadicMatcher(std::vector<DynTypedMatcher> InnerMatchers)
90 : InnerMatchers(std::move(InnerMatchers)) {}
92 bool dynMatches(const ast_type_traits::DynTypedNode &DynNode,
93 ASTMatchFinder *Finder,
94 BoundNodesTreeBuilder *Builder) const override {
95 return Func(DynNode, Finder, Builder, InnerMatchers);
99 std::vector<DynTypedMatcher> InnerMatchers;
102 class IdDynMatcher : public DynMatcherInterface {
104 IdDynMatcher(StringRef ID,
105 IntrusiveRefCntPtr<DynMatcherInterface> InnerMatcher)
106 : ID(ID), InnerMatcher(std::move(InnerMatcher)) {}
108 bool dynMatches(const ast_type_traits::DynTypedNode &DynNode,
109 ASTMatchFinder *Finder,
110 BoundNodesTreeBuilder *Builder) const override {
111 bool Result = InnerMatcher->dynMatches(DynNode, Finder, Builder);
112 if (Result) Builder->setBinding(ID, DynNode);
117 const std::string ID;
118 const IntrusiveRefCntPtr<DynMatcherInterface> InnerMatcher;
121 /// A matcher that always returns true.
123 /// We only ever need one instance of this matcher, so we create a global one
124 /// and reuse it to reduce the overhead of the matcher and increase the chance
126 class TrueMatcherImpl : public DynMatcherInterface {
129 Retain(); // Reference count will never become zero.
132 bool dynMatches(const ast_type_traits::DynTypedNode &, ASTMatchFinder *,
133 BoundNodesTreeBuilder *) const override {
140 static llvm::ManagedStatic<TrueMatcherImpl> TrueMatcherInstance;
142 DynTypedMatcher DynTypedMatcher::constructVariadic(
143 DynTypedMatcher::VariadicOperator Op,
144 ast_type_traits::ASTNodeKind SupportedKind,
145 std::vector<DynTypedMatcher> InnerMatchers) {
146 assert(!InnerMatchers.empty() && "Array must not be empty.");
147 assert(std::all_of(InnerMatchers.begin(), InnerMatchers.end(),
148 [SupportedKind](const DynTypedMatcher &M) {
149 return M.canConvertTo(SupportedKind);
151 "InnerMatchers must be convertible to SupportedKind!");
153 // We must relax the restrict kind here.
154 // The different operators might deal differently with a mismatch.
155 // Make it the same as SupportedKind, since that is the broadest type we are
156 // allowed to accept.
157 auto RestrictKind = SupportedKind;
161 // In the case of allOf() we must pass all the checks, so making
162 // RestrictKind the most restrictive can save us time. This way we reject
163 // invalid types earlier and we can elide the kind checks inside the
165 for (auto &IM : InnerMatchers) {
166 RestrictKind = ast_type_traits::ASTNodeKind::getMostDerivedType(
167 RestrictKind, IM.RestrictKind);
169 return DynTypedMatcher(
170 SupportedKind, RestrictKind,
171 new VariadicMatcher<AllOfVariadicOperator>(std::move(InnerMatchers)));
174 return DynTypedMatcher(
175 SupportedKind, RestrictKind,
176 new VariadicMatcher<AnyOfVariadicOperator>(std::move(InnerMatchers)));
179 return DynTypedMatcher(
180 SupportedKind, RestrictKind,
181 new VariadicMatcher<EachOfVariadicOperator>(std::move(InnerMatchers)));
184 // FIXME: Implement the Not operator to take a single matcher instead of a
186 return DynTypedMatcher(
187 SupportedKind, RestrictKind,
188 new VariadicMatcher<NotUnaryOperator>(std::move(InnerMatchers)));
190 llvm_unreachable("Invalid Op value.");
193 DynTypedMatcher DynTypedMatcher::trueMatcher(
194 ast_type_traits::ASTNodeKind NodeKind) {
195 return DynTypedMatcher(NodeKind, NodeKind, &*TrueMatcherInstance);
198 bool DynTypedMatcher::canMatchNodesOfKind(
199 ast_type_traits::ASTNodeKind Kind) const {
200 return RestrictKind.isBaseOf(Kind);
203 DynTypedMatcher DynTypedMatcher::dynCastTo(
204 const ast_type_traits::ASTNodeKind Kind) const {
206 Copy.SupportedKind = Kind;
208 ast_type_traits::ASTNodeKind::getMostDerivedType(Kind, RestrictKind);
212 bool DynTypedMatcher::matches(const ast_type_traits::DynTypedNode &DynNode,
213 ASTMatchFinder *Finder,
214 BoundNodesTreeBuilder *Builder) const {
215 if (RestrictKind.isBaseOf(DynNode.getNodeKind()) &&
216 Implementation->dynMatches(DynNode, Finder, Builder)) {
219 // Delete all bindings when a matcher does not match.
220 // This prevents unexpected exposure of bound nodes in unmatches
221 // branches of the match tree.
222 Builder->removeBindings([](const BoundNodesMap &) { return true; });
226 bool DynTypedMatcher::matchesNoKindCheck(
227 const ast_type_traits::DynTypedNode &DynNode, ASTMatchFinder *Finder,
228 BoundNodesTreeBuilder *Builder) const {
229 assert(RestrictKind.isBaseOf(DynNode.getNodeKind()));
230 if (Implementation->dynMatches(DynNode, Finder, Builder)) {
233 // Delete all bindings when a matcher does not match.
234 // This prevents unexpected exposure of bound nodes in unmatches
235 // branches of the match tree.
236 Builder->removeBindings([](const BoundNodesMap &) { return true; });
240 llvm::Optional<DynTypedMatcher> DynTypedMatcher::tryBind(StringRef ID) const {
241 if (!AllowBind) return llvm::None;
243 Result.Implementation =
244 new IdDynMatcher(ID, std::move(Result.Implementation));
245 return std::move(Result);
248 bool DynTypedMatcher::canConvertTo(ast_type_traits::ASTNodeKind To) const {
249 const auto From = getSupportedKind();
250 auto QualKind = ast_type_traits::ASTNodeKind::getFromNodeKind<QualType>();
251 auto TypeKind = ast_type_traits::ASTNodeKind::getFromNodeKind<Type>();
252 /// Mimic the implicit conversions of Matcher<>.
253 /// - From Matcher<Type> to Matcher<QualType>
254 if (From.isSame(TypeKind) && To.isSame(QualKind)) return true;
255 /// - From Matcher<Base> to Matcher<Derived>
256 return From.isBaseOf(To);
259 void BoundNodesTreeBuilder::addMatch(const BoundNodesTreeBuilder &Other) {
260 Bindings.append(Other.Bindings.begin(), Other.Bindings.end());
263 bool NotUnaryOperator(const ast_type_traits::DynTypedNode &DynNode,
264 ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder,
265 ArrayRef<DynTypedMatcher> InnerMatchers) {
266 if (InnerMatchers.size() != 1)
269 // The 'unless' matcher will always discard the result:
270 // If the inner matcher doesn't match, unless returns true,
271 // but the inner matcher cannot have bound anything.
272 // If the inner matcher matches, the result is false, and
273 // any possible binding will be discarded.
274 // We still need to hand in all the bound nodes up to this
275 // point so the inner matcher can depend on bound nodes,
276 // and we need to actively discard the bound nodes, otherwise
277 // the inner matcher will reset the bound nodes if it doesn't
278 // match, but this would be inversed by 'unless'.
279 BoundNodesTreeBuilder Discard(*Builder);
280 return !InnerMatchers[0].matches(DynNode, Finder, &Discard);
283 bool AllOfVariadicOperator(const ast_type_traits::DynTypedNode &DynNode,
284 ASTMatchFinder *Finder,
285 BoundNodesTreeBuilder *Builder,
286 ArrayRef<DynTypedMatcher> InnerMatchers) {
287 // allOf leads to one matcher for each alternative in the first
288 // matcher combined with each alternative in the second matcher.
289 // Thus, we can reuse the same Builder.
290 for (const DynTypedMatcher &InnerMatcher : InnerMatchers) {
291 if (!InnerMatcher.matchesNoKindCheck(DynNode, Finder, Builder))
297 bool EachOfVariadicOperator(const ast_type_traits::DynTypedNode &DynNode,
298 ASTMatchFinder *Finder,
299 BoundNodesTreeBuilder *Builder,
300 ArrayRef<DynTypedMatcher> InnerMatchers) {
301 BoundNodesTreeBuilder Result;
302 bool Matched = false;
303 for (const DynTypedMatcher &InnerMatcher : InnerMatchers) {
304 BoundNodesTreeBuilder BuilderInner(*Builder);
305 if (InnerMatcher.matches(DynNode, Finder, &BuilderInner)) {
307 Result.addMatch(BuilderInner);
310 *Builder = std::move(Result);
314 bool AnyOfVariadicOperator(const ast_type_traits::DynTypedNode &DynNode,
315 ASTMatchFinder *Finder,
316 BoundNodesTreeBuilder *Builder,
317 ArrayRef<DynTypedMatcher> InnerMatchers) {
318 for (const DynTypedMatcher &InnerMatcher : InnerMatchers) {
319 BoundNodesTreeBuilder Result = *Builder;
320 if (InnerMatcher.matches(DynNode, Finder, &Result)) {
321 *Builder = std::move(Result);
329 std::vector<std::string> vectorFromRefs(ArrayRef<const StringRef *> NameRefs) {
330 std::vector<std::string> Names;
331 for (auto *Name : NameRefs)
332 Names.emplace_back(*Name);
336 Matcher<NamedDecl> hasAnyNameFunc(ArrayRef<const StringRef *> NameRefs) {
337 std::vector<std::string> Names = vectorFromRefs(NameRefs);
338 return internal::Matcher<NamedDecl>(new internal::HasNameMatcher(Names));
341 Matcher<ObjCMessageExpr> hasAnySelectorFunc(
342 ArrayRef<const StringRef *> NameRefs) {
343 return hasAnySelectorMatcher(vectorFromRefs(NameRefs));
346 HasNameMatcher::HasNameMatcher(std::vector<std::string> N)
347 : UseUnqualifiedMatch(std::all_of(
349 [](StringRef Name) { return Name.find("::") == Name.npos; })),
350 Names(std::move(N)) {
352 for (StringRef Name : Names)
353 assert(!Name.empty());
357 static bool consumeNameSuffix(StringRef &FullName, StringRef Suffix) {
358 StringRef Name = FullName;
359 if (!Name.endswith(Suffix))
361 Name = Name.drop_back(Suffix.size());
363 if (!Name.endswith("::"))
365 Name = Name.drop_back(2);
371 static StringRef getNodeName(const NamedDecl &Node,
372 llvm::SmallString<128> &Scratch) {
374 if (Node.getIdentifier())
375 return Node.getName();
377 if (Node.getDeclName()) {
378 // Name needs to be constructed.
380 llvm::raw_svector_ostream OS(Scratch);
385 return "(anonymous)";
388 static StringRef getNodeName(const RecordDecl &Node,
389 llvm::SmallString<128> &Scratch) {
390 if (Node.getIdentifier()) {
391 return Node.getName();
394 return ("(anonymous " + Node.getKindName() + ")").toStringRef(Scratch);
397 static StringRef getNodeName(const NamespaceDecl &Node,
398 llvm::SmallString<128> &Scratch) {
399 return Node.isAnonymousNamespace() ? "(anonymous namespace)" : Node.getName();
406 PatternSet(ArrayRef<std::string> Names) {
407 for (StringRef Name : Names)
408 Patterns.push_back({Name, Name.startswith("::")});
411 /// Consumes the name suffix from each pattern in the set and removes the ones
412 /// that didn't match.
413 /// Return true if there are still any patterns left.
414 bool consumeNameSuffix(StringRef NodeName, bool CanSkip) {
415 for (size_t I = 0; I < Patterns.size();) {
416 if (::clang::ast_matchers::internal::consumeNameSuffix(Patterns[I].P,
421 Patterns.erase(Patterns.begin() + I);
424 return !Patterns.empty();
427 /// Check if any of the patterns are a match.
428 /// A match will be a pattern that was fully consumed, that also matches the
429 /// 'fully qualified' requirement.
430 bool foundMatch(bool AllowFullyQualified) const {
431 for (auto& P: Patterns)
432 if (P.P.empty() && (AllowFullyQualified || !P.IsFullyQualified))
440 bool IsFullyQualified;
443 llvm::SmallVector<Pattern, 8> Patterns;
448 bool HasNameMatcher::matchesNodeUnqualified(const NamedDecl &Node) const {
449 assert(UseUnqualifiedMatch);
450 llvm::SmallString<128> Scratch;
451 StringRef NodeName = getNodeName(Node, Scratch);
452 return std::any_of(Names.begin(), Names.end(), [&](StringRef Name) {
453 return consumeNameSuffix(Name, NodeName) && Name.empty();
457 bool HasNameMatcher::matchesNodeFullFast(const NamedDecl &Node) const {
458 PatternSet Patterns(Names);
459 llvm::SmallString<128> Scratch;
461 // This function is copied and adapted from NamedDecl::printQualifiedName()
462 // By matching each part individually we optimize in a couple of ways:
463 // - We can exit early on the first failure.
464 // - We can skip inline/anonymous namespaces without another pass.
465 // - We print one name at a time, reducing the chance of overflowing the
466 // inlined space of the SmallString.
468 // First, match the name.
469 if (!Patterns.consumeNameSuffix(getNodeName(Node, Scratch),
473 // Try to match each declaration context.
474 // We are allowed to skip anonymous and inline namespaces if they don't match.
475 const DeclContext *Ctx = Node.getDeclContext();
477 if (Ctx->isFunctionOrMethod())
478 return Patterns.foundMatch(/*AllowFullyQualified=*/false);
480 for (; Ctx && isa<NamedDecl>(Ctx); Ctx = Ctx->getParent()) {
481 if (Patterns.foundMatch(/*AllowFullyQualified=*/false))
484 if (const auto *ND = dyn_cast<NamespaceDecl>(Ctx)) {
485 // If it matches (or we can skip it), continue.
486 if (Patterns.consumeNameSuffix(getNodeName(*ND, Scratch),
487 /*CanSkip=*/ND->isAnonymousNamespace() ||
492 if (const auto *RD = dyn_cast<RecordDecl>(Ctx)) {
493 if (!isa<ClassTemplateSpecializationDecl>(Ctx)) {
494 if (Patterns.consumeNameSuffix(getNodeName(*RD, Scratch),
502 // We don't know how to deal with this DeclContext.
503 // Fallback to the slow version of the code.
504 return matchesNodeFullSlow(Node);
507 return Patterns.foundMatch(/*AllowFullyQualified=*/true);
510 bool HasNameMatcher::matchesNodeFullSlow(const NamedDecl &Node) const {
511 const bool SkipUnwrittenCases[] = {false, true};
512 for (bool SkipUnwritten : SkipUnwrittenCases) {
513 llvm::SmallString<128> NodeName = StringRef("::");
514 llvm::raw_svector_ostream OS(NodeName);
517 PrintingPolicy Policy = Node.getASTContext().getPrintingPolicy();
518 Policy.SuppressUnwrittenScope = true;
519 Node.printQualifiedName(OS, Policy);
521 Node.printQualifiedName(OS);
524 const StringRef FullName = OS.str();
526 for (const StringRef Pattern : Names) {
527 if (Pattern.startswith("::")) {
528 if (FullName == Pattern)
530 } else if (FullName.endswith(Pattern) &&
531 FullName.drop_back(Pattern.size()).endswith("::")) {
540 bool HasNameMatcher::matchesNode(const NamedDecl &Node) const {
541 assert(matchesNodeFullFast(Node) == matchesNodeFullSlow(Node));
542 if (UseUnqualifiedMatch) {
543 assert(matchesNodeUnqualified(Node) == matchesNodeFullFast(Node));
544 return matchesNodeUnqualified(Node);
546 return matchesNodeFullFast(Node);
549 } // end namespace internal
551 const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAutoreleasePoolStmt>
553 const internal::VariadicDynCastAllOfMatcher<Decl, TranslationUnitDecl>
555 const internal::VariadicDynCastAllOfMatcher<Decl, TypedefDecl> typedefDecl;
556 const internal::VariadicDynCastAllOfMatcher<Decl, TypedefNameDecl>
558 const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasDecl> typeAliasDecl;
559 const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasTemplateDecl>
560 typeAliasTemplateDecl;
561 const internal::VariadicAllOfMatcher<Decl> decl;
562 const internal::VariadicDynCastAllOfMatcher<Decl, LinkageSpecDecl>
564 const internal::VariadicDynCastAllOfMatcher<Decl, NamedDecl> namedDecl;
565 const internal::VariadicDynCastAllOfMatcher<Decl, LabelDecl> labelDecl;
566 const internal::VariadicDynCastAllOfMatcher<Decl, NamespaceDecl> namespaceDecl;
567 const internal::VariadicDynCastAllOfMatcher<Decl, NamespaceAliasDecl>
569 const internal::VariadicDynCastAllOfMatcher<Decl, RecordDecl> recordDecl;
570 const internal::VariadicDynCastAllOfMatcher<Decl, CXXRecordDecl> cxxRecordDecl;
571 const internal::VariadicDynCastAllOfMatcher<Decl, ClassTemplateDecl>
573 const internal::VariadicDynCastAllOfMatcher<Decl,
574 ClassTemplateSpecializationDecl>
575 classTemplateSpecializationDecl;
576 const internal::VariadicDynCastAllOfMatcher<Decl, DeclaratorDecl>
578 const internal::VariadicDynCastAllOfMatcher<Decl, ParmVarDecl> parmVarDecl;
579 const internal::VariadicDynCastAllOfMatcher<Decl, AccessSpecDecl>
581 const internal::VariadicAllOfMatcher<CXXCtorInitializer> cxxCtorInitializer;
582 const internal::VariadicAllOfMatcher<TemplateArgument> templateArgument;
583 const internal::VariadicAllOfMatcher<TemplateName> templateName;
584 const internal::VariadicDynCastAllOfMatcher<Decl, NonTypeTemplateParmDecl>
585 nonTypeTemplateParmDecl;
586 const internal::VariadicDynCastAllOfMatcher<Decl, TemplateTypeParmDecl>
587 templateTypeParmDecl;
588 const internal::VariadicAllOfMatcher<QualType> qualType;
589 const internal::VariadicAllOfMatcher<Type> type;
590 const internal::VariadicAllOfMatcher<TypeLoc> typeLoc;
591 const internal::VariadicDynCastAllOfMatcher<Stmt, UnaryExprOrTypeTraitExpr>
592 unaryExprOrTypeTraitExpr;
593 const internal::VariadicDynCastAllOfMatcher<Decl, ValueDecl> valueDecl;
594 const internal::VariadicDynCastAllOfMatcher<Decl, CXXConstructorDecl>
596 const internal::VariadicDynCastAllOfMatcher<Decl, CXXDestructorDecl>
598 const internal::VariadicDynCastAllOfMatcher<Decl, EnumDecl> enumDecl;
599 const internal::VariadicDynCastAllOfMatcher<Decl, EnumConstantDecl>
601 const internal::VariadicDynCastAllOfMatcher<Decl, CXXMethodDecl> cxxMethodDecl;
602 const internal::VariadicDynCastAllOfMatcher<Decl, CXXConversionDecl>
604 const internal::VariadicDynCastAllOfMatcher<Decl, VarDecl> varDecl;
605 const internal::VariadicDynCastAllOfMatcher<Decl, FieldDecl> fieldDecl;
606 const internal::VariadicDynCastAllOfMatcher<Decl, FunctionDecl> functionDecl;
607 const internal::VariadicDynCastAllOfMatcher<Decl, FunctionTemplateDecl>
608 functionTemplateDecl;
609 const internal::VariadicDynCastAllOfMatcher<Decl, FriendDecl> friendDecl;
610 const internal::VariadicAllOfMatcher<Stmt> stmt;
611 const internal::VariadicDynCastAllOfMatcher<Stmt, DeclStmt> declStmt;
612 const internal::VariadicDynCastAllOfMatcher<Stmt, MemberExpr> memberExpr;
613 const internal::VariadicDynCastAllOfMatcher<Stmt, CallExpr> callExpr;
614 const internal::VariadicDynCastAllOfMatcher<Stmt, LambdaExpr> lambdaExpr;
615 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXMemberCallExpr>
617 const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCMessageExpr>
619 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCInterfaceDecl>
621 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCImplementationDecl>
622 objcImplementationDecl;
623 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCProtocolDecl>
625 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryDecl>
627 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryImplDecl>
628 objcCategoryImplDecl;
629 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCMethodDecl>
631 const internal::VariadicDynCastAllOfMatcher<Decl, BlockDecl>
633 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCIvarDecl> objcIvarDecl;
634 const internal::VariadicDynCastAllOfMatcher<Decl, ObjCPropertyDecl>
636 const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtThrowStmt>
638 const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtTryStmt> objcTryStmt;
639 const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtCatchStmt>
641 const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtFinallyStmt>
643 const internal::VariadicDynCastAllOfMatcher<Stmt, ExprWithCleanups>
645 const internal::VariadicDynCastAllOfMatcher<Stmt, InitListExpr> initListExpr;
646 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXStdInitializerListExpr>
647 cxxStdInitializerListExpr;
648 const internal::VariadicDynCastAllOfMatcher<Stmt, ImplicitValueInitExpr>
649 implicitValueInitExpr;
650 const internal::VariadicDynCastAllOfMatcher<Stmt, ParenListExpr> parenListExpr;
651 const internal::VariadicDynCastAllOfMatcher<Stmt, SubstNonTypeTemplateParmExpr>
652 substNonTypeTemplateParmExpr;
653 const internal::VariadicDynCastAllOfMatcher<Decl, UsingDecl> usingDecl;
654 const internal::VariadicDynCastAllOfMatcher<Decl, UsingDirectiveDecl>
656 const internal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedLookupExpr>
657 unresolvedLookupExpr;
658 const internal::VariadicDynCastAllOfMatcher<Decl, UnresolvedUsingValueDecl>
659 unresolvedUsingValueDecl;
660 const internal::VariadicDynCastAllOfMatcher<Decl, UnresolvedUsingTypenameDecl>
661 unresolvedUsingTypenameDecl;
662 const internal::VariadicDynCastAllOfMatcher<Stmt, ParenExpr> parenExpr;
663 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXConstructExpr>
665 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXUnresolvedConstructExpr>
666 cxxUnresolvedConstructExpr;
667 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThisExpr> cxxThisExpr;
668 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBindTemporaryExpr>
669 cxxBindTemporaryExpr;
670 const internal::VariadicDynCastAllOfMatcher<Stmt, MaterializeTemporaryExpr>
671 materializeTemporaryExpr;
672 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNewExpr> cxxNewExpr;
673 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDeleteExpr> cxxDeleteExpr;
674 const internal::VariadicDynCastAllOfMatcher<Stmt, ArraySubscriptExpr>
676 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDefaultArgExpr>
678 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXOperatorCallExpr>
680 const internal::VariadicDynCastAllOfMatcher<Stmt, Expr> expr;
681 const internal::VariadicDynCastAllOfMatcher<Stmt, DeclRefExpr> declRefExpr;
682 const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCIvarRefExpr> objcIvarRefExpr;
683 const internal::VariadicDynCastAllOfMatcher<Stmt, IfStmt> ifStmt;
684 const internal::VariadicDynCastAllOfMatcher<Stmt, ForStmt> forStmt;
685 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXForRangeStmt>
687 const internal::VariadicDynCastAllOfMatcher<Stmt, WhileStmt> whileStmt;
688 const internal::VariadicDynCastAllOfMatcher<Stmt, DoStmt> doStmt;
689 const internal::VariadicDynCastAllOfMatcher<Stmt, BreakStmt> breakStmt;
690 const internal::VariadicDynCastAllOfMatcher<Stmt, ContinueStmt> continueStmt;
691 const internal::VariadicDynCastAllOfMatcher<Stmt, ReturnStmt> returnStmt;
692 const internal::VariadicDynCastAllOfMatcher<Stmt, GotoStmt> gotoStmt;
693 const internal::VariadicDynCastAllOfMatcher<Stmt, LabelStmt> labelStmt;
694 const internal::VariadicDynCastAllOfMatcher<Stmt, AddrLabelExpr> addrLabelExpr;
695 const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchStmt> switchStmt;
696 const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchCase> switchCase;
697 const internal::VariadicDynCastAllOfMatcher<Stmt, CaseStmt> caseStmt;
698 const internal::VariadicDynCastAllOfMatcher<Stmt, DefaultStmt> defaultStmt;
699 const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundStmt> compoundStmt;
700 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXCatchStmt> cxxCatchStmt;
701 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTryStmt> cxxTryStmt;
702 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThrowExpr> cxxThrowExpr;
703 const internal::VariadicDynCastAllOfMatcher<Stmt, NullStmt> nullStmt;
704 const internal::VariadicDynCastAllOfMatcher<Stmt, AsmStmt> asmStmt;
705 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBoolLiteralExpr>
707 const internal::VariadicDynCastAllOfMatcher<Stmt, StringLiteral> stringLiteral;
708 const internal::VariadicDynCastAllOfMatcher<Stmt, CharacterLiteral>
710 const internal::VariadicDynCastAllOfMatcher<Stmt, IntegerLiteral>
712 const internal::VariadicDynCastAllOfMatcher<Stmt, FloatingLiteral> floatLiteral;
713 const internal::VariadicDynCastAllOfMatcher<Stmt, UserDefinedLiteral>
715 const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundLiteralExpr>
717 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNullPtrLiteralExpr>
718 cxxNullPtrLiteralExpr;
719 const internal::VariadicDynCastAllOfMatcher<Stmt, GNUNullExpr> gnuNullExpr;
720 const internal::VariadicDynCastAllOfMatcher<Stmt, AtomicExpr> atomicExpr;
721 const internal::VariadicDynCastAllOfMatcher<Stmt, StmtExpr> stmtExpr;
722 const internal::VariadicDynCastAllOfMatcher<Stmt, BinaryOperator>
724 const internal::VariadicDynCastAllOfMatcher<Stmt, UnaryOperator> unaryOperator;
725 const internal::VariadicDynCastAllOfMatcher<Stmt, ConditionalOperator>
727 const internal::VariadicDynCastAllOfMatcher<Stmt, BinaryConditionalOperator>
728 binaryConditionalOperator;
729 const internal::VariadicDynCastAllOfMatcher<Stmt, OpaqueValueExpr>
731 const internal::VariadicDynCastAllOfMatcher<Decl, StaticAssertDecl>
733 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXReinterpretCastExpr>
734 cxxReinterpretCastExpr;
735 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXStaticCastExpr>
737 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDynamicCastExpr>
739 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXConstCastExpr>
741 const internal::VariadicDynCastAllOfMatcher<Stmt, CStyleCastExpr>
743 const internal::VariadicDynCastAllOfMatcher<Stmt, ExplicitCastExpr>
745 const internal::VariadicDynCastAllOfMatcher<Stmt, ImplicitCastExpr>
747 const internal::VariadicDynCastAllOfMatcher<Stmt, CastExpr> castExpr;
748 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXFunctionalCastExpr>
749 cxxFunctionalCastExpr;
750 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTemporaryObjectExpr>
751 cxxTemporaryObjectExpr;
752 const internal::VariadicDynCastAllOfMatcher<Stmt, PredefinedExpr>
754 const internal::VariadicDynCastAllOfMatcher<Stmt, DesignatedInitExpr>
756 const internal::VariadicOperatorMatcherFunc<
757 2, std::numeric_limits<unsigned>::max()>
758 eachOf = {internal::DynTypedMatcher::VO_EachOf};
759 const internal::VariadicOperatorMatcherFunc<
760 2, std::numeric_limits<unsigned>::max()>
761 anyOf = {internal::DynTypedMatcher::VO_AnyOf};
762 const internal::VariadicOperatorMatcherFunc<
763 2, std::numeric_limits<unsigned>::max()>
764 allOf = {internal::DynTypedMatcher::VO_AllOf};
765 const internal::VariadicFunction<internal::Matcher<NamedDecl>, StringRef,
766 internal::hasAnyNameFunc>
768 const internal::VariadicFunction<internal::Matcher<ObjCMessageExpr>, StringRef,
769 internal::hasAnySelectorFunc>
771 const internal::ArgumentAdaptingMatcherFunc<internal::HasMatcher> has = {};
772 const internal::ArgumentAdaptingMatcherFunc<internal::HasDescendantMatcher>
774 const internal::ArgumentAdaptingMatcherFunc<internal::ForEachMatcher> forEach =
776 const internal::ArgumentAdaptingMatcherFunc<internal::ForEachDescendantMatcher>
777 forEachDescendant = {};
778 const internal::ArgumentAdaptingMatcherFunc<
779 internal::HasParentMatcher,
780 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc>,
781 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc>>
783 const internal::ArgumentAdaptingMatcherFunc<
784 internal::HasAncestorMatcher,
785 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc>,
786 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc>>
788 const internal::VariadicOperatorMatcherFunc<1, 1> unless = {
789 internal::DynTypedMatcher::VO_UnaryNot};
790 const internal::VariadicAllOfMatcher<NestedNameSpecifier> nestedNameSpecifier;
791 const internal::VariadicAllOfMatcher<NestedNameSpecifierLoc>
792 nestedNameSpecifierLoc;
793 const internal::VariadicDynCastAllOfMatcher<Stmt, CUDAKernelCallExpr>
795 const AstTypeMatcher<BuiltinType> builtinType;
796 const AstTypeMatcher<ArrayType> arrayType;
797 const AstTypeMatcher<ComplexType> complexType;
798 const AstTypeMatcher<ConstantArrayType> constantArrayType;
799 const AstTypeMatcher<DependentSizedArrayType> dependentSizedArrayType;
800 const AstTypeMatcher<IncompleteArrayType> incompleteArrayType;
801 const AstTypeMatcher<VariableArrayType> variableArrayType;
802 const AstTypeMatcher<AtomicType> atomicType;
803 const AstTypeMatcher<AutoType> autoType;
804 const AstTypeMatcher<DecltypeType> decltypeType;
805 const AstTypeMatcher<FunctionType> functionType;
806 const AstTypeMatcher<FunctionProtoType> functionProtoType;
807 const AstTypeMatcher<ParenType> parenType;
808 const AstTypeMatcher<BlockPointerType> blockPointerType;
809 const AstTypeMatcher<MemberPointerType> memberPointerType;
810 const AstTypeMatcher<PointerType> pointerType;
811 const AstTypeMatcher<ObjCObjectPointerType> objcObjectPointerType;
812 const AstTypeMatcher<ReferenceType> referenceType;
813 const AstTypeMatcher<LValueReferenceType> lValueReferenceType;
814 const AstTypeMatcher<RValueReferenceType> rValueReferenceType;
815 const AstTypeMatcher<TypedefType> typedefType;
816 const AstTypeMatcher<EnumType> enumType;
817 const AstTypeMatcher<TemplateSpecializationType> templateSpecializationType;
818 const AstTypeMatcher<UnaryTransformType> unaryTransformType;
819 const AstTypeMatcher<RecordType> recordType;
820 const AstTypeMatcher<TagType> tagType;
821 const AstTypeMatcher<ElaboratedType> elaboratedType;
822 const AstTypeMatcher<SubstTemplateTypeParmType> substTemplateTypeParmType;
823 const AstTypeMatcher<TemplateTypeParmType> templateTypeParmType;
824 const AstTypeMatcher<InjectedClassNameType> injectedClassNameType;
825 const AstTypeMatcher<DecayedType> decayedType;
826 AST_TYPELOC_TRAVERSE_MATCHER_DEF(hasElementType,
827 AST_POLYMORPHIC_SUPPORTED_TYPES(ArrayType,
829 AST_TYPELOC_TRAVERSE_MATCHER_DEF(hasValueType,
830 AST_POLYMORPHIC_SUPPORTED_TYPES(AtomicType));
831 AST_TYPELOC_TRAVERSE_MATCHER_DEF(
833 AST_POLYMORPHIC_SUPPORTED_TYPES(BlockPointerType, MemberPointerType,
834 PointerType, ReferenceType));
836 } // end namespace ast_matchers
837 } // end namespace clang