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