xref: /freebsd/contrib/llvm-project/clang/include/clang/ASTMatchers/ASTMatchersInternal.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1 //===- ASTMatchersInternal.h - Structural query framework -------*- C++ -*-===//
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 //  Matchers are methods that return a Matcher<T> which provides a method
12 //  Matches(...) which is a predicate on an AST node. The Matches method's
13 //  parameters define the context of the match, which allows matchers to recurse
14 //  or store the current node as bound to a specific string, so that it can be
15 //  retrieved later.
16 //
17 //  In general, matchers have two parts:
18 //  1. A function Matcher<T> MatcherName(<arguments>) which returns a Matcher<T>
19 //     based on the arguments and optionally on template type deduction based
20 //     on the arguments. Matcher<T>s form an implicit reverse hierarchy
21 //     to clang's AST class hierarchy, meaning that you can use a Matcher<Base>
22 //     everywhere a Matcher<Derived> is required.
23 //  2. An implementation of a class derived from MatcherInterface<T>.
24 //
25 //  The matcher functions are defined in ASTMatchers.h. To make it possible
26 //  to implement both the matcher function and the implementation of the matcher
27 //  interface in one place, ASTMatcherMacros.h defines macros that allow
28 //  implementing a matcher in a single place.
29 //
30 //  This file contains the base classes needed to construct the actual matchers.
31 //
32 //===----------------------------------------------------------------------===//
33 
34 #ifndef LLVM_CLANG_ASTMATCHERS_ASTMATCHERSINTERNAL_H
35 #define LLVM_CLANG_ASTMATCHERS_ASTMATCHERSINTERNAL_H
36 
37 #include "clang/AST/ASTTypeTraits.h"
38 #include "clang/AST/Decl.h"
39 #include "clang/AST/DeclCXX.h"
40 #include "clang/AST/DeclFriend.h"
41 #include "clang/AST/DeclTemplate.h"
42 #include "clang/AST/Expr.h"
43 #include "clang/AST/ExprCXX.h"
44 #include "clang/AST/ExprObjC.h"
45 #include "clang/AST/NestedNameSpecifier.h"
46 #include "clang/AST/Stmt.h"
47 #include "clang/AST/TemplateName.h"
48 #include "clang/AST/Type.h"
49 #include "clang/AST/TypeLoc.h"
50 #include "clang/Basic/LLVM.h"
51 #include "clang/Basic/OperatorKinds.h"
52 #include "llvm/ADT/APFloat.h"
53 #include "llvm/ADT/ArrayRef.h"
54 #include "llvm/ADT/IntrusiveRefCntPtr.h"
55 #include "llvm/ADT/STLExtras.h"
56 #include "llvm/ADT/SmallVector.h"
57 #include "llvm/ADT/StringRef.h"
58 #include "llvm/ADT/iterator.h"
59 #include "llvm/Support/Casting.h"
60 #include "llvm/Support/ManagedStatic.h"
61 #include "llvm/Support/Regex.h"
62 #include <algorithm>
63 #include <cassert>
64 #include <cstddef>
65 #include <cstdint>
66 #include <map>
67 #include <memory>
68 #include <optional>
69 #include <string>
70 #include <tuple>
71 #include <type_traits>
72 #include <utility>
73 #include <vector>
74 
75 namespace clang {
76 
77 class ASTContext;
78 
79 namespace ast_matchers {
80 
81 class BoundNodes;
82 
83 namespace internal {
84 
85 /// A type-list implementation.
86 ///
87 /// A "linked list" of types, accessible by using the ::head and ::tail
88 /// typedefs.
89 template <typename... Ts> struct TypeList {}; // Empty sentinel type list.
90 
91 template <typename T1, typename... Ts> struct TypeList<T1, Ts...> {
92   /// The first type on the list.
93   using head = T1;
94 
95   /// A sublist with the tail. ie everything but the head.
96   ///
97   /// This type is used to do recursion. TypeList<>/EmptyTypeList indicates the
98   /// end of the list.
99   using tail = TypeList<Ts...>;
100 };
101 
102 /// The empty type list.
103 using EmptyTypeList = TypeList<>;
104 
105 /// Helper meta-function to determine if some type \c T is present or
106 ///   a parent type in the list.
107 template <typename AnyTypeList, typename T> struct TypeListContainsSuperOf {
108   static const bool value =
109       std::is_base_of<typename AnyTypeList::head, T>::value ||
110       TypeListContainsSuperOf<typename AnyTypeList::tail, T>::value;
111 };
112 template <typename T> struct TypeListContainsSuperOf<EmptyTypeList, T> {
113   static const bool value = false;
114 };
115 
116 /// Variadic function object.
117 ///
118 /// Most of the functions below that use VariadicFunction could be implemented
119 /// using plain C++11 variadic functions, but the function object allows us to
120 /// capture it on the dynamic matcher registry.
121 template <typename ResultT, typename ArgT,
122           ResultT (*Func)(ArrayRef<const ArgT *>)>
123 struct VariadicFunction {
124   ResultT operator()() const { return Func(std::nullopt); }
125 
126   template <typename... ArgsT>
127   ResultT operator()(const ArgT &Arg1, const ArgsT &... Args) const {
128     return Execute(Arg1, static_cast<const ArgT &>(Args)...);
129   }
130 
131   // We also allow calls with an already created array, in case the caller
132   // already had it.
133   ResultT operator()(ArrayRef<ArgT> Args) const {
134     return Func(llvm::to_vector<8>(llvm::make_pointer_range(Args)));
135   }
136 
137 private:
138   // Trampoline function to allow for implicit conversions to take place
139   // before we make the array.
140   template <typename... ArgsT> ResultT Execute(const ArgsT &... Args) const {
141     const ArgT *const ArgsArray[] = {&Args...};
142     return Func(ArrayRef<const ArgT *>(ArgsArray, sizeof...(ArgsT)));
143   }
144 };
145 
146 /// Unifies obtaining the underlying type of a regular node through
147 /// `getType` and a TypedefNameDecl node through `getUnderlyingType`.
148 inline QualType getUnderlyingType(const Expr &Node) { return Node.getType(); }
149 
150 inline QualType getUnderlyingType(const ValueDecl &Node) {
151   return Node.getType();
152 }
153 inline QualType getUnderlyingType(const TypedefNameDecl &Node) {
154   return Node.getUnderlyingType();
155 }
156 inline QualType getUnderlyingType(const FriendDecl &Node) {
157   if (const TypeSourceInfo *TSI = Node.getFriendType())
158     return TSI->getType();
159   return QualType();
160 }
161 inline QualType getUnderlyingType(const CXXBaseSpecifier &Node) {
162   return Node.getType();
163 }
164 
165 /// Unifies obtaining a `TypeSourceInfo` from different node types.
166 template <typename T,
167           std::enable_if_t<TypeListContainsSuperOf<
168               TypeList<CXXBaseSpecifier, CXXCtorInitializer,
169                        CXXTemporaryObjectExpr, CXXUnresolvedConstructExpr,
170                        CompoundLiteralExpr, DeclaratorDecl, ObjCPropertyDecl,
171                        TemplateArgumentLoc, TypedefNameDecl>,
172               T>::value> * = nullptr>
173 inline TypeSourceInfo *GetTypeSourceInfo(const T &Node) {
174   return Node.getTypeSourceInfo();
175 }
176 template <typename T,
177           std::enable_if_t<TypeListContainsSuperOf<
178               TypeList<CXXFunctionalCastExpr, ExplicitCastExpr>, T>::value> * =
179               nullptr>
180 inline TypeSourceInfo *GetTypeSourceInfo(const T &Node) {
181   return Node.getTypeInfoAsWritten();
182 }
183 inline TypeSourceInfo *GetTypeSourceInfo(const BlockDecl &Node) {
184   return Node.getSignatureAsWritten();
185 }
186 inline TypeSourceInfo *GetTypeSourceInfo(const CXXNewExpr &Node) {
187   return Node.getAllocatedTypeSourceInfo();
188 }
189 
190 /// Unifies obtaining the FunctionProtoType pointer from both
191 /// FunctionProtoType and FunctionDecl nodes..
192 inline const FunctionProtoType *
193 getFunctionProtoType(const FunctionProtoType &Node) {
194   return &Node;
195 }
196 
197 inline const FunctionProtoType *getFunctionProtoType(const FunctionDecl &Node) {
198   return Node.getType()->getAs<FunctionProtoType>();
199 }
200 
201 /// Unifies obtaining the access specifier from Decl and CXXBaseSpecifier nodes.
202 inline clang::AccessSpecifier getAccessSpecifier(const Decl &Node) {
203   return Node.getAccess();
204 }
205 
206 inline clang::AccessSpecifier getAccessSpecifier(const CXXBaseSpecifier &Node) {
207   return Node.getAccessSpecifier();
208 }
209 
210 /// Internal version of BoundNodes. Holds all the bound nodes.
211 class BoundNodesMap {
212 public:
213   /// Adds \c Node to the map with key \c ID.
214   ///
215   /// The node's base type should be in NodeBaseType or it will be unaccessible.
216   void addNode(StringRef ID, const DynTypedNode &DynNode) {
217     NodeMap[std::string(ID)] = DynNode;
218   }
219 
220   /// Returns the AST node bound to \c ID.
221   ///
222   /// Returns NULL if there was no node bound to \c ID or if there is a node but
223   /// it cannot be converted to the specified type.
224   template <typename T>
225   const T *getNodeAs(StringRef ID) const {
226     IDToNodeMap::const_iterator It = NodeMap.find(ID);
227     if (It == NodeMap.end()) {
228       return nullptr;
229     }
230     return It->second.get<T>();
231   }
232 
233   DynTypedNode getNode(StringRef ID) const {
234     IDToNodeMap::const_iterator It = NodeMap.find(ID);
235     if (It == NodeMap.end()) {
236       return DynTypedNode();
237     }
238     return It->second;
239   }
240 
241   /// Imposes an order on BoundNodesMaps.
242   bool operator<(const BoundNodesMap &Other) const {
243     return NodeMap < Other.NodeMap;
244   }
245 
246   /// A map from IDs to the bound nodes.
247   ///
248   /// Note that we're using std::map here, as for memoization:
249   /// - we need a comparison operator
250   /// - we need an assignment operator
251   using IDToNodeMap = std::map<std::string, DynTypedNode, std::less<>>;
252 
253   const IDToNodeMap &getMap() const {
254     return NodeMap;
255   }
256 
257   /// Returns \c true if this \c BoundNodesMap can be compared, i.e. all
258   /// stored nodes have memoization data.
259   bool isComparable() const {
260     for (const auto &IDAndNode : NodeMap) {
261       if (!IDAndNode.second.getMemoizationData())
262         return false;
263     }
264     return true;
265   }
266 
267 private:
268   IDToNodeMap NodeMap;
269 };
270 
271 /// Creates BoundNodesTree objects.
272 ///
273 /// The tree builder is used during the matching process to insert the bound
274 /// nodes from the Id matcher.
275 class BoundNodesTreeBuilder {
276 public:
277   /// A visitor interface to visit all BoundNodes results for a
278   /// BoundNodesTree.
279   class Visitor {
280   public:
281     virtual ~Visitor() = default;
282 
283     /// Called multiple times during a single call to VisitMatches(...).
284     ///
285     /// 'BoundNodesView' contains the bound nodes for a single match.
286     virtual void visitMatch(const BoundNodes& BoundNodesView) = 0;
287   };
288 
289   /// Add a binding from an id to a node.
290   void setBinding(StringRef Id, const DynTypedNode &DynNode) {
291     if (Bindings.empty())
292       Bindings.emplace_back();
293     for (BoundNodesMap &Binding : Bindings)
294       Binding.addNode(Id, DynNode);
295   }
296 
297   /// Adds a branch in the tree.
298   void addMatch(const BoundNodesTreeBuilder &Bindings);
299 
300   /// Visits all matches that this BoundNodesTree represents.
301   ///
302   /// The ownership of 'ResultVisitor' remains at the caller.
303   void visitMatches(Visitor* ResultVisitor);
304 
305   template <typename ExcludePredicate>
306   bool removeBindings(const ExcludePredicate &Predicate) {
307     llvm::erase_if(Bindings, Predicate);
308     return !Bindings.empty();
309   }
310 
311   /// Imposes an order on BoundNodesTreeBuilders.
312   bool operator<(const BoundNodesTreeBuilder &Other) const {
313     return Bindings < Other.Bindings;
314   }
315 
316   /// Returns \c true if this \c BoundNodesTreeBuilder can be compared,
317   /// i.e. all stored node maps have memoization data.
318   bool isComparable() const {
319     for (const BoundNodesMap &NodesMap : Bindings) {
320       if (!NodesMap.isComparable())
321         return false;
322     }
323     return true;
324   }
325 
326 private:
327   SmallVector<BoundNodesMap, 1> Bindings;
328 };
329 
330 class ASTMatchFinder;
331 
332 /// Generic interface for all matchers.
333 ///
334 /// Used by the implementation of Matcher<T> and DynTypedMatcher.
335 /// In general, implement MatcherInterface<T> or SingleNodeMatcherInterface<T>
336 /// instead.
337 class DynMatcherInterface
338     : public llvm::ThreadSafeRefCountedBase<DynMatcherInterface> {
339 public:
340   virtual ~DynMatcherInterface() = default;
341 
342   /// Returns true if \p DynNode can be matched.
343   ///
344   /// May bind \p DynNode to an ID via \p Builder, or recurse into
345   /// the AST via \p Finder.
346   virtual bool dynMatches(const DynTypedNode &DynNode, ASTMatchFinder *Finder,
347                           BoundNodesTreeBuilder *Builder) const = 0;
348 
349   virtual std::optional<clang::TraversalKind> TraversalKind() const {
350     return std::nullopt;
351   }
352 };
353 
354 /// Generic interface for matchers on an AST node of type T.
355 ///
356 /// Implement this if your matcher may need to inspect the children or
357 /// descendants of the node or bind matched nodes to names. If you are
358 /// writing a simple matcher that only inspects properties of the
359 /// current node and doesn't care about its children or descendants,
360 /// implement SingleNodeMatcherInterface instead.
361 template <typename T>
362 class MatcherInterface : public DynMatcherInterface {
363 public:
364   /// Returns true if 'Node' can be matched.
365   ///
366   /// May bind 'Node' to an ID via 'Builder', or recurse into
367   /// the AST via 'Finder'.
368   virtual bool matches(const T &Node,
369                        ASTMatchFinder *Finder,
370                        BoundNodesTreeBuilder *Builder) const = 0;
371 
372   bool dynMatches(const DynTypedNode &DynNode, ASTMatchFinder *Finder,
373                   BoundNodesTreeBuilder *Builder) const override {
374     return matches(DynNode.getUnchecked<T>(), Finder, Builder);
375   }
376 };
377 
378 /// Interface for matchers that only evaluate properties on a single
379 /// node.
380 template <typename T>
381 class SingleNodeMatcherInterface : public MatcherInterface<T> {
382 public:
383   /// Returns true if the matcher matches the provided node.
384   ///
385   /// A subclass must implement this instead of Matches().
386   virtual bool matchesNode(const T &Node) const = 0;
387 
388 private:
389   /// Implements MatcherInterface::Matches.
390   bool matches(const T &Node,
391                ASTMatchFinder * /* Finder */,
392                BoundNodesTreeBuilder * /*  Builder */) const override {
393     return matchesNode(Node);
394   }
395 };
396 
397 template <typename> class Matcher;
398 
399 /// Matcher that works on a \c DynTypedNode.
400 ///
401 /// It is constructed from a \c Matcher<T> object and redirects most calls to
402 /// underlying matcher.
403 /// It checks whether the \c DynTypedNode is convertible into the type of the
404 /// underlying matcher and then do the actual match on the actual node, or
405 /// return false if it is not convertible.
406 class DynTypedMatcher {
407 public:
408   /// Takes ownership of the provided implementation pointer.
409   template <typename T>
410   DynTypedMatcher(MatcherInterface<T> *Implementation)
411       : SupportedKind(ASTNodeKind::getFromNodeKind<T>()),
412         RestrictKind(SupportedKind), Implementation(Implementation) {}
413 
414   /// Construct from a variadic function.
415   enum VariadicOperator {
416     /// Matches nodes for which all provided matchers match.
417     VO_AllOf,
418 
419     /// Matches nodes for which at least one of the provided matchers
420     /// matches.
421     VO_AnyOf,
422 
423     /// Matches nodes for which at least one of the provided matchers
424     /// matches, but doesn't stop at the first match.
425     VO_EachOf,
426 
427     /// Matches any node but executes all inner matchers to find result
428     /// bindings.
429     VO_Optionally,
430 
431     /// Matches nodes that do not match the provided matcher.
432     ///
433     /// Uses the variadic matcher interface, but fails if
434     /// InnerMatchers.size() != 1.
435     VO_UnaryNot
436   };
437 
438   static DynTypedMatcher
439   constructVariadic(VariadicOperator Op, ASTNodeKind SupportedKind,
440                     std::vector<DynTypedMatcher> InnerMatchers);
441 
442   static DynTypedMatcher
443   constructRestrictedWrapper(const DynTypedMatcher &InnerMatcher,
444                              ASTNodeKind RestrictKind);
445 
446   /// Get a "true" matcher for \p NodeKind.
447   ///
448   /// It only checks that the node is of the right kind.
449   static DynTypedMatcher trueMatcher(ASTNodeKind NodeKind);
450 
451   void setAllowBind(bool AB) { AllowBind = AB; }
452 
453   /// Check whether this matcher could ever match a node of kind \p Kind.
454   /// \return \c false if this matcher will never match such a node. Otherwise,
455   /// return \c true.
456   bool canMatchNodesOfKind(ASTNodeKind Kind) const;
457 
458   /// Return a matcher that points to the same implementation, but
459   ///   restricts the node types for \p Kind.
460   DynTypedMatcher dynCastTo(const ASTNodeKind Kind) const;
461 
462   /// Return a matcher that points to the same implementation, but sets the
463   ///   traversal kind.
464   ///
465   /// If the traversal kind is already set, then \c TK overrides it.
466   DynTypedMatcher withTraversalKind(TraversalKind TK);
467 
468   /// Returns true if the matcher matches the given \c DynNode.
469   bool matches(const DynTypedNode &DynNode, ASTMatchFinder *Finder,
470                BoundNodesTreeBuilder *Builder) const;
471 
472   /// Same as matches(), but skips the kind check.
473   ///
474   /// It is faster, but the caller must ensure the node is valid for the
475   /// kind of this matcher.
476   bool matchesNoKindCheck(const DynTypedNode &DynNode, ASTMatchFinder *Finder,
477                           BoundNodesTreeBuilder *Builder) const;
478 
479   /// Bind the specified \p ID to the matcher.
480   /// \return A new matcher with the \p ID bound to it if this matcher supports
481   ///   binding. Otherwise, returns an empty \c std::optional<>.
482   std::optional<DynTypedMatcher> tryBind(StringRef ID) const;
483 
484   /// Returns a unique \p ID for the matcher.
485   ///
486   /// Casting a Matcher<T> to Matcher<U> creates a matcher that has the
487   /// same \c Implementation pointer, but different \c RestrictKind. We need to
488   /// include both in the ID to make it unique.
489   ///
490   /// \c MatcherIDType supports operator< and provides strict weak ordering.
491   using MatcherIDType = std::pair<ASTNodeKind, uint64_t>;
492   MatcherIDType getID() const {
493     /// FIXME: Document the requirements this imposes on matcher
494     /// implementations (no new() implementation_ during a Matches()).
495     return std::make_pair(RestrictKind,
496                           reinterpret_cast<uint64_t>(Implementation.get()));
497   }
498 
499   /// Returns the type this matcher works on.
500   ///
501   /// \c matches() will always return false unless the node passed is of this
502   /// or a derived type.
503   ASTNodeKind getSupportedKind() const { return SupportedKind; }
504 
505   /// Returns \c true if the passed \c DynTypedMatcher can be converted
506   ///   to a \c Matcher<T>.
507   ///
508   /// This method verifies that the underlying matcher in \c Other can process
509   /// nodes of types T.
510   template <typename T> bool canConvertTo() const {
511     return canConvertTo(ASTNodeKind::getFromNodeKind<T>());
512   }
513   bool canConvertTo(ASTNodeKind To) const;
514 
515   /// Construct a \c Matcher<T> interface around the dynamic matcher.
516   ///
517   /// This method asserts that \c canConvertTo() is \c true. Callers
518   /// should call \c canConvertTo() first to make sure that \c this is
519   /// compatible with T.
520   template <typename T> Matcher<T> convertTo() const {
521     assert(canConvertTo<T>());
522     return unconditionalConvertTo<T>();
523   }
524 
525   /// Same as \c convertTo(), but does not check that the underlying
526   ///   matcher can handle a value of T.
527   ///
528   /// If it is not compatible, then this matcher will never match anything.
529   template <typename T> Matcher<T> unconditionalConvertTo() const;
530 
531   /// Returns the \c TraversalKind respected by calls to `match()`, if any.
532   ///
533   /// Most matchers will not have a traversal kind set, instead relying on the
534   /// surrounding context. For those, \c std::nullopt is returned.
535   std::optional<clang::TraversalKind> getTraversalKind() const {
536     return Implementation->TraversalKind();
537   }
538 
539 private:
540   DynTypedMatcher(ASTNodeKind SupportedKind, ASTNodeKind RestrictKind,
541                   IntrusiveRefCntPtr<DynMatcherInterface> Implementation)
542       : SupportedKind(SupportedKind), RestrictKind(RestrictKind),
543         Implementation(std::move(Implementation)) {}
544 
545   bool AllowBind = false;
546   ASTNodeKind SupportedKind;
547 
548   /// A potentially stricter node kind.
549   ///
550   /// It allows to perform implicit and dynamic cast of matchers without
551   /// needing to change \c Implementation.
552   ASTNodeKind RestrictKind;
553   IntrusiveRefCntPtr<DynMatcherInterface> Implementation;
554 };
555 
556 /// Wrapper of a MatcherInterface<T> *that allows copying.
557 ///
558 /// A Matcher<Base> can be used anywhere a Matcher<Derived> is
559 /// required. This establishes an is-a relationship which is reverse
560 /// to the AST hierarchy. In other words, Matcher<T> is contravariant
561 /// with respect to T. The relationship is built via a type conversion
562 /// operator rather than a type hierarchy to be able to templatize the
563 /// type hierarchy instead of spelling it out.
564 template <typename T>
565 class Matcher {
566 public:
567   /// Takes ownership of the provided implementation pointer.
568   explicit Matcher(MatcherInterface<T> *Implementation)
569       : Implementation(Implementation) {}
570 
571   /// Implicitly converts \c Other to a Matcher<T>.
572   ///
573   /// Requires \c T to be derived from \c From.
574   template <typename From>
575   Matcher(const Matcher<From> &Other,
576           std::enable_if_t<std::is_base_of<From, T>::value &&
577                            !std::is_same<From, T>::value> * = nullptr)
578       : Implementation(restrictMatcher(Other.Implementation)) {
579     assert(Implementation.getSupportedKind().isSame(
580         ASTNodeKind::getFromNodeKind<T>()));
581   }
582 
583   /// Implicitly converts \c Matcher<Type> to \c Matcher<QualType>.
584   ///
585   /// The resulting matcher is not strict, i.e. ignores qualifiers.
586   template <typename TypeT>
587   Matcher(const Matcher<TypeT> &Other,
588           std::enable_if_t<std::is_same<T, QualType>::value &&
589                            std::is_same<TypeT, Type>::value> * = nullptr)
590       : Implementation(new TypeToQualType<TypeT>(Other)) {}
591 
592   /// Convert \c this into a \c Matcher<T> by applying dyn_cast<> to the
593   /// argument.
594   /// \c To must be a base class of \c T.
595   template <typename To> Matcher<To> dynCastTo() const & {
596     static_assert(std::is_base_of<To, T>::value, "Invalid dynCast call.");
597     return Matcher<To>(Implementation);
598   }
599 
600   template <typename To> Matcher<To> dynCastTo() && {
601     static_assert(std::is_base_of<To, T>::value, "Invalid dynCast call.");
602     return Matcher<To>(std::move(Implementation));
603   }
604 
605   /// Forwards the call to the underlying MatcherInterface<T> pointer.
606   bool matches(const T &Node,
607                ASTMatchFinder *Finder,
608                BoundNodesTreeBuilder *Builder) const {
609     return Implementation.matches(DynTypedNode::create(Node), Finder, Builder);
610   }
611 
612   /// Returns an ID that uniquely identifies the matcher.
613   DynTypedMatcher::MatcherIDType getID() const {
614     return Implementation.getID();
615   }
616 
617   /// Extract the dynamic matcher.
618   ///
619   /// The returned matcher keeps the same restrictions as \c this and remembers
620   /// that it is meant to support nodes of type \c T.
621   operator DynTypedMatcher() const & { return Implementation; }
622 
623   operator DynTypedMatcher() && { return std::move(Implementation); }
624 
625   /// Allows the conversion of a \c Matcher<Type> to a \c
626   /// Matcher<QualType>.
627   ///
628   /// Depending on the constructor argument, the matcher is either strict, i.e.
629   /// does only matches in the absence of qualifiers, or not, i.e. simply
630   /// ignores any qualifiers.
631   template <typename TypeT>
632   class TypeToQualType : public MatcherInterface<QualType> {
633     const DynTypedMatcher InnerMatcher;
634 
635   public:
636     TypeToQualType(const Matcher<TypeT> &InnerMatcher)
637         : InnerMatcher(InnerMatcher) {}
638 
639     bool matches(const QualType &Node, ASTMatchFinder *Finder,
640                  BoundNodesTreeBuilder *Builder) const override {
641       if (Node.isNull())
642         return false;
643       return this->InnerMatcher.matches(DynTypedNode::create(*Node), Finder,
644                                         Builder);
645     }
646 
647     std::optional<clang::TraversalKind> TraversalKind() const override {
648       return this->InnerMatcher.getTraversalKind();
649     }
650   };
651 
652 private:
653   // For Matcher<T> <=> Matcher<U> conversions.
654   template <typename U> friend class Matcher;
655 
656   // For DynTypedMatcher::unconditionalConvertTo<T>.
657   friend class DynTypedMatcher;
658 
659   static DynTypedMatcher restrictMatcher(const DynTypedMatcher &Other) {
660     return Other.dynCastTo(ASTNodeKind::getFromNodeKind<T>());
661   }
662 
663   explicit Matcher(const DynTypedMatcher &Implementation)
664       : Implementation(restrictMatcher(Implementation)) {
665     assert(this->Implementation.getSupportedKind().isSame(
666         ASTNodeKind::getFromNodeKind<T>()));
667   }
668 
669   DynTypedMatcher Implementation;
670 };  // class Matcher
671 
672 /// A convenient helper for creating a Matcher<T> without specifying
673 /// the template type argument.
674 template <typename T>
675 inline Matcher<T> makeMatcher(MatcherInterface<T> *Implementation) {
676   return Matcher<T>(Implementation);
677 }
678 
679 /// Interface that allows matchers to traverse the AST.
680 /// FIXME: Find a better name.
681 ///
682 /// This provides three entry methods for each base node type in the AST:
683 /// - \c matchesChildOf:
684 ///   Matches a matcher on every child node of the given node. Returns true
685 ///   if at least one child node could be matched.
686 /// - \c matchesDescendantOf:
687 ///   Matches a matcher on all descendant nodes of the given node. Returns true
688 ///   if at least one descendant matched.
689 /// - \c matchesAncestorOf:
690 ///   Matches a matcher on all ancestors of the given node. Returns true if
691 ///   at least one ancestor matched.
692 ///
693 /// FIXME: Currently we only allow Stmt and Decl nodes to start a traversal.
694 /// In the future, we want to implement this for all nodes for which it makes
695 /// sense. In the case of matchesAncestorOf, we'll want to implement it for
696 /// all nodes, as all nodes have ancestors.
697 class ASTMatchFinder {
698 public:
699   /// Defines how bindings are processed on recursive matches.
700   enum BindKind {
701     /// Stop at the first match and only bind the first match.
702     BK_First,
703 
704     /// Create results for all combinations of bindings that match.
705     BK_All
706   };
707 
708   /// Defines which ancestors are considered for a match.
709   enum AncestorMatchMode {
710     /// All ancestors.
711     AMM_All,
712 
713     /// Direct parent only.
714     AMM_ParentOnly
715   };
716 
717   virtual ~ASTMatchFinder() = default;
718 
719   /// Returns true if the given C++ class is directly or indirectly derived
720   /// from a base type matching \c base.
721   ///
722   /// A class is not considered to be derived from itself.
723   virtual bool classIsDerivedFrom(const CXXRecordDecl *Declaration,
724                                   const Matcher<NamedDecl> &Base,
725                                   BoundNodesTreeBuilder *Builder,
726                                   bool Directly) = 0;
727 
728   /// Returns true if the given Objective-C class is directly or indirectly
729   /// derived from a base class matching \c base.
730   ///
731   /// A class is not considered to be derived from itself.
732   virtual bool objcClassIsDerivedFrom(const ObjCInterfaceDecl *Declaration,
733                                       const Matcher<NamedDecl> &Base,
734                                       BoundNodesTreeBuilder *Builder,
735                                       bool Directly) = 0;
736 
737   template <typename T>
738   bool matchesChildOf(const T &Node, const DynTypedMatcher &Matcher,
739                       BoundNodesTreeBuilder *Builder, BindKind Bind) {
740     static_assert(std::is_base_of<Decl, T>::value ||
741                       std::is_base_of<Stmt, T>::value ||
742                       std::is_base_of<NestedNameSpecifier, T>::value ||
743                       std::is_base_of<NestedNameSpecifierLoc, T>::value ||
744                       std::is_base_of<TypeLoc, T>::value ||
745                       std::is_base_of<QualType, T>::value ||
746                       std::is_base_of<Attr, T>::value,
747                   "unsupported type for recursive matching");
748     return matchesChildOf(DynTypedNode::create(Node), getASTContext(), Matcher,
749                           Builder, Bind);
750   }
751 
752   template <typename T>
753   bool matchesDescendantOf(const T &Node, const DynTypedMatcher &Matcher,
754                            BoundNodesTreeBuilder *Builder, BindKind Bind) {
755     static_assert(std::is_base_of<Decl, T>::value ||
756                       std::is_base_of<Stmt, T>::value ||
757                       std::is_base_of<NestedNameSpecifier, T>::value ||
758                       std::is_base_of<NestedNameSpecifierLoc, T>::value ||
759                       std::is_base_of<TypeLoc, T>::value ||
760                       std::is_base_of<QualType, T>::value ||
761                       std::is_base_of<Attr, T>::value,
762                   "unsupported type for recursive matching");
763     return matchesDescendantOf(DynTypedNode::create(Node), getASTContext(),
764                                Matcher, Builder, Bind);
765   }
766 
767   // FIXME: Implement support for BindKind.
768   template <typename T>
769   bool matchesAncestorOf(const T &Node, const DynTypedMatcher &Matcher,
770                          BoundNodesTreeBuilder *Builder,
771                          AncestorMatchMode MatchMode) {
772     static_assert(std::is_base_of<Decl, T>::value ||
773                       std::is_base_of<NestedNameSpecifierLoc, T>::value ||
774                       std::is_base_of<Stmt, T>::value ||
775                       std::is_base_of<TypeLoc, T>::value ||
776                       std::is_base_of<Attr, T>::value,
777                   "type not allowed for recursive matching");
778     return matchesAncestorOf(DynTypedNode::create(Node), getASTContext(),
779                              Matcher, Builder, MatchMode);
780   }
781 
782   virtual ASTContext &getASTContext() const = 0;
783 
784   virtual bool IsMatchingInASTNodeNotSpelledInSource() const = 0;
785 
786   virtual bool IsMatchingInASTNodeNotAsIs() const = 0;
787 
788   bool isTraversalIgnoringImplicitNodes() const;
789 
790 protected:
791   virtual bool matchesChildOf(const DynTypedNode &Node, ASTContext &Ctx,
792                               const DynTypedMatcher &Matcher,
793                               BoundNodesTreeBuilder *Builder,
794                               BindKind Bind) = 0;
795 
796   virtual bool matchesDescendantOf(const DynTypedNode &Node, ASTContext &Ctx,
797                                    const DynTypedMatcher &Matcher,
798                                    BoundNodesTreeBuilder *Builder,
799                                    BindKind Bind) = 0;
800 
801   virtual bool matchesAncestorOf(const DynTypedNode &Node, ASTContext &Ctx,
802                                  const DynTypedMatcher &Matcher,
803                                  BoundNodesTreeBuilder *Builder,
804                                  AncestorMatchMode MatchMode) = 0;
805 private:
806   friend struct ASTChildrenNotSpelledInSourceScope;
807   virtual bool isMatchingChildrenNotSpelledInSource() const = 0;
808   virtual void setMatchingChildrenNotSpelledInSource(bool Set) = 0;
809 };
810 
811 struct ASTChildrenNotSpelledInSourceScope {
812   ASTChildrenNotSpelledInSourceScope(ASTMatchFinder *V, bool B)
813       : MV(V), MB(V->isMatchingChildrenNotSpelledInSource()) {
814     V->setMatchingChildrenNotSpelledInSource(B);
815   }
816   ~ASTChildrenNotSpelledInSourceScope() {
817     MV->setMatchingChildrenNotSpelledInSource(MB);
818   }
819 
820 private:
821   ASTMatchFinder *MV;
822   bool MB;
823 };
824 
825 /// Specialization of the conversion functions for QualType.
826 ///
827 /// This specialization provides the Matcher<Type>->Matcher<QualType>
828 /// conversion that the static API does.
829 template <>
830 inline Matcher<QualType> DynTypedMatcher::convertTo<QualType>() const {
831   assert(canConvertTo<QualType>());
832   const ASTNodeKind SourceKind = getSupportedKind();
833   if (SourceKind.isSame(ASTNodeKind::getFromNodeKind<Type>())) {
834     // We support implicit conversion from Matcher<Type> to Matcher<QualType>
835     return unconditionalConvertTo<Type>();
836   }
837   return unconditionalConvertTo<QualType>();
838 }
839 
840 /// Finds the first node in a range that matches the given matcher.
841 template <typename MatcherT, typename IteratorT>
842 IteratorT matchesFirstInRange(const MatcherT &Matcher, IteratorT Start,
843                               IteratorT End, ASTMatchFinder *Finder,
844                               BoundNodesTreeBuilder *Builder) {
845   for (IteratorT I = Start; I != End; ++I) {
846     BoundNodesTreeBuilder Result(*Builder);
847     if (Matcher.matches(*I, Finder, &Result)) {
848       *Builder = std::move(Result);
849       return I;
850     }
851   }
852   return End;
853 }
854 
855 /// Finds the first node in a pointer range that matches the given
856 /// matcher.
857 template <typename MatcherT, typename IteratorT>
858 IteratorT matchesFirstInPointerRange(const MatcherT &Matcher, IteratorT Start,
859                                      IteratorT End, ASTMatchFinder *Finder,
860                                      BoundNodesTreeBuilder *Builder) {
861   for (IteratorT I = Start; I != End; ++I) {
862     BoundNodesTreeBuilder Result(*Builder);
863     if (Matcher.matches(**I, Finder, &Result)) {
864       *Builder = std::move(Result);
865       return I;
866     }
867   }
868   return End;
869 }
870 
871 template <typename T, std::enable_if_t<!std::is_base_of<FunctionDecl, T>::value>
872                           * = nullptr>
873 inline bool isDefaultedHelper(const T *) {
874   return false;
875 }
876 inline bool isDefaultedHelper(const FunctionDecl *FD) {
877   return FD->isDefaulted();
878 }
879 
880 // Metafunction to determine if type T has a member called getDecl.
881 template <typename Ty>
882 class has_getDecl {
883   using yes = char[1];
884   using no = char[2];
885 
886   template <typename Inner>
887   static yes& test(Inner *I, decltype(I->getDecl()) * = nullptr);
888 
889   template <typename>
890   static no& test(...);
891 
892 public:
893   static const bool value = sizeof(test<Ty>(nullptr)) == sizeof(yes);
894 };
895 
896 /// Matches overloaded operators with a specific name.
897 ///
898 /// The type argument ArgT is not used by this matcher but is used by
899 /// PolymorphicMatcher and should be StringRef.
900 template <typename T, typename ArgT>
901 class HasOverloadedOperatorNameMatcher : public SingleNodeMatcherInterface<T> {
902   static_assert(std::is_same<T, CXXOperatorCallExpr>::value ||
903                 std::is_base_of<FunctionDecl, T>::value,
904                 "unsupported class for matcher");
905   static_assert(std::is_same<ArgT, std::vector<std::string>>::value,
906                 "argument type must be std::vector<std::string>");
907 
908 public:
909   explicit HasOverloadedOperatorNameMatcher(std::vector<std::string> Names)
910       : SingleNodeMatcherInterface<T>(), Names(std::move(Names)) {}
911 
912   bool matchesNode(const T &Node) const override {
913     return matchesSpecialized(Node);
914   }
915 
916 private:
917 
918   /// CXXOperatorCallExpr exist only for calls to overloaded operators
919   /// so this function returns true if the call is to an operator of the given
920   /// name.
921   bool matchesSpecialized(const CXXOperatorCallExpr &Node) const {
922     return llvm::is_contained(Names, getOperatorSpelling(Node.getOperator()));
923   }
924 
925   /// Returns true only if CXXMethodDecl represents an overloaded
926   /// operator and has the given operator name.
927   bool matchesSpecialized(const FunctionDecl &Node) const {
928     return Node.isOverloadedOperator() &&
929            llvm::is_contained(
930                Names, getOperatorSpelling(Node.getOverloadedOperator()));
931   }
932 
933   std::vector<std::string> Names;
934 };
935 
936 /// Matches named declarations with a specific name.
937 ///
938 /// See \c hasName() and \c hasAnyName() in ASTMatchers.h for details.
939 class HasNameMatcher : public SingleNodeMatcherInterface<NamedDecl> {
940  public:
941   explicit HasNameMatcher(std::vector<std::string> Names);
942 
943   bool matchesNode(const NamedDecl &Node) const override;
944 
945 private:
946   /// Unqualified match routine.
947   ///
948   /// It is much faster than the full match, but it only works for unqualified
949   /// matches.
950   bool matchesNodeUnqualified(const NamedDecl &Node) const;
951 
952   /// Full match routine
953   ///
954   /// Fast implementation for the simple case of a named declaration at
955   /// namespace or RecordDecl scope.
956   /// It is slower than matchesNodeUnqualified, but faster than
957   /// matchesNodeFullSlow.
958   bool matchesNodeFullFast(const NamedDecl &Node) const;
959 
960   /// Full match routine
961   ///
962   /// It generates the fully qualified name of the declaration (which is
963   /// expensive) before trying to match.
964   /// It is slower but simple and works on all cases.
965   bool matchesNodeFullSlow(const NamedDecl &Node) const;
966 
967   bool UseUnqualifiedMatch;
968   std::vector<std::string> Names;
969 };
970 
971 /// Trampoline function to use VariadicFunction<> to construct a
972 ///        HasNameMatcher.
973 Matcher<NamedDecl> hasAnyNameFunc(ArrayRef<const StringRef *> NameRefs);
974 
975 /// Trampoline function to use VariadicFunction<> to construct a
976 ///        hasAnySelector matcher.
977 Matcher<ObjCMessageExpr> hasAnySelectorFunc(
978     ArrayRef<const StringRef *> NameRefs);
979 
980 /// Matches declarations for QualType and CallExpr.
981 ///
982 /// Type argument DeclMatcherT is required by PolymorphicMatcher but
983 /// not actually used.
984 template <typename T, typename DeclMatcherT>
985 class HasDeclarationMatcher : public MatcherInterface<T> {
986   static_assert(std::is_same<DeclMatcherT, Matcher<Decl>>::value,
987                 "instantiated with wrong types");
988 
989   DynTypedMatcher InnerMatcher;
990 
991 public:
992   explicit HasDeclarationMatcher(const Matcher<Decl> &InnerMatcher)
993       : InnerMatcher(InnerMatcher) {}
994 
995   bool matches(const T &Node, ASTMatchFinder *Finder,
996                BoundNodesTreeBuilder *Builder) const override {
997     return matchesSpecialized(Node, Finder, Builder);
998   }
999 
1000 private:
1001   /// Forwards to matching on the underlying type of the QualType.
1002   bool matchesSpecialized(const QualType &Node, ASTMatchFinder *Finder,
1003                           BoundNodesTreeBuilder *Builder) const {
1004     if (Node.isNull())
1005       return false;
1006 
1007     return matchesSpecialized(*Node, Finder, Builder);
1008   }
1009 
1010   /// Finds the best declaration for a type and returns whether the inner
1011   /// matcher matches on it.
1012   bool matchesSpecialized(const Type &Node, ASTMatchFinder *Finder,
1013                           BoundNodesTreeBuilder *Builder) const {
1014     // DeducedType does not have declarations of its own, so
1015     // match the deduced type instead.
1016     if (const auto *S = dyn_cast<DeducedType>(&Node)) {
1017       QualType DT = S->getDeducedType();
1018       return !DT.isNull() ? matchesSpecialized(*DT, Finder, Builder) : false;
1019     }
1020 
1021     // First, for any types that have a declaration, extract the declaration and
1022     // match on it.
1023     if (const auto *S = dyn_cast<TagType>(&Node)) {
1024       return matchesDecl(S->getDecl(), Finder, Builder);
1025     }
1026     if (const auto *S = dyn_cast<InjectedClassNameType>(&Node)) {
1027       return matchesDecl(S->getDecl(), Finder, Builder);
1028     }
1029     if (const auto *S = dyn_cast<TemplateTypeParmType>(&Node)) {
1030       return matchesDecl(S->getDecl(), Finder, Builder);
1031     }
1032     if (const auto *S = dyn_cast<TypedefType>(&Node)) {
1033       return matchesDecl(S->getDecl(), Finder, Builder);
1034     }
1035     if (const auto *S = dyn_cast<UnresolvedUsingType>(&Node)) {
1036       return matchesDecl(S->getDecl(), Finder, Builder);
1037     }
1038     if (const auto *S = dyn_cast<ObjCObjectType>(&Node)) {
1039       return matchesDecl(S->getInterface(), Finder, Builder);
1040     }
1041 
1042     // A SubstTemplateTypeParmType exists solely to mark a type substitution
1043     // on the instantiated template. As users usually want to match the
1044     // template parameter on the uninitialized template, we can always desugar
1045     // one level without loss of expressivness.
1046     // For example, given:
1047     //   template<typename T> struct X { T t; } class A {}; X<A> a;
1048     // The following matcher will match, which otherwise would not:
1049     //   fieldDecl(hasType(pointerType())).
1050     if (const auto *S = dyn_cast<SubstTemplateTypeParmType>(&Node)) {
1051       return matchesSpecialized(S->getReplacementType(), Finder, Builder);
1052     }
1053 
1054     // For template specialization types, we want to match the template
1055     // declaration, as long as the type is still dependent, and otherwise the
1056     // declaration of the instantiated tag type.
1057     if (const auto *S = dyn_cast<TemplateSpecializationType>(&Node)) {
1058       if (!S->isTypeAlias() && S->isSugared()) {
1059         // If the template is non-dependent, we want to match the instantiated
1060         // tag type.
1061         // For example, given:
1062         //   template<typename T> struct X {}; X<int> a;
1063         // The following matcher will match, which otherwise would not:
1064         //   templateSpecializationType(hasDeclaration(cxxRecordDecl())).
1065         return matchesSpecialized(*S->desugar(), Finder, Builder);
1066       }
1067       // If the template is dependent or an alias, match the template
1068       // declaration.
1069       return matchesDecl(S->getTemplateName().getAsTemplateDecl(), Finder,
1070                          Builder);
1071     }
1072 
1073     // FIXME: We desugar elaborated types. This makes the assumption that users
1074     // do never want to match on whether a type is elaborated - there are
1075     // arguments for both sides; for now, continue desugaring.
1076     if (const auto *S = dyn_cast<ElaboratedType>(&Node)) {
1077       return matchesSpecialized(S->desugar(), Finder, Builder);
1078     }
1079     // Similarly types found via using declarations.
1080     // These are *usually* meaningless sugar, and this matches the historical
1081     // behavior prior to the introduction of UsingType.
1082     if (const auto *S = dyn_cast<UsingType>(&Node)) {
1083       return matchesSpecialized(S->desugar(), Finder, Builder);
1084     }
1085     return false;
1086   }
1087 
1088   /// Extracts the Decl the DeclRefExpr references and returns whether
1089   /// the inner matcher matches on it.
1090   bool matchesSpecialized(const DeclRefExpr &Node, ASTMatchFinder *Finder,
1091                           BoundNodesTreeBuilder *Builder) const {
1092     return matchesDecl(Node.getDecl(), Finder, Builder);
1093   }
1094 
1095   /// Extracts the Decl of the callee of a CallExpr and returns whether
1096   /// the inner matcher matches on it.
1097   bool matchesSpecialized(const CallExpr &Node, ASTMatchFinder *Finder,
1098                           BoundNodesTreeBuilder *Builder) const {
1099     return matchesDecl(Node.getCalleeDecl(), Finder, Builder);
1100   }
1101 
1102   /// Extracts the Decl of the constructor call and returns whether the
1103   /// inner matcher matches on it.
1104   bool matchesSpecialized(const CXXConstructExpr &Node,
1105                           ASTMatchFinder *Finder,
1106                           BoundNodesTreeBuilder *Builder) const {
1107     return matchesDecl(Node.getConstructor(), Finder, Builder);
1108   }
1109 
1110   bool matchesSpecialized(const ObjCIvarRefExpr &Node,
1111                           ASTMatchFinder *Finder,
1112                           BoundNodesTreeBuilder *Builder) const {
1113     return matchesDecl(Node.getDecl(), Finder, Builder);
1114   }
1115 
1116   /// Extracts the operator new of the new call and returns whether the
1117   /// inner matcher matches on it.
1118   bool matchesSpecialized(const CXXNewExpr &Node,
1119                           ASTMatchFinder *Finder,
1120                           BoundNodesTreeBuilder *Builder) const {
1121     return matchesDecl(Node.getOperatorNew(), Finder, Builder);
1122   }
1123 
1124   /// Extracts the \c ValueDecl a \c MemberExpr refers to and returns
1125   /// whether the inner matcher matches on it.
1126   bool matchesSpecialized(const MemberExpr &Node,
1127                           ASTMatchFinder *Finder,
1128                           BoundNodesTreeBuilder *Builder) const {
1129     return matchesDecl(Node.getMemberDecl(), Finder, Builder);
1130   }
1131 
1132   /// Extracts the \c LabelDecl a \c AddrLabelExpr refers to and returns
1133   /// whether the inner matcher matches on it.
1134   bool matchesSpecialized(const AddrLabelExpr &Node,
1135                           ASTMatchFinder *Finder,
1136                           BoundNodesTreeBuilder *Builder) const {
1137     return matchesDecl(Node.getLabel(), Finder, Builder);
1138   }
1139 
1140   /// Extracts the declaration of a LabelStmt and returns whether the
1141   /// inner matcher matches on it.
1142   bool matchesSpecialized(const LabelStmt &Node, ASTMatchFinder *Finder,
1143                           BoundNodesTreeBuilder *Builder) const {
1144     return matchesDecl(Node.getDecl(), Finder, Builder);
1145   }
1146 
1147   /// Returns whether the inner matcher \c Node. Returns false if \c Node
1148   /// is \c NULL.
1149   bool matchesDecl(const Decl *Node, ASTMatchFinder *Finder,
1150                    BoundNodesTreeBuilder *Builder) const {
1151     return Node != nullptr &&
1152            !(Finder->isTraversalIgnoringImplicitNodes() &&
1153              Node->isImplicit()) &&
1154            this->InnerMatcher.matches(DynTypedNode::create(*Node), Finder,
1155                                       Builder);
1156   }
1157 };
1158 
1159 /// IsBaseType<T>::value is true if T is a "base" type in the AST
1160 /// node class hierarchies.
1161 template <typename T>
1162 struct IsBaseType {
1163   static const bool value =
1164       std::is_same<T, Decl>::value || std::is_same<T, Stmt>::value ||
1165       std::is_same<T, QualType>::value || std::is_same<T, Type>::value ||
1166       std::is_same<T, TypeLoc>::value ||
1167       std::is_same<T, NestedNameSpecifier>::value ||
1168       std::is_same<T, NestedNameSpecifierLoc>::value ||
1169       std::is_same<T, CXXCtorInitializer>::value ||
1170       std::is_same<T, TemplateArgumentLoc>::value ||
1171       std::is_same<T, Attr>::value;
1172 };
1173 template <typename T>
1174 const bool IsBaseType<T>::value;
1175 
1176 /// A "type list" that contains all types.
1177 ///
1178 /// Useful for matchers like \c anything and \c unless.
1179 using AllNodeBaseTypes =
1180     TypeList<Decl, Stmt, NestedNameSpecifier, NestedNameSpecifierLoc, QualType,
1181              Type, TypeLoc, CXXCtorInitializer, Attr>;
1182 
1183 /// Helper meta-function to extract the argument out of a function of
1184 ///   type void(Arg).
1185 ///
1186 /// See AST_POLYMORPHIC_SUPPORTED_TYPES for details.
1187 template <class T> struct ExtractFunctionArgMeta;
1188 template <class T> struct ExtractFunctionArgMeta<void(T)> {
1189   using type = T;
1190 };
1191 
1192 template <class T, class Tuple, std::size_t... I>
1193 constexpr T *new_from_tuple_impl(Tuple &&t, std::index_sequence<I...>) {
1194   return new T(std::get<I>(std::forward<Tuple>(t))...);
1195 }
1196 
1197 template <class T, class Tuple> constexpr T *new_from_tuple(Tuple &&t) {
1198   return new_from_tuple_impl<T>(
1199       std::forward<Tuple>(t),
1200       std::make_index_sequence<
1201           std::tuple_size<std::remove_reference_t<Tuple>>::value>{});
1202 }
1203 
1204 /// Default type lists for ArgumentAdaptingMatcher matchers.
1205 using AdaptativeDefaultFromTypes = AllNodeBaseTypes;
1206 using AdaptativeDefaultToTypes =
1207     TypeList<Decl, Stmt, NestedNameSpecifier, NestedNameSpecifierLoc, TypeLoc,
1208              QualType, Attr>;
1209 
1210 /// All types that are supported by HasDeclarationMatcher above.
1211 using HasDeclarationSupportedTypes =
1212     TypeList<CallExpr, CXXConstructExpr, CXXNewExpr, DeclRefExpr, EnumType,
1213              ElaboratedType, InjectedClassNameType, LabelStmt, AddrLabelExpr,
1214              MemberExpr, QualType, RecordType, TagType,
1215              TemplateSpecializationType, TemplateTypeParmType, TypedefType,
1216              UnresolvedUsingType, ObjCIvarRefExpr>;
1217 
1218 /// A Matcher that allows binding the node it matches to an id.
1219 ///
1220 /// BindableMatcher provides a \a bind() method that allows binding the
1221 /// matched node to an id if the match was successful.
1222 template <typename T> class BindableMatcher : public Matcher<T> {
1223 public:
1224   explicit BindableMatcher(const Matcher<T> &M) : Matcher<T>(M) {}
1225   explicit BindableMatcher(MatcherInterface<T> *Implementation)
1226       : Matcher<T>(Implementation) {}
1227 
1228   /// Returns a matcher that will bind the matched node on a match.
1229   ///
1230   /// The returned matcher is equivalent to this matcher, but will
1231   /// bind the matched node on a match.
1232   Matcher<T> bind(StringRef ID) const {
1233     return DynTypedMatcher(*this)
1234         .tryBind(ID)
1235         ->template unconditionalConvertTo<T>();
1236   }
1237 
1238   /// Same as Matcher<T>'s conversion operator, but enables binding on
1239   /// the returned matcher.
1240   operator DynTypedMatcher() const {
1241     DynTypedMatcher Result = static_cast<const Matcher<T> &>(*this);
1242     Result.setAllowBind(true);
1243     return Result;
1244   }
1245 };
1246 
1247 /// Matches any instance of the given NodeType.
1248 ///
1249 /// This is useful when a matcher syntactically requires a child matcher,
1250 /// but the context doesn't care. See for example: anything().
1251 class TrueMatcher {
1252 public:
1253   using ReturnTypes = AllNodeBaseTypes;
1254 
1255   template <typename T> operator Matcher<T>() const {
1256     return DynTypedMatcher::trueMatcher(ASTNodeKind::getFromNodeKind<T>())
1257         .template unconditionalConvertTo<T>();
1258   }
1259 };
1260 
1261 /// Creates a Matcher<T> that matches if all inner matchers match.
1262 template <typename T>
1263 BindableMatcher<T>
1264 makeAllOfComposite(ArrayRef<const Matcher<T> *> InnerMatchers) {
1265   // For the size() == 0 case, we return a "true" matcher.
1266   if (InnerMatchers.empty()) {
1267     return BindableMatcher<T>(TrueMatcher());
1268   }
1269   // For the size() == 1 case, we simply return that one matcher.
1270   // No need to wrap it in a variadic operation.
1271   if (InnerMatchers.size() == 1) {
1272     return BindableMatcher<T>(*InnerMatchers[0]);
1273   }
1274 
1275   using PI = llvm::pointee_iterator<const Matcher<T> *const *>;
1276 
1277   std::vector<DynTypedMatcher> DynMatchers(PI(InnerMatchers.begin()),
1278                                            PI(InnerMatchers.end()));
1279   return BindableMatcher<T>(
1280       DynTypedMatcher::constructVariadic(DynTypedMatcher::VO_AllOf,
1281                                          ASTNodeKind::getFromNodeKind<T>(),
1282                                          std::move(DynMatchers))
1283           .template unconditionalConvertTo<T>());
1284 }
1285 
1286 /// Creates a Matcher<T> that matches if
1287 /// T is dyn_cast'able into InnerT and all inner matchers match.
1288 ///
1289 /// Returns BindableMatcher, as matchers that use dyn_cast have
1290 /// the same object both to match on and to run submatchers on,
1291 /// so there is no ambiguity with what gets bound.
1292 template <typename T, typename InnerT>
1293 BindableMatcher<T>
1294 makeDynCastAllOfComposite(ArrayRef<const Matcher<InnerT> *> InnerMatchers) {
1295   return BindableMatcher<T>(
1296       makeAllOfComposite(InnerMatchers).template dynCastTo<T>());
1297 }
1298 
1299 /// A VariadicDynCastAllOfMatcher<SourceT, TargetT> object is a
1300 /// variadic functor that takes a number of Matcher<TargetT> and returns a
1301 /// Matcher<SourceT> that matches TargetT nodes that are matched by all of the
1302 /// given matchers, if SourceT can be dynamically casted into TargetT.
1303 ///
1304 /// For example:
1305 ///   const VariadicDynCastAllOfMatcher<Decl, CXXRecordDecl> record;
1306 /// Creates a functor record(...) that creates a Matcher<Decl> given
1307 /// a variable number of arguments of type Matcher<CXXRecordDecl>.
1308 /// The returned matcher matches if the given Decl can by dynamically
1309 /// casted to CXXRecordDecl and all given matchers match.
1310 template <typename SourceT, typename TargetT>
1311 class VariadicDynCastAllOfMatcher
1312     : public VariadicFunction<BindableMatcher<SourceT>, Matcher<TargetT>,
1313                               makeDynCastAllOfComposite<SourceT, TargetT>> {
1314 public:
1315   VariadicDynCastAllOfMatcher() {}
1316 };
1317 
1318 /// A \c VariadicAllOfMatcher<T> object is a variadic functor that takes
1319 /// a number of \c Matcher<T> and returns a \c Matcher<T> that matches \c T
1320 /// nodes that are matched by all of the given matchers.
1321 ///
1322 /// For example:
1323 ///   const VariadicAllOfMatcher<NestedNameSpecifier> nestedNameSpecifier;
1324 /// Creates a functor nestedNameSpecifier(...) that creates a
1325 /// \c Matcher<NestedNameSpecifier> given a variable number of arguments of type
1326 /// \c Matcher<NestedNameSpecifier>.
1327 /// The returned matcher matches if all given matchers match.
1328 template <typename T>
1329 class VariadicAllOfMatcher
1330     : public VariadicFunction<BindableMatcher<T>, Matcher<T>,
1331                               makeAllOfComposite<T>> {
1332 public:
1333   VariadicAllOfMatcher() {}
1334 };
1335 
1336 /// VariadicOperatorMatcher related types.
1337 /// @{
1338 
1339 /// Polymorphic matcher object that uses a \c
1340 /// DynTypedMatcher::VariadicOperator operator.
1341 ///
1342 /// Input matchers can have any type (including other polymorphic matcher
1343 /// types), and the actual Matcher<T> is generated on demand with an implicit
1344 /// conversion operator.
1345 template <typename... Ps> class VariadicOperatorMatcher {
1346 public:
1347   VariadicOperatorMatcher(DynTypedMatcher::VariadicOperator Op, Ps &&... Params)
1348       : Op(Op), Params(std::forward<Ps>(Params)...) {}
1349 
1350   template <typename T> operator Matcher<T>() const & {
1351     return DynTypedMatcher::constructVariadic(
1352                Op, ASTNodeKind::getFromNodeKind<T>(),
1353                getMatchers<T>(std::index_sequence_for<Ps...>()))
1354         .template unconditionalConvertTo<T>();
1355   }
1356 
1357   template <typename T> operator Matcher<T>() && {
1358     return DynTypedMatcher::constructVariadic(
1359                Op, ASTNodeKind::getFromNodeKind<T>(),
1360                getMatchers<T>(std::index_sequence_for<Ps...>()))
1361         .template unconditionalConvertTo<T>();
1362   }
1363 
1364 private:
1365   // Helper method to unpack the tuple into a vector.
1366   template <typename T, std::size_t... Is>
1367   std::vector<DynTypedMatcher> getMatchers(std::index_sequence<Is...>) const & {
1368     return {Matcher<T>(std::get<Is>(Params))...};
1369   }
1370 
1371   template <typename T, std::size_t... Is>
1372   std::vector<DynTypedMatcher> getMatchers(std::index_sequence<Is...>) && {
1373     return {Matcher<T>(std::get<Is>(std::move(Params)))...};
1374   }
1375 
1376   const DynTypedMatcher::VariadicOperator Op;
1377   std::tuple<Ps...> Params;
1378 };
1379 
1380 /// Overloaded function object to generate VariadicOperatorMatcher
1381 ///   objects from arbitrary matchers.
1382 template <unsigned MinCount, unsigned MaxCount>
1383 struct VariadicOperatorMatcherFunc {
1384   DynTypedMatcher::VariadicOperator Op;
1385 
1386   template <typename... Ms>
1387   VariadicOperatorMatcher<Ms...> operator()(Ms &&... Ps) const {
1388     static_assert(MinCount <= sizeof...(Ms) && sizeof...(Ms) <= MaxCount,
1389                   "invalid number of parameters for variadic matcher");
1390     return VariadicOperatorMatcher<Ms...>(Op, std::forward<Ms>(Ps)...);
1391   }
1392 };
1393 
1394 template <typename T, bool IsBaseOf, typename Head, typename Tail>
1395 struct GetCladeImpl {
1396   using Type = Head;
1397 };
1398 template <typename T, typename Head, typename Tail>
1399 struct GetCladeImpl<T, false, Head, Tail>
1400     : GetCladeImpl<T, std::is_base_of<typename Tail::head, T>::value,
1401                    typename Tail::head, typename Tail::tail> {};
1402 
1403 template <typename T, typename... U>
1404 struct GetClade : GetCladeImpl<T, false, T, AllNodeBaseTypes> {};
1405 
1406 template <typename CladeType, typename... MatcherTypes>
1407 struct MapAnyOfMatcherImpl {
1408 
1409   template <typename... InnerMatchers>
1410   BindableMatcher<CladeType>
1411   operator()(InnerMatchers &&... InnerMatcher) const {
1412     return VariadicAllOfMatcher<CladeType>()(std::apply(
1413         internal::VariadicOperatorMatcherFunc<
1414             0, std::numeric_limits<unsigned>::max()>{
1415             internal::DynTypedMatcher::VO_AnyOf},
1416         std::apply(
1417             [&](auto... Matcher) {
1418               return std::make_tuple(Matcher(InnerMatcher...)...);
1419             },
1420             std::tuple<
1421                 VariadicDynCastAllOfMatcher<CladeType, MatcherTypes>...>())));
1422   }
1423 };
1424 
1425 template <typename... MatcherTypes>
1426 using MapAnyOfMatcher =
1427     MapAnyOfMatcherImpl<typename GetClade<MatcherTypes...>::Type,
1428                         MatcherTypes...>;
1429 
1430 template <typename... MatcherTypes> struct MapAnyOfHelper {
1431   using CladeType = typename GetClade<MatcherTypes...>::Type;
1432 
1433   MapAnyOfMatcher<MatcherTypes...> with;
1434 
1435   operator BindableMatcher<CladeType>() const { return with(); }
1436 
1437   Matcher<CladeType> bind(StringRef ID) const { return with().bind(ID); }
1438 };
1439 
1440 template <template <typename ToArg, typename FromArg> class ArgumentAdapterT,
1441           typename T, typename ToTypes>
1442 class ArgumentAdaptingMatcherFuncAdaptor {
1443 public:
1444   explicit ArgumentAdaptingMatcherFuncAdaptor(const Matcher<T> &InnerMatcher)
1445       : InnerMatcher(InnerMatcher) {}
1446 
1447   using ReturnTypes = ToTypes;
1448 
1449   template <typename To> operator Matcher<To>() const & {
1450     return Matcher<To>(new ArgumentAdapterT<To, T>(InnerMatcher));
1451   }
1452 
1453   template <typename To> operator Matcher<To>() && {
1454     return Matcher<To>(new ArgumentAdapterT<To, T>(std::move(InnerMatcher)));
1455   }
1456 
1457 private:
1458   Matcher<T> InnerMatcher;
1459 };
1460 
1461 /// Converts a \c Matcher<T> to a matcher of desired type \c To by
1462 /// "adapting" a \c To into a \c T.
1463 ///
1464 /// The \c ArgumentAdapterT argument specifies how the adaptation is done.
1465 ///
1466 /// For example:
1467 ///   \c ArgumentAdaptingMatcher<HasMatcher, T>(InnerMatcher);
1468 /// Given that \c InnerMatcher is of type \c Matcher<T>, this returns a matcher
1469 /// that is convertible into any matcher of type \c To by constructing
1470 /// \c HasMatcher<To, T>(InnerMatcher).
1471 ///
1472 /// If a matcher does not need knowledge about the inner type, prefer to use
1473 /// PolymorphicMatcher.
1474 template <template <typename ToArg, typename FromArg> class ArgumentAdapterT,
1475           typename FromTypes = AdaptativeDefaultFromTypes,
1476           typename ToTypes = AdaptativeDefaultToTypes>
1477 struct ArgumentAdaptingMatcherFunc {
1478   template <typename T>
1479   static ArgumentAdaptingMatcherFuncAdaptor<ArgumentAdapterT, T, ToTypes>
1480   create(const Matcher<T> &InnerMatcher) {
1481     return ArgumentAdaptingMatcherFuncAdaptor<ArgumentAdapterT, T, ToTypes>(
1482         InnerMatcher);
1483   }
1484 
1485   template <typename T>
1486   ArgumentAdaptingMatcherFuncAdaptor<ArgumentAdapterT, T, ToTypes>
1487   operator()(const Matcher<T> &InnerMatcher) const {
1488     return create(InnerMatcher);
1489   }
1490 
1491   template <typename... T>
1492   ArgumentAdaptingMatcherFuncAdaptor<ArgumentAdapterT,
1493                                      typename GetClade<T...>::Type, ToTypes>
1494   operator()(const MapAnyOfHelper<T...> &InnerMatcher) const {
1495     return create(InnerMatcher.with());
1496   }
1497 };
1498 
1499 template <typename T> class TraversalMatcher : public MatcherInterface<T> {
1500   DynTypedMatcher InnerMatcher;
1501   clang::TraversalKind Traversal;
1502 
1503 public:
1504   explicit TraversalMatcher(clang::TraversalKind TK,
1505                             const Matcher<T> &InnerMatcher)
1506       : InnerMatcher(InnerMatcher), Traversal(TK) {}
1507 
1508   bool matches(const T &Node, ASTMatchFinder *Finder,
1509                BoundNodesTreeBuilder *Builder) const override {
1510     return this->InnerMatcher.matches(DynTypedNode::create(Node), Finder,
1511                                       Builder);
1512   }
1513 
1514   std::optional<clang::TraversalKind> TraversalKind() const override {
1515     if (auto NestedKind = this->InnerMatcher.getTraversalKind())
1516       return NestedKind;
1517     return Traversal;
1518   }
1519 };
1520 
1521 template <typename MatcherType> class TraversalWrapper {
1522 public:
1523   TraversalWrapper(TraversalKind TK, const MatcherType &InnerMatcher)
1524       : TK(TK), InnerMatcher(InnerMatcher) {}
1525 
1526   template <typename T> operator Matcher<T>() const & {
1527     return internal::DynTypedMatcher::constructRestrictedWrapper(
1528                new internal::TraversalMatcher<T>(TK, InnerMatcher),
1529                ASTNodeKind::getFromNodeKind<T>())
1530         .template unconditionalConvertTo<T>();
1531   }
1532 
1533   template <typename T> operator Matcher<T>() && {
1534     return internal::DynTypedMatcher::constructRestrictedWrapper(
1535                new internal::TraversalMatcher<T>(TK, std::move(InnerMatcher)),
1536                ASTNodeKind::getFromNodeKind<T>())
1537         .template unconditionalConvertTo<T>();
1538   }
1539 
1540 private:
1541   TraversalKind TK;
1542   MatcherType InnerMatcher;
1543 };
1544 
1545 /// A PolymorphicMatcher<MatcherT, P1, ..., PN> object can be
1546 /// created from N parameters p1, ..., pN (of type P1, ..., PN) and
1547 /// used as a Matcher<T> where a MatcherT<T, P1, ..., PN>(p1, ..., pN)
1548 /// can be constructed.
1549 ///
1550 /// For example:
1551 /// - PolymorphicMatcher<IsDefinitionMatcher>()
1552 ///   creates an object that can be used as a Matcher<T> for any type T
1553 ///   where an IsDefinitionMatcher<T>() can be constructed.
1554 /// - PolymorphicMatcher<ValueEqualsMatcher, int>(42)
1555 ///   creates an object that can be used as a Matcher<T> for any type T
1556 ///   where a ValueEqualsMatcher<T, int>(42) can be constructed.
1557 template <template <typename T, typename... Params> class MatcherT,
1558           typename ReturnTypesF, typename... ParamTypes>
1559 class PolymorphicMatcher {
1560 public:
1561   PolymorphicMatcher(const ParamTypes &... Params) : Params(Params...) {}
1562 
1563   using ReturnTypes = typename ExtractFunctionArgMeta<ReturnTypesF>::type;
1564 
1565   template <typename T> operator Matcher<T>() const & {
1566     static_assert(TypeListContainsSuperOf<ReturnTypes, T>::value,
1567                   "right polymorphic conversion");
1568     return Matcher<T>(new_from_tuple<MatcherT<T, ParamTypes...>>(Params));
1569   }
1570 
1571   template <typename T> operator Matcher<T>() && {
1572     static_assert(TypeListContainsSuperOf<ReturnTypes, T>::value,
1573                   "right polymorphic conversion");
1574     return Matcher<T>(
1575         new_from_tuple<MatcherT<T, ParamTypes...>>(std::move(Params)));
1576   }
1577 
1578 private:
1579   std::tuple<ParamTypes...> Params;
1580 };
1581 
1582 /// Matches nodes of type T that have child nodes of type ChildT for
1583 /// which a specified child matcher matches.
1584 ///
1585 /// ChildT must be an AST base type.
1586 template <typename T, typename ChildT>
1587 class HasMatcher : public MatcherInterface<T> {
1588   DynTypedMatcher InnerMatcher;
1589 
1590 public:
1591   explicit HasMatcher(const Matcher<ChildT> &InnerMatcher)
1592       : InnerMatcher(InnerMatcher) {}
1593 
1594   bool matches(const T &Node, ASTMatchFinder *Finder,
1595                BoundNodesTreeBuilder *Builder) const override {
1596     return Finder->matchesChildOf(Node, this->InnerMatcher, Builder,
1597                                   ASTMatchFinder::BK_First);
1598   }
1599 };
1600 
1601 /// Matches nodes of type T that have child nodes of type ChildT for
1602 /// which a specified child matcher matches. ChildT must be an AST base
1603 /// type.
1604 /// As opposed to the HasMatcher, the ForEachMatcher will produce a match
1605 /// for each child that matches.
1606 template <typename T, typename ChildT>
1607 class ForEachMatcher : public MatcherInterface<T> {
1608   static_assert(IsBaseType<ChildT>::value,
1609                 "for each only accepts base type matcher");
1610 
1611   DynTypedMatcher InnerMatcher;
1612 
1613 public:
1614   explicit ForEachMatcher(const Matcher<ChildT> &InnerMatcher)
1615       : InnerMatcher(InnerMatcher) {}
1616 
1617   bool matches(const T &Node, ASTMatchFinder *Finder,
1618                BoundNodesTreeBuilder *Builder) const override {
1619     return Finder->matchesChildOf(
1620         Node, this->InnerMatcher, Builder,
1621         ASTMatchFinder::BK_All);
1622   }
1623 };
1624 
1625 /// @}
1626 
1627 template <typename T>
1628 inline Matcher<T> DynTypedMatcher::unconditionalConvertTo() const {
1629   return Matcher<T>(*this);
1630 }
1631 
1632 /// Matches nodes of type T that have at least one descendant node of
1633 /// type DescendantT for which the given inner matcher matches.
1634 ///
1635 /// DescendantT must be an AST base type.
1636 template <typename T, typename DescendantT>
1637 class HasDescendantMatcher : public MatcherInterface<T> {
1638   static_assert(IsBaseType<DescendantT>::value,
1639                 "has descendant only accepts base type matcher");
1640 
1641   DynTypedMatcher DescendantMatcher;
1642 
1643 public:
1644   explicit HasDescendantMatcher(const Matcher<DescendantT> &DescendantMatcher)
1645       : DescendantMatcher(DescendantMatcher) {}
1646 
1647   bool matches(const T &Node, ASTMatchFinder *Finder,
1648                BoundNodesTreeBuilder *Builder) const override {
1649     return Finder->matchesDescendantOf(Node, this->DescendantMatcher, Builder,
1650                                        ASTMatchFinder::BK_First);
1651   }
1652 };
1653 
1654 /// Matches nodes of type \c T that have a parent node of type \c ParentT
1655 /// for which the given inner matcher matches.
1656 ///
1657 /// \c ParentT must be an AST base type.
1658 template <typename T, typename ParentT>
1659 class HasParentMatcher : public MatcherInterface<T> {
1660   static_assert(IsBaseType<ParentT>::value,
1661                 "has parent only accepts base type matcher");
1662 
1663   DynTypedMatcher ParentMatcher;
1664 
1665 public:
1666   explicit HasParentMatcher(const Matcher<ParentT> &ParentMatcher)
1667       : ParentMatcher(ParentMatcher) {}
1668 
1669   bool matches(const T &Node, ASTMatchFinder *Finder,
1670                BoundNodesTreeBuilder *Builder) const override {
1671     return Finder->matchesAncestorOf(Node, this->ParentMatcher, Builder,
1672                                      ASTMatchFinder::AMM_ParentOnly);
1673   }
1674 };
1675 
1676 /// Matches nodes of type \c T that have at least one ancestor node of
1677 /// type \c AncestorT for which the given inner matcher matches.
1678 ///
1679 /// \c AncestorT must be an AST base type.
1680 template <typename T, typename AncestorT>
1681 class HasAncestorMatcher : public MatcherInterface<T> {
1682   static_assert(IsBaseType<AncestorT>::value,
1683                 "has ancestor only accepts base type matcher");
1684 
1685   DynTypedMatcher AncestorMatcher;
1686 
1687 public:
1688   explicit HasAncestorMatcher(const Matcher<AncestorT> &AncestorMatcher)
1689       : AncestorMatcher(AncestorMatcher) {}
1690 
1691   bool matches(const T &Node, ASTMatchFinder *Finder,
1692                BoundNodesTreeBuilder *Builder) const override {
1693     return Finder->matchesAncestorOf(Node, this->AncestorMatcher, Builder,
1694                                      ASTMatchFinder::AMM_All);
1695   }
1696 };
1697 
1698 /// Matches nodes of type T that have at least one descendant node of
1699 /// type DescendantT for which the given inner matcher matches.
1700 ///
1701 /// DescendantT must be an AST base type.
1702 /// As opposed to HasDescendantMatcher, ForEachDescendantMatcher will match
1703 /// for each descendant node that matches instead of only for the first.
1704 template <typename T, typename DescendantT>
1705 class ForEachDescendantMatcher : public MatcherInterface<T> {
1706   static_assert(IsBaseType<DescendantT>::value,
1707                 "for each descendant only accepts base type matcher");
1708 
1709   DynTypedMatcher DescendantMatcher;
1710 
1711 public:
1712   explicit ForEachDescendantMatcher(
1713       const Matcher<DescendantT> &DescendantMatcher)
1714       : DescendantMatcher(DescendantMatcher) {}
1715 
1716   bool matches(const T &Node, ASTMatchFinder *Finder,
1717                BoundNodesTreeBuilder *Builder) const override {
1718     return Finder->matchesDescendantOf(Node, this->DescendantMatcher, Builder,
1719                                        ASTMatchFinder::BK_All);
1720   }
1721 };
1722 
1723 /// Matches on nodes that have a getValue() method if getValue() equals
1724 /// the value the ValueEqualsMatcher was constructed with.
1725 template <typename T, typename ValueT>
1726 class ValueEqualsMatcher : public SingleNodeMatcherInterface<T> {
1727   static_assert(std::is_base_of<CharacterLiteral, T>::value ||
1728                 std::is_base_of<CXXBoolLiteralExpr, T>::value ||
1729                 std::is_base_of<FloatingLiteral, T>::value ||
1730                 std::is_base_of<IntegerLiteral, T>::value,
1731                 "the node must have a getValue method");
1732 
1733 public:
1734   explicit ValueEqualsMatcher(const ValueT &ExpectedValue)
1735       : ExpectedValue(ExpectedValue) {}
1736 
1737   bool matchesNode(const T &Node) const override {
1738     return Node.getValue() == ExpectedValue;
1739   }
1740 
1741 private:
1742   ValueT ExpectedValue;
1743 };
1744 
1745 /// Template specializations to easily write matchers for floating point
1746 /// literals.
1747 template <>
1748 inline bool ValueEqualsMatcher<FloatingLiteral, double>::matchesNode(
1749     const FloatingLiteral &Node) const {
1750   if ((&Node.getSemantics()) == &llvm::APFloat::IEEEsingle())
1751     return Node.getValue().convertToFloat() == ExpectedValue;
1752   if ((&Node.getSemantics()) == &llvm::APFloat::IEEEdouble())
1753     return Node.getValue().convertToDouble() == ExpectedValue;
1754   return false;
1755 }
1756 template <>
1757 inline bool ValueEqualsMatcher<FloatingLiteral, float>::matchesNode(
1758     const FloatingLiteral &Node) const {
1759   if ((&Node.getSemantics()) == &llvm::APFloat::IEEEsingle())
1760     return Node.getValue().convertToFloat() == ExpectedValue;
1761   if ((&Node.getSemantics()) == &llvm::APFloat::IEEEdouble())
1762     return Node.getValue().convertToDouble() == ExpectedValue;
1763   return false;
1764 }
1765 template <>
1766 inline bool ValueEqualsMatcher<FloatingLiteral, llvm::APFloat>::matchesNode(
1767     const FloatingLiteral &Node) const {
1768   return ExpectedValue.compare(Node.getValue()) == llvm::APFloat::cmpEqual;
1769 }
1770 
1771 /// Matches nodes of type \c TLoc for which the inner
1772 /// \c Matcher<T> matches.
1773 template <typename TLoc, typename T>
1774 class LocMatcher : public MatcherInterface<TLoc> {
1775   DynTypedMatcher InnerMatcher;
1776 
1777 public:
1778   explicit LocMatcher(const Matcher<T> &InnerMatcher)
1779       : InnerMatcher(InnerMatcher) {}
1780 
1781   bool matches(const TLoc &Node, ASTMatchFinder *Finder,
1782                BoundNodesTreeBuilder *Builder) const override {
1783     if (!Node)
1784       return false;
1785     return this->InnerMatcher.matches(extract(Node), Finder, Builder);
1786   }
1787 
1788 private:
1789   static DynTypedNode extract(const NestedNameSpecifierLoc &Loc) {
1790     return DynTypedNode::create(*Loc.getNestedNameSpecifier());
1791   }
1792 };
1793 
1794 /// Matches \c TypeLocs based on an inner matcher matching a certain
1795 /// \c QualType.
1796 ///
1797 /// Used to implement the \c loc() matcher.
1798 class TypeLocTypeMatcher : public MatcherInterface<TypeLoc> {
1799   DynTypedMatcher InnerMatcher;
1800 
1801 public:
1802   explicit TypeLocTypeMatcher(const Matcher<QualType> &InnerMatcher)
1803       : InnerMatcher(InnerMatcher) {}
1804 
1805   bool matches(const TypeLoc &Node, ASTMatchFinder *Finder,
1806                BoundNodesTreeBuilder *Builder) const override {
1807     if (!Node)
1808       return false;
1809     return this->InnerMatcher.matches(DynTypedNode::create(Node.getType()),
1810                                       Finder, Builder);
1811   }
1812 };
1813 
1814 /// Matches nodes of type \c T for which the inner matcher matches on a
1815 /// another node of type \c T that can be reached using a given traverse
1816 /// function.
1817 template <typename T> class TypeTraverseMatcher : public MatcherInterface<T> {
1818   DynTypedMatcher InnerMatcher;
1819 
1820 public:
1821   explicit TypeTraverseMatcher(const Matcher<QualType> &InnerMatcher,
1822                                QualType (T::*TraverseFunction)() const)
1823       : InnerMatcher(InnerMatcher), TraverseFunction(TraverseFunction) {}
1824 
1825   bool matches(const T &Node, ASTMatchFinder *Finder,
1826                BoundNodesTreeBuilder *Builder) const override {
1827     QualType NextNode = (Node.*TraverseFunction)();
1828     if (NextNode.isNull())
1829       return false;
1830     return this->InnerMatcher.matches(DynTypedNode::create(NextNode), Finder,
1831                                       Builder);
1832   }
1833 
1834 private:
1835   QualType (T::*TraverseFunction)() const;
1836 };
1837 
1838 /// Matches nodes of type \c T in a ..Loc hierarchy, for which the inner
1839 /// matcher matches on a another node of type \c T that can be reached using a
1840 /// given traverse function.
1841 template <typename T>
1842 class TypeLocTraverseMatcher : public MatcherInterface<T> {
1843   DynTypedMatcher InnerMatcher;
1844 
1845 public:
1846   explicit TypeLocTraverseMatcher(const Matcher<TypeLoc> &InnerMatcher,
1847                                   TypeLoc (T::*TraverseFunction)() const)
1848       : InnerMatcher(InnerMatcher), TraverseFunction(TraverseFunction) {}
1849 
1850   bool matches(const T &Node, ASTMatchFinder *Finder,
1851                BoundNodesTreeBuilder *Builder) const override {
1852     TypeLoc NextNode = (Node.*TraverseFunction)();
1853     if (!NextNode)
1854       return false;
1855     return this->InnerMatcher.matches(DynTypedNode::create(NextNode), Finder,
1856                                       Builder);
1857   }
1858 
1859 private:
1860   TypeLoc (T::*TraverseFunction)() const;
1861 };
1862 
1863 /// Converts a \c Matcher<InnerT> to a \c Matcher<OuterT>, where
1864 /// \c OuterT is any type that is supported by \c Getter.
1865 ///
1866 /// \code Getter<OuterT>::value() \endcode returns a
1867 /// \code InnerTBase (OuterT::*)() \endcode, which is used to adapt a \c OuterT
1868 /// object into a \c InnerT
1869 template <typename InnerTBase,
1870           template <typename OuterT> class Getter,
1871           template <typename OuterT> class MatcherImpl,
1872           typename ReturnTypesF>
1873 class TypeTraversePolymorphicMatcher {
1874 private:
1875   using Self = TypeTraversePolymorphicMatcher<InnerTBase, Getter, MatcherImpl,
1876                                               ReturnTypesF>;
1877 
1878   static Self create(ArrayRef<const Matcher<InnerTBase> *> InnerMatchers);
1879 
1880 public:
1881   using ReturnTypes = typename ExtractFunctionArgMeta<ReturnTypesF>::type;
1882 
1883   explicit TypeTraversePolymorphicMatcher(
1884       ArrayRef<const Matcher<InnerTBase> *> InnerMatchers)
1885       : InnerMatcher(makeAllOfComposite(InnerMatchers)) {}
1886 
1887   template <typename OuterT> operator Matcher<OuterT>() const {
1888     return Matcher<OuterT>(
1889         new MatcherImpl<OuterT>(InnerMatcher, Getter<OuterT>::value()));
1890   }
1891 
1892   struct Func
1893       : public VariadicFunction<Self, Matcher<InnerTBase>, &Self::create> {
1894     Func() {}
1895   };
1896 
1897 private:
1898   Matcher<InnerTBase> InnerMatcher;
1899 };
1900 
1901 /// A simple memoizer of T(*)() functions.
1902 ///
1903 /// It will call the passed 'Func' template parameter at most once.
1904 /// Used to support AST_MATCHER_FUNCTION() macro.
1905 template <typename Matcher, Matcher (*Func)()> class MemoizedMatcher {
1906   struct Wrapper {
1907     Wrapper() : M(Func()) {}
1908 
1909     Matcher M;
1910   };
1911 
1912 public:
1913   static const Matcher &getInstance() {
1914     static llvm::ManagedStatic<Wrapper> Instance;
1915     return Instance->M;
1916   }
1917 };
1918 
1919 // Define the create() method out of line to silence a GCC warning about
1920 // the struct "Func" having greater visibility than its base, which comes from
1921 // using the flag -fvisibility-inlines-hidden.
1922 template <typename InnerTBase, template <typename OuterT> class Getter,
1923           template <typename OuterT> class MatcherImpl, typename ReturnTypesF>
1924 TypeTraversePolymorphicMatcher<InnerTBase, Getter, MatcherImpl, ReturnTypesF>
1925 TypeTraversePolymorphicMatcher<
1926     InnerTBase, Getter, MatcherImpl,
1927     ReturnTypesF>::create(ArrayRef<const Matcher<InnerTBase> *> InnerMatchers) {
1928   return Self(InnerMatchers);
1929 }
1930 
1931 // FIXME: unify ClassTemplateSpecializationDecl and TemplateSpecializationType's
1932 // APIs for accessing the template argument list.
1933 inline ArrayRef<TemplateArgument>
1934 getTemplateSpecializationArgs(const ClassTemplateSpecializationDecl &D) {
1935   return D.getTemplateArgs().asArray();
1936 }
1937 
1938 inline ArrayRef<TemplateArgument>
1939 getTemplateSpecializationArgs(const VarTemplateSpecializationDecl &D) {
1940   return D.getTemplateArgs().asArray();
1941 }
1942 
1943 inline ArrayRef<TemplateArgument>
1944 getTemplateSpecializationArgs(const TemplateSpecializationType &T) {
1945   return T.template_arguments();
1946 }
1947 
1948 inline ArrayRef<TemplateArgument>
1949 getTemplateSpecializationArgs(const FunctionDecl &FD) {
1950   if (const auto* TemplateArgs = FD.getTemplateSpecializationArgs())
1951     return TemplateArgs->asArray();
1952   return std::nullopt;
1953 }
1954 
1955 inline ArrayRef<TemplateArgumentLoc>
1956 getTemplateArgsWritten(const ClassTemplateSpecializationDecl &D) {
1957   if (const ASTTemplateArgumentListInfo *Args = D.getTemplateArgsAsWritten())
1958     return Args->arguments();
1959   return std::nullopt;
1960 }
1961 
1962 inline ArrayRef<TemplateArgumentLoc>
1963 getTemplateArgsWritten(const VarTemplateSpecializationDecl &D) {
1964   if (const ASTTemplateArgumentListInfo *Args = D.getTemplateArgsAsWritten())
1965     return Args->arguments();
1966   return std::nullopt;
1967 }
1968 
1969 inline ArrayRef<TemplateArgumentLoc>
1970 getTemplateArgsWritten(const FunctionDecl &FD) {
1971   if (const auto *Args = FD.getTemplateSpecializationArgsAsWritten())
1972     return Args->arguments();
1973   return std::nullopt;
1974 }
1975 
1976 inline ArrayRef<TemplateArgumentLoc>
1977 getTemplateArgsWritten(const DeclRefExpr &DRE) {
1978   if (const auto *Args = DRE.getTemplateArgs())
1979     return {Args, DRE.getNumTemplateArgs()};
1980   return std::nullopt;
1981 }
1982 
1983 inline SmallVector<TemplateArgumentLoc>
1984 getTemplateArgsWritten(const TemplateSpecializationTypeLoc &T) {
1985   SmallVector<TemplateArgumentLoc> Args;
1986   if (!T.isNull()) {
1987     Args.reserve(T.getNumArgs());
1988     for (unsigned I = 0; I < T.getNumArgs(); ++I)
1989       Args.emplace_back(T.getArgLoc(I));
1990   }
1991   return Args;
1992 }
1993 
1994 struct NotEqualsBoundNodePredicate {
1995   bool operator()(const internal::BoundNodesMap &Nodes) const {
1996     return Nodes.getNode(ID) != Node;
1997   }
1998 
1999   std::string ID;
2000   DynTypedNode Node;
2001 };
2002 
2003 template <typename Ty, typename Enable = void> struct GetBodyMatcher {
2004   static const Stmt *get(const Ty &Node) { return Node.getBody(); }
2005 };
2006 
2007 template <typename Ty>
2008 struct GetBodyMatcher<
2009     Ty, std::enable_if_t<std::is_base_of<FunctionDecl, Ty>::value>> {
2010   static const Stmt *get(const Ty &Node) {
2011     return Node.doesThisDeclarationHaveABody() ? Node.getBody() : nullptr;
2012   }
2013 };
2014 
2015 template <typename NodeType>
2016 inline std::optional<BinaryOperatorKind>
2017 equivalentBinaryOperator(const NodeType &Node) {
2018   return Node.getOpcode();
2019 }
2020 
2021 template <>
2022 inline std::optional<BinaryOperatorKind>
2023 equivalentBinaryOperator<CXXOperatorCallExpr>(const CXXOperatorCallExpr &Node) {
2024   if (Node.getNumArgs() != 2)
2025     return std::nullopt;
2026   switch (Node.getOperator()) {
2027   default:
2028     return std::nullopt;
2029   case OO_ArrowStar:
2030     return BO_PtrMemI;
2031   case OO_Star:
2032     return BO_Mul;
2033   case OO_Slash:
2034     return BO_Div;
2035   case OO_Percent:
2036     return BO_Rem;
2037   case OO_Plus:
2038     return BO_Add;
2039   case OO_Minus:
2040     return BO_Sub;
2041   case OO_LessLess:
2042     return BO_Shl;
2043   case OO_GreaterGreater:
2044     return BO_Shr;
2045   case OO_Spaceship:
2046     return BO_Cmp;
2047   case OO_Less:
2048     return BO_LT;
2049   case OO_Greater:
2050     return BO_GT;
2051   case OO_LessEqual:
2052     return BO_LE;
2053   case OO_GreaterEqual:
2054     return BO_GE;
2055   case OO_EqualEqual:
2056     return BO_EQ;
2057   case OO_ExclaimEqual:
2058     return BO_NE;
2059   case OO_Amp:
2060     return BO_And;
2061   case OO_Caret:
2062     return BO_Xor;
2063   case OO_Pipe:
2064     return BO_Or;
2065   case OO_AmpAmp:
2066     return BO_LAnd;
2067   case OO_PipePipe:
2068     return BO_LOr;
2069   case OO_Equal:
2070     return BO_Assign;
2071   case OO_StarEqual:
2072     return BO_MulAssign;
2073   case OO_SlashEqual:
2074     return BO_DivAssign;
2075   case OO_PercentEqual:
2076     return BO_RemAssign;
2077   case OO_PlusEqual:
2078     return BO_AddAssign;
2079   case OO_MinusEqual:
2080     return BO_SubAssign;
2081   case OO_LessLessEqual:
2082     return BO_ShlAssign;
2083   case OO_GreaterGreaterEqual:
2084     return BO_ShrAssign;
2085   case OO_AmpEqual:
2086     return BO_AndAssign;
2087   case OO_CaretEqual:
2088     return BO_XorAssign;
2089   case OO_PipeEqual:
2090     return BO_OrAssign;
2091   case OO_Comma:
2092     return BO_Comma;
2093   }
2094 }
2095 
2096 template <typename NodeType>
2097 inline std::optional<UnaryOperatorKind>
2098 equivalentUnaryOperator(const NodeType &Node) {
2099   return Node.getOpcode();
2100 }
2101 
2102 template <>
2103 inline std::optional<UnaryOperatorKind>
2104 equivalentUnaryOperator<CXXOperatorCallExpr>(const CXXOperatorCallExpr &Node) {
2105   if (Node.getNumArgs() != 1 && Node.getOperator() != OO_PlusPlus &&
2106       Node.getOperator() != OO_MinusMinus)
2107     return std::nullopt;
2108   switch (Node.getOperator()) {
2109   default:
2110     return std::nullopt;
2111   case OO_Plus:
2112     return UO_Plus;
2113   case OO_Minus:
2114     return UO_Minus;
2115   case OO_Amp:
2116     return UO_AddrOf;
2117   case OO_Star:
2118     return UO_Deref;
2119   case OO_Tilde:
2120     return UO_Not;
2121   case OO_Exclaim:
2122     return UO_LNot;
2123   case OO_PlusPlus: {
2124     const auto *FD = Node.getDirectCallee();
2125     if (!FD)
2126       return std::nullopt;
2127     return FD->getNumParams() > 0 ? UO_PostInc : UO_PreInc;
2128   }
2129   case OO_MinusMinus: {
2130     const auto *FD = Node.getDirectCallee();
2131     if (!FD)
2132       return std::nullopt;
2133     return FD->getNumParams() > 0 ? UO_PostDec : UO_PreDec;
2134   }
2135   case OO_Coawait:
2136     return UO_Coawait;
2137   }
2138 }
2139 
2140 template <typename NodeType> inline const Expr *getLHS(const NodeType &Node) {
2141   return Node.getLHS();
2142 }
2143 template <>
2144 inline const Expr *
2145 getLHS<CXXOperatorCallExpr>(const CXXOperatorCallExpr &Node) {
2146   if (!internal::equivalentBinaryOperator(Node))
2147     return nullptr;
2148   return Node.getArg(0);
2149 }
2150 template <typename NodeType> inline const Expr *getRHS(const NodeType &Node) {
2151   return Node.getRHS();
2152 }
2153 template <>
2154 inline const Expr *
2155 getRHS<CXXOperatorCallExpr>(const CXXOperatorCallExpr &Node) {
2156   if (!internal::equivalentBinaryOperator(Node))
2157     return nullptr;
2158   return Node.getArg(1);
2159 }
2160 template <typename NodeType>
2161 inline const Expr *getSubExpr(const NodeType &Node) {
2162   return Node.getSubExpr();
2163 }
2164 template <>
2165 inline const Expr *
2166 getSubExpr<CXXOperatorCallExpr>(const CXXOperatorCallExpr &Node) {
2167   if (!internal::equivalentUnaryOperator(Node))
2168     return nullptr;
2169   return Node.getArg(0);
2170 }
2171 
2172 template <typename Ty>
2173 struct HasSizeMatcher {
2174   static bool hasSize(const Ty &Node, unsigned int N) {
2175     return Node.getSize() == N;
2176   }
2177 };
2178 
2179 template <>
2180 inline bool HasSizeMatcher<StringLiteral>::hasSize(
2181     const StringLiteral &Node, unsigned int N) {
2182   return Node.getLength() == N;
2183 }
2184 
2185 template <typename Ty>
2186 struct GetSourceExpressionMatcher {
2187   static const Expr *get(const Ty &Node) {
2188     return Node.getSubExpr();
2189   }
2190 };
2191 
2192 template <>
2193 inline const Expr *GetSourceExpressionMatcher<OpaqueValueExpr>::get(
2194     const OpaqueValueExpr &Node) {
2195   return Node.getSourceExpr();
2196 }
2197 
2198 template <typename Ty>
2199 struct CompoundStmtMatcher {
2200   static const CompoundStmt *get(const Ty &Node) {
2201     return &Node;
2202   }
2203 };
2204 
2205 template <>
2206 inline const CompoundStmt *
2207 CompoundStmtMatcher<StmtExpr>::get(const StmtExpr &Node) {
2208   return Node.getSubStmt();
2209 }
2210 
2211 /// If \p Loc is (transitively) expanded from macro \p MacroName, returns the
2212 /// location (in the chain of expansions) at which \p MacroName was
2213 /// expanded. Since the macro may have been expanded inside a series of
2214 /// expansions, that location may itself be a MacroID.
2215 std::optional<SourceLocation> getExpansionLocOfMacro(StringRef MacroName,
2216                                                      SourceLocation Loc,
2217                                                      const ASTContext &Context);
2218 
2219 inline std::optional<StringRef> getOpName(const UnaryOperator &Node) {
2220   return Node.getOpcodeStr(Node.getOpcode());
2221 }
2222 inline std::optional<StringRef> getOpName(const BinaryOperator &Node) {
2223   return Node.getOpcodeStr();
2224 }
2225 inline StringRef getOpName(const CXXRewrittenBinaryOperator &Node) {
2226   return Node.getOpcodeStr();
2227 }
2228 inline std::optional<StringRef> getOpName(const CXXOperatorCallExpr &Node) {
2229   auto optBinaryOpcode = equivalentBinaryOperator(Node);
2230   if (!optBinaryOpcode) {
2231     auto optUnaryOpcode = equivalentUnaryOperator(Node);
2232     if (!optUnaryOpcode)
2233       return std::nullopt;
2234     return UnaryOperator::getOpcodeStr(*optUnaryOpcode);
2235   }
2236   return BinaryOperator::getOpcodeStr(*optBinaryOpcode);
2237 }
2238 inline StringRef getOpName(const CXXFoldExpr &Node) {
2239   return BinaryOperator::getOpcodeStr(Node.getOperator());
2240 }
2241 
2242 /// Matches overloaded operators with a specific name.
2243 ///
2244 /// The type argument ArgT is not used by this matcher but is used by
2245 /// PolymorphicMatcher and should be std::vector<std::string>>.
2246 template <typename T, typename ArgT = std::vector<std::string>>
2247 class HasAnyOperatorNameMatcher : public SingleNodeMatcherInterface<T> {
2248   static_assert(std::is_same<T, BinaryOperator>::value ||
2249                     std::is_same<T, CXXOperatorCallExpr>::value ||
2250                     std::is_same<T, CXXRewrittenBinaryOperator>::value ||
2251                     std::is_same<T, UnaryOperator>::value,
2252                 "Matcher only supports `BinaryOperator`, `UnaryOperator`, "
2253                 "`CXXOperatorCallExpr` and `CXXRewrittenBinaryOperator`");
2254   static_assert(std::is_same<ArgT, std::vector<std::string>>::value,
2255                 "Matcher ArgT must be std::vector<std::string>");
2256 
2257 public:
2258   explicit HasAnyOperatorNameMatcher(std::vector<std::string> Names)
2259       : SingleNodeMatcherInterface<T>(), Names(std::move(Names)) {}
2260 
2261   bool matchesNode(const T &Node) const override {
2262     std::optional<StringRef> OptOpName = getOpName(Node);
2263     return OptOpName && llvm::is_contained(Names, *OptOpName);
2264   }
2265 
2266 private:
2267   static std::optional<StringRef> getOpName(const UnaryOperator &Node) {
2268     return Node.getOpcodeStr(Node.getOpcode());
2269   }
2270   static std::optional<StringRef> getOpName(const BinaryOperator &Node) {
2271     return Node.getOpcodeStr();
2272   }
2273   static StringRef getOpName(const CXXRewrittenBinaryOperator &Node) {
2274     return Node.getOpcodeStr();
2275   }
2276   static std::optional<StringRef> getOpName(const CXXOperatorCallExpr &Node) {
2277     auto optBinaryOpcode = equivalentBinaryOperator(Node);
2278     if (!optBinaryOpcode) {
2279       auto optUnaryOpcode = equivalentUnaryOperator(Node);
2280       if (!optUnaryOpcode)
2281         return std::nullopt;
2282       return UnaryOperator::getOpcodeStr(*optUnaryOpcode);
2283     }
2284     return BinaryOperator::getOpcodeStr(*optBinaryOpcode);
2285   }
2286 
2287   std::vector<std::string> Names;
2288 };
2289 
2290 using HasOpNameMatcher =
2291     PolymorphicMatcher<HasAnyOperatorNameMatcher,
2292                        void(
2293                            TypeList<BinaryOperator, CXXOperatorCallExpr,
2294                                     CXXRewrittenBinaryOperator, UnaryOperator>),
2295                        std::vector<std::string>>;
2296 
2297 HasOpNameMatcher hasAnyOperatorNameFunc(ArrayRef<const StringRef *> NameRefs);
2298 
2299 using HasOverloadOpNameMatcher =
2300     PolymorphicMatcher<HasOverloadedOperatorNameMatcher,
2301                        void(TypeList<CXXOperatorCallExpr, FunctionDecl>),
2302                        std::vector<std::string>>;
2303 
2304 HasOverloadOpNameMatcher
2305 hasAnyOverloadedOperatorNameFunc(ArrayRef<const StringRef *> NameRefs);
2306 
2307 /// Returns true if \p Node has a base specifier matching \p BaseSpec.
2308 ///
2309 /// A class is not considered to be derived from itself.
2310 bool matchesAnyBase(const CXXRecordDecl &Node,
2311                     const Matcher<CXXBaseSpecifier> &BaseSpecMatcher,
2312                     ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder);
2313 
2314 std::shared_ptr<llvm::Regex> createAndVerifyRegex(StringRef Regex,
2315                                                   llvm::Regex::RegexFlags Flags,
2316                                                   StringRef MatcherID);
2317 
2318 inline bool
2319 MatchTemplateArgLocAt(const DeclRefExpr &Node, unsigned int Index,
2320                       internal::Matcher<TemplateArgumentLoc> InnerMatcher,
2321                       internal::ASTMatchFinder *Finder,
2322                       internal::BoundNodesTreeBuilder *Builder) {
2323   llvm::ArrayRef<TemplateArgumentLoc> ArgLocs = Node.template_arguments();
2324   return Index < ArgLocs.size() &&
2325          InnerMatcher.matches(ArgLocs[Index], Finder, Builder);
2326 }
2327 
2328 inline bool
2329 MatchTemplateArgLocAt(const TemplateSpecializationTypeLoc &Node,
2330                       unsigned int Index,
2331                       internal::Matcher<TemplateArgumentLoc> InnerMatcher,
2332                       internal::ASTMatchFinder *Finder,
2333                       internal::BoundNodesTreeBuilder *Builder) {
2334   return !Node.isNull() && Index < Node.getNumArgs() &&
2335          InnerMatcher.matches(Node.getArgLoc(Index), Finder, Builder);
2336 }
2337 
2338 } // namespace internal
2339 
2340 } // namespace ast_matchers
2341 
2342 } // namespace clang
2343 
2344 #endif // LLVM_CLANG_ASTMATCHERS_ASTMATCHERSINTERNAL_H
2345