• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===--- ASTMatchers.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 //  This file implements matchers to be used together with the MatchFinder to
11 //  match AST nodes.
12 //
13 //  Matchers are created by generator functions, which can be combined in
14 //  a functional in-language DSL to express queries over the C++ AST.
15 //
16 //  For example, to match a class with a certain name, one would call:
17 //    recordDecl(hasName("MyClass"))
18 //  which returns a matcher that can be used to find all AST nodes that declare
19 //  a class named 'MyClass'.
20 //
21 //  For more complicated match expressions we're often interested in accessing
22 //  multiple parts of the matched AST nodes once a match is found. In that case,
23 //  use the id(...) matcher around the match expressions that match the nodes
24 //  you want to access.
25 //
26 //  For example, when we're interested in child classes of a certain class, we
27 //  would write:
28 //    recordDecl(hasName("MyClass"), hasChild(id("child", recordDecl())))
29 //  When the match is found via the MatchFinder, a user provided callback will
30 //  be called with a BoundNodes instance that contains a mapping from the
31 //  strings that we provided for the id(...) calls to the nodes that were
32 //  matched.
33 //  In the given example, each time our matcher finds a match we get a callback
34 //  where "child" is bound to the CXXRecordDecl node of the matching child
35 //  class declaration.
36 //
37 //  See ASTMatchersInternal.h for a more in-depth explanation of the
38 //  implementation details of the matcher framework.
39 //
40 //  See ASTMatchFinder.h for how to use the generated matchers to run over
41 //  an AST.
42 //
43 //===----------------------------------------------------------------------===//
44 
45 #ifndef LLVM_CLANG_AST_MATCHERS_AST_MATCHERS_H
46 #define LLVM_CLANG_AST_MATCHERS_AST_MATCHERS_H
47 
48 #include "clang/AST/DeclTemplate.h"
49 #include "clang/ASTMatchers/ASTMatchersInternal.h"
50 #include "clang/ASTMatchers/ASTMatchersMacros.h"
51 #include "llvm/ADT/Twine.h"
52 #include "llvm/Support/Regex.h"
53 #include <iterator>
54 
55 namespace clang {
56 namespace ast_matchers {
57 
58 /// \brief Maps string IDs to AST nodes matched by parts of a matcher.
59 ///
60 /// The bound nodes are generated by calling \c bind("id") on the node matchers
61 /// of the nodes we want to access later.
62 ///
63 /// The instances of BoundNodes are created by \c MatchFinder when the user's
64 /// callbacks are executed every time a match is found.
65 class BoundNodes {
66 public:
67   /// \brief Returns the AST node bound to \c ID.
68   ///
69   /// Returns NULL if there was no node bound to \c ID or if there is a node but
70   /// it cannot be converted to the specified type.
71   template <typename T>
getNodeAs(StringRef ID)72   const T *getNodeAs(StringRef ID) const {
73     return MyBoundNodes.getNodeAs<T>(ID);
74   }
75 
76   /// \brief Deprecated. Please use \c getNodeAs instead.
77   /// @{
78   template <typename T>
getDeclAs(StringRef ID)79   const T *getDeclAs(StringRef ID) const {
80     return getNodeAs<T>(ID);
81   }
82   template <typename T>
getStmtAs(StringRef ID)83   const T *getStmtAs(StringRef ID) const {
84     return getNodeAs<T>(ID);
85   }
86   /// @}
87 
88 private:
89   /// \brief Create BoundNodes from a pre-filled map of bindings.
BoundNodes(internal::BoundNodesMap & MyBoundNodes)90   BoundNodes(internal::BoundNodesMap &MyBoundNodes)
91       : MyBoundNodes(MyBoundNodes) {}
92 
93   internal::BoundNodesMap MyBoundNodes;
94 
95   friend class internal::BoundNodesTree;
96 };
97 
98 /// \brief If the provided matcher matches a node, binds the node to \c ID.
99 ///
100 /// FIXME: Do we want to support this now that we have bind()?
101 template <typename T>
id(const std::string & ID,const internal::BindableMatcher<T> & InnerMatcher)102 internal::Matcher<T> id(const std::string &ID,
103                         const internal::BindableMatcher<T> &InnerMatcher) {
104   return InnerMatcher.bind(ID);
105 }
106 
107 /// \brief Types of matchers for the top-level classes in the AST class
108 /// hierarchy.
109 /// @{
110 typedef internal::Matcher<Decl> DeclarationMatcher;
111 typedef internal::Matcher<Stmt> StatementMatcher;
112 typedef internal::Matcher<QualType> TypeMatcher;
113 typedef internal::Matcher<TypeLoc> TypeLocMatcher;
114 typedef internal::Matcher<NestedNameSpecifier> NestedNameSpecifierMatcher;
115 typedef internal::Matcher<NestedNameSpecifierLoc> NestedNameSpecifierLocMatcher;
116 /// @}
117 
118 /// \brief Matches any node.
119 ///
120 /// Useful when another matcher requires a child matcher, but there's no
121 /// additional constraint. This will often be used with an explicit conversion
122 /// to an \c internal::Matcher<> type such as \c TypeMatcher.
123 ///
124 /// Example: \c DeclarationMatcher(anything()) matches all declarations, e.g.,
125 /// \code
126 /// "int* p" and "void f()" in
127 ///   int* p;
128 ///   void f();
129 /// \endcode
130 ///
131 /// Usable as: Any Matcher
anything()132 inline internal::PolymorphicMatcherWithParam0<internal::TrueMatcher> anything() {
133   return internal::PolymorphicMatcherWithParam0<internal::TrueMatcher>();
134 }
135 
136 /// \brief Matches declarations.
137 ///
138 /// Examples matches \c X, \c C, and the friend declaration inside \c C;
139 /// \code
140 ///   void X();
141 ///   class C {
142 ///     friend X;
143 ///   };
144 /// \endcode
145 const internal::VariadicAllOfMatcher<Decl> decl;
146 
147 /// \brief Matches a declaration of anything that could have a name.
148 ///
149 /// Example matches \c X, \c S, the anonymous union type, \c i, and \c U;
150 /// \code
151 ///   typedef int X;
152 ///   struct S {
153 ///     union {
154 ///       int i;
155 ///     } U;
156 ///   };
157 /// \endcode
158 const internal::VariadicDynCastAllOfMatcher<Decl, NamedDecl> namedDecl;
159 
160 /// \brief Matches C++ class declarations.
161 ///
162 /// Example matches \c X, \c Z
163 /// \code
164 ///   class X;
165 ///   template<class T> class Z {};
166 /// \endcode
167 const internal::VariadicDynCastAllOfMatcher<
168   Decl,
169   CXXRecordDecl> recordDecl;
170 
171 /// \brief Matches C++ class template declarations.
172 ///
173 /// Example matches \c Z
174 /// \code
175 ///   template<class T> class Z {};
176 /// \endcode
177 const internal::VariadicDynCastAllOfMatcher<
178   Decl,
179   ClassTemplateDecl> classTemplateDecl;
180 
181 /// \brief Matches C++ class template specializations.
182 ///
183 /// Given
184 /// \code
185 ///   template<typename T> class A {};
186 ///   template<> class A<double> {};
187 ///   A<int> a;
188 /// \endcode
189 /// classTemplateSpecializationDecl()
190 ///   matches the specializations \c A<int> and \c A<double>
191 const internal::VariadicDynCastAllOfMatcher<
192   Decl,
193   ClassTemplateSpecializationDecl> classTemplateSpecializationDecl;
194 
195 /// \brief Matches C++ access specifier declarations.
196 ///
197 /// Given
198 /// \code
199 ///   class C {
200 ///   public:
201 ///     int a;
202 ///   };
203 /// \endcode
204 /// accessSpecDecl()
205 ///   matches 'public:'
206 const internal::VariadicDynCastAllOfMatcher<
207   Decl,
208   AccessSpecDecl> accessSpecDecl;
209 
210 /// \brief Matches public C++ declarations.
211 ///
212 /// Given
213 /// \code
214 ///   class C {
215 ///   public:    int a;
216 ///   protected: int b;
217 ///   private:   int c;
218 ///   };
219 /// \endcode
220 /// fieldDecl(isPublic())
221 ///   matches 'int a;'
AST_MATCHER(Decl,isPublic)222 AST_MATCHER(Decl, isPublic) {
223   return Node.getAccess() == AS_public;
224 }
225 
226 /// \brief Matches protected C++ declarations.
227 ///
228 /// Given
229 /// \code
230 ///   class C {
231 ///   public:    int a;
232 ///   protected: int b;
233 ///   private:   int c;
234 ///   };
235 /// \endcode
236 /// fieldDecl(isProtected())
237 ///   matches 'int b;'
AST_MATCHER(Decl,isProtected)238 AST_MATCHER(Decl, isProtected) {
239   return Node.getAccess() == AS_protected;
240 }
241 
242 /// \brief Matches private C++ declarations.
243 ///
244 /// Given
245 /// \code
246 ///   class C {
247 ///   public:    int a;
248 ///   protected: int b;
249 ///   private:   int c;
250 ///   };
251 /// \endcode
252 /// fieldDecl(isPrivate())
253 ///   matches 'int c;'
AST_MATCHER(Decl,isPrivate)254 AST_MATCHER(Decl, isPrivate) {
255   return Node.getAccess() == AS_private;
256 }
257 
258 /// \brief Matches classTemplateSpecializations that have at least one
259 /// TemplateArgument matching the given InnerMatcher.
260 ///
261 /// Given
262 /// \code
263 ///   template<typename T> class A {};
264 ///   template<> class A<double> {};
265 ///   A<int> a;
266 /// \endcode
267 /// classTemplateSpecializationDecl(hasAnyTemplateArgument(
268 ///     refersToType(asString("int"))))
269 ///   matches the specialization \c A<int>
AST_MATCHER_P(ClassTemplateSpecializationDecl,hasAnyTemplateArgument,internal::Matcher<TemplateArgument>,InnerMatcher)270 AST_MATCHER_P(ClassTemplateSpecializationDecl, hasAnyTemplateArgument,
271               internal::Matcher<TemplateArgument>, InnerMatcher) {
272   const TemplateArgumentList &List = Node.getTemplateArgs();
273   for (unsigned i = 0; i < List.size(); ++i) {
274     if (InnerMatcher.matches(List.get(i), Finder, Builder))
275       return true;
276   }
277   return false;
278 }
279 
280 /// \brief Matches expressions that match InnerMatcher after any implicit casts
281 /// are stripped off.
282 ///
283 /// Parentheses and explicit casts are not discarded.
284 /// Given
285 /// \code
286 ///   int arr[5];
287 ///   int a = 0;
288 ///   char b = 0;
289 ///   const int c = a;
290 ///   int *d = arr;
291 ///   long e = (long) 0l;
292 /// \endcode
293 /// The matchers
294 /// \code
295 ///    varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
296 ///    varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
297 /// \endcode
298 /// would match the declarations for a, b, c, and d, but not e.
299 /// While
300 /// \code
301 ///    varDecl(hasInitializer(integerLiteral()))
302 ///    varDecl(hasInitializer(declRefExpr()))
303 /// \endcode
304 /// only match the declarations for b, c, and d.
AST_MATCHER_P(Expr,ignoringImpCasts,internal::Matcher<Expr>,InnerMatcher)305 AST_MATCHER_P(Expr, ignoringImpCasts,
306               internal::Matcher<Expr>, InnerMatcher) {
307   return InnerMatcher.matches(*Node.IgnoreImpCasts(), Finder, Builder);
308 }
309 
310 /// \brief Matches expressions that match InnerMatcher after parentheses and
311 /// casts are stripped off.
312 ///
313 /// Implicit and non-C Style casts are also discarded.
314 /// Given
315 /// \code
316 ///   int a = 0;
317 ///   char b = (0);
318 ///   void* c = reinterpret_cast<char*>(0);
319 ///   char d = char(0);
320 /// \endcode
321 /// The matcher
322 ///    varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
323 /// would match the declarations for a, b, c, and d.
324 /// while
325 ///    varDecl(hasInitializer(integerLiteral()))
326 /// only match the declaration for a.
AST_MATCHER_P(Expr,ignoringParenCasts,internal::Matcher<Expr>,InnerMatcher)327 AST_MATCHER_P(Expr, ignoringParenCasts, internal::Matcher<Expr>, InnerMatcher) {
328   return InnerMatcher.matches(*Node.IgnoreParenCasts(), Finder, Builder);
329 }
330 
331 /// \brief Matches expressions that match InnerMatcher after implicit casts and
332 /// parentheses are stripped off.
333 ///
334 /// Explicit casts are not discarded.
335 /// Given
336 /// \code
337 ///   int arr[5];
338 ///   int a = 0;
339 ///   char b = (0);
340 ///   const int c = a;
341 ///   int *d = (arr);
342 ///   long e = ((long) 0l);
343 /// \endcode
344 /// The matchers
345 ///    varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
346 ///    varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
347 /// would match the declarations for a, b, c, and d, but not e.
348 /// while
349 ///    varDecl(hasInitializer(integerLiteral()))
350 ///    varDecl(hasInitializer(declRefExpr()))
351 /// would only match the declaration for a.
AST_MATCHER_P(Expr,ignoringParenImpCasts,internal::Matcher<Expr>,InnerMatcher)352 AST_MATCHER_P(Expr, ignoringParenImpCasts,
353               internal::Matcher<Expr>, InnerMatcher) {
354   return InnerMatcher.matches(*Node.IgnoreParenImpCasts(), Finder, Builder);
355 }
356 
357 /// \brief Matches classTemplateSpecializations where the n'th TemplateArgument
358 /// matches the given InnerMatcher.
359 ///
360 /// Given
361 /// \code
362 ///   template<typename T, typename U> class A {};
363 ///   A<bool, int> b;
364 ///   A<int, bool> c;
365 /// \endcode
366 /// classTemplateSpecializationDecl(hasTemplateArgument(
367 ///     1, refersToType(asString("int"))))
368 ///   matches the specialization \c A<bool, int>
AST_MATCHER_P2(ClassTemplateSpecializationDecl,hasTemplateArgument,unsigned,N,internal::Matcher<TemplateArgument>,InnerMatcher)369 AST_MATCHER_P2(ClassTemplateSpecializationDecl, hasTemplateArgument,
370                unsigned, N, internal::Matcher<TemplateArgument>, InnerMatcher) {
371   const TemplateArgumentList &List = Node.getTemplateArgs();
372   if (List.size() <= N)
373     return false;
374   return InnerMatcher.matches(List.get(N), Finder, Builder);
375 }
376 
377 /// \brief Matches a TemplateArgument that refers to a certain type.
378 ///
379 /// Given
380 /// \code
381 ///   struct X {};
382 ///   template<typename T> struct A {};
383 ///   A<X> a;
384 /// \endcode
385 /// classTemplateSpecializationDecl(hasAnyTemplateArgument(
386 ///     refersToType(class(hasName("X")))))
387 ///   matches the specialization \c A<X>
AST_MATCHER_P(TemplateArgument,refersToType,internal::Matcher<QualType>,InnerMatcher)388 AST_MATCHER_P(TemplateArgument, refersToType,
389               internal::Matcher<QualType>, InnerMatcher) {
390   if (Node.getKind() != TemplateArgument::Type)
391     return false;
392   return InnerMatcher.matches(Node.getAsType(), Finder, Builder);
393 }
394 
395 /// \brief Matches a TemplateArgument that refers to a certain declaration.
396 ///
397 /// Given
398 /// \code
399 ///   template<typename T> struct A {};
400 ///   struct B { B* next; };
401 ///   A<&B::next> a;
402 /// \endcode
403 /// classTemplateSpecializationDecl(hasAnyTemplateArgument(
404 ///     refersToDeclaration(fieldDecl(hasName("next"))))
405 ///   matches the specialization \c A<&B::next> with \c fieldDecl(...) matching
406 ///     \c B::next
AST_MATCHER_P(TemplateArgument,refersToDeclaration,internal::Matcher<Decl>,InnerMatcher)407 AST_MATCHER_P(TemplateArgument, refersToDeclaration,
408               internal::Matcher<Decl>, InnerMatcher) {
409   if (Node.getKind() == TemplateArgument::Declaration)
410     return InnerMatcher.matches(*Node.getAsDecl(), Finder, Builder);
411   return false;
412 }
413 
414 /// \brief Matches C++ constructor declarations.
415 ///
416 /// Example matches Foo::Foo() and Foo::Foo(int)
417 /// \code
418 ///   class Foo {
419 ///    public:
420 ///     Foo();
421 ///     Foo(int);
422 ///     int DoSomething();
423 ///   };
424 /// \endcode
425 const internal::VariadicDynCastAllOfMatcher<
426   Decl,
427   CXXConstructorDecl> constructorDecl;
428 
429 /// \brief Matches explicit C++ destructor declarations.
430 ///
431 /// Example matches Foo::~Foo()
432 /// \code
433 ///   class Foo {
434 ///    public:
435 ///     virtual ~Foo();
436 ///   };
437 /// \endcode
438 const internal::VariadicDynCastAllOfMatcher<
439   Decl,
440   CXXDestructorDecl> destructorDecl;
441 
442 /// \brief Matches enum declarations.
443 ///
444 /// Example matches X
445 /// \code
446 ///   enum X {
447 ///     A, B, C
448 ///   };
449 /// \endcode
450 const internal::VariadicDynCastAllOfMatcher<Decl, EnumDecl> enumDecl;
451 
452 /// \brief Matches enum constants.
453 ///
454 /// Example matches A, B, C
455 /// \code
456 ///   enum X {
457 ///     A, B, C
458 ///   };
459 /// \endcode
460 const internal::VariadicDynCastAllOfMatcher<
461   Decl,
462   EnumConstantDecl> enumConstantDecl;
463 
464 /// \brief Matches method declarations.
465 ///
466 /// Example matches y
467 /// \code
468 ///   class X { void y() };
469 /// \endcode
470 const internal::VariadicDynCastAllOfMatcher<Decl, CXXMethodDecl> methodDecl;
471 
472 /// \brief Matches variable declarations.
473 ///
474 /// Note: this does not match declarations of member variables, which are
475 /// "field" declarations in Clang parlance.
476 ///
477 /// Example matches a
478 /// \code
479 ///   int a;
480 /// \endcode
481 const internal::VariadicDynCastAllOfMatcher<Decl, VarDecl> varDecl;
482 
483 /// \brief Matches field declarations.
484 ///
485 /// Given
486 /// \code
487 ///   class X { int m; };
488 /// \endcode
489 /// fieldDecl()
490 ///   matches 'm'.
491 const internal::VariadicDynCastAllOfMatcher<Decl, FieldDecl> fieldDecl;
492 
493 /// \brief Matches function declarations.
494 ///
495 /// Example matches f
496 /// \code
497 ///   void f();
498 /// \endcode
499 const internal::VariadicDynCastAllOfMatcher<Decl, FunctionDecl> functionDecl;
500 
501 /// \brief Matches C++ function template declarations.
502 ///
503 /// Example matches f
504 /// \code
505 ///   template<class T> void f(T t) {}
506 /// \endcode
507 const internal::VariadicDynCastAllOfMatcher<
508   Decl,
509   FunctionTemplateDecl> functionTemplateDecl;
510 
511 /// \brief Matches statements.
512 ///
513 /// Given
514 /// \code
515 ///   { ++a; }
516 /// \endcode
517 /// stmt()
518 ///   matches both the compound statement '{ ++a; }' and '++a'.
519 const internal::VariadicAllOfMatcher<Stmt> stmt;
520 
521 /// \brief Matches declaration statements.
522 ///
523 /// Given
524 /// \code
525 ///   int a;
526 /// \endcode
527 /// declStmt()
528 ///   matches 'int a'.
529 const internal::VariadicDynCastAllOfMatcher<
530   Stmt,
531   DeclStmt> declStmt;
532 
533 /// \brief Matches member expressions.
534 ///
535 /// Given
536 /// \code
537 ///   class Y {
538 ///     void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
539 ///     int a; static int b;
540 ///   };
541 /// \endcode
542 /// memberExpr()
543 ///   matches this->x, x, y.x, a, this->b
544 const internal::VariadicDynCastAllOfMatcher<Stmt, MemberExpr> memberExpr;
545 
546 /// \brief Matches call expressions.
547 ///
548 /// Example matches x.y() and y()
549 /// \code
550 ///   X x;
551 ///   x.y();
552 ///   y();
553 /// \endcode
554 const internal::VariadicDynCastAllOfMatcher<Stmt, CallExpr> callExpr;
555 
556 /// \brief Matches lambda expressions.
557 ///
558 /// Example matches [&](){return 5;}
559 /// \code
560 ///   [&](){return 5;}
561 /// \endcode
562 const internal::VariadicDynCastAllOfMatcher<Stmt, LambdaExpr> lambdaExpr;
563 
564 /// \brief Matches member call expressions.
565 ///
566 /// Example matches x.y()
567 /// \code
568 ///   X x;
569 ///   x.y();
570 /// \endcode
571 const internal::VariadicDynCastAllOfMatcher<
572   Stmt,
573   CXXMemberCallExpr> memberCallExpr;
574 
575 /// \brief Matches init list expressions.
576 ///
577 /// Given
578 /// \code
579 ///   int a[] = { 1, 2 };
580 ///   struct B { int x, y; };
581 ///   B b = { 5, 6 };
582 /// \endcode
583 /// initList()
584 ///   matches "{ 1, 2 }" and "{ 5, 6 }"
585 const internal::VariadicDynCastAllOfMatcher<Stmt, InitListExpr> initListExpr;
586 
587 /// \brief Matches using declarations.
588 ///
589 /// Given
590 /// \code
591 ///   namespace X { int x; }
592 ///   using X::x;
593 /// \endcode
594 /// usingDecl()
595 ///   matches \code using X::x \endcode
596 const internal::VariadicDynCastAllOfMatcher<Decl, UsingDecl> usingDecl;
597 
598 /// \brief Matches constructor call expressions (including implicit ones).
599 ///
600 /// Example matches string(ptr, n) and ptr within arguments of f
601 ///     (matcher = constructExpr())
602 /// \code
603 ///   void f(const string &a, const string &b);
604 ///   char *ptr;
605 ///   int n;
606 ///   f(string(ptr, n), ptr);
607 /// \endcode
608 const internal::VariadicDynCastAllOfMatcher<
609   Stmt,
610   CXXConstructExpr> constructExpr;
611 
612 /// \brief Matches implicit and explicit this expressions.
613 ///
614 /// Example matches the implicit this expression in "return i".
615 ///     (matcher = thisExpr())
616 /// \code
617 /// struct foo {
618 ///   int i;
619 ///   int f() { return i; }
620 /// };
621 /// \endcode
622 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThisExpr> thisExpr;
623 
624 /// \brief Matches nodes where temporaries are created.
625 ///
626 /// Example matches FunctionTakesString(GetStringByValue())
627 ///     (matcher = bindTemporaryExpr())
628 /// \code
629 ///   FunctionTakesString(GetStringByValue());
630 ///   FunctionTakesStringByPointer(GetStringPointer());
631 /// \endcode
632 const internal::VariadicDynCastAllOfMatcher<
633   Stmt,
634   CXXBindTemporaryExpr> bindTemporaryExpr;
635 
636 /// \brief Matches nodes where temporaries are materialized.
637 ///
638 /// Example: Given
639 /// \code
640 ///   struct T {void func()};
641 ///   T f();
642 ///   void g(T);
643 /// \endcode
644 /// materializeTemporaryExpr() matches 'f()' in these statements
645 /// \code
646 ///   T u(f());
647 ///   g(f());
648 /// \endcode
649 /// but does not match
650 /// \code
651 ///   f();
652 ///   f().func();
653 /// \endcode
654 const internal::VariadicDynCastAllOfMatcher<
655   Stmt,
656   MaterializeTemporaryExpr> materializeTemporaryExpr;
657 
658 /// \brief Matches new expressions.
659 ///
660 /// Given
661 /// \code
662 ///   new X;
663 /// \endcode
664 /// newExpr()
665 ///   matches 'new X'.
666 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNewExpr> newExpr;
667 
668 /// \brief Matches delete expressions.
669 ///
670 /// Given
671 /// \code
672 ///   delete X;
673 /// \endcode
674 /// deleteExpr()
675 ///   matches 'delete X'.
676 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDeleteExpr> deleteExpr;
677 
678 /// \brief Matches array subscript expressions.
679 ///
680 /// Given
681 /// \code
682 ///   int i = a[1];
683 /// \endcode
684 /// arraySubscriptExpr()
685 ///   matches "a[1]"
686 const internal::VariadicDynCastAllOfMatcher<
687   Stmt,
688   ArraySubscriptExpr> arraySubscriptExpr;
689 
690 /// \brief Matches the value of a default argument at the call site.
691 ///
692 /// Example matches the CXXDefaultArgExpr placeholder inserted for the
693 ///     default value of the second parameter in the call expression f(42)
694 ///     (matcher = defaultArgExpr())
695 /// \code
696 ///   void f(int x, int y = 0);
697 ///   f(42);
698 /// \endcode
699 const internal::VariadicDynCastAllOfMatcher<
700   Stmt,
701   CXXDefaultArgExpr> defaultArgExpr;
702 
703 /// \brief Matches overloaded operator calls.
704 ///
705 /// Note that if an operator isn't overloaded, it won't match. Instead, use
706 /// binaryOperator matcher.
707 /// Currently it does not match operators such as new delete.
708 /// FIXME: figure out why these do not match?
709 ///
710 /// Example matches both operator<<((o << b), c) and operator<<(o, b)
711 ///     (matcher = operatorCallExpr())
712 /// \code
713 ///   ostream &operator<< (ostream &out, int i) { };
714 ///   ostream &o; int b = 1, c = 1;
715 ///   o << b << c;
716 /// \endcode
717 const internal::VariadicDynCastAllOfMatcher<
718   Stmt,
719   CXXOperatorCallExpr> operatorCallExpr;
720 
721 /// \brief Matches expressions.
722 ///
723 /// Example matches x()
724 /// \code
725 ///   void f() { x(); }
726 /// \endcode
727 const internal::VariadicDynCastAllOfMatcher<Stmt, Expr> expr;
728 
729 /// \brief Matches expressions that refer to declarations.
730 ///
731 /// Example matches x in if (x)
732 /// \code
733 ///   bool x;
734 ///   if (x) {}
735 /// \endcode
736 const internal::VariadicDynCastAllOfMatcher<Stmt, DeclRefExpr> declRefExpr;
737 
738 /// \brief Matches if statements.
739 ///
740 /// Example matches 'if (x) {}'
741 /// \code
742 ///   if (x) {}
743 /// \endcode
744 const internal::VariadicDynCastAllOfMatcher<Stmt, IfStmt> ifStmt;
745 
746 /// \brief Matches for statements.
747 ///
748 /// Example matches 'for (;;) {}'
749 /// \code
750 ///   for (;;) {}
751 ///   int i[] =  {1, 2, 3}; for (auto a : i);
752 /// \endcode
753 const internal::VariadicDynCastAllOfMatcher<Stmt, ForStmt> forStmt;
754 
755 /// \brief Matches range-based for statements.
756 ///
757 /// forRangeStmt() matches 'for (auto a : i)'
758 /// \code
759 ///   int i[] =  {1, 2, 3}; for (auto a : i);
760 ///   for(int j = 0; j < 5; ++j);
761 /// \endcode
762 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXForRangeStmt> forRangeStmt;
763 
764 /// \brief Matches the increment statement of a for loop.
765 ///
766 /// Example:
767 ///     forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
768 /// matches '++x' in
769 /// \code
770 ///     for (x; x < N; ++x) { }
771 /// \endcode
AST_MATCHER_P(ForStmt,hasIncrement,internal::Matcher<Stmt>,InnerMatcher)772 AST_MATCHER_P(ForStmt, hasIncrement, internal::Matcher<Stmt>,
773               InnerMatcher) {
774   const Stmt *const Increment = Node.getInc();
775   return (Increment != NULL &&
776           InnerMatcher.matches(*Increment, Finder, Builder));
777 }
778 
779 /// \brief Matches the initialization statement of a for loop.
780 ///
781 /// Example:
782 ///     forStmt(hasLoopInit(declStmt()))
783 /// matches 'int x = 0' in
784 /// \code
785 ///     for (int x = 0; x < N; ++x) { }
786 /// \endcode
AST_MATCHER_P(ForStmt,hasLoopInit,internal::Matcher<Stmt>,InnerMatcher)787 AST_MATCHER_P(ForStmt, hasLoopInit, internal::Matcher<Stmt>,
788               InnerMatcher) {
789   const Stmt *const Init = Node.getInit();
790   return (Init != NULL && InnerMatcher.matches(*Init, Finder, Builder));
791 }
792 
793 /// \brief Matches while statements.
794 ///
795 /// Given
796 /// \code
797 ///   while (true) {}
798 /// \endcode
799 /// whileStmt()
800 ///   matches 'while (true) {}'.
801 const internal::VariadicDynCastAllOfMatcher<Stmt, WhileStmt> whileStmt;
802 
803 /// \brief Matches do statements.
804 ///
805 /// Given
806 /// \code
807 ///   do {} while (true);
808 /// \endcode
809 /// doStmt()
810 ///   matches 'do {} while(true)'
811 const internal::VariadicDynCastAllOfMatcher<Stmt, DoStmt> doStmt;
812 
813 /// \brief Matches break statements.
814 ///
815 /// Given
816 /// \code
817 ///   while (true) { break; }
818 /// \endcode
819 /// breakStmt()
820 ///   matches 'break'
821 const internal::VariadicDynCastAllOfMatcher<Stmt, BreakStmt> breakStmt;
822 
823 /// \brief Matches continue statements.
824 ///
825 /// Given
826 /// \code
827 ///   while (true) { continue; }
828 /// \endcode
829 /// continueStmt()
830 ///   matches 'continue'
831 const internal::VariadicDynCastAllOfMatcher<Stmt, ContinueStmt> continueStmt;
832 
833 /// \brief Matches return statements.
834 ///
835 /// Given
836 /// \code
837 ///   return 1;
838 /// \endcode
839 /// returnStmt()
840 ///   matches 'return 1'
841 const internal::VariadicDynCastAllOfMatcher<Stmt, ReturnStmt> returnStmt;
842 
843 /// \brief Matches goto statements.
844 ///
845 /// Given
846 /// \code
847 ///   goto FOO;
848 ///   FOO: bar();
849 /// \endcode
850 /// gotoStmt()
851 ///   matches 'goto FOO'
852 const internal::VariadicDynCastAllOfMatcher<Stmt, GotoStmt> gotoStmt;
853 
854 /// \brief Matches label statements.
855 ///
856 /// Given
857 /// \code
858 ///   goto FOO;
859 ///   FOO: bar();
860 /// \endcode
861 /// labelStmt()
862 ///   matches 'FOO:'
863 const internal::VariadicDynCastAllOfMatcher<Stmt, LabelStmt> labelStmt;
864 
865 /// \brief Matches switch statements.
866 ///
867 /// Given
868 /// \code
869 ///   switch(a) { case 42: break; default: break; }
870 /// \endcode
871 /// switchStmt()
872 ///   matches 'switch(a)'.
873 const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchStmt> switchStmt;
874 
875 /// \brief Matches case and default statements inside switch statements.
876 ///
877 /// Given
878 /// \code
879 ///   switch(a) { case 42: break; default: break; }
880 /// \endcode
881 /// switchCase()
882 ///   matches 'case 42: break;' and 'default: break;'.
883 const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchCase> switchCase;
884 
885 /// \brief Matches compound statements.
886 ///
887 /// Example matches '{}' and '{{}}'in 'for (;;) {{}}'
888 /// \code
889 ///   for (;;) {{}}
890 /// \endcode
891 const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundStmt> compoundStmt;
892 
893 /// \brief Matches catch statements.
894 ///
895 /// \code
896 ///   try {} catch(int i) {}
897 /// \endcode
898 /// catchStmt()
899 ///   matches 'catch(int i)'
900 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXCatchStmt> catchStmt;
901 
902 /// \brief Matches try statements.
903 ///
904 /// \code
905 ///   try {} catch(int i) {}
906 /// \endcode
907 /// tryStmt()
908 ///   matches 'try {}'
909 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTryStmt> tryStmt;
910 
911 /// \brief Matches throw expressions.
912 ///
913 /// \code
914 ///   try { throw 5; } catch(int i) {}
915 /// \endcode
916 /// throwExpr()
917 ///   matches 'throw 5'
918 const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThrowExpr> throwExpr;
919 
920 /// \brief Matches null statements.
921 ///
922 /// \code
923 ///   foo();;
924 /// \endcode
925 /// nullStmt()
926 ///   matches the second ';'
927 const internal::VariadicDynCastAllOfMatcher<Stmt, NullStmt> nullStmt;
928 
929 /// \brief Matches asm statements.
930 ///
931 /// \code
932 ///  int i = 100;
933 ///   __asm("mov al, 2");
934 /// \endcode
935 /// asmStmt()
936 ///   matches '__asm("mov al, 2")'
937 const internal::VariadicDynCastAllOfMatcher<Stmt, AsmStmt> asmStmt;
938 
939 /// \brief Matches bool literals.
940 ///
941 /// Example matches true
942 /// \code
943 ///   true
944 /// \endcode
945 const internal::VariadicDynCastAllOfMatcher<
946   Stmt,
947   CXXBoolLiteralExpr> boolLiteral;
948 
949 /// \brief Matches string literals (also matches wide string literals).
950 ///
951 /// Example matches "abcd", L"abcd"
952 /// \code
953 ///   char *s = "abcd"; wchar_t *ws = L"abcd"
954 /// \endcode
955 const internal::VariadicDynCastAllOfMatcher<
956   Stmt,
957   StringLiteral> stringLiteral;
958 
959 /// \brief Matches character literals (also matches wchar_t).
960 ///
961 /// Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
962 /// though.
963 ///
964 /// Example matches 'a', L'a'
965 /// \code
966 ///   char ch = 'a'; wchar_t chw = L'a';
967 /// \endcode
968 const internal::VariadicDynCastAllOfMatcher<
969   Stmt,
970   CharacterLiteral> characterLiteral;
971 
972 /// \brief Matches integer literals of all sizes / encodings.
973 ///
974 /// Not matching character-encoded integers such as L'a'.
975 ///
976 /// Example matches 1, 1L, 0x1, 1U
977 const internal::VariadicDynCastAllOfMatcher<
978   Stmt,
979   IntegerLiteral> integerLiteral;
980 
981 /// \brief Matches user defined literal operator call.
982 ///
983 /// Example match: "foo"_suffix
984 const internal::VariadicDynCastAllOfMatcher<
985   Stmt,
986   UserDefinedLiteral> userDefinedLiteral;
987 
988 /// \brief Matches compound (i.e. non-scalar) literals
989 ///
990 /// Example match: {1}, (1, 2)
991 /// \code
992 ///   int array[4] = {1}; vector int myvec = (vector int)(1, 2);
993 /// \endcode
994 const internal::VariadicDynCastAllOfMatcher<
995   Stmt,
996   CompoundLiteralExpr> compoundLiteralExpr;
997 
998 /// \brief Matches nullptr literal.
999 const internal::VariadicDynCastAllOfMatcher<
1000   Stmt,
1001   CXXNullPtrLiteralExpr> nullPtrLiteralExpr;
1002 
1003 /// \brief Matches binary operator expressions.
1004 ///
1005 /// Example matches a || b
1006 /// \code
1007 ///   !(a || b)
1008 /// \endcode
1009 const internal::VariadicDynCastAllOfMatcher<
1010   Stmt,
1011   BinaryOperator> binaryOperator;
1012 
1013 /// \brief Matches unary operator expressions.
1014 ///
1015 /// Example matches !a
1016 /// \code
1017 ///   !a || b
1018 /// \endcode
1019 const internal::VariadicDynCastAllOfMatcher<
1020   Stmt,
1021   UnaryOperator> unaryOperator;
1022 
1023 /// \brief Matches conditional operator expressions.
1024 ///
1025 /// Example matches a ? b : c
1026 /// \code
1027 ///   (a ? b : c) + 42
1028 /// \endcode
1029 const internal::VariadicDynCastAllOfMatcher<
1030   Stmt,
1031   ConditionalOperator> conditionalOperator;
1032 
1033 /// \brief Matches a reinterpret_cast expression.
1034 ///
1035 /// Either the source expression or the destination type can be matched
1036 /// using has(), but hasDestinationType() is more specific and can be
1037 /// more readable.
1038 ///
1039 /// Example matches reinterpret_cast<char*>(&p) in
1040 /// \code
1041 ///   void* p = reinterpret_cast<char*>(&p);
1042 /// \endcode
1043 const internal::VariadicDynCastAllOfMatcher<
1044   Stmt,
1045   CXXReinterpretCastExpr> reinterpretCastExpr;
1046 
1047 /// \brief Matches a C++ static_cast expression.
1048 ///
1049 /// \see hasDestinationType
1050 /// \see reinterpretCast
1051 ///
1052 /// Example:
1053 ///   staticCastExpr()
1054 /// matches
1055 ///   static_cast<long>(8)
1056 /// in
1057 /// \code
1058 ///   long eight(static_cast<long>(8));
1059 /// \endcode
1060 const internal::VariadicDynCastAllOfMatcher<
1061   Stmt,
1062   CXXStaticCastExpr> staticCastExpr;
1063 
1064 /// \brief Matches a dynamic_cast expression.
1065 ///
1066 /// Example:
1067 ///   dynamicCastExpr()
1068 /// matches
1069 ///   dynamic_cast<D*>(&b);
1070 /// in
1071 /// \code
1072 ///   struct B { virtual ~B() {} }; struct D : B {};
1073 ///   B b;
1074 ///   D* p = dynamic_cast<D*>(&b);
1075 /// \endcode
1076 const internal::VariadicDynCastAllOfMatcher<
1077   Stmt,
1078   CXXDynamicCastExpr> dynamicCastExpr;
1079 
1080 /// \brief Matches a const_cast expression.
1081 ///
1082 /// Example: Matches const_cast<int*>(&r) in
1083 /// \code
1084 ///   int n = 42;
1085 ///   const int &r(n);
1086 ///   int* p = const_cast<int*>(&r);
1087 /// \endcode
1088 const internal::VariadicDynCastAllOfMatcher<
1089   Stmt,
1090   CXXConstCastExpr> constCastExpr;
1091 
1092 /// \brief Matches a C-style cast expression.
1093 ///
1094 /// Example: Matches (int*) 2.2f in
1095 /// \code
1096 ///   int i = (int) 2.2f;
1097 /// \endcode
1098 const internal::VariadicDynCastAllOfMatcher<
1099   Stmt,
1100   CStyleCastExpr> cStyleCastExpr;
1101 
1102 /// \brief Matches explicit cast expressions.
1103 ///
1104 /// Matches any cast expression written in user code, whether it be a
1105 /// C-style cast, a functional-style cast, or a keyword cast.
1106 ///
1107 /// Does not match implicit conversions.
1108 ///
1109 /// Note: the name "explicitCast" is chosen to match Clang's terminology, as
1110 /// Clang uses the term "cast" to apply to implicit conversions as well as to
1111 /// actual cast expressions.
1112 ///
1113 /// \see hasDestinationType.
1114 ///
1115 /// Example: matches all five of the casts in
1116 /// \code
1117 ///   int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42)))))
1118 /// \endcode
1119 /// but does not match the implicit conversion in
1120 /// \code
1121 ///   long ell = 42;
1122 /// \endcode
1123 const internal::VariadicDynCastAllOfMatcher<
1124   Stmt,
1125   ExplicitCastExpr> explicitCastExpr;
1126 
1127 /// \brief Matches the implicit cast nodes of Clang's AST.
1128 ///
1129 /// This matches many different places, including function call return value
1130 /// eliding, as well as any type conversions.
1131 const internal::VariadicDynCastAllOfMatcher<
1132   Stmt,
1133   ImplicitCastExpr> implicitCastExpr;
1134 
1135 /// \brief Matches any cast nodes of Clang's AST.
1136 ///
1137 /// Example: castExpr() matches each of the following:
1138 /// \code
1139 ///   (int) 3;
1140 ///   const_cast<Expr *>(SubExpr);
1141 ///   char c = 0;
1142 /// \endcode
1143 /// but does not match
1144 /// \code
1145 ///   int i = (0);
1146 ///   int k = 0;
1147 /// \endcode
1148 const internal::VariadicDynCastAllOfMatcher<Stmt, CastExpr> castExpr;
1149 
1150 /// \brief Matches functional cast expressions
1151 ///
1152 /// Example: Matches Foo(bar);
1153 /// \code
1154 ///   Foo f = bar;
1155 ///   Foo g = (Foo) bar;
1156 ///   Foo h = Foo(bar);
1157 /// \endcode
1158 const internal::VariadicDynCastAllOfMatcher<
1159   Stmt,
1160   CXXFunctionalCastExpr> functionalCastExpr;
1161 
1162 /// \brief Matches \c QualTypes in the clang AST.
1163 const internal::VariadicAllOfMatcher<QualType> qualType;
1164 
1165 /// \brief Matches \c Types in the clang AST.
1166 const internal::VariadicAllOfMatcher<Type> type;
1167 
1168 /// \brief Matches \c TypeLocs in the clang AST.
1169 const internal::VariadicAllOfMatcher<TypeLoc> typeLoc;
1170 
1171 /// \brief Matches if any of the given matchers matches.
1172 ///
1173 /// Unlike \c anyOf, \c eachOf will generate a match result for each
1174 /// matching submatcher.
1175 ///
1176 /// For example, in:
1177 /// \code
1178 ///   class A { int a; int b; };
1179 /// \endcode
1180 /// The matcher:
1181 /// \code
1182 ///   recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
1183 ///                     has(fieldDecl(hasName("b")).bind("v"))))
1184 /// \endcode
1185 /// will generate two results binding "v", the first of which binds
1186 /// the field declaration of \c a, the second the field declaration of
1187 /// \c b.
1188 ///
1189 /// Usable as: Any Matcher
1190 template <typename M1, typename M2>
1191 internal::PolymorphicMatcherWithParam2<internal::EachOfMatcher, M1, M2>
eachOf(const M1 & P1,const M2 & P2)1192 eachOf(const M1 &P1, const M2 &P2) {
1193   return internal::PolymorphicMatcherWithParam2<internal::EachOfMatcher, M1,
1194                                                 M2>(P1, P2);
1195 }
1196 
1197 /// \brief Various overloads for the anyOf matcher.
1198 /// @{
1199 
1200 /// \brief Matches if any of the given matchers matches.
1201 ///
1202 /// Usable as: Any Matcher
1203 template<typename M1, typename M2>
1204 internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M1, M2>
anyOf(const M1 & P1,const M2 & P2)1205 anyOf(const M1 &P1, const M2 &P2) {
1206   return internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher,
1207                                                 M1, M2 >(P1, P2);
1208 }
1209 template<typename M1, typename M2, typename M3>
1210 internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M1,
1211     internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M2, M3> >
anyOf(const M1 & P1,const M2 & P2,const M3 & P3)1212 anyOf(const M1 &P1, const M2 &P2, const M3 &P3) {
1213   return anyOf(P1, anyOf(P2, P3));
1214 }
1215 template<typename M1, typename M2, typename M3, typename M4>
1216 internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M1,
1217     internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M2,
1218         internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher,
1219                                                M3, M4> > >
anyOf(const M1 & P1,const M2 & P2,const M3 & P3,const M4 & P4)1220 anyOf(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4) {
1221   return anyOf(P1, anyOf(P2, anyOf(P3, P4)));
1222 }
1223 template<typename M1, typename M2, typename M3, typename M4, typename M5>
1224 internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M1,
1225     internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M2,
1226         internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M3,
1227             internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher,
1228                                                    M4, M5> > > >
anyOf(const M1 & P1,const M2 & P2,const M3 & P3,const M4 & P4,const M5 & P5)1229 anyOf(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4, const M5 &P5) {
1230   return anyOf(P1, anyOf(P2, anyOf(P3, anyOf(P4, P5))));
1231 }
1232 
1233 /// @}
1234 
1235 /// \brief Various overloads for the allOf matcher.
1236 /// @{
1237 
1238 /// \brief Matches if all given matchers match.
1239 ///
1240 /// Usable as: Any Matcher
1241 template <typename M1, typename M2>
1242 internal::PolymorphicMatcherWithParam2<internal::AllOfMatcher, M1, M2>
allOf(const M1 & P1,const M2 & P2)1243 allOf(const M1 &P1, const M2 &P2) {
1244   return internal::PolymorphicMatcherWithParam2<internal::AllOfMatcher, M1, M2>(
1245       P1, P2);
1246 }
1247 template <typename M1, typename M2, typename M3>
1248 internal::PolymorphicMatcherWithParam2<
1249     internal::AllOfMatcher, M1,
1250     internal::PolymorphicMatcherWithParam2<internal::AllOfMatcher, M2, M3> >
allOf(const M1 & P1,const M2 & P2,const M3 & P3)1251 allOf(const M1 &P1, const M2 &P2, const M3 &P3) {
1252   return allOf(P1, allOf(P2, P3));
1253 }
1254 template <typename M1, typename M2, typename M3, typename M4>
1255 internal::PolymorphicMatcherWithParam2<
1256     internal::AllOfMatcher, M1,
1257     internal::PolymorphicMatcherWithParam2<
1258         internal::AllOfMatcher, M2, internal::PolymorphicMatcherWithParam2<
1259                                         internal::AllOfMatcher, M3, M4> > >
allOf(const M1 & P1,const M2 & P2,const M3 & P3,const M4 & P4)1260 allOf(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4) {
1261   return allOf(P1, allOf(P2, P3, P4));
1262 }
1263 template <typename M1, typename M2, typename M3, typename M4, typename M5>
1264 internal::PolymorphicMatcherWithParam2<
1265     internal::AllOfMatcher, M1,
1266     internal::PolymorphicMatcherWithParam2<
1267         internal::AllOfMatcher, M2,
1268         internal::PolymorphicMatcherWithParam2<
1269             internal::AllOfMatcher, M3,
1270             internal::PolymorphicMatcherWithParam2<internal::AllOfMatcher, M4,
1271                                                    M5> > > >
allOf(const M1 & P1,const M2 & P2,const M3 & P3,const M4 & P4,const M5 & P5)1272 allOf(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4, const M5 &P5) {
1273   return allOf(P1, allOf(P2, P3, P4, P5));
1274 }
1275 
1276 /// @}
1277 
1278 /// \brief Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1279 ///
1280 /// Given
1281 /// \code
1282 ///   Foo x = bar;
1283 ///   int y = sizeof(x) + alignof(x);
1284 /// \endcode
1285 /// unaryExprOrTypeTraitExpr()
1286 ///   matches \c sizeof(x) and \c alignof(x)
1287 const internal::VariadicDynCastAllOfMatcher<
1288   Stmt,
1289   UnaryExprOrTypeTraitExpr> unaryExprOrTypeTraitExpr;
1290 
1291 /// \brief Matches unary expressions that have a specific type of argument.
1292 ///
1293 /// Given
1294 /// \code
1295 ///   int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
1296 /// \endcode
1297 /// unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
1298 ///   matches \c sizeof(a) and \c alignof(c)
AST_MATCHER_P(UnaryExprOrTypeTraitExpr,hasArgumentOfType,internal::Matcher<QualType>,InnerMatcher)1299 AST_MATCHER_P(UnaryExprOrTypeTraitExpr, hasArgumentOfType,
1300               internal::Matcher<QualType>, InnerMatcher) {
1301   const QualType ArgumentType = Node.getTypeOfArgument();
1302   return InnerMatcher.matches(ArgumentType, Finder, Builder);
1303 }
1304 
1305 /// \brief Matches unary expressions of a certain kind.
1306 ///
1307 /// Given
1308 /// \code
1309 ///   int x;
1310 ///   int s = sizeof(x) + alignof(x)
1311 /// \endcode
1312 /// unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
1313 ///   matches \c sizeof(x)
AST_MATCHER_P(UnaryExprOrTypeTraitExpr,ofKind,UnaryExprOrTypeTrait,Kind)1314 AST_MATCHER_P(UnaryExprOrTypeTraitExpr, ofKind, UnaryExprOrTypeTrait, Kind) {
1315   return Node.getKind() == Kind;
1316 }
1317 
1318 /// \brief Same as unaryExprOrTypeTraitExpr, but only matching
1319 /// alignof.
alignOfExpr(const internal::Matcher<UnaryExprOrTypeTraitExpr> & InnerMatcher)1320 inline internal::Matcher<Stmt> alignOfExpr(
1321     const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
1322   return stmt(unaryExprOrTypeTraitExpr(allOf(
1323       ofKind(UETT_AlignOf), InnerMatcher)));
1324 }
1325 
1326 /// \brief Same as unaryExprOrTypeTraitExpr, but only matching
1327 /// sizeof.
sizeOfExpr(const internal::Matcher<UnaryExprOrTypeTraitExpr> & InnerMatcher)1328 inline internal::Matcher<Stmt> sizeOfExpr(
1329     const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
1330   return stmt(unaryExprOrTypeTraitExpr(
1331       allOf(ofKind(UETT_SizeOf), InnerMatcher)));
1332 }
1333 
1334 /// \brief Matches NamedDecl nodes that have the specified name.
1335 ///
1336 /// Supports specifying enclosing namespaces or classes by prefixing the name
1337 /// with '<enclosing>::'.
1338 /// Does not match typedefs of an underlying type with the given name.
1339 ///
1340 /// Example matches X (Name == "X")
1341 /// \code
1342 ///   class X;
1343 /// \endcode
1344 ///
1345 /// Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
1346 /// \code
1347 ///   namespace a { namespace b { class X; } }
1348 /// \endcode
AST_MATCHER_P(NamedDecl,hasName,std::string,Name)1349 AST_MATCHER_P(NamedDecl, hasName, std::string, Name) {
1350   assert(!Name.empty());
1351   const std::string FullNameString = "::" + Node.getQualifiedNameAsString();
1352   const StringRef FullName = FullNameString;
1353   const StringRef Pattern = Name;
1354   if (Pattern.startswith("::")) {
1355     return FullName == Pattern;
1356   } else {
1357     return FullName.endswith(("::" + Pattern).str());
1358   }
1359 }
1360 
1361 /// \brief Matches NamedDecl nodes whose fully qualified names contain
1362 /// a substring matched by the given RegExp.
1363 ///
1364 /// Supports specifying enclosing namespaces or classes by
1365 /// prefixing the name with '<enclosing>::'.  Does not match typedefs
1366 /// of an underlying type with the given name.
1367 ///
1368 /// Example matches X (regexp == "::X")
1369 /// \code
1370 ///   class X;
1371 /// \endcode
1372 ///
1373 /// Example matches X (regexp is one of "::X", "^foo::.*X", among others)
1374 /// \code
1375 ///   namespace foo { namespace bar { class X; } }
1376 /// \endcode
AST_MATCHER_P(NamedDecl,matchesName,std::string,RegExp)1377 AST_MATCHER_P(NamedDecl, matchesName, std::string, RegExp) {
1378   assert(!RegExp.empty());
1379   std::string FullNameString = "::" + Node.getQualifiedNameAsString();
1380   llvm::Regex RE(RegExp);
1381   return RE.match(FullNameString);
1382 }
1383 
1384 /// \brief Matches overloaded operator names.
1385 ///
1386 /// Matches overloaded operator names specified in strings without the
1387 /// "operator" prefix: e.g. "<<".
1388 ///
1389 /// Given:
1390 /// \code
1391 ///   class A { int operator*(); };
1392 ///   const A &operator<<(const A &a, const A &b);
1393 ///   A a;
1394 ///   a << a;   // <-- This matches
1395 /// \endcode
1396 ///
1397 /// \c operatorCallExpr(hasOverloadedOperatorName("<<"))) matches the specified
1398 /// line and \c recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1399 /// the declaration of \c A.
1400 ///
1401 /// Usable as: Matcher<CXXOperatorCallExpr>, Matcher<CXXMethodDecl>
1402 inline internal::PolymorphicMatcherWithParam1<
1403     internal::HasOverloadedOperatorNameMatcher, StringRef>
hasOverloadedOperatorName(const StringRef Name)1404 hasOverloadedOperatorName(const StringRef Name) {
1405   return internal::PolymorphicMatcherWithParam1<
1406       internal::HasOverloadedOperatorNameMatcher, StringRef>(Name);
1407 }
1408 
1409 /// \brief Matches C++ classes that are directly or indirectly derived from
1410 /// a class matching \c Base.
1411 ///
1412 /// Note that a class is not considered to be derived from itself.
1413 ///
1414 /// Example matches Y, Z, C (Base == hasName("X"))
1415 /// \code
1416 ///   class X;
1417 ///   class Y : public X {};  // directly derived
1418 ///   class Z : public Y {};  // indirectly derived
1419 ///   typedef X A;
1420 ///   typedef A B;
1421 ///   class C : public B {};  // derived from a typedef of X
1422 /// \endcode
1423 ///
1424 /// In the following example, Bar matches isDerivedFrom(hasName("X")):
1425 /// \code
1426 ///   class Foo;
1427 ///   typedef Foo X;
1428 ///   class Bar : public Foo {};  // derived from a type that X is a typedef of
1429 /// \endcode
AST_MATCHER_P(CXXRecordDecl,isDerivedFrom,internal::Matcher<NamedDecl>,Base)1430 AST_MATCHER_P(CXXRecordDecl, isDerivedFrom,
1431               internal::Matcher<NamedDecl>, Base) {
1432   return Finder->classIsDerivedFrom(&Node, Base, Builder);
1433 }
1434 
1435 /// \brief Overloaded method as shortcut for \c isDerivedFrom(hasName(...)).
isDerivedFrom(StringRef BaseName)1436 inline internal::Matcher<CXXRecordDecl> isDerivedFrom(StringRef BaseName) {
1437   assert(!BaseName.empty());
1438   return isDerivedFrom(hasName(BaseName));
1439 }
1440 
1441 /// \brief Similar to \c isDerivedFrom(), but also matches classes that directly
1442 /// match \c Base.
isSameOrDerivedFrom(internal::Matcher<NamedDecl> Base)1443 inline internal::Matcher<CXXRecordDecl> isSameOrDerivedFrom(
1444     internal::Matcher<NamedDecl> Base) {
1445   return anyOf(Base, isDerivedFrom(Base));
1446 }
1447 
1448 /// \brief Overloaded method as shortcut for
1449 /// \c isSameOrDerivedFrom(hasName(...)).
isSameOrDerivedFrom(StringRef BaseName)1450 inline internal::Matcher<CXXRecordDecl> isSameOrDerivedFrom(
1451     StringRef BaseName) {
1452   assert(!BaseName.empty());
1453   return isSameOrDerivedFrom(hasName(BaseName));
1454 }
1455 
1456 /// \brief Matches the first method of a class or struct that satisfies \c
1457 /// InnerMatcher.
1458 ///
1459 /// Given:
1460 /// \code
1461 ///   class A { void func(); };
1462 ///   class B { void member(); };
1463 /// \code
1464 ///
1465 /// \c recordDecl(hasMethod(hasName("func"))) matches the declaration of \c A
1466 /// but not \c B.
AST_MATCHER_P(CXXRecordDecl,hasMethod,internal::Matcher<CXXMethodDecl>,InnerMatcher)1467 AST_MATCHER_P(CXXRecordDecl, hasMethod, internal::Matcher<CXXMethodDecl>,
1468               InnerMatcher) {
1469   for (CXXRecordDecl::method_iterator I = Node.method_begin(),
1470                                       E = Node.method_end();
1471        I != E; ++I)
1472     if (InnerMatcher.matches(**I, Finder, Builder))
1473       return true;
1474   return false;
1475 }
1476 
1477 /// \brief Matches AST nodes that have child AST nodes that match the
1478 /// provided matcher.
1479 ///
1480 /// Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
1481 /// \code
1482 ///   class X {};  // Matches X, because X::X is a class of name X inside X.
1483 ///   class Y { class X {}; };
1484 ///   class Z { class Y { class X {}; }; };  // Does not match Z.
1485 /// \endcode
1486 ///
1487 /// ChildT must be an AST base type.
1488 ///
1489 /// Usable as: Any Matcher
1490 template <typename ChildT>
has(const internal::Matcher<ChildT> & ChildMatcher)1491 internal::ArgumentAdaptingMatcher<internal::HasMatcher, ChildT> has(
1492     const internal::Matcher<ChildT> &ChildMatcher) {
1493   return internal::ArgumentAdaptingMatcher<internal::HasMatcher,
1494                                            ChildT>(ChildMatcher);
1495 }
1496 
1497 /// \brief Matches AST nodes that have descendant AST nodes that match the
1498 /// provided matcher.
1499 ///
1500 /// Example matches X, Y, Z
1501 ///     (matcher = recordDecl(hasDescendant(recordDecl(hasName("X")))))
1502 /// \code
1503 ///   class X {};  // Matches X, because X::X is a class of name X inside X.
1504 ///   class Y { class X {}; };
1505 ///   class Z { class Y { class X {}; }; };
1506 /// \endcode
1507 ///
1508 /// DescendantT must be an AST base type.
1509 ///
1510 /// Usable as: Any Matcher
1511 template <typename DescendantT>
1512 internal::ArgumentAdaptingMatcher<internal::HasDescendantMatcher, DescendantT>
hasDescendant(const internal::Matcher<DescendantT> & DescendantMatcher)1513 hasDescendant(const internal::Matcher<DescendantT> &DescendantMatcher) {
1514   return internal::ArgumentAdaptingMatcher<
1515     internal::HasDescendantMatcher,
1516     DescendantT>(DescendantMatcher);
1517 }
1518 
1519 /// \brief Matches AST nodes that have child AST nodes that match the
1520 /// provided matcher.
1521 ///
1522 /// Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
1523 /// \code
1524 ///   class X {};  // Matches X, because X::X is a class of name X inside X.
1525 ///   class Y { class X {}; };
1526 ///   class Z { class Y { class X {}; }; };  // Does not match Z.
1527 /// \endcode
1528 ///
1529 /// ChildT must be an AST base type.
1530 ///
1531 /// As opposed to 'has', 'forEach' will cause a match for each result that
1532 /// matches instead of only on the first one.
1533 ///
1534 /// Usable as: Any Matcher
1535 template <typename ChildT>
forEach(const internal::Matcher<ChildT> & ChildMatcher)1536 internal::ArgumentAdaptingMatcher<internal::ForEachMatcher, ChildT> forEach(
1537     const internal::Matcher<ChildT> &ChildMatcher) {
1538   return internal::ArgumentAdaptingMatcher<
1539     internal::ForEachMatcher,
1540     ChildT>(ChildMatcher);
1541 }
1542 
1543 /// \brief Matches AST nodes that have descendant AST nodes that match the
1544 /// provided matcher.
1545 ///
1546 /// Example matches X, A, B, C
1547 ///     (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X")))))
1548 /// \code
1549 ///   class X {};  // Matches X, because X::X is a class of name X inside X.
1550 ///   class A { class X {}; };
1551 ///   class B { class C { class X {}; }; };
1552 /// \endcode
1553 ///
1554 /// DescendantT must be an AST base type.
1555 ///
1556 /// As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
1557 /// each result that matches instead of only on the first one.
1558 ///
1559 /// Note: Recursively combined ForEachDescendant can cause many matches:
1560 ///   recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl()))))
1561 /// will match 10 times (plus injected class name matches) on:
1562 /// \code
1563 ///   class A { class B { class C { class D { class E {}; }; }; }; };
1564 /// \endcode
1565 ///
1566 /// Usable as: Any Matcher
1567 template <typename DescendantT>
1568 internal::ArgumentAdaptingMatcher<internal::ForEachDescendantMatcher,
1569                                   DescendantT>
forEachDescendant(const internal::Matcher<DescendantT> & DescendantMatcher)1570 forEachDescendant(
1571     const internal::Matcher<DescendantT> &DescendantMatcher) {
1572   return internal::ArgumentAdaptingMatcher<
1573     internal::ForEachDescendantMatcher,
1574     DescendantT>(DescendantMatcher);
1575 }
1576 
1577 /// \brief Matches if the node or any descendant matches.
1578 ///
1579 /// Generates results for each match.
1580 ///
1581 /// For example, in:
1582 /// \code
1583 ///   class A { class B {}; class C {}; };
1584 /// \endcode
1585 /// The matcher:
1586 /// \code
1587 ///   recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m")))
1588 /// \endcode
1589 /// will generate results for \c A, \c B and \c C.
1590 ///
1591 /// Usable as: Any Matcher
1592 template <typename T>
1593 internal::PolymorphicMatcherWithParam2<
1594     internal::EachOfMatcher, internal::Matcher<T>,
1595     internal::ArgumentAdaptingMatcher<internal::ForEachDescendantMatcher, T> >
findAll(const internal::Matcher<T> & Matcher)1596 findAll(const internal::Matcher<T> &Matcher) {
1597   return eachOf(Matcher, forEachDescendant(Matcher));
1598 }
1599 
1600 /// \brief Matches AST nodes that have a parent that matches the provided
1601 /// matcher.
1602 ///
1603 /// Given
1604 /// \code
1605 /// void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
1606 /// \endcode
1607 /// \c compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
1608 ///
1609 /// Usable as: Any Matcher
1610 template <typename ParentT>
1611 internal::ArgumentAdaptingMatcher<internal::HasParentMatcher, ParentT>
hasParent(const internal::Matcher<ParentT> & ParentMatcher)1612 hasParent(const internal::Matcher<ParentT> &ParentMatcher) {
1613   return internal::ArgumentAdaptingMatcher<
1614     internal::HasParentMatcher,
1615     ParentT>(ParentMatcher);
1616 }
1617 
1618 /// \brief Matches AST nodes that have an ancestor that matches the provided
1619 /// matcher.
1620 ///
1621 /// Given
1622 /// \code
1623 /// void f() { if (true) { int x = 42; } }
1624 /// void g() { for (;;) { int x = 43; } }
1625 /// \endcode
1626 /// \c expr(integerLiteral(hasAncestor(ifStmt()))) matches \c 42, but not 43.
1627 ///
1628 /// Usable as: Any Matcher
1629 template <typename AncestorT>
1630 internal::ArgumentAdaptingMatcher<internal::HasAncestorMatcher, AncestorT>
hasAncestor(const internal::Matcher<AncestorT> & AncestorMatcher)1631 hasAncestor(const internal::Matcher<AncestorT> &AncestorMatcher) {
1632   return internal::ArgumentAdaptingMatcher<
1633     internal::HasAncestorMatcher,
1634     AncestorT>(AncestorMatcher);
1635 }
1636 
1637 /// \brief Matches if the provided matcher does not match.
1638 ///
1639 /// Example matches Y (matcher = recordDecl(unless(hasName("X"))))
1640 /// \code
1641 ///   class X {};
1642 ///   class Y {};
1643 /// \endcode
1644 ///
1645 /// Usable as: Any Matcher
1646 template <typename M>
1647 internal::PolymorphicMatcherWithParam1<internal::NotMatcher, M>
unless(const M & InnerMatcher)1648 unless(const M &InnerMatcher) {
1649   return internal::PolymorphicMatcherWithParam1<
1650     internal::NotMatcher, M>(InnerMatcher);
1651 }
1652 
1653 /// \brief Matches a type if the declaration of the type matches the given
1654 /// matcher.
1655 ///
1656 /// In addition to being usable as Matcher<TypedefType>, also usable as
1657 /// Matcher<T> for any T supporting the getDecl() member function. e.g. various
1658 /// subtypes of clang::Type.
1659 ///
1660 /// Usable as: Matcher<QualType>, Matcher<CallExpr>, Matcher<CXXConstructExpr>,
1661 ///   Matcher<MemberExpr>, Matcher<TypedefType>,
1662 ///   Matcher<TemplateSpecializationType>
1663 inline internal::PolymorphicMatcherWithParam1< internal::HasDeclarationMatcher,
1664                                      internal::Matcher<Decl> >
hasDeclaration(const internal::Matcher<Decl> & InnerMatcher)1665     hasDeclaration(const internal::Matcher<Decl> &InnerMatcher) {
1666   return internal::PolymorphicMatcherWithParam1<
1667     internal::HasDeclarationMatcher,
1668     internal::Matcher<Decl> >(InnerMatcher);
1669 }
1670 
1671 /// \brief Matches on the implicit object argument of a member call expression.
1672 ///
1673 /// Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y"))))))
1674 /// \code
1675 ///   class Y { public: void x(); };
1676 ///   void z() { Y y; y.x(); }",
1677 /// \endcode
1678 ///
1679 /// FIXME: Overload to allow directly matching types?
AST_MATCHER_P(CXXMemberCallExpr,on,internal::Matcher<Expr>,InnerMatcher)1680 AST_MATCHER_P(CXXMemberCallExpr, on, internal::Matcher<Expr>,
1681               InnerMatcher) {
1682   const Expr *ExprNode = Node.getImplicitObjectArgument()
1683                             ->IgnoreParenImpCasts();
1684   return (ExprNode != NULL &&
1685           InnerMatcher.matches(*ExprNode, Finder, Builder));
1686 }
1687 
1688 /// \brief Matches if the call expression's callee expression matches.
1689 ///
1690 /// Given
1691 /// \code
1692 ///   class Y { void x() { this->x(); x(); Y y; y.x(); } };
1693 ///   void f() { f(); }
1694 /// \endcode
1695 /// callExpr(callee(expr()))
1696 ///   matches this->x(), x(), y.x(), f()
1697 /// with callee(...)
1698 ///   matching this->x, x, y.x, f respectively
1699 ///
1700 /// Note: Callee cannot take the more general internal::Matcher<Expr>
1701 /// because this introduces ambiguous overloads with calls to Callee taking a
1702 /// internal::Matcher<Decl>, as the matcher hierarchy is purely
1703 /// implemented in terms of implicit casts.
AST_MATCHER_P(CallExpr,callee,internal::Matcher<Stmt>,InnerMatcher)1704 AST_MATCHER_P(CallExpr, callee, internal::Matcher<Stmt>,
1705               InnerMatcher) {
1706   const Expr *ExprNode = Node.getCallee();
1707   return (ExprNode != NULL &&
1708           InnerMatcher.matches(*ExprNode, Finder, Builder));
1709 }
1710 
1711 /// \brief Matches if the call expression's callee's declaration matches the
1712 /// given matcher.
1713 ///
1714 /// Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x")))))
1715 /// \code
1716 ///   class Y { public: void x(); };
1717 ///   void z() { Y y; y.x();
1718 /// \endcode
callee(const internal::Matcher<Decl> & InnerMatcher)1719 inline internal::Matcher<CallExpr> callee(
1720     const internal::Matcher<Decl> &InnerMatcher) {
1721   return callExpr(hasDeclaration(InnerMatcher));
1722 }
1723 
1724 /// \brief Matches if the expression's or declaration's type matches a type
1725 /// matcher.
1726 ///
1727 /// Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
1728 ///             and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
1729 /// \code
1730 ///  class X {};
1731 ///  void y(X &x) { x; X z; }
1732 /// \endcode
AST_POLYMORPHIC_MATCHER_P(hasType,internal::Matcher<QualType>,InnerMatcher)1733 AST_POLYMORPHIC_MATCHER_P(hasType, internal::Matcher<QualType>,
1734                           InnerMatcher) {
1735   TOOLING_COMPILE_ASSERT((llvm::is_base_of<Expr, NodeType>::value ||
1736                           llvm::is_base_of<ValueDecl, NodeType>::value),
1737                          instantiated_with_wrong_types);
1738   return InnerMatcher.matches(Node.getType(), Finder, Builder);
1739 }
1740 
1741 /// \brief Overloaded to match the declaration of the expression's or value
1742 /// declaration's type.
1743 ///
1744 /// In case of a value declaration (for example a variable declaration),
1745 /// this resolves one layer of indirection. For example, in the value
1746 /// declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
1747 /// while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
1748 /// of x."
1749 ///
1750 /// Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
1751 ///             and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
1752 /// \code
1753 ///  class X {};
1754 ///  void y(X &x) { x; X z; }
1755 /// \endcode
1756 ///
1757 /// Usable as: Matcher<Expr>, Matcher<ValueDecl>
1758 inline internal::PolymorphicMatcherWithParam1<
1759   internal::matcher_hasType0Matcher,
1760   internal::Matcher<QualType> >
hasType(const internal::Matcher<Decl> & InnerMatcher)1761 hasType(const internal::Matcher<Decl> &InnerMatcher) {
1762   return hasType(qualType(hasDeclaration(InnerMatcher)));
1763 }
1764 
1765 /// \brief Matches if the matched type is represented by the given string.
1766 ///
1767 /// Given
1768 /// \code
1769 ///   class Y { public: void x(); };
1770 ///   void z() { Y* y; y->x(); }
1771 /// \endcode
1772 /// callExpr(on(hasType(asString("class Y *"))))
1773 ///   matches y->x()
AST_MATCHER_P(QualType,asString,std::string,Name)1774 AST_MATCHER_P(QualType, asString, std::string, Name) {
1775   return Name == Node.getAsString();
1776 }
1777 
1778 /// \brief Matches if the matched type is a pointer type and the pointee type
1779 /// matches the specified matcher.
1780 ///
1781 /// Example matches y->x()
1782 ///     (matcher = callExpr(on(hasType(pointsTo(recordDecl(hasName("Y")))))))
1783 /// \code
1784 ///   class Y { public: void x(); };
1785 ///   void z() { Y *y; y->x(); }
1786 /// \endcode
AST_MATCHER_P(QualType,pointsTo,internal::Matcher<QualType>,InnerMatcher)1787 AST_MATCHER_P(
1788     QualType, pointsTo, internal::Matcher<QualType>,
1789     InnerMatcher) {
1790   return (!Node.isNull() && Node->isPointerType() &&
1791           InnerMatcher.matches(Node->getPointeeType(), Finder, Builder));
1792 }
1793 
1794 /// \brief Overloaded to match the pointee type's declaration.
pointsTo(const internal::Matcher<Decl> & InnerMatcher)1795 inline internal::Matcher<QualType> pointsTo(
1796     const internal::Matcher<Decl> &InnerMatcher) {
1797   return pointsTo(qualType(hasDeclaration(InnerMatcher)));
1798 }
1799 
1800 /// \brief Matches if the matched type is a reference type and the referenced
1801 /// type matches the specified matcher.
1802 ///
1803 /// Example matches X &x and const X &y
1804 ///     (matcher = varDecl(hasType(references(recordDecl(hasName("X"))))))
1805 /// \code
1806 ///   class X {
1807 ///     void a(X b) {
1808 ///       X &x = b;
1809 ///       const X &y = b;
1810 ///   };
1811 /// \endcode
AST_MATCHER_P(QualType,references,internal::Matcher<QualType>,InnerMatcher)1812 AST_MATCHER_P(QualType, references, internal::Matcher<QualType>,
1813               InnerMatcher) {
1814   return (!Node.isNull() && Node->isReferenceType() &&
1815           InnerMatcher.matches(Node->getPointeeType(), Finder, Builder));
1816 }
1817 
1818 /// \brief Matches QualTypes whose canonical type matches InnerMatcher.
1819 ///
1820 /// Given:
1821 /// \code
1822 ///   typedef int &int_ref;
1823 ///   int a;
1824 ///   int_ref b = a;
1825 /// \code
1826 ///
1827 /// \c varDecl(hasType(qualType(referenceType()))))) will not match the
1828 /// declaration of b but \c
1829 /// varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
AST_MATCHER_P(QualType,hasCanonicalType,internal::Matcher<QualType>,InnerMatcher)1830 AST_MATCHER_P(QualType, hasCanonicalType, internal::Matcher<QualType>,
1831               InnerMatcher) {
1832   return InnerMatcher.matches(Node.getCanonicalType(), Finder, Builder);
1833 }
1834 
1835 /// \brief Overloaded to match the referenced type's declaration.
references(const internal::Matcher<Decl> & InnerMatcher)1836 inline internal::Matcher<QualType> references(
1837     const internal::Matcher<Decl> &InnerMatcher) {
1838   return references(qualType(hasDeclaration(InnerMatcher)));
1839 }
1840 
AST_MATCHER_P(CXXMemberCallExpr,onImplicitObjectArgument,internal::Matcher<Expr>,InnerMatcher)1841 AST_MATCHER_P(CXXMemberCallExpr, onImplicitObjectArgument,
1842               internal::Matcher<Expr>, InnerMatcher) {
1843   const Expr *ExprNode = Node.getImplicitObjectArgument();
1844   return (ExprNode != NULL &&
1845           InnerMatcher.matches(*ExprNode, Finder, Builder));
1846 }
1847 
1848 /// \brief Matches if the expression's type either matches the specified
1849 /// matcher, or is a pointer to a type that matches the InnerMatcher.
thisPointerType(const internal::Matcher<QualType> & InnerMatcher)1850 inline internal::Matcher<CXXMemberCallExpr> thisPointerType(
1851     const internal::Matcher<QualType> &InnerMatcher) {
1852   return onImplicitObjectArgument(
1853       anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))));
1854 }
1855 
1856 /// \brief Overloaded to match the type's declaration.
thisPointerType(const internal::Matcher<Decl> & InnerMatcher)1857 inline internal::Matcher<CXXMemberCallExpr> thisPointerType(
1858     const internal::Matcher<Decl> &InnerMatcher) {
1859   return onImplicitObjectArgument(
1860       anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))));
1861 }
1862 
1863 /// \brief Matches a DeclRefExpr that refers to a declaration that matches the
1864 /// specified matcher.
1865 ///
1866 /// Example matches x in if(x)
1867 ///     (matcher = declRefExpr(to(varDecl(hasName("x")))))
1868 /// \code
1869 ///   bool x;
1870 ///   if (x) {}
1871 /// \endcode
AST_MATCHER_P(DeclRefExpr,to,internal::Matcher<Decl>,InnerMatcher)1872 AST_MATCHER_P(DeclRefExpr, to, internal::Matcher<Decl>,
1873               InnerMatcher) {
1874   const Decl *DeclNode = Node.getDecl();
1875   return (DeclNode != NULL &&
1876           InnerMatcher.matches(*DeclNode, Finder, Builder));
1877 }
1878 
1879 /// \brief Matches a \c DeclRefExpr that refers to a declaration through a
1880 /// specific using shadow declaration.
1881 ///
1882 /// FIXME: This currently only works for functions. Fix.
1883 ///
1884 /// Given
1885 /// \code
1886 ///   namespace a { void f() {} }
1887 ///   using a::f;
1888 ///   void g() {
1889 ///     f();     // Matches this ..
1890 ///     a::f();  // .. but not this.
1891 ///   }
1892 /// \endcode
1893 /// declRefExpr(throughUsingDeclaration(anything()))
1894 ///   matches \c f()
AST_MATCHER_P(DeclRefExpr,throughUsingDecl,internal::Matcher<UsingShadowDecl>,InnerMatcher)1895 AST_MATCHER_P(DeclRefExpr, throughUsingDecl,
1896               internal::Matcher<UsingShadowDecl>, InnerMatcher) {
1897   const NamedDecl *FoundDecl = Node.getFoundDecl();
1898   if (const UsingShadowDecl *UsingDecl = dyn_cast<UsingShadowDecl>(FoundDecl))
1899     return InnerMatcher.matches(*UsingDecl, Finder, Builder);
1900   return false;
1901 }
1902 
1903 /// \brief Matches the Decl of a DeclStmt which has a single declaration.
1904 ///
1905 /// Given
1906 /// \code
1907 ///   int a, b;
1908 ///   int c;
1909 /// \endcode
1910 /// declStmt(hasSingleDecl(anything()))
1911 ///   matches 'int c;' but not 'int a, b;'.
AST_MATCHER_P(DeclStmt,hasSingleDecl,internal::Matcher<Decl>,InnerMatcher)1912 AST_MATCHER_P(DeclStmt, hasSingleDecl, internal::Matcher<Decl>, InnerMatcher) {
1913   if (Node.isSingleDecl()) {
1914     const Decl *FoundDecl = Node.getSingleDecl();
1915     return InnerMatcher.matches(*FoundDecl, Finder, Builder);
1916   }
1917   return false;
1918 }
1919 
1920 /// \brief Matches a variable declaration that has an initializer expression
1921 /// that matches the given matcher.
1922 ///
1923 /// Example matches x (matcher = varDecl(hasInitializer(callExpr())))
1924 /// \code
1925 ///   bool y() { return true; }
1926 ///   bool x = y();
1927 /// \endcode
AST_MATCHER_P(VarDecl,hasInitializer,internal::Matcher<Expr>,InnerMatcher)1928 AST_MATCHER_P(
1929     VarDecl, hasInitializer, internal::Matcher<Expr>,
1930     InnerMatcher) {
1931   const Expr *Initializer = Node.getAnyInitializer();
1932   return (Initializer != NULL &&
1933           InnerMatcher.matches(*Initializer, Finder, Builder));
1934 }
1935 
1936 /// \brief Checks that a call expression or a constructor call expression has
1937 /// a specific number of arguments (including absent default arguments).
1938 ///
1939 /// Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1940 /// \code
1941 ///   void f(int x, int y);
1942 ///   f(0, 0);
1943 /// \endcode
AST_POLYMORPHIC_MATCHER_P(argumentCountIs,unsigned,N)1944 AST_POLYMORPHIC_MATCHER_P(argumentCountIs, unsigned, N) {
1945   TOOLING_COMPILE_ASSERT((llvm::is_base_of<CallExpr, NodeType>::value ||
1946                           llvm::is_base_of<CXXConstructExpr,
1947                                            NodeType>::value),
1948                          instantiated_with_wrong_types);
1949   return Node.getNumArgs() == N;
1950 }
1951 
1952 /// \brief Matches the n'th argument of a call expression or a constructor
1953 /// call expression.
1954 ///
1955 /// Example matches y in x(y)
1956 ///     (matcher = callExpr(hasArgument(0, declRefExpr())))
1957 /// \code
1958 ///   void x(int) { int y; x(y); }
1959 /// \endcode
AST_POLYMORPHIC_MATCHER_P2(hasArgument,unsigned,N,internal::Matcher<Expr>,InnerMatcher)1960 AST_POLYMORPHIC_MATCHER_P2(
1961     hasArgument, unsigned, N, internal::Matcher<Expr>, InnerMatcher) {
1962   TOOLING_COMPILE_ASSERT((llvm::is_base_of<CallExpr, NodeType>::value ||
1963                          llvm::is_base_of<CXXConstructExpr,
1964                                           NodeType>::value),
1965                          instantiated_with_wrong_types);
1966   return (N < Node.getNumArgs() &&
1967           InnerMatcher.matches(
1968               *Node.getArg(N)->IgnoreParenImpCasts(), Finder, Builder));
1969 }
1970 
1971 /// \brief Matches declaration statements that contain a specific number of
1972 /// declarations.
1973 ///
1974 /// Example: Given
1975 /// \code
1976 ///   int a, b;
1977 ///   int c;
1978 ///   int d = 2, e;
1979 /// \endcode
1980 /// declCountIs(2)
1981 ///   matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
AST_MATCHER_P(DeclStmt,declCountIs,unsigned,N)1982 AST_MATCHER_P(DeclStmt, declCountIs, unsigned, N) {
1983   return std::distance(Node.decl_begin(), Node.decl_end()) == (ptrdiff_t)N;
1984 }
1985 
1986 /// \brief Matches the n'th declaration of a declaration statement.
1987 ///
1988 /// Note that this does not work for global declarations because the AST
1989 /// breaks up multiple-declaration DeclStmt's into multiple single-declaration
1990 /// DeclStmt's.
1991 /// Example: Given non-global declarations
1992 /// \code
1993 ///   int a, b = 0;
1994 ///   int c;
1995 ///   int d = 2, e;
1996 /// \endcode
1997 /// declStmt(containsDeclaration(
1998 ///       0, varDecl(hasInitializer(anything()))))
1999 ///   matches only 'int d = 2, e;', and
2000 /// declStmt(containsDeclaration(1, varDecl()))
2001 /// \code
2002 ///   matches 'int a, b = 0' as well as 'int d = 2, e;'
2003 ///   but 'int c;' is not matched.
2004 /// \endcode
AST_MATCHER_P2(DeclStmt,containsDeclaration,unsigned,N,internal::Matcher<Decl>,InnerMatcher)2005 AST_MATCHER_P2(DeclStmt, containsDeclaration, unsigned, N,
2006                internal::Matcher<Decl>, InnerMatcher) {
2007   const unsigned NumDecls = std::distance(Node.decl_begin(), Node.decl_end());
2008   if (N >= NumDecls)
2009     return false;
2010   DeclStmt::const_decl_iterator Iterator = Node.decl_begin();
2011   std::advance(Iterator, N);
2012   return InnerMatcher.matches(**Iterator, Finder, Builder);
2013 }
2014 
2015 /// \brief Matches a constructor initializer.
2016 ///
2017 /// Given
2018 /// \code
2019 ///   struct Foo {
2020 ///     Foo() : foo_(1) { }
2021 ///     int foo_;
2022 ///   };
2023 /// \endcode
2024 /// recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything()))))
2025 ///   record matches Foo, hasAnyConstructorInitializer matches foo_(1)
AST_MATCHER_P(CXXConstructorDecl,hasAnyConstructorInitializer,internal::Matcher<CXXCtorInitializer>,InnerMatcher)2026 AST_MATCHER_P(CXXConstructorDecl, hasAnyConstructorInitializer,
2027               internal::Matcher<CXXCtorInitializer>, InnerMatcher) {
2028   for (CXXConstructorDecl::init_const_iterator I = Node.init_begin();
2029        I != Node.init_end(); ++I) {
2030     if (InnerMatcher.matches(**I, Finder, Builder)) {
2031       return true;
2032     }
2033   }
2034   return false;
2035 }
2036 
2037 /// \brief Matches the field declaration of a constructor initializer.
2038 ///
2039 /// Given
2040 /// \code
2041 ///   struct Foo {
2042 ///     Foo() : foo_(1) { }
2043 ///     int foo_;
2044 ///   };
2045 /// \endcode
2046 /// recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
2047 ///     forField(hasName("foo_"))))))
2048 ///   matches Foo
2049 /// with forField matching foo_
AST_MATCHER_P(CXXCtorInitializer,forField,internal::Matcher<FieldDecl>,InnerMatcher)2050 AST_MATCHER_P(CXXCtorInitializer, forField,
2051               internal::Matcher<FieldDecl>, InnerMatcher) {
2052   const FieldDecl *NodeAsDecl = Node.getMember();
2053   return (NodeAsDecl != NULL &&
2054       InnerMatcher.matches(*NodeAsDecl, Finder, Builder));
2055 }
2056 
2057 /// \brief Matches the initializer expression of a constructor initializer.
2058 ///
2059 /// Given
2060 /// \code
2061 ///   struct Foo {
2062 ///     Foo() : foo_(1) { }
2063 ///     int foo_;
2064 ///   };
2065 /// \endcode
2066 /// recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
2067 ///     withInitializer(integerLiteral(equals(1)))))))
2068 ///   matches Foo
2069 /// with withInitializer matching (1)
AST_MATCHER_P(CXXCtorInitializer,withInitializer,internal::Matcher<Expr>,InnerMatcher)2070 AST_MATCHER_P(CXXCtorInitializer, withInitializer,
2071               internal::Matcher<Expr>, InnerMatcher) {
2072   const Expr* NodeAsExpr = Node.getInit();
2073   return (NodeAsExpr != NULL &&
2074       InnerMatcher.matches(*NodeAsExpr, Finder, Builder));
2075 }
2076 
2077 /// \brief Matches a contructor initializer if it is explicitly written in
2078 /// code (as opposed to implicitly added by the compiler).
2079 ///
2080 /// Given
2081 /// \code
2082 ///   struct Foo {
2083 ///     Foo() { }
2084 ///     Foo(int) : foo_("A") { }
2085 ///     string foo_;
2086 ///   };
2087 /// \endcode
2088 /// constructorDecl(hasAnyConstructorInitializer(isWritten()))
2089 ///   will match Foo(int), but not Foo()
AST_MATCHER(CXXCtorInitializer,isWritten)2090 AST_MATCHER(CXXCtorInitializer, isWritten) {
2091   return Node.isWritten();
2092 }
2093 
2094 /// \brief Matches a constructor declaration that has been implicitly added
2095 /// by the compiler (eg. implicit default/copy constructors).
AST_MATCHER(CXXConstructorDecl,isImplicit)2096 AST_MATCHER(CXXConstructorDecl, isImplicit) {
2097   return Node.isImplicit();
2098 }
2099 
2100 /// \brief Matches any argument of a call expression or a constructor call
2101 /// expression.
2102 ///
2103 /// Given
2104 /// \code
2105 ///   void x(int, int, int) { int y; x(1, y, 42); }
2106 /// \endcode
2107 /// callExpr(hasAnyArgument(declRefExpr()))
2108 ///   matches x(1, y, 42)
2109 /// with hasAnyArgument(...)
2110 ///   matching y
AST_POLYMORPHIC_MATCHER_P(hasAnyArgument,internal::Matcher<Expr>,InnerMatcher)2111 AST_POLYMORPHIC_MATCHER_P(hasAnyArgument, internal::Matcher<Expr>,
2112                           InnerMatcher) {
2113   TOOLING_COMPILE_ASSERT((llvm::is_base_of<CallExpr, NodeType>::value ||
2114                          llvm::is_base_of<CXXConstructExpr,
2115                                           NodeType>::value),
2116                          instantiated_with_wrong_types);
2117   for (unsigned I = 0; I < Node.getNumArgs(); ++I) {
2118     if (InnerMatcher.matches(*Node.getArg(I)->IgnoreParenImpCasts(),
2119                              Finder, Builder)) {
2120       return true;
2121     }
2122   }
2123   return false;
2124 }
2125 
2126 /// \brief Matches the n'th parameter of a function declaration.
2127 ///
2128 /// Given
2129 /// \code
2130 ///   class X { void f(int x) {} };
2131 /// \endcode
2132 /// methodDecl(hasParameter(0, hasType(varDecl())))
2133 ///   matches f(int x) {}
2134 /// with hasParameter(...)
2135 ///   matching int x
AST_MATCHER_P2(FunctionDecl,hasParameter,unsigned,N,internal::Matcher<ParmVarDecl>,InnerMatcher)2136 AST_MATCHER_P2(FunctionDecl, hasParameter,
2137                unsigned, N, internal::Matcher<ParmVarDecl>,
2138                InnerMatcher) {
2139   return (N < Node.getNumParams() &&
2140           InnerMatcher.matches(
2141               *Node.getParamDecl(N), Finder, Builder));
2142 }
2143 
2144 /// \brief Matches any parameter of a function declaration.
2145 ///
2146 /// Does not match the 'this' parameter of a method.
2147 ///
2148 /// Given
2149 /// \code
2150 ///   class X { void f(int x, int y, int z) {} };
2151 /// \endcode
2152 /// methodDecl(hasAnyParameter(hasName("y")))
2153 ///   matches f(int x, int y, int z) {}
2154 /// with hasAnyParameter(...)
2155 ///   matching int y
AST_MATCHER_P(FunctionDecl,hasAnyParameter,internal::Matcher<ParmVarDecl>,InnerMatcher)2156 AST_MATCHER_P(FunctionDecl, hasAnyParameter,
2157               internal::Matcher<ParmVarDecl>, InnerMatcher) {
2158   for (unsigned I = 0; I < Node.getNumParams(); ++I) {
2159     if (InnerMatcher.matches(*Node.getParamDecl(I), Finder, Builder)) {
2160       return true;
2161     }
2162   }
2163   return false;
2164 }
2165 
2166 /// \brief Matches \c FunctionDecls that have a specific parameter count.
2167 ///
2168 /// Given
2169 /// \code
2170 ///   void f(int i) {}
2171 ///   void g(int i, int j) {}
2172 /// \endcode
2173 /// functionDecl(parameterCountIs(2))
2174 ///   matches g(int i, int j) {}
AST_MATCHER_P(FunctionDecl,parameterCountIs,unsigned,N)2175 AST_MATCHER_P(FunctionDecl, parameterCountIs, unsigned, N) {
2176   return Node.getNumParams() == N;
2177 }
2178 
2179 /// \brief Matches the return type of a function declaration.
2180 ///
2181 /// Given:
2182 /// \code
2183 ///   class X { int f() { return 1; } };
2184 /// \endcode
2185 /// methodDecl(returns(asString("int")))
2186 ///   matches int f() { return 1; }
AST_MATCHER_P(FunctionDecl,returns,internal::Matcher<QualType>,InnerMatcher)2187 AST_MATCHER_P(FunctionDecl, returns,
2188               internal::Matcher<QualType>, InnerMatcher) {
2189   return InnerMatcher.matches(Node.getResultType(), Finder, Builder);
2190 }
2191 
2192 /// \brief Matches extern "C" function declarations.
2193 ///
2194 /// Given:
2195 /// \code
2196 ///   extern "C" void f() {}
2197 ///   extern "C" { void g() {} }
2198 ///   void h() {}
2199 /// \endcode
2200 /// functionDecl(isExternC())
2201 ///   matches the declaration of f and g, but not the declaration h
AST_MATCHER(FunctionDecl,isExternC)2202 AST_MATCHER(FunctionDecl, isExternC) {
2203   return Node.isExternC();
2204 }
2205 
2206 /// \brief Matches the condition expression of an if statement, for loop,
2207 /// or conditional operator.
2208 ///
2209 /// Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2210 /// \code
2211 ///   if (true) {}
2212 /// \endcode
AST_POLYMORPHIC_MATCHER_P(hasCondition,internal::Matcher<Expr>,InnerMatcher)2213 AST_POLYMORPHIC_MATCHER_P(hasCondition, internal::Matcher<Expr>,
2214                           InnerMatcher) {
2215   TOOLING_COMPILE_ASSERT(
2216     (llvm::is_base_of<IfStmt, NodeType>::value) ||
2217     (llvm::is_base_of<ForStmt, NodeType>::value) ||
2218     (llvm::is_base_of<WhileStmt, NodeType>::value) ||
2219     (llvm::is_base_of<DoStmt, NodeType>::value) ||
2220     (llvm::is_base_of<ConditionalOperator, NodeType>::value),
2221     has_condition_requires_if_statement_conditional_operator_or_loop);
2222   const Expr *const Condition = Node.getCond();
2223   return (Condition != NULL &&
2224           InnerMatcher.matches(*Condition, Finder, Builder));
2225 }
2226 
2227 /// \brief Matches the condition variable statement in an if statement.
2228 ///
2229 /// Given
2230 /// \code
2231 ///   if (A* a = GetAPointer()) {}
2232 /// \endcode
2233 /// hasConditionVariableStatment(...)
2234 ///   matches 'A* a = GetAPointer()'.
AST_MATCHER_P(IfStmt,hasConditionVariableStatement,internal::Matcher<DeclStmt>,InnerMatcher)2235 AST_MATCHER_P(IfStmt, hasConditionVariableStatement,
2236               internal::Matcher<DeclStmt>, InnerMatcher) {
2237   const DeclStmt* const DeclarationStatement =
2238     Node.getConditionVariableDeclStmt();
2239   return DeclarationStatement != NULL &&
2240          InnerMatcher.matches(*DeclarationStatement, Finder, Builder);
2241 }
2242 
2243 /// \brief Matches the index expression of an array subscript expression.
2244 ///
2245 /// Given
2246 /// \code
2247 ///   int i[5];
2248 ///   void f() { i[1] = 42; }
2249 /// \endcode
2250 /// arraySubscriptExpression(hasIndex(integerLiteral()))
2251 ///   matches \c i[1] with the \c integerLiteral() matching \c 1
AST_MATCHER_P(ArraySubscriptExpr,hasIndex,internal::Matcher<Expr>,InnerMatcher)2252 AST_MATCHER_P(ArraySubscriptExpr, hasIndex,
2253               internal::Matcher<Expr>, InnerMatcher) {
2254   if (const Expr* Expression = Node.getIdx())
2255     return InnerMatcher.matches(*Expression, Finder, Builder);
2256   return false;
2257 }
2258 
2259 /// \brief Matches the base expression of an array subscript expression.
2260 ///
2261 /// Given
2262 /// \code
2263 ///   int i[5];
2264 ///   void f() { i[1] = 42; }
2265 /// \endcode
2266 /// arraySubscriptExpression(hasBase(implicitCastExpr(
2267 ///     hasSourceExpression(declRefExpr()))))
2268 ///   matches \c i[1] with the \c declRefExpr() matching \c i
AST_MATCHER_P(ArraySubscriptExpr,hasBase,internal::Matcher<Expr>,InnerMatcher)2269 AST_MATCHER_P(ArraySubscriptExpr, hasBase,
2270               internal::Matcher<Expr>, InnerMatcher) {
2271   if (const Expr* Expression = Node.getBase())
2272     return InnerMatcher.matches(*Expression, Finder, Builder);
2273   return false;
2274 }
2275 
2276 /// \brief Matches a 'for', 'while', or 'do while' statement that has
2277 /// a given body.
2278 ///
2279 /// Given
2280 /// \code
2281 ///   for (;;) {}
2282 /// \endcode
2283 /// hasBody(compoundStmt())
2284 ///   matches 'for (;;) {}'
2285 /// with compoundStmt()
2286 ///   matching '{}'
AST_POLYMORPHIC_MATCHER_P(hasBody,internal::Matcher<Stmt>,InnerMatcher)2287 AST_POLYMORPHIC_MATCHER_P(hasBody, internal::Matcher<Stmt>,
2288                           InnerMatcher) {
2289   TOOLING_COMPILE_ASSERT(
2290       (llvm::is_base_of<DoStmt, NodeType>::value) ||
2291       (llvm::is_base_of<ForStmt, NodeType>::value) ||
2292       (llvm::is_base_of<WhileStmt, NodeType>::value),
2293       has_body_requires_for_while_or_do_statement);
2294   const Stmt *const Statement = Node.getBody();
2295   return (Statement != NULL &&
2296           InnerMatcher.matches(*Statement, Finder, Builder));
2297 }
2298 
2299 /// \brief Matches compound statements where at least one substatement matches
2300 /// a given matcher.
2301 ///
2302 /// Given
2303 /// \code
2304 ///   { {}; 1+2; }
2305 /// \endcode
2306 /// hasAnySubstatement(compoundStmt())
2307 ///   matches '{ {}; 1+2; }'
2308 /// with compoundStmt()
2309 ///   matching '{}'
AST_MATCHER_P(CompoundStmt,hasAnySubstatement,internal::Matcher<Stmt>,InnerMatcher)2310 AST_MATCHER_P(CompoundStmt, hasAnySubstatement,
2311               internal::Matcher<Stmt>, InnerMatcher) {
2312   for (CompoundStmt::const_body_iterator It = Node.body_begin();
2313        It != Node.body_end();
2314        ++It) {
2315     if (InnerMatcher.matches(**It, Finder, Builder)) return true;
2316   }
2317   return false;
2318 }
2319 
2320 /// \brief Checks that a compound statement contains a specific number of
2321 /// child statements.
2322 ///
2323 /// Example: Given
2324 /// \code
2325 ///   { for (;;) {} }
2326 /// \endcode
2327 /// compoundStmt(statementCountIs(0)))
2328 ///   matches '{}'
2329 ///   but does not match the outer compound statement.
AST_MATCHER_P(CompoundStmt,statementCountIs,unsigned,N)2330 AST_MATCHER_P(CompoundStmt, statementCountIs, unsigned, N) {
2331   return Node.size() == N;
2332 }
2333 
2334 /// \brief Matches literals that are equal to the given value.
2335 ///
2336 /// Example matches true (matcher = boolLiteral(equals(true)))
2337 /// \code
2338 ///   true
2339 /// \endcode
2340 ///
2341 /// Usable as: Matcher<CharacterLiteral>, Matcher<CXXBoolLiteral>,
2342 ///            Matcher<FloatingLiteral>, Matcher<IntegerLiteral>
2343 template <typename ValueT>
2344 internal::PolymorphicMatcherWithParam1<internal::ValueEqualsMatcher, ValueT>
equals(const ValueT & Value)2345 equals(const ValueT &Value) {
2346   return internal::PolymorphicMatcherWithParam1<
2347     internal::ValueEqualsMatcher,
2348     ValueT>(Value);
2349 }
2350 
2351 /// \brief Matches the operator Name of operator expressions (binary or
2352 /// unary).
2353 ///
2354 /// Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2355 /// \code
2356 ///   !(a || b)
2357 /// \endcode
AST_POLYMORPHIC_MATCHER_P(hasOperatorName,std::string,Name)2358 AST_POLYMORPHIC_MATCHER_P(hasOperatorName, std::string, Name) {
2359   TOOLING_COMPILE_ASSERT(
2360     (llvm::is_base_of<BinaryOperator, NodeType>::value) ||
2361     (llvm::is_base_of<UnaryOperator, NodeType>::value),
2362     has_condition_requires_if_statement_or_conditional_operator);
2363   return Name == Node.getOpcodeStr(Node.getOpcode());
2364 }
2365 
2366 /// \brief Matches the left hand side of binary operator expressions.
2367 ///
2368 /// Example matches a (matcher = binaryOperator(hasLHS()))
2369 /// \code
2370 ///   a || b
2371 /// \endcode
AST_MATCHER_P(BinaryOperator,hasLHS,internal::Matcher<Expr>,InnerMatcher)2372 AST_MATCHER_P(BinaryOperator, hasLHS,
2373               internal::Matcher<Expr>, InnerMatcher) {
2374   Expr *LeftHandSide = Node.getLHS();
2375   return (LeftHandSide != NULL &&
2376           InnerMatcher.matches(*LeftHandSide, Finder, Builder));
2377 }
2378 
2379 /// \brief Matches the right hand side of binary operator expressions.
2380 ///
2381 /// Example matches b (matcher = binaryOperator(hasRHS()))
2382 /// \code
2383 ///   a || b
2384 /// \endcode
AST_MATCHER_P(BinaryOperator,hasRHS,internal::Matcher<Expr>,InnerMatcher)2385 AST_MATCHER_P(BinaryOperator, hasRHS,
2386               internal::Matcher<Expr>, InnerMatcher) {
2387   Expr *RightHandSide = Node.getRHS();
2388   return (RightHandSide != NULL &&
2389           InnerMatcher.matches(*RightHandSide, Finder, Builder));
2390 }
2391 
2392 /// \brief Matches if either the left hand side or the right hand side of a
2393 /// binary operator matches.
hasEitherOperand(const internal::Matcher<Expr> & InnerMatcher)2394 inline internal::Matcher<BinaryOperator> hasEitherOperand(
2395     const internal::Matcher<Expr> &InnerMatcher) {
2396   return anyOf(hasLHS(InnerMatcher), hasRHS(InnerMatcher));
2397 }
2398 
2399 /// \brief Matches if the operand of a unary operator matches.
2400 ///
2401 /// Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true))))
2402 /// \code
2403 ///   !true
2404 /// \endcode
AST_MATCHER_P(UnaryOperator,hasUnaryOperand,internal::Matcher<Expr>,InnerMatcher)2405 AST_MATCHER_P(UnaryOperator, hasUnaryOperand,
2406               internal::Matcher<Expr>, InnerMatcher) {
2407   const Expr * const Operand = Node.getSubExpr();
2408   return (Operand != NULL &&
2409           InnerMatcher.matches(*Operand, Finder, Builder));
2410 }
2411 
2412 /// \brief Matches if the cast's source expression matches the given matcher.
2413 ///
2414 /// Example: matches "a string" (matcher =
2415 ///                                  hasSourceExpression(constructExpr()))
2416 /// \code
2417 /// class URL { URL(string); };
2418 /// URL url = "a string";
AST_MATCHER_P(CastExpr,hasSourceExpression,internal::Matcher<Expr>,InnerMatcher)2419 AST_MATCHER_P(CastExpr, hasSourceExpression,
2420               internal::Matcher<Expr>, InnerMatcher) {
2421   const Expr* const SubExpression = Node.getSubExpr();
2422   return (SubExpression != NULL &&
2423           InnerMatcher.matches(*SubExpression, Finder, Builder));
2424 }
2425 
2426 /// \brief Matches casts whose destination type matches a given matcher.
2427 ///
2428 /// (Note: Clang's AST refers to other conversions as "casts" too, and calls
2429 /// actual casts "explicit" casts.)
AST_MATCHER_P(ExplicitCastExpr,hasDestinationType,internal::Matcher<QualType>,InnerMatcher)2430 AST_MATCHER_P(ExplicitCastExpr, hasDestinationType,
2431               internal::Matcher<QualType>, InnerMatcher) {
2432   const QualType NodeType = Node.getTypeAsWritten();
2433   return InnerMatcher.matches(NodeType, Finder, Builder);
2434 }
2435 
2436 /// \brief Matches implicit casts whose destination type matches a given
2437 /// matcher.
2438 ///
2439 /// FIXME: Unit test this matcher
AST_MATCHER_P(ImplicitCastExpr,hasImplicitDestinationType,internal::Matcher<QualType>,InnerMatcher)2440 AST_MATCHER_P(ImplicitCastExpr, hasImplicitDestinationType,
2441               internal::Matcher<QualType>, InnerMatcher) {
2442   return InnerMatcher.matches(Node.getType(), Finder, Builder);
2443 }
2444 
2445 /// \brief Matches the true branch expression of a conditional operator.
2446 ///
2447 /// Example matches a
2448 /// \code
2449 ///   condition ? a : b
2450 /// \endcode
AST_MATCHER_P(ConditionalOperator,hasTrueExpression,internal::Matcher<Expr>,InnerMatcher)2451 AST_MATCHER_P(ConditionalOperator, hasTrueExpression,
2452               internal::Matcher<Expr>, InnerMatcher) {
2453   Expr *Expression = Node.getTrueExpr();
2454   return (Expression != NULL &&
2455           InnerMatcher.matches(*Expression, Finder, Builder));
2456 }
2457 
2458 /// \brief Matches the false branch expression of a conditional operator.
2459 ///
2460 /// Example matches b
2461 /// \code
2462 ///   condition ? a : b
2463 /// \endcode
AST_MATCHER_P(ConditionalOperator,hasFalseExpression,internal::Matcher<Expr>,InnerMatcher)2464 AST_MATCHER_P(ConditionalOperator, hasFalseExpression,
2465               internal::Matcher<Expr>, InnerMatcher) {
2466   Expr *Expression = Node.getFalseExpr();
2467   return (Expression != NULL &&
2468           InnerMatcher.matches(*Expression, Finder, Builder));
2469 }
2470 
2471 /// \brief Matches if a declaration has a body attached.
2472 ///
2473 /// Example matches A, va, fa
2474 /// \code
2475 ///   class A {};
2476 ///   class B;  // Doesn't match, as it has no body.
2477 ///   int va;
2478 ///   extern int vb;  // Doesn't match, as it doesn't define the variable.
2479 ///   void fa() {}
2480 ///   void fb();  // Doesn't match, as it has no body.
2481 /// \endcode
2482 ///
2483 /// Usable as: Matcher<TagDecl>, Matcher<VarDecl>, Matcher<FunctionDecl>
AST_POLYMORPHIC_MATCHER(isDefinition)2484 AST_POLYMORPHIC_MATCHER(isDefinition) {
2485   TOOLING_COMPILE_ASSERT(
2486       (llvm::is_base_of<TagDecl, NodeType>::value) ||
2487       (llvm::is_base_of<VarDecl, NodeType>::value) ||
2488       (llvm::is_base_of<FunctionDecl, NodeType>::value),
2489       is_definition_requires_isThisDeclarationADefinition_method);
2490   return Node.isThisDeclarationADefinition();
2491 }
2492 
2493 /// \brief Matches the class declaration that the given method declaration
2494 /// belongs to.
2495 ///
2496 /// FIXME: Generalize this for other kinds of declarations.
2497 /// FIXME: What other kind of declarations would we need to generalize
2498 /// this to?
2499 ///
2500 /// Example matches A() in the last line
2501 ///     (matcher = constructExpr(hasDeclaration(methodDecl(
2502 ///         ofClass(hasName("A"))))))
2503 /// \code
2504 ///   class A {
2505 ///    public:
2506 ///     A();
2507 ///   };
2508 ///   A a = A();
2509 /// \endcode
AST_MATCHER_P(CXXMethodDecl,ofClass,internal::Matcher<CXXRecordDecl>,InnerMatcher)2510 AST_MATCHER_P(CXXMethodDecl, ofClass,
2511               internal::Matcher<CXXRecordDecl>, InnerMatcher) {
2512   const CXXRecordDecl *Parent = Node.getParent();
2513   return (Parent != NULL &&
2514           InnerMatcher.matches(*Parent, Finder, Builder));
2515 }
2516 
2517 /// \brief Matches member expressions that are called with '->' as opposed
2518 /// to '.'.
2519 ///
2520 /// Member calls on the implicit this pointer match as called with '->'.
2521 ///
2522 /// Given
2523 /// \code
2524 ///   class Y {
2525 ///     void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
2526 ///     int a;
2527 ///     static int b;
2528 ///   };
2529 /// \endcode
2530 /// memberExpr(isArrow())
2531 ///   matches this->x, x, y.x, a, this->b
AST_MATCHER(MemberExpr,isArrow)2532 AST_MATCHER(MemberExpr, isArrow) {
2533   return Node.isArrow();
2534 }
2535 
2536 /// \brief Matches QualType nodes that are of integer type.
2537 ///
2538 /// Given
2539 /// \code
2540 ///   void a(int);
2541 ///   void b(long);
2542 ///   void c(double);
2543 /// \endcode
2544 /// functionDecl(hasAnyParameter(hasType(isInteger())))
2545 /// matches "a(int)", "b(long)", but not "c(double)".
AST_MATCHER(QualType,isInteger)2546 AST_MATCHER(QualType, isInteger) {
2547     return Node->isIntegerType();
2548 }
2549 
2550 /// \brief Matches QualType nodes that are const-qualified, i.e., that
2551 /// include "top-level" const.
2552 ///
2553 /// Given
2554 /// \code
2555 ///   void a(int);
2556 ///   void b(int const);
2557 ///   void c(const int);
2558 ///   void d(const int*);
2559 ///   void e(int const) {};
2560 /// \endcode
2561 /// functionDecl(hasAnyParameter(hasType(isConstQualified())))
2562 ///   matches "void b(int const)", "void c(const int)" and
2563 ///   "void e(int const) {}". It does not match d as there
2564 ///   is no top-level const on the parameter type "const int *".
AST_MATCHER(QualType,isConstQualified)2565 AST_MATCHER(QualType, isConstQualified) {
2566   return Node.isConstQualified();
2567 }
2568 
2569 /// \brief Matches a member expression where the member is matched by a
2570 /// given matcher.
2571 ///
2572 /// Given
2573 /// \code
2574 ///   struct { int first, second; } first, second;
2575 ///   int i(second.first);
2576 ///   int j(first.second);
2577 /// \endcode
2578 /// memberExpr(member(hasName("first")))
2579 ///   matches second.first
2580 ///   but not first.second (because the member name there is "second").
AST_MATCHER_P(MemberExpr,member,internal::Matcher<ValueDecl>,InnerMatcher)2581 AST_MATCHER_P(MemberExpr, member,
2582               internal::Matcher<ValueDecl>, InnerMatcher) {
2583   return InnerMatcher.matches(*Node.getMemberDecl(), Finder, Builder);
2584 }
2585 
2586 /// \brief Matches a member expression where the object expression is
2587 /// matched by a given matcher.
2588 ///
2589 /// Given
2590 /// \code
2591 ///   struct X { int m; };
2592 ///   void f(X x) { x.m; m; }
2593 /// \endcode
2594 /// memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))))
2595 ///   matches "x.m" and "m"
2596 /// with hasObjectExpression(...)
2597 ///   matching "x" and the implicit object expression of "m" which has type X*.
AST_MATCHER_P(MemberExpr,hasObjectExpression,internal::Matcher<Expr>,InnerMatcher)2598 AST_MATCHER_P(MemberExpr, hasObjectExpression,
2599               internal::Matcher<Expr>, InnerMatcher) {
2600   return InnerMatcher.matches(*Node.getBase(), Finder, Builder);
2601 }
2602 
2603 /// \brief Matches any using shadow declaration.
2604 ///
2605 /// Given
2606 /// \code
2607 ///   namespace X { void b(); }
2608 ///   using X::b;
2609 /// \endcode
2610 /// usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
2611 ///   matches \code using X::b \endcode
AST_MATCHER_P(UsingDecl,hasAnyUsingShadowDecl,internal::Matcher<UsingShadowDecl>,InnerMatcher)2612 AST_MATCHER_P(UsingDecl, hasAnyUsingShadowDecl,
2613               internal::Matcher<UsingShadowDecl>, InnerMatcher) {
2614   for (UsingDecl::shadow_iterator II = Node.shadow_begin();
2615        II != Node.shadow_end(); ++II) {
2616     if (InnerMatcher.matches(**II, Finder, Builder))
2617       return true;
2618   }
2619   return false;
2620 }
2621 
2622 /// \brief Matches a using shadow declaration where the target declaration is
2623 /// matched by the given matcher.
2624 ///
2625 /// Given
2626 /// \code
2627 ///   namespace X { int a; void b(); }
2628 ///   using X::a;
2629 ///   using X::b;
2630 /// \endcode
2631 /// usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
2632 ///   matches \code using X::b \endcode
2633 ///   but not \code using X::a \endcode
AST_MATCHER_P(UsingShadowDecl,hasTargetDecl,internal::Matcher<NamedDecl>,InnerMatcher)2634 AST_MATCHER_P(UsingShadowDecl, hasTargetDecl,
2635               internal::Matcher<NamedDecl>, InnerMatcher) {
2636   return InnerMatcher.matches(*Node.getTargetDecl(), Finder, Builder);
2637 }
2638 
2639 /// \brief Matches template instantiations of function, class, or static
2640 /// member variable template instantiations.
2641 ///
2642 /// Given
2643 /// \code
2644 ///   template <typename T> class X {}; class A {}; X<A> x;
2645 /// \endcode
2646 /// or
2647 /// \code
2648 ///   template <typename T> class X {}; class A {}; template class X<A>;
2649 /// \endcode
2650 /// recordDecl(hasName("::X"), isTemplateInstantiation())
2651 ///   matches the template instantiation of X<A>.
2652 ///
2653 /// But given
2654 /// \code
2655 ///   template <typename T>  class X {}; class A {};
2656 ///   template <> class X<A> {}; X<A> x;
2657 /// \endcode
2658 /// recordDecl(hasName("::X"), isTemplateInstantiation())
2659 ///   does not match, as X<A> is an explicit template specialization.
2660 ///
2661 /// Usable as: Matcher<FunctionDecl>, Matcher<VarDecl>, Matcher<CXXRecordDecl>
AST_POLYMORPHIC_MATCHER(isTemplateInstantiation)2662 AST_POLYMORPHIC_MATCHER(isTemplateInstantiation) {
2663   TOOLING_COMPILE_ASSERT((llvm::is_base_of<FunctionDecl, NodeType>::value) ||
2664                          (llvm::is_base_of<VarDecl, NodeType>::value) ||
2665                          (llvm::is_base_of<CXXRecordDecl, NodeType>::value),
2666                          requires_getTemplateSpecializationKind_method);
2667   return (Node.getTemplateSpecializationKind() == TSK_ImplicitInstantiation ||
2668           Node.getTemplateSpecializationKind() ==
2669           TSK_ExplicitInstantiationDefinition);
2670 }
2671 
2672 /// \brief Matches explicit template specializations of function, class, or
2673 /// static member variable template instantiations.
2674 ///
2675 /// Given
2676 /// \code
2677 ///   template<typename T> void A(T t) { }
2678 ///   template<> void A(int N) { }
2679 /// \endcode
2680 /// functionDecl(isExplicitTemplateSpecialization())
2681 ///   matches the specialization A<int>().
2682 ///
2683 /// Usable as: Matcher<FunctionDecl>, Matcher<VarDecl>, Matcher<CXXRecordDecl>
AST_POLYMORPHIC_MATCHER(isExplicitTemplateSpecialization)2684 AST_POLYMORPHIC_MATCHER(isExplicitTemplateSpecialization) {
2685   TOOLING_COMPILE_ASSERT((llvm::is_base_of<FunctionDecl, NodeType>::value) ||
2686                          (llvm::is_base_of<VarDecl, NodeType>::value) ||
2687                          (llvm::is_base_of<CXXRecordDecl, NodeType>::value),
2688                          requires_getTemplateSpecializationKind_method);
2689   return (Node.getTemplateSpecializationKind() == TSK_ExplicitSpecialization);
2690 }
2691 
2692 /// \brief Matches \c TypeLocs for which the given inner
2693 /// QualType-matcher matches.
loc(const internal::Matcher<QualType> & InnerMatcher)2694 inline internal::BindableMatcher<TypeLoc> loc(
2695     const internal::Matcher<QualType> &InnerMatcher) {
2696   return internal::BindableMatcher<TypeLoc>(
2697       new internal::TypeLocTypeMatcher(InnerMatcher));
2698 }
2699 
2700 /// \brief Matches builtin Types.
2701 ///
2702 /// Given
2703 /// \code
2704 ///   struct A {};
2705 ///   A a;
2706 ///   int b;
2707 ///   float c;
2708 ///   bool d;
2709 /// \endcode
2710 /// builtinType()
2711 ///   matches "int b", "float c" and "bool d"
2712 AST_TYPE_MATCHER(BuiltinType, builtinType);
2713 
2714 /// \brief Matches all kinds of arrays.
2715 ///
2716 /// Given
2717 /// \code
2718 ///   int a[] = { 2, 3 };
2719 ///   int b[4];
2720 ///   void f() { int c[a[0]]; }
2721 /// \endcode
2722 /// arrayType()
2723 ///   matches "int a[]", "int b[4]" and "int c[a[0]]";
2724 AST_TYPE_MATCHER(ArrayType, arrayType);
2725 
2726 /// \brief Matches C99 complex types.
2727 ///
2728 /// Given
2729 /// \code
2730 ///   _Complex float f;
2731 /// \endcode
2732 /// complexType()
2733 ///   matches "_Complex float f"
2734 AST_TYPE_MATCHER(ComplexType, complexType);
2735 
2736 /// \brief Matches arrays and C99 complex types that have a specific element
2737 /// type.
2738 ///
2739 /// Given
2740 /// \code
2741 ///   struct A {};
2742 ///   A a[7];
2743 ///   int b[7];
2744 /// \endcode
2745 /// arrayType(hasElementType(builtinType()))
2746 ///   matches "int b[7]"
2747 ///
2748 /// Usable as: Matcher<ArrayType>, Matcher<ComplexType>
2749 AST_TYPELOC_TRAVERSE_MATCHER(hasElementType, getElement);
2750 
2751 /// \brief Matches C arrays with a specified constant size.
2752 ///
2753 /// Given
2754 /// \code
2755 ///   void() {
2756 ///     int a[2];
2757 ///     int b[] = { 2, 3 };
2758 ///     int c[b[0]];
2759 ///   }
2760 /// \endcode
2761 /// constantArrayType()
2762 ///   matches "int a[2]"
2763 AST_TYPE_MATCHER(ConstantArrayType, constantArrayType);
2764 
2765 /// \brief Matches \c ConstantArrayType nodes that have the specified size.
2766 ///
2767 /// Given
2768 /// \code
2769 ///   int a[42];
2770 ///   int b[2 * 21];
2771 ///   int c[41], d[43];
2772 /// \endcode
2773 /// constantArrayType(hasSize(42))
2774 ///   matches "int a[42]" and "int b[2 * 21]"
AST_MATCHER_P(ConstantArrayType,hasSize,unsigned,N)2775 AST_MATCHER_P(ConstantArrayType, hasSize, unsigned, N) {
2776   return Node.getSize() == N;
2777 }
2778 
2779 /// \brief Matches C++ arrays whose size is a value-dependent expression.
2780 ///
2781 /// Given
2782 /// \code
2783 ///   template<typename T, int Size>
2784 ///   class array {
2785 ///     T data[Size];
2786 ///   };
2787 /// \endcode
2788 /// dependentSizedArrayType
2789 ///   matches "T data[Size]"
2790 AST_TYPE_MATCHER(DependentSizedArrayType, dependentSizedArrayType);
2791 
2792 /// \brief Matches C arrays with unspecified size.
2793 ///
2794 /// Given
2795 /// \code
2796 ///   int a[] = { 2, 3 };
2797 ///   int b[42];
2798 ///   void f(int c[]) { int d[a[0]]; };
2799 /// \endcode
2800 /// incompleteArrayType()
2801 ///   matches "int a[]" and "int c[]"
2802 AST_TYPE_MATCHER(IncompleteArrayType, incompleteArrayType);
2803 
2804 /// \brief Matches C arrays with a specified size that is not an
2805 /// integer-constant-expression.
2806 ///
2807 /// Given
2808 /// \code
2809 ///   void f() {
2810 ///     int a[] = { 2, 3 }
2811 ///     int b[42];
2812 ///     int c[a[0]];
2813 /// \endcode
2814 /// variableArrayType()
2815 ///   matches "int c[a[0]]"
2816 AST_TYPE_MATCHER(VariableArrayType, variableArrayType);
2817 
2818 /// \brief Matches \c VariableArrayType nodes that have a specific size
2819 /// expression.
2820 ///
2821 /// Given
2822 /// \code
2823 ///   void f(int b) {
2824 ///     int a[b];
2825 ///   }
2826 /// \endcode
2827 /// variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
2828 ///   varDecl(hasName("b")))))))
2829 ///   matches "int a[b]"
AST_MATCHER_P(VariableArrayType,hasSizeExpr,internal::Matcher<Expr>,InnerMatcher)2830 AST_MATCHER_P(VariableArrayType, hasSizeExpr,
2831               internal::Matcher<Expr>, InnerMatcher) {
2832   return InnerMatcher.matches(*Node.getSizeExpr(), Finder, Builder);
2833 }
2834 
2835 /// \brief Matches atomic types.
2836 ///
2837 /// Given
2838 /// \code
2839 ///   _Atomic(int) i;
2840 /// \endcode
2841 /// atomicType()
2842 ///   matches "_Atomic(int) i"
2843 AST_TYPE_MATCHER(AtomicType, atomicType);
2844 
2845 /// \brief Matches atomic types with a specific value type.
2846 ///
2847 /// Given
2848 /// \code
2849 ///   _Atomic(int) i;
2850 ///   _Atomic(float) f;
2851 /// \endcode
2852 /// atomicType(hasValueType(isInteger()))
2853 ///  matches "_Atomic(int) i"
2854 ///
2855 /// Usable as: Matcher<AtomicType>
2856 AST_TYPELOC_TRAVERSE_MATCHER(hasValueType, getValue);
2857 
2858 /// \brief Matches types nodes representing C++11 auto types.
2859 ///
2860 /// Given:
2861 /// \code
2862 ///   auto n = 4;
2863 ///   int v[] = { 2, 3 }
2864 ///   for (auto i : v) { }
2865 /// \endcode
2866 /// autoType()
2867 ///   matches "auto n" and "auto i"
2868 AST_TYPE_MATCHER(AutoType, autoType);
2869 
2870 /// \brief Matches \c AutoType nodes where the deduced type is a specific type.
2871 ///
2872 /// Note: There is no \c TypeLoc for the deduced type and thus no
2873 /// \c getDeducedLoc() matcher.
2874 ///
2875 /// Given
2876 /// \code
2877 ///   auto a = 1;
2878 ///   auto b = 2.0;
2879 /// \endcode
2880 /// autoType(hasDeducedType(isInteger()))
2881 ///   matches "auto a"
2882 ///
2883 /// Usable as: Matcher<AutoType>
2884 AST_TYPE_TRAVERSE_MATCHER(hasDeducedType, getDeducedType);
2885 
2886 /// \brief Matches \c FunctionType nodes.
2887 ///
2888 /// Given
2889 /// \code
2890 ///   int (*f)(int);
2891 ///   void g();
2892 /// \endcode
2893 /// functionType()
2894 ///   matches "int (*f)(int)" and the type of "g".
2895 AST_TYPE_MATCHER(FunctionType, functionType);
2896 
2897 /// \brief Matches block pointer types, i.e. types syntactically represented as
2898 /// "void (^)(int)".
2899 ///
2900 /// The \c pointee is always required to be a \c FunctionType.
2901 AST_TYPE_MATCHER(BlockPointerType, blockPointerType);
2902 
2903 /// \brief Matches member pointer types.
2904 /// Given
2905 /// \code
2906 ///   struct A { int i; }
2907 ///   A::* ptr = A::i;
2908 /// \endcode
2909 /// memberPointerType()
2910 ///   matches "A::* ptr"
2911 AST_TYPE_MATCHER(MemberPointerType, memberPointerType);
2912 
2913 /// \brief Matches pointer types.
2914 ///
2915 /// Given
2916 /// \code
2917 ///   int *a;
2918 ///   int &b = *a;
2919 ///   int c = 5;
2920 /// \endcode
2921 /// pointerType()
2922 ///   matches "int *a"
2923 AST_TYPE_MATCHER(PointerType, pointerType);
2924 
2925 /// \brief Matches both lvalue and rvalue reference types.
2926 ///
2927 /// Given
2928 /// \code
2929 ///   int *a;
2930 ///   int &b = *a;
2931 ///   int &&c = 1;
2932 ///   auto &d = b;
2933 ///   auto &&e = c;
2934 ///   auto &&f = 2;
2935 ///   int g = 5;
2936 /// \endcode
2937 ///
2938 /// \c referenceType() matches the types of \c b, \c c, \c d, \c e, and \c f.
2939 AST_TYPE_MATCHER(ReferenceType, referenceType);
2940 
2941 /// \brief Matches lvalue reference types.
2942 ///
2943 /// Given:
2944 /// \code
2945 ///   int *a;
2946 ///   int &b = *a;
2947 ///   int &&c = 1;
2948 ///   auto &d = b;
2949 ///   auto &&e = c;
2950 ///   auto &&f = 2;
2951 ///   int g = 5;
2952 /// \endcode
2953 ///
2954 /// \c lValueReferenceType() matches the types of \c b, \c d, and \c e. \c e is
2955 /// matched since the type is deduced as int& by reference collapsing rules.
2956 AST_TYPE_MATCHER(LValueReferenceType, lValueReferenceType);
2957 
2958 /// \brief Matches rvalue reference types.
2959 ///
2960 /// Given:
2961 /// \code
2962 ///   int *a;
2963 ///   int &b = *a;
2964 ///   int &&c = 1;
2965 ///   auto &d = b;
2966 ///   auto &&e = c;
2967 ///   auto &&f = 2;
2968 ///   int g = 5;
2969 /// \endcode
2970 ///
2971 /// \c rValueReferenceType() matches the types of \c c and \c f. \c e is not
2972 /// matched as it is deduced to int& by reference collapsing rules.
2973 AST_TYPE_MATCHER(RValueReferenceType, rValueReferenceType);
2974 
2975 /// \brief Narrows PointerType (and similar) matchers to those where the
2976 /// \c pointee matches a given matcher.
2977 ///
2978 /// Given
2979 /// \code
2980 ///   int *a;
2981 ///   int const *b;
2982 ///   float const *f;
2983 /// \endcode
2984 /// pointerType(pointee(isConstQualified(), isInteger()))
2985 ///   matches "int const *b"
2986 ///
2987 /// Usable as: Matcher<BlockPointerType>, Matcher<MemberPointerType>,
2988 ///   Matcher<PointerType>, Matcher<ReferenceType>
2989 AST_TYPELOC_TRAVERSE_MATCHER(pointee, getPointee);
2990 
2991 /// \brief Matches typedef types.
2992 ///
2993 /// Given
2994 /// \code
2995 ///   typedef int X;
2996 /// \endcode
2997 /// typedefType()
2998 ///   matches "typedef int X"
2999 AST_TYPE_MATCHER(TypedefType, typedefType);
3000 
3001 /// \brief Matches template specialization types.
3002 ///
3003 /// Given
3004 /// \code
3005 ///   template <typename T>
3006 ///   class C { };
3007 ///
3008 ///   template class C<int>;  // A
3009 ///   C<char> var;            // B
3010 /// \code
3011 ///
3012 /// \c templateSpecializationType() matches the type of the explicit
3013 /// instantiation in \c A and the type of the variable declaration in \c B.
3014 AST_TYPE_MATCHER(TemplateSpecializationType, templateSpecializationType);
3015 
3016 /// \brief Matches record types (e.g. structs, classes).
3017 ///
3018 /// Given
3019 /// \code
3020 ///   class C {};
3021 ///   struct S {};
3022 ///
3023 ///   C c;
3024 ///   S s;
3025 /// \code
3026 ///
3027 /// \c recordType() matches the type of the variable declarations of both \c c
3028 /// and \c s.
3029 AST_TYPE_MATCHER(RecordType, recordType);
3030 
3031 /// \brief Matches types specified with an elaborated type keyword or with a
3032 /// qualified name.
3033 ///
3034 /// Given
3035 /// \code
3036 ///   namespace N {
3037 ///     namespace M {
3038 ///       class D {};
3039 ///     }
3040 ///   }
3041 ///   class C {};
3042 ///
3043 ///   class C c;
3044 ///   N::M::D d;
3045 /// \code
3046 ///
3047 /// \c elaboratedType() matches the type of the variable declarations of both
3048 /// \c c and \c d.
3049 AST_TYPE_MATCHER(ElaboratedType, elaboratedType);
3050 
3051 /// \brief Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
3052 /// matches \c InnerMatcher if the qualifier exists.
3053 ///
3054 /// Given
3055 /// \code
3056 ///   namespace N {
3057 ///     namespace M {
3058 ///       class D {};
3059 ///     }
3060 ///   }
3061 ///   N::M::D d;
3062 /// \code
3063 ///
3064 /// \c elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
3065 /// matches the type of the variable declaration of \c d.
AST_MATCHER_P(ElaboratedType,hasQualifier,internal::Matcher<NestedNameSpecifier>,InnerMatcher)3066 AST_MATCHER_P(ElaboratedType, hasQualifier,
3067               internal::Matcher<NestedNameSpecifier>, InnerMatcher) {
3068   if (const NestedNameSpecifier *Qualifier = Node.getQualifier())
3069     return InnerMatcher.matches(*Qualifier, Finder, Builder);
3070 
3071   return false;
3072 }
3073 
3074 /// \brief Matches ElaboratedTypes whose named type matches \c InnerMatcher.
3075 ///
3076 /// Given
3077 /// \code
3078 ///   namespace N {
3079 ///     namespace M {
3080 ///       class D {};
3081 ///     }
3082 ///   }
3083 ///   N::M::D d;
3084 /// \code
3085 ///
3086 /// \c elaboratedType(namesType(recordType(
3087 /// hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
3088 /// declaration of \c d.
AST_MATCHER_P(ElaboratedType,namesType,internal::Matcher<QualType>,InnerMatcher)3089 AST_MATCHER_P(ElaboratedType, namesType, internal::Matcher<QualType>,
3090               InnerMatcher) {
3091   return InnerMatcher.matches(Node.getNamedType(), Finder, Builder);
3092 }
3093 
3094 /// \brief Matches declarations whose declaration context, interpreted as a
3095 /// Decl, matches \c InnerMatcher.
3096 ///
3097 /// Given
3098 /// \code
3099 ///   namespace N {
3100 ///     namespace M {
3101 ///       class D {};
3102 ///     }
3103 ///   }
3104 /// \code
3105 ///
3106 /// \c recordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
3107 /// declaration of \c class \c D.
AST_MATCHER_P(Decl,hasDeclContext,internal::Matcher<Decl>,InnerMatcher)3108 AST_MATCHER_P(Decl, hasDeclContext, internal::Matcher<Decl>, InnerMatcher) {
3109   return InnerMatcher.matches(*Decl::castFromDeclContext(Node.getDeclContext()),
3110                               Finder, Builder);
3111 }
3112 
3113 /// \brief Matches nested name specifiers.
3114 ///
3115 /// Given
3116 /// \code
3117 ///   namespace ns {
3118 ///     struct A { static void f(); };
3119 ///     void A::f() {}
3120 ///     void g() { A::f(); }
3121 ///   }
3122 ///   ns::A a;
3123 /// \endcode
3124 /// nestedNameSpecifier()
3125 ///   matches "ns::" and both "A::"
3126 const internal::VariadicAllOfMatcher<NestedNameSpecifier> nestedNameSpecifier;
3127 
3128 /// \brief Same as \c nestedNameSpecifier but matches \c NestedNameSpecifierLoc.
3129 const internal::VariadicAllOfMatcher<
3130   NestedNameSpecifierLoc> nestedNameSpecifierLoc;
3131 
3132 /// \brief Matches \c NestedNameSpecifierLocs for which the given inner
3133 /// NestedNameSpecifier-matcher matches.
loc(const internal::Matcher<NestedNameSpecifier> & InnerMatcher)3134 inline internal::BindableMatcher<NestedNameSpecifierLoc> loc(
3135     const internal::Matcher<NestedNameSpecifier> &InnerMatcher) {
3136   return internal::BindableMatcher<NestedNameSpecifierLoc>(
3137       new internal::LocMatcher<NestedNameSpecifierLoc, NestedNameSpecifier>(
3138           InnerMatcher));
3139 }
3140 
3141 /// \brief Matches nested name specifiers that specify a type matching the
3142 /// given \c QualType matcher without qualifiers.
3143 ///
3144 /// Given
3145 /// \code
3146 ///   struct A { struct B { struct C {}; }; };
3147 ///   A::B::C c;
3148 /// \endcode
3149 /// nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A")))))
3150 ///   matches "A::"
AST_MATCHER_P(NestedNameSpecifier,specifiesType,internal::Matcher<QualType>,InnerMatcher)3151 AST_MATCHER_P(NestedNameSpecifier, specifiesType,
3152               internal::Matcher<QualType>, InnerMatcher) {
3153   if (Node.getAsType() == NULL)
3154     return false;
3155   return InnerMatcher.matches(QualType(Node.getAsType(), 0), Finder, Builder);
3156 }
3157 
3158 /// \brief Matches nested name specifier locs that specify a type matching the
3159 /// given \c TypeLoc.
3160 ///
3161 /// Given
3162 /// \code
3163 ///   struct A { struct B { struct C {}; }; };
3164 ///   A::B::C c;
3165 /// \endcode
3166 /// nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
3167 ///   hasDeclaration(recordDecl(hasName("A")))))))
3168 ///   matches "A::"
AST_MATCHER_P(NestedNameSpecifierLoc,specifiesTypeLoc,internal::Matcher<TypeLoc>,InnerMatcher)3169 AST_MATCHER_P(NestedNameSpecifierLoc, specifiesTypeLoc,
3170               internal::Matcher<TypeLoc>, InnerMatcher) {
3171   return InnerMatcher.matches(Node.getTypeLoc(), Finder, Builder);
3172 }
3173 
3174 /// \brief Matches on the prefix of a \c NestedNameSpecifier.
3175 ///
3176 /// Given
3177 /// \code
3178 ///   struct A { struct B { struct C {}; }; };
3179 ///   A::B::C c;
3180 /// \endcode
3181 /// nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
3182 ///   matches "A::"
3183 AST_MATCHER_P_OVERLOAD(NestedNameSpecifier, hasPrefix,
3184                        internal::Matcher<NestedNameSpecifier>, InnerMatcher,
3185                        0) {
3186   NestedNameSpecifier *NextNode = Node.getPrefix();
3187   if (NextNode == NULL)
3188     return false;
3189   return InnerMatcher.matches(*NextNode, Finder, Builder);
3190 }
3191 
3192 /// \brief Matches on the prefix of a \c NestedNameSpecifierLoc.
3193 ///
3194 /// Given
3195 /// \code
3196 ///   struct A { struct B { struct C {}; }; };
3197 ///   A::B::C c;
3198 /// \endcode
3199 /// nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
3200 ///   matches "A::"
3201 AST_MATCHER_P_OVERLOAD(NestedNameSpecifierLoc, hasPrefix,
3202                        internal::Matcher<NestedNameSpecifierLoc>, InnerMatcher,
3203                        1) {
3204   NestedNameSpecifierLoc NextNode = Node.getPrefix();
3205   if (!NextNode)
3206     return false;
3207   return InnerMatcher.matches(NextNode, Finder, Builder);
3208 }
3209 
3210 /// \brief Matches nested name specifiers that specify a namespace matching the
3211 /// given namespace matcher.
3212 ///
3213 /// Given
3214 /// \code
3215 ///   namespace ns { struct A {}; }
3216 ///   ns::A a;
3217 /// \endcode
3218 /// nestedNameSpecifier(specifiesNamespace(hasName("ns")))
3219 ///   matches "ns::"
AST_MATCHER_P(NestedNameSpecifier,specifiesNamespace,internal::Matcher<NamespaceDecl>,InnerMatcher)3220 AST_MATCHER_P(NestedNameSpecifier, specifiesNamespace,
3221               internal::Matcher<NamespaceDecl>, InnerMatcher) {
3222   if (Node.getAsNamespace() == NULL)
3223     return false;
3224   return InnerMatcher.matches(*Node.getAsNamespace(), Finder, Builder);
3225 }
3226 
3227 /// \brief Overloads for the \c equalsNode matcher.
3228 /// FIXME: Implement for other node types.
3229 /// @{
3230 
3231 /// \brief Matches if a node equals another node.
3232 ///
3233 /// \c Decl has pointer identity in the AST.
3234 AST_MATCHER_P_OVERLOAD(Decl, equalsNode, Decl*, Other, 0) {
3235   return &Node == Other;
3236 }
3237 /// \brief Matches if a node equals another node.
3238 ///
3239 /// \c Stmt has pointer identity in the AST.
3240 ///
3241 AST_MATCHER_P_OVERLOAD(Stmt, equalsNode, Stmt*, Other, 1) {
3242   return &Node == Other;
3243 }
3244 
3245 /// @}
3246 
3247 } // end namespace ast_matchers
3248 } // end namespace clang
3249 
3250 #endif // LLVM_CLANG_AST_MATCHERS_AST_MATCHERS_H
3251