• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===--- ASTMatchersInternal.h - Structural query framework -----*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 //  Implements the base layer of the matcher framework.
11 //
12 //  Matchers are methods that return a Matcher<T> which provides a method
13 //  Matches(...) which is a predicate on an AST node. The Matches method's
14 //  parameters define the context of the match, which allows matchers to recurse
15 //  or store the current node as bound to a specific string, so that it can be
16 //  retrieved later.
17 //
18 //  In general, matchers have two parts:
19 //  1. A function Matcher<T> MatcherName(<arguments>) which returns a Matcher<T>
20 //     based on the arguments and optionally on template type deduction based
21 //     on the arguments. Matcher<T>s form an implicit reverse hierarchy
22 //     to clang's AST class hierarchy, meaning that you can use a Matcher<Base>
23 //     everywhere a Matcher<Derived> is required.
24 //  2. An implementation of a class derived from MatcherInterface<T>.
25 //
26 //  The matcher functions are defined in ASTMatchers.h. To make it possible
27 //  to implement both the matcher function and the implementation of the matcher
28 //  interface in one place, ASTMatcherMacros.h defines macros that allow
29 //  implementing a matcher in a single place.
30 //
31 //  This file contains the base classes needed to construct the actual matchers.
32 //
33 //===----------------------------------------------------------------------===//
34 
35 #ifndef LLVM_CLANG_AST_MATCHERS_AST_MATCHERS_INTERNAL_H
36 #define LLVM_CLANG_AST_MATCHERS_AST_MATCHERS_INTERNAL_H
37 
38 #include "clang/AST/ASTTypeTraits.h"
39 #include "clang/AST/Decl.h"
40 #include "clang/AST/DeclCXX.h"
41 #include "clang/AST/ExprCXX.h"
42 #include "clang/AST/Stmt.h"
43 #include "clang/AST/StmtCXX.h"
44 #include "clang/AST/Type.h"
45 #include "llvm/ADT/Optional.h"
46 #include "llvm/ADT/VariadicFunction.h"
47 #include <map>
48 #include <string>
49 #include <vector>
50 
51 namespace clang {
52 namespace ast_matchers {
53 
54 class BoundNodes;
55 
56 namespace internal {
57 
58 /// \brief Internal version of BoundNodes. Holds all the bound nodes.
59 class BoundNodesMap {
60 public:
61   /// \brief Adds \c Node to the map with key \c ID.
62   ///
63   /// The node's base type should be in NodeBaseType or it will be unaccessible.
64   template <typename T>
addNode(StringRef ID,const T * Node)65   void addNode(StringRef ID, const T* Node) {
66     NodeMap[ID] = ast_type_traits::DynTypedNode::create(*Node);
67   }
68 
69   /// \brief Returns the AST node bound to \c ID.
70   ///
71   /// Returns NULL if there was no node bound to \c ID or if there is a node but
72   /// it cannot be converted to the specified type.
73   template <typename T>
getNodeAs(StringRef ID)74   const T *getNodeAs(StringRef ID) const {
75     IDToNodeMap::const_iterator It = NodeMap.find(ID);
76     if (It == NodeMap.end()) {
77       return nullptr;
78     }
79     return It->second.get<T>();
80   }
81 
getNode(StringRef ID)82   ast_type_traits::DynTypedNode getNode(StringRef ID) const {
83     IDToNodeMap::const_iterator It = NodeMap.find(ID);
84     if (It == NodeMap.end()) {
85       return ast_type_traits::DynTypedNode();
86     }
87     return It->second;
88   }
89 
90   /// \brief Imposes an order on BoundNodesMaps.
91   bool operator<(const BoundNodesMap &Other) const {
92     return NodeMap < Other.NodeMap;
93   }
94 
95   /// \brief A map from IDs to the bound nodes.
96   ///
97   /// Note that we're using std::map here, as for memoization:
98   /// - we need a comparison operator
99   /// - we need an assignment operator
100   typedef std::map<std::string, ast_type_traits::DynTypedNode> IDToNodeMap;
101 
getMap()102   const IDToNodeMap &getMap() const {
103     return NodeMap;
104   }
105 
106 private:
107   IDToNodeMap NodeMap;
108 };
109 
110 /// \brief Creates BoundNodesTree objects.
111 ///
112 /// The tree builder is used during the matching process to insert the bound
113 /// nodes from the Id matcher.
114 class BoundNodesTreeBuilder {
115 public:
116   /// \brief A visitor interface to visit all BoundNodes results for a
117   /// BoundNodesTree.
118   class Visitor {
119   public:
~Visitor()120     virtual ~Visitor() {}
121 
122     /// \brief Called multiple times during a single call to VisitMatches(...).
123     ///
124     /// 'BoundNodesView' contains the bound nodes for a single match.
125     virtual void visitMatch(const BoundNodes& BoundNodesView) = 0;
126   };
127 
128   /// \brief Add a binding from an id to a node.
setBinding(const std::string & Id,const T * Node)129   template <typename T> void setBinding(const std::string &Id, const T *Node) {
130     if (Bindings.empty())
131       Bindings.push_back(BoundNodesMap());
132     for (unsigned i = 0, e = Bindings.size(); i != e; ++i)
133       Bindings[i].addNode(Id, Node);
134   }
135 
136   /// \brief Adds a branch in the tree.
137   void addMatch(const BoundNodesTreeBuilder &Bindings);
138 
139   /// \brief Visits all matches that this BoundNodesTree represents.
140   ///
141   /// The ownership of 'ResultVisitor' remains at the caller.
142   void visitMatches(Visitor* ResultVisitor);
143 
144   template <typename ExcludePredicate>
removeBindings(const ExcludePredicate & Predicate)145   bool removeBindings(const ExcludePredicate &Predicate) {
146     Bindings.erase(std::remove_if(Bindings.begin(), Bindings.end(), Predicate),
147                    Bindings.end());
148     return !Bindings.empty();
149   }
150 
151   /// \brief Imposes an order on BoundNodesTreeBuilders.
152   bool operator<(const BoundNodesTreeBuilder &Other) const {
153     return Bindings < Other.Bindings;
154   }
155 
156 private:
157   SmallVector<BoundNodesMap, 16> Bindings;
158 };
159 
160 class ASTMatchFinder;
161 
162 /// \brief Generic interface for matchers on an AST node of type T.
163 ///
164 /// Implement this if your matcher may need to inspect the children or
165 /// descendants of the node or bind matched nodes to names. If you are
166 /// writing a simple matcher that only inspects properties of the
167 /// current node and doesn't care about its children or descendants,
168 /// implement SingleNodeMatcherInterface instead.
169 template <typename T>
170 class MatcherInterface : public RefCountedBaseVPTR {
171 public:
~MatcherInterface()172   virtual ~MatcherInterface() {}
173 
174   /// \brief Returns true if 'Node' can be matched.
175   ///
176   /// May bind 'Node' to an ID via 'Builder', or recurse into
177   /// the AST via 'Finder'.
178   virtual bool matches(const T &Node,
179                        ASTMatchFinder *Finder,
180                        BoundNodesTreeBuilder *Builder) const = 0;
181 };
182 
183 /// \brief Interface for matchers that only evaluate properties on a single
184 /// node.
185 template <typename T>
186 class SingleNodeMatcherInterface : public MatcherInterface<T> {
187 public:
188   /// \brief Returns true if the matcher matches the provided node.
189   ///
190   /// A subclass must implement this instead of Matches().
191   virtual bool matchesNode(const T &Node) const = 0;
192 
193 private:
194   /// Implements MatcherInterface::Matches.
matches(const T & Node,ASTMatchFinder *,BoundNodesTreeBuilder *)195   bool matches(const T &Node,
196                ASTMatchFinder * /* Finder */,
197                BoundNodesTreeBuilder * /*  Builder */) const override {
198     return matchesNode(Node);
199   }
200 };
201 
202 /// \brief Wrapper of a MatcherInterface<T> *that allows copying.
203 ///
204 /// A Matcher<Base> can be used anywhere a Matcher<Derived> is
205 /// required. This establishes an is-a relationship which is reverse
206 /// to the AST hierarchy. In other words, Matcher<T> is contravariant
207 /// with respect to T. The relationship is built via a type conversion
208 /// operator rather than a type hierarchy to be able to templatize the
209 /// type hierarchy instead of spelling it out.
210 template <typename T>
211 class Matcher {
212 public:
213   /// \brief Takes ownership of the provided implementation pointer.
Matcher(MatcherInterface<T> * Implementation)214   explicit Matcher(MatcherInterface<T> *Implementation)
215       : Implementation(Implementation) {}
216 
217   /// \brief Implicitly converts \c Other to a Matcher<T>.
218   ///
219   /// Requires \c T to be derived from \c From.
220   template <typename From>
221   Matcher(const Matcher<From> &Other,
222           typename std::enable_if<std::is_base_of<From, T>::value &&
223                                   !std::is_same<From, T>::value>::type * = 0)
Implementation(new ImplicitCastMatcher<From> (Other))224       : Implementation(new ImplicitCastMatcher<From>(Other)) {}
225 
226   /// \brief Implicitly converts \c Matcher<Type> to \c Matcher<QualType>.
227   ///
228   /// The resulting matcher is not strict, i.e. ignores qualifiers.
229   template <typename TypeT>
230   Matcher(const Matcher<TypeT> &Other,
231           typename std::enable_if<
232             std::is_same<T, QualType>::value &&
233             std::is_same<TypeT, Type>::value>::type* = 0)
Implementation(new TypeToQualType<TypeT> (Other))234       : Implementation(new TypeToQualType<TypeT>(Other)) {}
235 
236   /// \brief Forwards the call to the underlying MatcherInterface<T> pointer.
matches(const T & Node,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)237   bool matches(const T &Node,
238                ASTMatchFinder *Finder,
239                BoundNodesTreeBuilder *Builder) const {
240     if (Implementation->matches(Node, Finder, Builder))
241       return true;
242     // Delete all bindings when a matcher does not match.
243     // This prevents unexpected exposure of bound nodes in unmatches
244     // branches of the match tree.
245     *Builder = BoundNodesTreeBuilder();
246     return false;
247   }
248 
249   /// \brief Returns an ID that uniquely identifies the matcher.
getID()250   uint64_t getID() const {
251     /// FIXME: Document the requirements this imposes on matcher
252     /// implementations (no new() implementation_ during a Matches()).
253     return reinterpret_cast<uint64_t>(Implementation.get());
254   }
255 
256   /// \brief Allows the conversion of a \c Matcher<Type> to a \c
257   /// Matcher<QualType>.
258   ///
259   /// Depending on the constructor argument, the matcher is either strict, i.e.
260   /// does only matches in the absence of qualifiers, or not, i.e. simply
261   /// ignores any qualifiers.
262   template <typename TypeT>
263   class TypeToQualType : public MatcherInterface<QualType> {
264    public:
TypeToQualType(const Matcher<TypeT> & InnerMatcher)265     TypeToQualType(const Matcher<TypeT> &InnerMatcher)
266         : InnerMatcher(InnerMatcher) {}
267 
matches(const QualType & Node,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)268     bool matches(const QualType &Node, ASTMatchFinder *Finder,
269                  BoundNodesTreeBuilder *Builder) const override {
270       if (Node.isNull())
271         return false;
272       return InnerMatcher.matches(*Node, Finder, Builder);
273     }
274    private:
275     const Matcher<TypeT> InnerMatcher;
276   };
277 
278 private:
279   /// \brief Allows conversion from Matcher<Base> to Matcher<T> if T
280   /// is derived from Base.
281   template <typename Base>
282   class ImplicitCastMatcher : public MatcherInterface<T> {
283   public:
ImplicitCastMatcher(const Matcher<Base> & From)284     explicit ImplicitCastMatcher(const Matcher<Base> &From)
285         : From(From) {}
286 
matches(const T & Node,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)287     bool matches(const T &Node, ASTMatchFinder *Finder,
288                  BoundNodesTreeBuilder *Builder) const override {
289       return From.matches(Node, Finder, Builder);
290     }
291 
292   private:
293     const Matcher<Base> From;
294   };
295 
296   IntrusiveRefCntPtr< MatcherInterface<T> > Implementation;
297 };  // class Matcher
298 
299 /// \brief A convenient helper for creating a Matcher<T> without specifying
300 /// the template type argument.
301 template <typename T>
makeMatcher(MatcherInterface<T> * Implementation)302 inline Matcher<T> makeMatcher(MatcherInterface<T> *Implementation) {
303   return Matcher<T>(Implementation);
304 }
305 
306 template <typename T> class BindableMatcher;
307 
308 /// \brief Matcher that works on a \c DynTypedNode.
309 ///
310 /// It is constructed from a \c Matcher<T> object and redirects most calls to
311 /// underlying matcher.
312 /// It checks whether the \c DynTypedNode is convertible into the type of the
313 /// underlying matcher and then do the actual match on the actual node, or
314 /// return false if it is not convertible.
315 class DynTypedMatcher {
316 public:
317   /// \brief Construct from a \c Matcher<T>. Copies the matcher.
318   template <typename T> inline DynTypedMatcher(const Matcher<T> &M);
319 
320   /// \brief Construct from a bindable \c Matcher<T>. Copies the matcher.
321   ///
322   /// This version enables \c tryBind() on the \c DynTypedMatcher.
323   template <typename T> inline DynTypedMatcher(const BindableMatcher<T> &M);
324 
325   /// \brief Returns true if the matcher matches the given \c DynNode.
matches(const ast_type_traits::DynTypedNode DynNode,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)326   bool matches(const ast_type_traits::DynTypedNode DynNode,
327                ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder) const {
328     return Storage->matches(DynNode, Finder, Builder);
329   }
330 
331   /// \brief Bind the specified \p ID to the matcher.
332   /// \return A new matcher with the \p ID bound to it if this matcher supports
333   ///   binding. Otherwise, returns an empty \c Optional<>.
tryBind(StringRef ID)334   llvm::Optional<DynTypedMatcher> tryBind(StringRef ID) const {
335     return Storage->tryBind(ID);
336   }
337 
338   /// \brief Returns a unique \p ID for the matcher.
getID()339   uint64_t getID() const { return Storage->getID(); }
340 
341   /// \brief Returns the type this matcher works on.
342   ///
343   /// \c matches() will always return false unless the node passed is of this
344   /// or a derived type.
getSupportedKind()345   ast_type_traits::ASTNodeKind getSupportedKind() const {
346     return Storage->getSupportedKind();
347   }
348 
349   /// \brief Returns \c true if the passed \c DynTypedMatcher can be converted
350   ///   to a \c Matcher<T>.
351   ///
352   /// This method verifies that the underlying matcher in \c Other can process
353   /// nodes of types T.
canConvertTo()354   template <typename T> bool canConvertTo() const {
355     return getSupportedKind().isBaseOf(
356         ast_type_traits::ASTNodeKind::getFromNodeKind<T>());
357   }
358 
359   /// \brief Construct a \c Matcher<T> interface around the dynamic matcher.
360   ///
361   /// This method asserts that \c canConvertTo() is \c true. Callers
362   /// should call \c canConvertTo() first to make sure that \c this is
363   /// compatible with T.
convertTo()364   template <typename T> Matcher<T> convertTo() const {
365     assert(canConvertTo<T>());
366     return unconditionalConvertTo<T>();
367   }
368 
369   /// \brief Same as \c convertTo(), but does not check that the underlying
370   ///   matcher can handle a value of T.
371   ///
372   /// If it is not compatible, then this matcher will never match anything.
373   template <typename T> Matcher<T> unconditionalConvertTo() const;
374 
375 private:
376   class MatcherStorage : public RefCountedBaseVPTR {
377   public:
MatcherStorage(ast_type_traits::ASTNodeKind SupportedKind,uint64_t ID)378     MatcherStorage(ast_type_traits::ASTNodeKind SupportedKind, uint64_t ID)
379         : SupportedKind(SupportedKind), ID(ID) {}
380     virtual ~MatcherStorage();
381 
382     virtual bool matches(const ast_type_traits::DynTypedNode DynNode,
383                          ASTMatchFinder *Finder,
384                          BoundNodesTreeBuilder *Builder) const = 0;
385 
386     virtual llvm::Optional<DynTypedMatcher> tryBind(StringRef ID) const = 0;
387 
getSupportedKind()388     ast_type_traits::ASTNodeKind getSupportedKind() const {
389       return SupportedKind;
390     }
391 
getID()392     uint64_t getID() const { return ID; }
393 
394   private:
395     const ast_type_traits::ASTNodeKind SupportedKind;
396     const uint64_t ID;
397   };
398 
399   /// \brief Typed implementation of \c MatcherStorage.
400   template <typename T> class TypedMatcherStorage;
401 
402   IntrusiveRefCntPtr<const MatcherStorage> Storage;
403 };
404 
405 template <typename T>
406 class DynTypedMatcher::TypedMatcherStorage : public MatcherStorage {
407 public:
TypedMatcherStorage(const Matcher<T> & Other,bool AllowBind)408   TypedMatcherStorage(const Matcher<T> &Other, bool AllowBind)
409       : MatcherStorage(ast_type_traits::ASTNodeKind::getFromNodeKind<T>(),
410                        Other.getID()),
411         InnerMatcher(Other), AllowBind(AllowBind) {}
412 
matches(const ast_type_traits::DynTypedNode DynNode,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)413   bool matches(const ast_type_traits::DynTypedNode DynNode,
414                ASTMatchFinder *Finder,
415                BoundNodesTreeBuilder *Builder) const override {
416     if (const T *Node = DynNode.get<T>()) {
417       return InnerMatcher.matches(*Node, Finder, Builder);
418     }
419     return false;
420   }
421 
tryBind(StringRef ID)422   llvm::Optional<DynTypedMatcher> tryBind(StringRef ID) const override {
423     if (!AllowBind)
424       return llvm::Optional<DynTypedMatcher>();
425     return DynTypedMatcher(BindableMatcher<T>(InnerMatcher).bind(ID));
426   }
427 
428 private:
429   const Matcher<T> InnerMatcher;
430   const bool AllowBind;
431 };
432 
433 template <typename T>
DynTypedMatcher(const Matcher<T> & M)434 inline DynTypedMatcher::DynTypedMatcher(const Matcher<T> &M)
435     : Storage(new TypedMatcherStorage<T>(M, false)) {}
436 
437 template <typename T>
DynTypedMatcher(const BindableMatcher<T> & M)438 inline DynTypedMatcher::DynTypedMatcher(const BindableMatcher<T> &M)
439     : Storage(new TypedMatcherStorage<T>(M, true)) {}
440 
441 /// \brief Specialization of the conversion functions for QualType.
442 ///
443 /// These specializations provide the Matcher<Type>->Matcher<QualType>
444 /// conversion that the static API does.
445 template <> inline bool DynTypedMatcher::canConvertTo<QualType>() const {
446   const ast_type_traits::ASTNodeKind SourceKind = getSupportedKind();
447   return SourceKind.isSame(
448              ast_type_traits::ASTNodeKind::getFromNodeKind<Type>()) ||
449          SourceKind.isSame(
450              ast_type_traits::ASTNodeKind::getFromNodeKind<QualType>());
451 }
452 
453 template <>
454 inline Matcher<QualType> DynTypedMatcher::convertTo<QualType>() const {
455   assert(canConvertTo<QualType>());
456   const ast_type_traits::ASTNodeKind SourceKind = getSupportedKind();
457   if (SourceKind.isSame(
458           ast_type_traits::ASTNodeKind::getFromNodeKind<Type>())) {
459     // We support implicit conversion from Matcher<Type> to Matcher<QualType>
460     return unconditionalConvertTo<Type>();
461   }
462   return unconditionalConvertTo<QualType>();
463 }
464 
465 /// \brief Finds the first node in a range that matches the given matcher.
466 template <typename MatcherT, typename IteratorT>
matchesFirstInRange(const MatcherT & Matcher,IteratorT Start,IteratorT End,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)467 bool matchesFirstInRange(const MatcherT &Matcher, IteratorT Start,
468                          IteratorT End, ASTMatchFinder *Finder,
469                          BoundNodesTreeBuilder *Builder) {
470   for (IteratorT I = Start; I != End; ++I) {
471     BoundNodesTreeBuilder Result(*Builder);
472     if (Matcher.matches(*I, Finder, &Result)) {
473       *Builder = Result;
474       return true;
475     }
476   }
477   return false;
478 }
479 
480 /// \brief Finds the first node in a pointer range that matches the given
481 /// matcher.
482 template <typename MatcherT, typename IteratorT>
matchesFirstInPointerRange(const MatcherT & Matcher,IteratorT Start,IteratorT End,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)483 bool matchesFirstInPointerRange(const MatcherT &Matcher, IteratorT Start,
484                                 IteratorT End, ASTMatchFinder *Finder,
485                                 BoundNodesTreeBuilder *Builder) {
486   for (IteratorT I = Start; I != End; ++I) {
487     BoundNodesTreeBuilder Result(*Builder);
488     if (Matcher.matches(**I, Finder, &Result)) {
489       *Builder = Result;
490       return true;
491     }
492   }
493   return false;
494 }
495 
496 /// \brief Metafunction to determine if type T has a member called getDecl.
497 template <typename T> struct has_getDecl {
498   struct Default { int getDecl; };
499   struct Derived : T, Default { };
500 
501   template<typename C, C> struct CheckT;
502 
503   // If T::getDecl exists, an ambiguity arises and CheckT will
504   // not be instantiable. This makes f(...) the only available
505   // overload.
506   template<typename C>
507   static char (&f(CheckT<int Default::*, &C::getDecl>*))[1];
508   template<typename C> static char (&f(...))[2];
509 
510   static bool const value = sizeof(f<Derived>(nullptr)) == 2;
511 };
512 
513 /// \brief Matches overloaded operators with a specific name.
514 ///
515 /// The type argument ArgT is not used by this matcher but is used by
516 /// PolymorphicMatcherWithParam1 and should be StringRef.
517 template <typename T, typename ArgT>
518 class HasOverloadedOperatorNameMatcher : public SingleNodeMatcherInterface<T> {
519   static_assert(std::is_same<T, CXXOperatorCallExpr>::value ||
520                 std::is_same<T, CXXMethodDecl>::value,
521                 "unsupported class for matcher");
522   static_assert(std::is_same<ArgT, StringRef>::value,
523                 "argument type must be StringRef");
524 
525 public:
HasOverloadedOperatorNameMatcher(const StringRef Name)526   explicit HasOverloadedOperatorNameMatcher(const StringRef Name)
527       : SingleNodeMatcherInterface<T>(), Name(Name) {}
528 
matchesNode(const T & Node)529   bool matchesNode(const T &Node) const override {
530     return matchesSpecialized(Node);
531   }
532 
533 private:
534 
535   /// \brief CXXOperatorCallExpr exist only for calls to overloaded operators
536   /// so this function returns true if the call is to an operator of the given
537   /// name.
matchesSpecialized(const CXXOperatorCallExpr & Node)538   bool matchesSpecialized(const CXXOperatorCallExpr &Node) const {
539     return getOperatorSpelling(Node.getOperator()) == Name;
540   }
541 
542   /// \brief Returns true only if CXXMethodDecl represents an overloaded
543   /// operator and has the given operator name.
matchesSpecialized(const CXXMethodDecl & Node)544   bool matchesSpecialized(const CXXMethodDecl &Node) const {
545     return Node.isOverloadedOperator() &&
546            getOperatorSpelling(Node.getOverloadedOperator()) == Name;
547   }
548 
549   std::string Name;
550 };
551 
552 /// \brief Matches declarations for QualType and CallExpr.
553 ///
554 /// Type argument DeclMatcherT is required by PolymorphicMatcherWithParam1 but
555 /// not actually used.
556 template <typename T, typename DeclMatcherT>
557 class HasDeclarationMatcher : public MatcherInterface<T> {
558   static_assert(std::is_same<DeclMatcherT, Matcher<Decl>>::value,
559                 "instantiated with wrong types");
560 
561 public:
HasDeclarationMatcher(const Matcher<Decl> & InnerMatcher)562   explicit HasDeclarationMatcher(const Matcher<Decl> &InnerMatcher)
563       : InnerMatcher(InnerMatcher) {}
564 
matches(const T & Node,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)565   bool matches(const T &Node, ASTMatchFinder *Finder,
566                BoundNodesTreeBuilder *Builder) const override {
567     return matchesSpecialized(Node, Finder, Builder);
568   }
569 
570 private:
571   /// \brief If getDecl exists as a member of U, returns whether the inner
572   /// matcher matches Node.getDecl().
573   template <typename U>
574   bool matchesSpecialized(
575       const U &Node, ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder,
576       typename std::enable_if<has_getDecl<U>::value, int>::type = 0) const {
577     return matchesDecl(Node.getDecl(), Finder, Builder);
578   }
579 
580   /// \brief Extracts the CXXRecordDecl or EnumDecl of a QualType and returns
581   /// whether the inner matcher matches on it.
matchesSpecialized(const QualType & Node,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)582   bool matchesSpecialized(const QualType &Node, ASTMatchFinder *Finder,
583                           BoundNodesTreeBuilder *Builder) const {
584     /// FIXME: Add other ways to convert...
585     if (Node.isNull())
586       return false;
587     if (const EnumType *AsEnum = dyn_cast<EnumType>(Node.getTypePtr()))
588       return matchesDecl(AsEnum->getDecl(), Finder, Builder);
589     return matchesDecl(Node->getAsCXXRecordDecl(), Finder, Builder);
590   }
591 
592   /// \brief Gets the TemplateDecl from a TemplateSpecializationType
593   /// and returns whether the inner matches on it.
matchesSpecialized(const TemplateSpecializationType & Node,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)594   bool matchesSpecialized(const TemplateSpecializationType &Node,
595                           ASTMatchFinder *Finder,
596                           BoundNodesTreeBuilder *Builder) const {
597     return matchesDecl(Node.getTemplateName().getAsTemplateDecl(),
598                        Finder, Builder);
599   }
600 
601   /// \brief Extracts the Decl of the callee of a CallExpr and returns whether
602   /// the inner matcher matches on it.
matchesSpecialized(const CallExpr & Node,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)603   bool matchesSpecialized(const CallExpr &Node, ASTMatchFinder *Finder,
604                           BoundNodesTreeBuilder *Builder) const {
605     return matchesDecl(Node.getCalleeDecl(), Finder, Builder);
606   }
607 
608   /// \brief Extracts the Decl of the constructor call and returns whether the
609   /// inner matcher matches on it.
matchesSpecialized(const CXXConstructExpr & Node,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)610   bool matchesSpecialized(const CXXConstructExpr &Node,
611                           ASTMatchFinder *Finder,
612                           BoundNodesTreeBuilder *Builder) const {
613     return matchesDecl(Node.getConstructor(), Finder, Builder);
614   }
615 
616   /// \brief Extracts the \c ValueDecl a \c MemberExpr refers to and returns
617   /// whether the inner matcher matches on it.
matchesSpecialized(const MemberExpr & Node,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)618   bool matchesSpecialized(const MemberExpr &Node,
619                           ASTMatchFinder *Finder,
620                           BoundNodesTreeBuilder *Builder) const {
621     return matchesDecl(Node.getMemberDecl(), Finder, Builder);
622   }
623 
624   /// \brief Returns whether the inner matcher \c Node. Returns false if \c Node
625   /// is \c NULL.
matchesDecl(const Decl * Node,ASTMatchFinder * Finder,BoundNodesTreeBuilder * Builder)626   bool matchesDecl(const Decl *Node,
627                    ASTMatchFinder *Finder,
628                    BoundNodesTreeBuilder *Builder) const {
629     return Node != nullptr && InnerMatcher.matches(*Node, Finder, Builder);
630   }
631 
632   const Matcher<Decl> InnerMatcher;
633 };
634 
635 /// \brief IsBaseType<T>::value is true if T is a "base" type in the AST
636 /// node class hierarchies.
637 template <typename T>
638 struct IsBaseType {
639   static const bool value =
640       std::is_same<T, Decl>::value ||
641       std::is_same<T, Stmt>::value ||
642       std::is_same<T, QualType>::value ||
643       std::is_same<T, Type>::value ||
644       std::is_same<T, TypeLoc>::value ||
645       std::is_same<T, NestedNameSpecifier>::value ||
646       std::is_same<T, NestedNameSpecifierLoc>::value ||
647       std::is_same<T, CXXCtorInitializer>::value;
648 };
649 template <typename T>
650 const bool IsBaseType<T>::value;
651 
652 /// \brief Interface that allows matchers to traverse the AST.
653 /// FIXME: Find a better name.
654 ///
655 /// This provides three entry methods for each base node type in the AST:
656 /// - \c matchesChildOf:
657 ///   Matches a matcher on every child node of the given node. Returns true
658 ///   if at least one child node could be matched.
659 /// - \c matchesDescendantOf:
660 ///   Matches a matcher on all descendant nodes of the given node. Returns true
661 ///   if at least one descendant matched.
662 /// - \c matchesAncestorOf:
663 ///   Matches a matcher on all ancestors of the given node. Returns true if
664 ///   at least one ancestor matched.
665 ///
666 /// FIXME: Currently we only allow Stmt and Decl nodes to start a traversal.
667 /// In the future, we wan to implement this for all nodes for which it makes
668 /// sense. In the case of matchesAncestorOf, we'll want to implement it for
669 /// all nodes, as all nodes have ancestors.
670 class ASTMatchFinder {
671 public:
672   /// \brief Defines how we descend a level in the AST when we pass
673   /// through expressions.
674   enum TraversalKind {
675     /// Will traverse any child nodes.
676     TK_AsIs,
677     /// Will not traverse implicit casts and parentheses.
678     TK_IgnoreImplicitCastsAndParentheses
679   };
680 
681   /// \brief Defines how bindings are processed on recursive matches.
682   enum BindKind {
683     /// Stop at the first match and only bind the first match.
684     BK_First,
685     /// Create results for all combinations of bindings that match.
686     BK_All
687   };
688 
689   /// \brief Defines which ancestors are considered for a match.
690   enum AncestorMatchMode {
691     /// All ancestors.
692     AMM_All,
693     /// Direct parent only.
694     AMM_ParentOnly
695   };
696 
~ASTMatchFinder()697   virtual ~ASTMatchFinder() {}
698 
699   /// \brief Returns true if the given class is directly or indirectly derived
700   /// from a base type matching \c base.
701   ///
702   /// A class is considered to be also derived from itself.
703   virtual bool classIsDerivedFrom(const CXXRecordDecl *Declaration,
704                                   const Matcher<NamedDecl> &Base,
705                                   BoundNodesTreeBuilder *Builder) = 0;
706 
707   template <typename T>
matchesChildOf(const T & Node,const DynTypedMatcher & Matcher,BoundNodesTreeBuilder * Builder,TraversalKind Traverse,BindKind Bind)708   bool matchesChildOf(const T &Node,
709                       const DynTypedMatcher &Matcher,
710                       BoundNodesTreeBuilder *Builder,
711                       TraversalKind Traverse,
712                       BindKind Bind) {
713     static_assert(std::is_base_of<Decl, T>::value ||
714                   std::is_base_of<Stmt, T>::value ||
715                   std::is_base_of<NestedNameSpecifier, T>::value ||
716                   std::is_base_of<NestedNameSpecifierLoc, T>::value ||
717                   std::is_base_of<TypeLoc, T>::value ||
718                   std::is_base_of<QualType, T>::value,
719                   "unsupported type for recursive matching");
720    return matchesChildOf(ast_type_traits::DynTypedNode::create(Node),
721                           Matcher, Builder, Traverse, Bind);
722   }
723 
724   template <typename T>
matchesDescendantOf(const T & Node,const DynTypedMatcher & Matcher,BoundNodesTreeBuilder * Builder,BindKind Bind)725   bool matchesDescendantOf(const T &Node,
726                            const DynTypedMatcher &Matcher,
727                            BoundNodesTreeBuilder *Builder,
728                            BindKind Bind) {
729     static_assert(std::is_base_of<Decl, T>::value ||
730                   std::is_base_of<Stmt, T>::value ||
731                   std::is_base_of<NestedNameSpecifier, T>::value ||
732                   std::is_base_of<NestedNameSpecifierLoc, T>::value ||
733                   std::is_base_of<TypeLoc, T>::value ||
734                   std::is_base_of<QualType, T>::value,
735                   "unsupported type for recursive matching");
736     return matchesDescendantOf(ast_type_traits::DynTypedNode::create(Node),
737                                Matcher, Builder, Bind);
738   }
739 
740   // FIXME: Implement support for BindKind.
741   template <typename T>
matchesAncestorOf(const T & Node,const DynTypedMatcher & Matcher,BoundNodesTreeBuilder * Builder,AncestorMatchMode MatchMode)742   bool matchesAncestorOf(const T &Node,
743                          const DynTypedMatcher &Matcher,
744                          BoundNodesTreeBuilder *Builder,
745                          AncestorMatchMode MatchMode) {
746     static_assert(std::is_base_of<Decl, T>::value ||
747                   std::is_base_of<Stmt, T>::value,
748                   "only Decl or Stmt allowed for recursive matching");
749     return matchesAncestorOf(ast_type_traits::DynTypedNode::create(Node),
750                              Matcher, Builder, MatchMode);
751   }
752 
753   virtual ASTContext &getASTContext() const = 0;
754 
755 protected:
756   virtual bool matchesChildOf(const ast_type_traits::DynTypedNode &Node,
757                               const DynTypedMatcher &Matcher,
758                               BoundNodesTreeBuilder *Builder,
759                               TraversalKind Traverse,
760                               BindKind Bind) = 0;
761 
762   virtual bool matchesDescendantOf(const ast_type_traits::DynTypedNode &Node,
763                                    const DynTypedMatcher &Matcher,
764                                    BoundNodesTreeBuilder *Builder,
765                                    BindKind Bind) = 0;
766 
767   virtual bool matchesAncestorOf(const ast_type_traits::DynTypedNode &Node,
768                                  const DynTypedMatcher &Matcher,
769                                  BoundNodesTreeBuilder *Builder,
770                                  AncestorMatchMode MatchMode) = 0;
771 };
772 
773 /// \brief A type-list implementation.
774 ///
775 /// A list is declared as a tree of type list nodes, where the leafs are the
776 /// types.
777 /// However, it is used as a "linked list" of types, by using the ::head and
778 /// ::tail typedefs.
779 /// Each node supports up to 4 children (instead of just 2) to reduce the
780 /// nesting required by large lists.
781 template <typename T1 = void, typename T2 = void, typename T3 = void,
782           typename T4 = void>
783 struct TypeList {
784   /// \brief Implementation detail. Combined with the specializations below,
785   ///   this typedef allows for flattening of nested structures.
786   typedef TypeList<T1, T2, T3, T4> self;
787 
788   /// \brief The first type on the list.
789   typedef T1 head;
790 
791   /// \brief A sublist with the tail. ie everything but the head.
792   ///
793   /// This type is used to do recursion. TypeList<>/EmptyTypeList indicates the
794   /// end of the list.
795   typedef typename TypeList<T2, T3, T4>::self tail;
796 };
797 
798 /// \brief Template specialization to allow nested lists.
799 ///
800 /// First element is a typelist. Pop its first element.
801 template <typename Sub1, typename Sub2, typename Sub3, typename Sub4,
802           typename T2, typename T3, typename T4>
803 struct TypeList<TypeList<Sub1, Sub2, Sub3, Sub4>, T2, T3,
804                 T4> : public TypeList<Sub1,
805                                       typename TypeList<Sub2, Sub3, Sub4>::self,
806                                       typename TypeList<T2, T3, T4>::self> {};
807 
808 /// \brief Template specialization to allow nested lists.
809 ///
810 /// First element is an empty typelist. Skip it.
811 template <typename T2, typename T3, typename T4>
812 struct TypeList<TypeList<>, T2, T3, T4> : public TypeList<T2, T3, T4> {
813 };
814 
815 /// \brief The empty type list.
816 typedef TypeList<> EmptyTypeList;
817 
818 /// \brief Helper meta-function to determine if some type \c T is present or
819 ///   a parent type in the list.
820 template <typename AnyTypeList, typename T>
821 struct TypeListContainsSuperOf {
822   static const bool value =
823       std::is_base_of<typename AnyTypeList::head, T>::value ||
824       TypeListContainsSuperOf<typename AnyTypeList::tail, T>::value;
825 };
826 template <typename T>
827 struct TypeListContainsSuperOf<EmptyTypeList, T> {
828   static const bool value = false;
829 };
830 
831 /// \brief A "type list" that contains all types.
832 ///
833 /// Useful for matchers like \c anything and \c unless.
834 typedef TypeList<
835     TypeList<Decl, Stmt, NestedNameSpecifier, NestedNameSpecifierLoc>,
836     TypeList<QualType, Type, TypeLoc, CXXCtorInitializer> > AllNodeBaseTypes;
837 
838 /// \brief Helper meta-function to extract the argument out of a function of
839 ///   type void(Arg).
840 ///
841 /// See AST_POLYMORPHIC_SUPPORTED_TYPES_* for details.
842 template <class T> struct ExtractFunctionArgMeta;
843 template <class T> struct ExtractFunctionArgMeta<void(T)> {
844   typedef T type;
845 };
846 
847 /// \brief Default type lists for ArgumentAdaptingMatcher matchers.
848 typedef AllNodeBaseTypes AdaptativeDefaultFromTypes;
849 typedef TypeList<TypeList<Decl, Stmt, NestedNameSpecifier>,
850                  TypeList<NestedNameSpecifierLoc, TypeLoc, QualType> >
851 AdaptativeDefaultToTypes;
852 
853 /// \brief All types that are supported by HasDeclarationMatcher above.
854 typedef TypeList<TypeList<CallExpr, CXXConstructExpr, DeclRefExpr, EnumType>,
855                  TypeList<InjectedClassNameType, LabelStmt, MemberExpr>,
856                  TypeList<QualType, RecordType, TagType>,
857                  TypeList<TemplateSpecializationType, TemplateTypeParmType,
858                           TypedefType, UnresolvedUsingType> >
859 HasDeclarationSupportedTypes;
860 
861 /// \brief Converts a \c Matcher<T> to a matcher of desired type \c To by
862 /// "adapting" a \c To into a \c T.
863 ///
864 /// The \c ArgumentAdapterT argument specifies how the adaptation is done.
865 ///
866 /// For example:
867 ///   \c ArgumentAdaptingMatcher<HasMatcher, T>(InnerMatcher);
868 /// Given that \c InnerMatcher is of type \c Matcher<T>, this returns a matcher
869 /// that is convertible into any matcher of type \c To by constructing
870 /// \c HasMatcher<To, T>(InnerMatcher).
871 ///
872 /// If a matcher does not need knowledge about the inner type, prefer to use
873 /// PolymorphicMatcherWithParam1.
874 template <template <typename ToArg, typename FromArg> class ArgumentAdapterT,
875           typename FromTypes = AdaptativeDefaultFromTypes,
876           typename ToTypes = AdaptativeDefaultToTypes>
877 struct ArgumentAdaptingMatcherFunc {
878   template <typename T> class Adaptor {
879   public:
880     explicit Adaptor(const Matcher<T> &InnerMatcher)
881         : InnerMatcher(InnerMatcher) {}
882 
883     typedef ToTypes ReturnTypes;
884 
885     template <typename To> operator Matcher<To>() const {
886       return Matcher<To>(new ArgumentAdapterT<To, T>(InnerMatcher));
887     }
888 
889   private:
890     const Matcher<T> InnerMatcher;
891   };
892 
893   template <typename T>
894   static Adaptor<T> create(const Matcher<T> &InnerMatcher) {
895     return Adaptor<T>(InnerMatcher);
896   }
897 
898   template <typename T>
899   Adaptor<T> operator()(const Matcher<T> &InnerMatcher) const {
900     return create(InnerMatcher);
901   }
902 };
903 
904 /// \brief A PolymorphicMatcherWithParamN<MatcherT, P1, ..., PN> object can be
905 /// created from N parameters p1, ..., pN (of type P1, ..., PN) and
906 /// used as a Matcher<T> where a MatcherT<T, P1, ..., PN>(p1, ..., pN)
907 /// can be constructed.
908 ///
909 /// For example:
910 /// - PolymorphicMatcherWithParam0<IsDefinitionMatcher>()
911 ///   creates an object that can be used as a Matcher<T> for any type T
912 ///   where an IsDefinitionMatcher<T>() can be constructed.
913 /// - PolymorphicMatcherWithParam1<ValueEqualsMatcher, int>(42)
914 ///   creates an object that can be used as a Matcher<T> for any type T
915 ///   where a ValueEqualsMatcher<T, int>(42) can be constructed.
916 template <template <typename T> class MatcherT,
917           typename ReturnTypesF = void(AllNodeBaseTypes)>
918 class PolymorphicMatcherWithParam0 {
919 public:
920   typedef typename ExtractFunctionArgMeta<ReturnTypesF>::type ReturnTypes;
921   template <typename T>
922   operator Matcher<T>() const {
923     static_assert(TypeListContainsSuperOf<ReturnTypes, T>::value,
924                   "right polymorphic conversion");
925     return Matcher<T>(new MatcherT<T>());
926   }
927 };
928 
929 template <template <typename T, typename P1> class MatcherT,
930           typename P1,
931           typename ReturnTypesF = void(AllNodeBaseTypes)>
932 class PolymorphicMatcherWithParam1 {
933 public:
934   explicit PolymorphicMatcherWithParam1(const P1 &Param1)
935       : Param1(Param1) {}
936 
937   typedef typename ExtractFunctionArgMeta<ReturnTypesF>::type ReturnTypes;
938 
939   template <typename T>
940   operator Matcher<T>() const {
941     static_assert(TypeListContainsSuperOf<ReturnTypes, T>::value,
942                   "right polymorphic conversion");
943     return Matcher<T>(new MatcherT<T, P1>(Param1));
944   }
945 
946 private:
947   const P1 Param1;
948 };
949 
950 template <template <typename T, typename P1, typename P2> class MatcherT,
951           typename P1, typename P2,
952           typename ReturnTypesF = void(AllNodeBaseTypes)>
953 class PolymorphicMatcherWithParam2 {
954 public:
955   PolymorphicMatcherWithParam2(const P1 &Param1, const P2 &Param2)
956       : Param1(Param1), Param2(Param2) {}
957 
958   typedef typename ExtractFunctionArgMeta<ReturnTypesF>::type ReturnTypes;
959 
960   template <typename T>
961   operator Matcher<T>() const {
962     static_assert(TypeListContainsSuperOf<ReturnTypes, T>::value,
963                   "right polymorphic conversion");
964     return Matcher<T>(new MatcherT<T, P1, P2>(Param1, Param2));
965   }
966 
967 private:
968   const P1 Param1;
969   const P2 Param2;
970 };
971 
972 /// \brief Matches any instance of the given NodeType.
973 ///
974 /// This is useful when a matcher syntactically requires a child matcher,
975 /// but the context doesn't care. See for example: anything().
976 ///
977 /// FIXME: Alternatively we could also create a IsAMatcher or something
978 /// that checks that a dyn_cast is possible. This is purely needed for the
979 /// difference between calling for example:
980 ///   record()
981 /// and
982 ///   record(SomeMatcher)
983 /// In the second case we need the correct type we were dyn_cast'ed to in order
984 /// to get the right type for the inner matcher. In the first case we don't need
985 /// that, but we use the type conversion anyway and insert a TrueMatcher.
986 template <typename T>
987 class TrueMatcher : public SingleNodeMatcherInterface<T>  {
988 public:
989   bool matchesNode(const T &Node) const override {
990     return true;
991   }
992 };
993 
994 /// \brief Matcher<T> that wraps an inner Matcher<T> and binds the matched node
995 /// to an ID if the inner matcher matches on the node.
996 template <typename T>
997 class IdMatcher : public MatcherInterface<T> {
998 public:
999   /// \brief Creates an IdMatcher that binds to 'ID' if 'InnerMatcher' matches
1000   /// the node.
1001   IdMatcher(StringRef ID, const Matcher<T> &InnerMatcher)
1002       : ID(ID), InnerMatcher(InnerMatcher) {}
1003 
1004   bool matches(const T &Node, ASTMatchFinder *Finder,
1005                BoundNodesTreeBuilder *Builder) const override {
1006     bool Result = InnerMatcher.matches(Node, Finder, Builder);
1007     if (Result) {
1008       Builder->setBinding(ID, &Node);
1009     }
1010     return Result;
1011   }
1012 
1013 private:
1014   const std::string ID;
1015   const Matcher<T> InnerMatcher;
1016 };
1017 
1018 /// \brief A Matcher that allows binding the node it matches to an id.
1019 ///
1020 /// BindableMatcher provides a \a bind() method that allows binding the
1021 /// matched node to an id if the match was successful.
1022 template <typename T>
1023 class BindableMatcher : public Matcher<T> {
1024 public:
1025   explicit BindableMatcher(const Matcher<T> &M) : Matcher<T>(M) {}
1026   explicit BindableMatcher(MatcherInterface<T> *Implementation)
1027     : Matcher<T>(Implementation) {}
1028 
1029   /// \brief Returns a matcher that will bind the matched node on a match.
1030   ///
1031   /// The returned matcher is equivalent to this matcher, but will
1032   /// bind the matched node on a match.
1033   Matcher<T> bind(StringRef ID) const {
1034     return Matcher<T>(new IdMatcher<T>(ID, *this));
1035   }
1036 };
1037 
1038 /// \brief Matches nodes of type T that have child nodes of type ChildT for
1039 /// which a specified child matcher matches.
1040 ///
1041 /// ChildT must be an AST base type.
1042 template <typename T, typename ChildT>
1043 class HasMatcher : public MatcherInterface<T> {
1044   static_assert(IsBaseType<ChildT>::value,
1045                 "has only accepts base type matcher");
1046 
1047 public:
1048   explicit HasMatcher(const Matcher<ChildT> &ChildMatcher)
1049       : ChildMatcher(ChildMatcher) {}
1050 
1051   bool matches(const T &Node, ASTMatchFinder *Finder,
1052                BoundNodesTreeBuilder *Builder) const override {
1053     return Finder->matchesChildOf(
1054         Node, ChildMatcher, Builder,
1055         ASTMatchFinder::TK_IgnoreImplicitCastsAndParentheses,
1056         ASTMatchFinder::BK_First);
1057   }
1058 
1059  private:
1060   const Matcher<ChildT> ChildMatcher;
1061 };
1062 
1063 /// \brief Matches nodes of type T that have child nodes of type ChildT for
1064 /// which a specified child matcher matches. ChildT must be an AST base
1065 /// type.
1066 /// As opposed to the HasMatcher, the ForEachMatcher will produce a match
1067 /// for each child that matches.
1068 template <typename T, typename ChildT>
1069 class ForEachMatcher : public MatcherInterface<T> {
1070   static_assert(IsBaseType<ChildT>::value,
1071                 "for each only accepts base type matcher");
1072 
1073  public:
1074   explicit ForEachMatcher(const Matcher<ChildT> &ChildMatcher)
1075       : ChildMatcher(ChildMatcher) {}
1076 
1077   bool matches(const T& Node, ASTMatchFinder* Finder,
1078                BoundNodesTreeBuilder* Builder) const override {
1079     return Finder->matchesChildOf(
1080       Node, ChildMatcher, Builder,
1081       ASTMatchFinder::TK_IgnoreImplicitCastsAndParentheses,
1082       ASTMatchFinder::BK_All);
1083   }
1084 
1085 private:
1086   const Matcher<ChildT> ChildMatcher;
1087 };
1088 
1089 /// \brief VariadicOperatorMatcher related types.
1090 /// @{
1091 
1092 /// \brief Function signature for any variadic operator. It takes the inner
1093 ///   matchers as an array of DynTypedMatcher.
1094 typedef bool (*VariadicOperatorFunction)(
1095     const ast_type_traits::DynTypedNode DynNode, ASTMatchFinder *Finder,
1096     BoundNodesTreeBuilder *Builder, ArrayRef<DynTypedMatcher> InnerMatchers);
1097 
1098 /// \brief \c MatcherInterface<T> implementation for an variadic operator.
1099 template <typename T>
1100 class VariadicOperatorMatcherInterface : public MatcherInterface<T> {
1101 public:
1102   VariadicOperatorMatcherInterface(VariadicOperatorFunction Func,
1103                                    std::vector<DynTypedMatcher> InnerMatchers)
1104       : Func(Func), InnerMatchers(std::move(InnerMatchers)) {}
1105 
1106   bool matches(const T &Node, ASTMatchFinder *Finder,
1107                BoundNodesTreeBuilder *Builder) const override {
1108     return Func(ast_type_traits::DynTypedNode::create(Node), Finder, Builder,
1109                 InnerMatchers);
1110   }
1111 
1112 private:
1113   const VariadicOperatorFunction Func;
1114   const std::vector<DynTypedMatcher> InnerMatchers;
1115 };
1116 
1117 /// \brief "No argument" placeholder to use as template paratemers.
1118 struct VariadicOperatorNoArg {};
1119 
1120 /// \brief Polymorphic matcher object that uses a \c VariadicOperatorFunction
1121 ///   operator.
1122 ///
1123 /// Input matchers can have any type (including other polymorphic matcher
1124 /// types), and the actual Matcher<T> is generated on demand with an implicit
1125 /// coversion operator.
1126 template <typename P1, typename P2 = VariadicOperatorNoArg,
1127           typename P3 = VariadicOperatorNoArg,
1128           typename P4 = VariadicOperatorNoArg,
1129           typename P5 = VariadicOperatorNoArg,
1130           typename P6 = VariadicOperatorNoArg,
1131           typename P7 = VariadicOperatorNoArg,
1132           typename P8 = VariadicOperatorNoArg,
1133           typename P9 = VariadicOperatorNoArg>
1134 class VariadicOperatorMatcher {
1135 public:
1136   VariadicOperatorMatcher(VariadicOperatorFunction Func, const P1 &Param1,
1137                           const P2 &Param2 = VariadicOperatorNoArg(),
1138                           const P3 &Param3 = VariadicOperatorNoArg(),
1139                           const P4 &Param4 = VariadicOperatorNoArg(),
1140                           const P5 &Param5 = VariadicOperatorNoArg(),
1141                           const P6 &Param6 = VariadicOperatorNoArg(),
1142                           const P7 &Param7 = VariadicOperatorNoArg(),
1143                           const P8 &Param8 = VariadicOperatorNoArg(),
1144                           const P9 &Param9 = VariadicOperatorNoArg())
1145       : Func(Func), Param1(Param1), Param2(Param2), Param3(Param3),
1146         Param4(Param4), Param5(Param5), Param6(Param6), Param7(Param7),
1147         Param8(Param8), Param9(Param9) {}
1148 
1149   template <typename T> operator Matcher<T>() const {
1150     std::vector<DynTypedMatcher> Matchers;
1151     addMatcher<T>(Param1, Matchers);
1152     addMatcher<T>(Param2, Matchers);
1153     addMatcher<T>(Param3, Matchers);
1154     addMatcher<T>(Param4, Matchers);
1155     addMatcher<T>(Param5, Matchers);
1156     addMatcher<T>(Param6, Matchers);
1157     addMatcher<T>(Param7, Matchers);
1158     addMatcher<T>(Param8, Matchers);
1159     addMatcher<T>(Param9, Matchers);
1160     return Matcher<T>(
1161         new VariadicOperatorMatcherInterface<T>(Func, std::move(Matchers)));
1162   }
1163 
1164 private:
1165   template <typename T>
1166   static void addMatcher(const Matcher<T> &M,
1167                          std::vector<DynTypedMatcher> &Matchers) {
1168     Matchers.push_back(M);
1169   }
1170 
1171   /// \brief Overload to ignore \c VariadicOperatorNoArg arguments.
1172   template <typename T>
1173   static void addMatcher(VariadicOperatorNoArg,
1174                          std::vector<DynTypedMatcher> &Matchers) {}
1175 
1176   const VariadicOperatorFunction Func;
1177   const P1 Param1;
1178   const P2 Param2;
1179   const P3 Param3;
1180   const P4 Param4;
1181   const P5 Param5;
1182   const P6 Param6;
1183   const P7 Param7;
1184   const P8 Param8;
1185   const P9 Param9;
1186 };
1187 
1188 /// \brief Overloaded function object to generate VariadicOperatorMatcher
1189 ///   objects from arbitrary matchers.
1190 ///
1191 /// It supports 1-9 argument overloaded operator(). More can be added if needed.
1192 template <unsigned MinCount, unsigned MaxCount>
1193 struct VariadicOperatorMatcherFunc {
1194   VariadicOperatorFunction Func;
1195 
1196   template <unsigned Count, typename T>
1197   struct EnableIfValidArity
1198       : public std::enable_if<MinCount <= Count && Count <= MaxCount, T> {};
1199 
1200   template <typename M1>
1201   typename EnableIfValidArity<1, VariadicOperatorMatcher<M1> >::type
1202   operator()(const M1 &P1) const {
1203     return VariadicOperatorMatcher<M1>(Func, P1);
1204   }
1205   template <typename M1, typename M2>
1206   typename EnableIfValidArity<2, VariadicOperatorMatcher<M1, M2> >::type
1207   operator()(const M1 &P1, const M2 &P2) const {
1208     return VariadicOperatorMatcher<M1, M2>(Func, P1, P2);
1209   }
1210   template <typename M1, typename M2, typename M3>
1211   typename EnableIfValidArity<3, VariadicOperatorMatcher<M1, M2, M3> >::type
1212   operator()(const M1 &P1, const M2 &P2, const M3 &P3) const {
1213     return VariadicOperatorMatcher<M1, M2, M3>(Func, P1, P2, P3);
1214   }
1215   template <typename M1, typename M2, typename M3, typename M4>
1216   typename EnableIfValidArity<4, VariadicOperatorMatcher<M1, M2, M3, M4> >::type
1217   operator()(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4) const {
1218     return VariadicOperatorMatcher<M1, M2, M3, M4>(Func, P1, P2, P3, P4);
1219   }
1220   template <typename M1, typename M2, typename M3, typename M4, typename M5>
1221   typename EnableIfValidArity<
1222       5, VariadicOperatorMatcher<M1, M2, M3, M4, M5> >::type
1223   operator()(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4,
1224              const M5 &P5) const {
1225     return VariadicOperatorMatcher<M1, M2, M3, M4, M5>(Func, P1, P2, P3, P4,
1226                                                        P5);
1227   }
1228   template <typename M1, typename M2, typename M3, typename M4, typename M5,
1229             typename M6>
1230   typename EnableIfValidArity<
1231       6, VariadicOperatorMatcher<M1, M2, M3, M4, M5, M6> >::type
1232   operator()(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4,
1233              const M5 &P5, const M6 &P6) const {
1234     return VariadicOperatorMatcher<M1, M2, M3, M4, M5, M6>(
1235         Func, P1, P2, P3, P4, P5, P6);
1236   }
1237   template <typename M1, typename M2, typename M3, typename M4, typename M5,
1238             typename M6, typename M7>
1239   typename EnableIfValidArity<
1240       7, VariadicOperatorMatcher<M1, M2, M3, M4, M5, M6, M7> >::type
1241   operator()(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4,
1242              const M5 &P5, const M6 &P6, const M7 &P7) const {
1243     return VariadicOperatorMatcher<M1, M2, M3, M4, M5, M6, M7>(
1244         Func, P1, P2, P3, P4, P5, P6, P7);
1245   }
1246   template <typename M1, typename M2, typename M3, typename M4, typename M5,
1247             typename M6, typename M7, typename M8>
1248   typename EnableIfValidArity<
1249       8, VariadicOperatorMatcher<M1, M2, M3, M4, M5, M6, M7, M8> >::type
1250   operator()(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4,
1251              const M5 &P5, const M6 &P6, const M7 &P7, const M8 &P8) const {
1252     return VariadicOperatorMatcher<M1, M2, M3, M4, M5, M6, M7, M8>(
1253         Func, P1, P2, P3, P4, P5, P6, P7, P8);
1254   }
1255   template <typename M1, typename M2, typename M3, typename M4, typename M5,
1256             typename M6, typename M7, typename M8, typename M9>
1257   typename EnableIfValidArity<
1258       9, VariadicOperatorMatcher<M1, M2, M3, M4, M5, M6, M7, M8, M9> >::type
1259   operator()(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4,
1260              const M5 &P5, const M6 &P6, const M7 &P7, const M8 &P8,
1261              const M9 &P9) const {
1262     return VariadicOperatorMatcher<M1, M2, M3, M4, M5, M6, M7, M8, M9>(
1263         Func, P1, P2, P3, P4, P5, P6, P7, P8, P9);
1264   }
1265 };
1266 
1267 /// @}
1268 
1269 /// \brief Matches nodes that do not match the provided matcher.
1270 ///
1271 /// Uses the variadic matcher interface, but fails if InnerMatchers.size()!=1.
1272 bool NotUnaryOperator(const ast_type_traits::DynTypedNode DynNode,
1273                       ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder,
1274                       ArrayRef<DynTypedMatcher> InnerMatchers);
1275 
1276 /// \brief Matches nodes for which all provided matchers match.
1277 bool AllOfVariadicOperator(const ast_type_traits::DynTypedNode DynNode,
1278                            ASTMatchFinder *Finder,
1279                            BoundNodesTreeBuilder *Builder,
1280                            ArrayRef<DynTypedMatcher> InnerMatchers);
1281 
1282 /// \brief Matches nodes for which at least one of the provided matchers
1283 /// matches, but doesn't stop at the first match.
1284 bool EachOfVariadicOperator(const ast_type_traits::DynTypedNode DynNode,
1285                             ASTMatchFinder *Finder,
1286                             BoundNodesTreeBuilder *Builder,
1287                             ArrayRef<DynTypedMatcher> InnerMatchers);
1288 
1289 /// \brief Matches nodes for which at least one of the provided matchers
1290 /// matches.
1291 bool AnyOfVariadicOperator(const ast_type_traits::DynTypedNode DynNode,
1292                            ASTMatchFinder *Finder,
1293                            BoundNodesTreeBuilder *Builder,
1294                            ArrayRef<DynTypedMatcher> InnerMatchers);
1295 
1296 template <typename T>
1297 inline Matcher<T> DynTypedMatcher::unconditionalConvertTo() const {
1298   return Matcher<T>(new VariadicOperatorMatcherInterface<T>(
1299       AllOfVariadicOperator, llvm::makeArrayRef(*this)));
1300 }
1301 
1302 /// \brief Creates a Matcher<T> that matches if all inner matchers match.
1303 template<typename T>
1304 BindableMatcher<T> makeAllOfComposite(
1305     ArrayRef<const Matcher<T> *> InnerMatchers) {
1306   std::vector<DynTypedMatcher> DynMatchers;
1307   for (size_t i = 0, e = InnerMatchers.size(); i != e; ++i) {
1308     DynMatchers.push_back(*InnerMatchers[i]);
1309   }
1310   return BindableMatcher<T>(new VariadicOperatorMatcherInterface<T>(
1311       AllOfVariadicOperator, std::move(DynMatchers)));
1312 }
1313 
1314 /// \brief Creates a Matcher<T> that matches if
1315 /// T is dyn_cast'able into InnerT and all inner matchers match.
1316 ///
1317 /// Returns BindableMatcher, as matchers that use dyn_cast have
1318 /// the same object both to match on and to run submatchers on,
1319 /// so there is no ambiguity with what gets bound.
1320 template<typename T, typename InnerT>
1321 BindableMatcher<T> makeDynCastAllOfComposite(
1322     ArrayRef<const Matcher<InnerT> *> InnerMatchers) {
1323   return BindableMatcher<T>(DynTypedMatcher(makeAllOfComposite(InnerMatchers))
1324                                 .unconditionalConvertTo<T>());
1325 }
1326 
1327 /// \brief Matches nodes of type T that have at least one descendant node of
1328 /// type DescendantT for which the given inner matcher matches.
1329 ///
1330 /// DescendantT must be an AST base type.
1331 template <typename T, typename DescendantT>
1332 class HasDescendantMatcher : public MatcherInterface<T> {
1333   static_assert(IsBaseType<DescendantT>::value,
1334                 "has descendant only accepts base type matcher");
1335 
1336 public:
1337   explicit HasDescendantMatcher(const Matcher<DescendantT> &DescendantMatcher)
1338       : DescendantMatcher(DescendantMatcher) {}
1339 
1340   bool matches(const T &Node, ASTMatchFinder *Finder,
1341                BoundNodesTreeBuilder *Builder) const override {
1342     return Finder->matchesDescendantOf(
1343         Node, DescendantMatcher, Builder, ASTMatchFinder::BK_First);
1344   }
1345 
1346  private:
1347   const Matcher<DescendantT> DescendantMatcher;
1348 };
1349 
1350 /// \brief Matches nodes of type \c T that have a parent node of type \c ParentT
1351 /// for which the given inner matcher matches.
1352 ///
1353 /// \c ParentT must be an AST base type.
1354 template <typename T, typename ParentT>
1355 class HasParentMatcher : public MatcherInterface<T> {
1356   static_assert(IsBaseType<ParentT>::value,
1357                 "has parent only accepts base type matcher");
1358 
1359 public:
1360   explicit HasParentMatcher(const Matcher<ParentT> &ParentMatcher)
1361       : ParentMatcher(ParentMatcher) {}
1362 
1363   bool matches(const T &Node, ASTMatchFinder *Finder,
1364                BoundNodesTreeBuilder *Builder) const override {
1365     return Finder->matchesAncestorOf(
1366         Node, ParentMatcher, Builder, ASTMatchFinder::AMM_ParentOnly);
1367   }
1368 
1369  private:
1370   const Matcher<ParentT> ParentMatcher;
1371 };
1372 
1373 /// \brief Matches nodes of type \c T that have at least one ancestor node of
1374 /// type \c AncestorT for which the given inner matcher matches.
1375 ///
1376 /// \c AncestorT must be an AST base type.
1377 template <typename T, typename AncestorT>
1378 class HasAncestorMatcher : public MatcherInterface<T> {
1379   static_assert(IsBaseType<AncestorT>::value,
1380                 "has ancestor only accepts base type matcher");
1381 
1382 public:
1383   explicit HasAncestorMatcher(const Matcher<AncestorT> &AncestorMatcher)
1384       : AncestorMatcher(AncestorMatcher) {}
1385 
1386   bool matches(const T &Node, ASTMatchFinder *Finder,
1387                BoundNodesTreeBuilder *Builder) const override {
1388     return Finder->matchesAncestorOf(
1389         Node, AncestorMatcher, Builder, ASTMatchFinder::AMM_All);
1390   }
1391 
1392  private:
1393   const Matcher<AncestorT> AncestorMatcher;
1394 };
1395 
1396 /// \brief Matches nodes of type T that have at least one descendant node of
1397 /// type DescendantT for which the given inner matcher matches.
1398 ///
1399 /// DescendantT must be an AST base type.
1400 /// As opposed to HasDescendantMatcher, ForEachDescendantMatcher will match
1401 /// for each descendant node that matches instead of only for the first.
1402 template <typename T, typename DescendantT>
1403 class ForEachDescendantMatcher : public MatcherInterface<T> {
1404   static_assert(IsBaseType<DescendantT>::value,
1405                 "for each descendant only accepts base type matcher");
1406 
1407  public:
1408   explicit ForEachDescendantMatcher(
1409       const Matcher<DescendantT>& DescendantMatcher)
1410       : DescendantMatcher(DescendantMatcher) {}
1411 
1412   bool matches(const T& Node, ASTMatchFinder* Finder,
1413                BoundNodesTreeBuilder* Builder) const override {
1414     return Finder->matchesDescendantOf(Node, DescendantMatcher, Builder,
1415                                        ASTMatchFinder::BK_All);
1416   }
1417 
1418 private:
1419   const Matcher<DescendantT> DescendantMatcher;
1420 };
1421 
1422 /// \brief Matches on nodes that have a getValue() method if getValue() equals
1423 /// the value the ValueEqualsMatcher was constructed with.
1424 template <typename T, typename ValueT>
1425 class ValueEqualsMatcher : public SingleNodeMatcherInterface<T> {
1426   static_assert(std::is_base_of<CharacterLiteral, T>::value ||
1427                 std::is_base_of<CXXBoolLiteralExpr, T>::value ||
1428                 std::is_base_of<FloatingLiteral, T>::value ||
1429                 std::is_base_of<IntegerLiteral, T>::value,
1430                 "the node must have a getValue method");
1431 
1432 public:
1433   explicit ValueEqualsMatcher(const ValueT &ExpectedValue)
1434       : ExpectedValue(ExpectedValue) {}
1435 
1436   bool matchesNode(const T &Node) const override {
1437     return Node.getValue() == ExpectedValue;
1438   }
1439 
1440 private:
1441   const ValueT ExpectedValue;
1442 };
1443 
1444 /// \brief A VariadicDynCastAllOfMatcher<SourceT, TargetT> object is a
1445 /// variadic functor that takes a number of Matcher<TargetT> and returns a
1446 /// Matcher<SourceT> that matches TargetT nodes that are matched by all of the
1447 /// given matchers, if SourceT can be dynamically casted into TargetT.
1448 ///
1449 /// For example:
1450 ///   const VariadicDynCastAllOfMatcher<
1451 ///       Decl, CXXRecordDecl> record;
1452 /// Creates a functor record(...) that creates a Matcher<Decl> given
1453 /// a variable number of arguments of type Matcher<CXXRecordDecl>.
1454 /// The returned matcher matches if the given Decl can by dynamically
1455 /// casted to CXXRecordDecl and all given matchers match.
1456 template <typename SourceT, typename TargetT>
1457 class VariadicDynCastAllOfMatcher
1458     : public llvm::VariadicFunction<
1459         BindableMatcher<SourceT>, Matcher<TargetT>,
1460         makeDynCastAllOfComposite<SourceT, TargetT> > {
1461 public:
1462   VariadicDynCastAllOfMatcher() {}
1463 };
1464 
1465 /// \brief A \c VariadicAllOfMatcher<T> object is a variadic functor that takes
1466 /// a number of \c Matcher<T> and returns a \c Matcher<T> that matches \c T
1467 /// nodes that are matched by all of the given matchers.
1468 ///
1469 /// For example:
1470 ///   const VariadicAllOfMatcher<NestedNameSpecifier> nestedNameSpecifier;
1471 /// Creates a functor nestedNameSpecifier(...) that creates a
1472 /// \c Matcher<NestedNameSpecifier> given a variable number of arguments of type
1473 /// \c Matcher<NestedNameSpecifier>.
1474 /// The returned matcher matches if all given matchers match.
1475 template <typename T>
1476 class VariadicAllOfMatcher : public llvm::VariadicFunction<
1477                                BindableMatcher<T>, Matcher<T>,
1478                                makeAllOfComposite<T> > {
1479 public:
1480   VariadicAllOfMatcher() {}
1481 };
1482 
1483 /// \brief Matches nodes of type \c TLoc for which the inner
1484 /// \c Matcher<T> matches.
1485 template <typename TLoc, typename T>
1486 class LocMatcher : public MatcherInterface<TLoc> {
1487 public:
1488   explicit LocMatcher(const Matcher<T> &InnerMatcher)
1489     : InnerMatcher(InnerMatcher) {}
1490 
1491   bool matches(const TLoc &Node, ASTMatchFinder *Finder,
1492                BoundNodesTreeBuilder *Builder) const override {
1493     if (!Node)
1494       return false;
1495     return InnerMatcher.matches(*extract(Node), Finder, Builder);
1496   }
1497 
1498 private:
1499   const NestedNameSpecifier *extract(const NestedNameSpecifierLoc &Loc) const {
1500     return Loc.getNestedNameSpecifier();
1501   }
1502 
1503   const Matcher<T> InnerMatcher;
1504 };
1505 
1506 /// \brief Matches \c TypeLocs based on an inner matcher matching a certain
1507 /// \c QualType.
1508 ///
1509 /// Used to implement the \c loc() matcher.
1510 class TypeLocTypeMatcher : public MatcherInterface<TypeLoc> {
1511 public:
1512   explicit TypeLocTypeMatcher(const Matcher<QualType> &InnerMatcher)
1513       : InnerMatcher(InnerMatcher) {}
1514 
1515   bool matches(const TypeLoc &Node, ASTMatchFinder *Finder,
1516                BoundNodesTreeBuilder *Builder) const override {
1517     if (!Node)
1518       return false;
1519     return InnerMatcher.matches(Node.getType(), Finder, Builder);
1520   }
1521 
1522 private:
1523   const Matcher<QualType> InnerMatcher;
1524 };
1525 
1526 /// \brief Matches nodes of type \c T for which the inner matcher matches on a
1527 /// another node of type \c T that can be reached using a given traverse
1528 /// function.
1529 template <typename T>
1530 class TypeTraverseMatcher : public MatcherInterface<T> {
1531 public:
1532   explicit TypeTraverseMatcher(const Matcher<QualType> &InnerMatcher,
1533                                QualType (T::*TraverseFunction)() const)
1534       : InnerMatcher(InnerMatcher), TraverseFunction(TraverseFunction) {}
1535 
1536   bool matches(const T &Node, ASTMatchFinder *Finder,
1537                BoundNodesTreeBuilder *Builder) const override {
1538     QualType NextNode = (Node.*TraverseFunction)();
1539     if (NextNode.isNull())
1540       return false;
1541     return InnerMatcher.matches(NextNode, Finder, Builder);
1542   }
1543 
1544 private:
1545   const Matcher<QualType> InnerMatcher;
1546   QualType (T::*TraverseFunction)() const;
1547 };
1548 
1549 /// \brief Matches nodes of type \c T in a ..Loc hierarchy, for which the inner
1550 /// matcher matches on a another node of type \c T that can be reached using a
1551 /// given traverse function.
1552 template <typename T>
1553 class TypeLocTraverseMatcher : public MatcherInterface<T> {
1554 public:
1555   explicit TypeLocTraverseMatcher(const Matcher<TypeLoc> &InnerMatcher,
1556                                   TypeLoc (T::*TraverseFunction)() const)
1557       : InnerMatcher(InnerMatcher), TraverseFunction(TraverseFunction) {}
1558 
1559   bool matches(const T &Node, ASTMatchFinder *Finder,
1560                BoundNodesTreeBuilder *Builder) const override {
1561     TypeLoc NextNode = (Node.*TraverseFunction)();
1562     if (!NextNode)
1563       return false;
1564     return InnerMatcher.matches(NextNode, Finder, Builder);
1565   }
1566 
1567 private:
1568   const Matcher<TypeLoc> InnerMatcher;
1569   TypeLoc (T::*TraverseFunction)() const;
1570 };
1571 
1572 /// \brief Converts a \c Matcher<InnerT> to a \c Matcher<OuterT>, where
1573 /// \c OuterT is any type that is supported by \c Getter.
1574 ///
1575 /// \code Getter<OuterT>::value() \endcode returns a
1576 /// \code InnerTBase (OuterT::*)() \endcode, which is used to adapt a \c OuterT
1577 /// object into a \c InnerT
1578 template <typename InnerTBase,
1579           template <typename OuterT> class Getter,
1580           template <typename OuterT> class MatcherImpl,
1581           typename ReturnTypesF>
1582 class TypeTraversePolymorphicMatcher {
1583 private:
1584   typedef TypeTraversePolymorphicMatcher<InnerTBase, Getter, MatcherImpl,
1585                                          ReturnTypesF> Self;
1586   static Self create(ArrayRef<const Matcher<InnerTBase> *> InnerMatchers);
1587 
1588 public:
1589   typedef typename ExtractFunctionArgMeta<ReturnTypesF>::type ReturnTypes;
1590 
1591   explicit TypeTraversePolymorphicMatcher(
1592       ArrayRef<const Matcher<InnerTBase> *> InnerMatchers)
1593       : InnerMatcher(makeAllOfComposite(InnerMatchers)) {}
1594 
1595   template <typename OuterT> operator Matcher<OuterT>() const {
1596     return Matcher<OuterT>(
1597         new MatcherImpl<OuterT>(InnerMatcher, Getter<OuterT>::value()));
1598   }
1599 
1600   struct Func : public llvm::VariadicFunction<Self, Matcher<InnerTBase>,
1601                                               &Self::create> {
1602     Func() {}
1603   };
1604 
1605 private:
1606   const Matcher<InnerTBase> InnerMatcher;
1607 };
1608 
1609 // Define the create() method out of line to silence a GCC warning about
1610 // the struct "Func" having greater visibility than its base, which comes from
1611 // using the flag -fvisibility-inlines-hidden.
1612 template <typename InnerTBase, template <typename OuterT> class Getter,
1613           template <typename OuterT> class MatcherImpl, typename ReturnTypesF>
1614 TypeTraversePolymorphicMatcher<InnerTBase, Getter, MatcherImpl, ReturnTypesF>
1615 TypeTraversePolymorphicMatcher<
1616     InnerTBase, Getter, MatcherImpl,
1617     ReturnTypesF>::create(ArrayRef<const Matcher<InnerTBase> *> InnerMatchers) {
1618   return Self(InnerMatchers);
1619 }
1620 
1621 // FIXME: unify ClassTemplateSpecializationDecl and TemplateSpecializationType's
1622 // APIs for accessing the template argument list.
1623 inline ArrayRef<TemplateArgument>
1624 getTemplateSpecializationArgs(const ClassTemplateSpecializationDecl &D) {
1625   return D.getTemplateArgs().asArray();
1626 }
1627 
1628 inline ArrayRef<TemplateArgument>
1629 getTemplateSpecializationArgs(const TemplateSpecializationType &T) {
1630   return ArrayRef<TemplateArgument>(T.getArgs(), T.getNumArgs());
1631 }
1632 
1633 struct NotEqualsBoundNodePredicate {
1634   bool operator()(const internal::BoundNodesMap &Nodes) const {
1635     return Nodes.getNode(ID) != Node;
1636   }
1637   std::string ID;
1638   ast_type_traits::DynTypedNode Node;
1639 };
1640 
1641 } // end namespace internal
1642 } // end namespace ast_matchers
1643 } // end namespace clang
1644 
1645 #endif // LLVM_CLANG_AST_MATCHERS_AST_MATCHERS_INTERNAL_H
1646