ASTMatchers.h revision 1a68afd5bbecd05a3bb22854954aa4e5448c4470
14da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//===--- ASTMatchers.h - Structural query framework -------------*- C++ -*-===//
24da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//
34da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//                     The LLVM Compiler Infrastructure
44da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//
54da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek// This file is distributed under the University of Illinois Open Source
64da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek// License. See LICENSE.TXT for details.
74da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//
84da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//===----------------------------------------------------------------------===//
94da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//
104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  This file implements matchers to be used together with the MatchFinder to
114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  match AST nodes.
124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//
134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  Matchers are created by generator functions, which can be combined in
144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  a functional in-language DSL to express queries over the C++ AST.
154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//
164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  For example, to match a class with a certain name, one would call:
172dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper//    recordDecl(hasName("MyClass"))
184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  which returns a matcher that can be used to find all AST nodes that declare
194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  a class named 'MyClass'.
204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//
214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  For more complicated match expressions we're often interested in accessing
224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  multiple parts of the matched AST nodes once a match is found. In that case,
234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  use the id(...) matcher around the match expressions that match the nodes
244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  you want to access.
254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//
264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  For example, when we're interested in child classes of a certain class, we
274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  would write:
282dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper//    recordDecl(hasName("MyClass"), hasChild(id("child", recordDecl())))
294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  When the match is found via the MatchFinder, a user provided callback will
304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  be called with a BoundNodes instance that contains a mapping from the
314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  strings that we provided for the id(...) calls to the nodes that were
324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  matched.
334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  In the given example, each time our matcher finds a match we get a callback
344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  where "child" is bound to the CXXRecordDecl node of the matching child
354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  class declaration.
364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//
374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  See ASTMatchersInternal.h for a more in-depth explanation of the
384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  implementation details of the matcher framework.
394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//
404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  See ASTMatchFinder.h for how to use the generated matchers to run over
414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//  an AST.
424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//
434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek//===----------------------------------------------------------------------===//
444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek#ifndef LLVM_CLANG_AST_MATCHERS_AST_MATCHERS_H
464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek#define LLVM_CLANG_AST_MATCHERS_AST_MATCHERS_H
474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
48e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper#include "clang/AST/DeclTemplate.h"
494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek#include "clang/ASTMatchers/ASTMatchersInternal.h"
504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek#include "clang/ASTMatchers/ASTMatchersMacros.h"
514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek#include "llvm/ADT/Twine.h"
52e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper#include "llvm/Support/Regex.h"
53425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer#include <iterator>
544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimeknamespace clang {
564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimeknamespace ast_matchers {
574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Maps string IDs to AST nodes matched by parts of a matcher.
594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
6025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// The bound nodes are generated by calling \c bind("id") on the node matchers
6125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// of the nodes we want to access later.
624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
6325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// The instances of BoundNodes are created by \c MatchFinder when the user's
644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// callbacks are executed every time a match is found.
654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekclass BoundNodes {
664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekpublic:
6725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek  /// \brief Returns the AST node bound to \c ID.
68a78d0d6203a990b88c9c3e4c4f2a277001e8bd46Manuel Klimek  ///
6925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek  /// Returns NULL if there was no node bound to \c ID or if there is a node but
704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  /// it cannot be converted to the specified type.
71ec2a396c6f11b4017e30f1865f7b62c5a42425b8Manuel Klimek  template <typename T>
72a78d0d6203a990b88c9c3e4c4f2a277001e8bd46Manuel Klimek  const T *getNodeAs(StringRef ID) const {
73ec2a396c6f11b4017e30f1865f7b62c5a42425b8Manuel Klimek    return MyBoundNodes.getNodeAs<T>(ID);
74ec2a396c6f11b4017e30f1865f7b62c5a42425b8Manuel Klimek  }
75ec2a396c6f11b4017e30f1865f7b62c5a42425b8Manuel Klimek
76ec2a396c6f11b4017e30f1865f7b62c5a42425b8Manuel Klimek  /// \brief Deprecated. Please use \c getNodeAs instead.
774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  /// @{
784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  template <typename T>
794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  const T *getDeclAs(StringRef ID) const {
80a78d0d6203a990b88c9c3e4c4f2a277001e8bd46Manuel Klimek    return getNodeAs<T>(ID);
814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  }
824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  template <typename T>
834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  const T *getStmtAs(StringRef ID) const {
84a78d0d6203a990b88c9c3e4c4f2a277001e8bd46Manuel Klimek    return getNodeAs<T>(ID);
854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  }
864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  /// @}
874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekprivate:
894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  /// \brief Create BoundNodes from a pre-filled map of bindings.
90ec2a396c6f11b4017e30f1865f7b62c5a42425b8Manuel Klimek  BoundNodes(internal::BoundNodesMap &MyBoundNodes)
91ec2a396c6f11b4017e30f1865f7b62c5a42425b8Manuel Klimek      : MyBoundNodes(MyBoundNodes) {}
924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
93ec2a396c6f11b4017e30f1865f7b62c5a42425b8Manuel Klimek  internal::BoundNodesMap MyBoundNodes;
944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
95054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  friend class internal::BoundNodesTreeBuilder;
964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek};
974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
9825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \brief If the provided matcher matches a node, binds the node to \c ID.
994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
10025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// FIXME: Do we want to support this now that we have bind()?
1014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename T>
1024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinternal::Matcher<T> id(const std::string &ID,
1039f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek                        const internal::BindableMatcher<T> &InnerMatcher) {
1049f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek  return InnerMatcher.bind(ID);
1054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
1064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
1074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Types of matchers for the top-level classes in the AST class
1084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// hierarchy.
1094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// @{
110e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jaspertypedef internal::Matcher<Decl> DeclarationMatcher;
111e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jaspertypedef internal::Matcher<Stmt> StatementMatcher;
112ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jaspertypedef internal::Matcher<QualType> TypeMatcher;
113ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jaspertypedef internal::Matcher<TypeLoc> TypeLocMatcher;
114a7564433191601cb8851196b8dde39392c9c05eeDaniel Jaspertypedef internal::Matcher<NestedNameSpecifier> NestedNameSpecifierMatcher;
115a7564433191601cb8851196b8dde39392c9c05eeDaniel Jaspertypedef internal::Matcher<NestedNameSpecifierLoc> NestedNameSpecifierLocMatcher;
1164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// @}
1174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
1184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches any node.
1194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
1204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Useful when another matcher requires a child matcher, but there's no
1214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// additional constraint. This will often be used with an explicit conversion
12225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// to an \c internal::Matcher<> type such as \c TypeMatcher.
1234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
12425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Example: \c DeclarationMatcher(anything()) matches all declarations, e.g.,
12525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// "int* p" and "void f()" in
1274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   int* p;
1284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void f();
12925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
13025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
13125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher
132abe922342d67d4ffe05b366a5a2af972185272f8Daniel Jasperinline internal::PolymorphicMatcherWithParam0<internal::TrueMatcher>
133abe922342d67d4ffe05b366a5a2af972185272f8Daniel Jasperanything() {
1344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::PolymorphicMatcherWithParam0<internal::TrueMatcher>();
1354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
1364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
137715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek/// \brief Matches declarations.
138715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek///
139715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek/// Examples matches \c X, \c C, and the friend declaration inside \c C;
140715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek/// \code
141715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek///   void X();
142715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek///   class C {
143715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek///     friend X;
144715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek///   };
145715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek/// \endcode
14606b247f0ffb69854e32150c80f347a9376d3709bManuel Klimekconst internal::VariadicAllOfMatcher<Decl> decl;
147715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek
1484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a declaration of anything that could have a name.
1494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
15025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Example matches \c X, \c S, the anonymous union type, \c i, and \c U;
15125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   typedef int X;
1534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   struct S {
1544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     union {
1554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///       int i;
1564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     } U;
1574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
15825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1592dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, NamedDecl> namedDecl;
1604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
161abe922342d67d4ffe05b366a5a2af972185272f8Daniel Jasper/// \brief Matches a declaration of a namespace.
162abe922342d67d4ffe05b366a5a2af972185272f8Daniel Jasper///
163abe922342d67d4ffe05b366a5a2af972185272f8Daniel Jasper/// Given
164abe922342d67d4ffe05b366a5a2af972185272f8Daniel Jasper/// \code
165abe922342d67d4ffe05b366a5a2af972185272f8Daniel Jasper///   namespace {}
166abe922342d67d4ffe05b366a5a2af972185272f8Daniel Jasper///   namespace test {}
167abe922342d67d4ffe05b366a5a2af972185272f8Daniel Jasper/// \endcode
168abe922342d67d4ffe05b366a5a2af972185272f8Daniel Jasper/// namespaceDecl()
169abe922342d67d4ffe05b366a5a2af972185272f8Daniel Jasper///   matches "namespace {}" and "namespace test {}"
170abe922342d67d4ffe05b366a5a2af972185272f8Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, NamespaceDecl> namespaceDecl;
171abe922342d67d4ffe05b366a5a2af972185272f8Daniel Jasper
1724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches C++ class declarations.
1734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
17425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Example matches \c X, \c Z
17525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X;
1774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   template<class T> class Z {};
17825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
180e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Decl,
1812dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXRecordDecl> recordDecl;
182e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
1838456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// \brief Matches C++ class template declarations.
1848456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko///
18525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Example matches \c Z
18625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1878456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko///   template<class T> class Z {};
18825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1898456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenkoconst internal::VariadicDynCastAllOfMatcher<
1908456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko  Decl,
1912dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  ClassTemplateDecl> classTemplateDecl;
1928456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko
193e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches C++ class template specializations.
194e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
195e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
19625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
197e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   template<typename T> class A {};
198e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   template<> class A<double> {};
199e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   A<int> a;
20025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2012dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// classTemplateSpecializationDecl()
202e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches the specializations \c A<int> and \c A<double>
203e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<
204e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Decl,
2052dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  ClassTemplateSpecializationDecl> classTemplateSpecializationDecl;
206e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
2071a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// \brief Matches declarator declarations (field, variable, function
2081a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// and non-type template parameter declarations).
2091a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek///
2101a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// Given
2111a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// \code
2121a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek///   class X { int y; };
2131a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// \endcode
2141a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// declaratorDecl()
2151a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek///   matches \c int y.
2161a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<Decl, DeclaratorDecl>
2171a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek    declaratorDecl;
2181a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek
2191a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// \brief Matches parameter variable declarations.
2201a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek///
2211a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// Given
2221a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// \code
2231a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek///   void f(int x);
2241a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// \endcode
2251a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// parmVarDecl()
2261a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek///   matches \c int x.
2271a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<Decl, ParmVarDecl> parmVarDecl;
2281a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek
229f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \brief Matches C++ access specifier declarations.
230f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///
231f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// Given
232f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \code
233f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   class C {
234f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   public:
235f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///     int a;
236f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   };
237f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \endcode
238f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// accessSpecDecl()
239f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   matches 'public:'
240f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<
241f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper  Decl,
242f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper  AccessSpecDecl> accessSpecDecl;
243f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper
244f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \brief Matches public C++ declarations.
245f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///
246f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// Given
247f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \code
248f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   class C {
249f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   public:    int a;
250f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   protected: int b;
251f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   private:   int c;
252f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   };
253f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \endcode
254f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// fieldDecl(isPublic())
255f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   matches 'int a;'
256f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel JasperAST_MATCHER(Decl, isPublic) {
257f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper  return Node.getAccess() == AS_public;
258f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper}
259f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper
260f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \brief Matches protected C++ declarations.
261f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///
262f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// Given
263f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \code
264f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   class C {
265f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   public:    int a;
266f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   protected: int b;
267f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   private:   int c;
268f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   };
269f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \endcode
270f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// fieldDecl(isProtected())
271f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   matches 'int b;'
272f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel JasperAST_MATCHER(Decl, isProtected) {
273f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper  return Node.getAccess() == AS_protected;
274f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper}
275f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper
276f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \brief Matches private C++ declarations.
277f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///
278f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// Given
279f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \code
280f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   class C {
281f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   public:    int a;
282f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   protected: int b;
283f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   private:   int c;
284f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   };
285f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \endcode
286f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// fieldDecl(isPrivate())
287f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   matches 'int c;'
288f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel JasperAST_MATCHER(Decl, isPrivate) {
289f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper  return Node.getAccess() == AS_private;
290f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper}
291f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper
292e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches classTemplateSpecializations that have at least one
29325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// TemplateArgument matching the given InnerMatcher.
294e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
295e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
29625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
297e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   template<typename T> class A {};
298e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   template<> class A<double> {};
299e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   A<int> a;
30025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
3012dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// classTemplateSpecializationDecl(hasAnyTemplateArgument(
302e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///     refersToType(asString("int"))))
303e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches the specialization \c A<int>
304e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ClassTemplateSpecializationDecl, hasAnyTemplateArgument,
30525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<TemplateArgument>, InnerMatcher) {
306054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  llvm::ArrayRef<TemplateArgument> List = Node.getTemplateArgs().asArray();
307054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  return matchesFirstInRange(InnerMatcher, List.begin(), List.end(), Finder,
308054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek                             Builder);
309e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
310e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
311089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// \brief Matches expressions that match InnerMatcher after any implicit casts
312089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// are stripped off.
313089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///
314089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Parentheses and explicit casts are not discarded.
315089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Given
31625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
317089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   int arr[5];
318089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   int a = 0;
319089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   char b = 0;
320089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   const int c = a;
321089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   int *d = arr;
322089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   long e = (long) 0l;
32325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
324089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// The matchers
32525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
3262dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///    varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
3272dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///    varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
32825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
329089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// would match the declarations for a, b, c, and d, but not e.
33025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// While
33125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
3322dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///    varDecl(hasInitializer(integerLiteral()))
3332dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///    varDecl(hasInitializer(declRefExpr()))
33425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
335089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// only match the declarations for b, c, and d.
336089e5b3bf2e57da0173b170ad501867b43395385Sam PanzerAST_MATCHER_P(Expr, ignoringImpCasts,
337089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer              internal::Matcher<Expr>, InnerMatcher) {
338089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer  return InnerMatcher.matches(*Node.IgnoreImpCasts(), Finder, Builder);
339089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer}
340089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer
341089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// \brief Matches expressions that match InnerMatcher after parentheses and
342089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// casts are stripped off.
343089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///
344089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Implicit and non-C Style casts are also discarded.
345089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Given
34625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
347089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   int a = 0;
348089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   char b = (0);
349089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   void* c = reinterpret_cast<char*>(0);
350089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   char d = char(0);
35125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
352089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// The matcher
3532dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///    varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
354089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// would match the declarations for a, b, c, and d.
355089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// while
3562dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///    varDecl(hasInitializer(integerLiteral()))
357089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// only match the declaration for a.
358089e5b3bf2e57da0173b170ad501867b43395385Sam PanzerAST_MATCHER_P(Expr, ignoringParenCasts, internal::Matcher<Expr>, InnerMatcher) {
359089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer  return InnerMatcher.matches(*Node.IgnoreParenCasts(), Finder, Builder);
360089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer}
361089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer
362089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// \brief Matches expressions that match InnerMatcher after implicit casts and
363089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// parentheses are stripped off.
364089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///
365089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Explicit casts are not discarded.
366089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Given
36725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
368089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   int arr[5];
369089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   int a = 0;
370089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   char b = (0);
371089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   const int c = a;
372089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   int *d = (arr);
373089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   long e = ((long) 0l);
37425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
375089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// The matchers
3762dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///    varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
3772dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///    varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
378089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// would match the declarations for a, b, c, and d, but not e.
379089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// while
3802dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///    varDecl(hasInitializer(integerLiteral()))
3812dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///    varDecl(hasInitializer(declRefExpr()))
382089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// would only match the declaration for a.
383089e5b3bf2e57da0173b170ad501867b43395385Sam PanzerAST_MATCHER_P(Expr, ignoringParenImpCasts,
384089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer              internal::Matcher<Expr>, InnerMatcher) {
385089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer  return InnerMatcher.matches(*Node.IgnoreParenImpCasts(), Finder, Builder);
386089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer}
387089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer
388e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches classTemplateSpecializations where the n'th TemplateArgument
38925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// matches the given InnerMatcher.
390e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
391e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
39225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
393e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   template<typename T, typename U> class A {};
394e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   A<bool, int> b;
395e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   A<int, bool> c;
39625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
3972dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// classTemplateSpecializationDecl(hasTemplateArgument(
398e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///     1, refersToType(asString("int"))))
399e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches the specialization \c A<bool, int>
400e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P2(ClassTemplateSpecializationDecl, hasTemplateArgument,
40125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek               unsigned, N, internal::Matcher<TemplateArgument>, InnerMatcher) {
402e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const TemplateArgumentList &List = Node.getTemplateArgs();
403e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  if (List.size() <= N)
404e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    return false;
40525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek  return InnerMatcher.matches(List.get(N), Finder, Builder);
406e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
407e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
408e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches a TemplateArgument that refers to a certain type.
409e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
410e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
41125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
412e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   struct X {};
413e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   template<typename T> struct A {};
414e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   A<X> a;
41525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
4162dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// classTemplateSpecializationDecl(hasAnyTemplateArgument(
417e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///     refersToType(class(hasName("X")))))
418e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches the specialization \c A<X>
419e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(TemplateArgument, refersToType,
42025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<QualType>, InnerMatcher) {
421e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  if (Node.getKind() != TemplateArgument::Type)
422e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    return false;
42325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek  return InnerMatcher.matches(Node.getAsType(), Finder, Builder);
424e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
425e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
426e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches a TemplateArgument that refers to a certain declaration.
427e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
428e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
42925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
430e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   template<typename T> struct A {};
431e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   struct B { B* next; };
432e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   A<&B::next> a;
43325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
4342dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// classTemplateSpecializationDecl(hasAnyTemplateArgument(
4352dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     refersToDeclaration(fieldDecl(hasName("next"))))
4362dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///   matches the specialization \c A<&B::next> with \c fieldDecl(...) matching
437e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///     \c B::next
438e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(TemplateArgument, refersToDeclaration,
43925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<Decl>, InnerMatcher) {
440aaa8e45b8e392a1f1b7498e2f00c6ed66d41119aDaniel Jasper  if (Node.getKind() == TemplateArgument::Declaration)
441aaa8e45b8e392a1f1b7498e2f00c6ed66d41119aDaniel Jasper    return InnerMatcher.matches(*Node.getAsDecl(), Finder, Builder);
442e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return false;
443e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
4444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
4454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches C++ constructor declarations.
4464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
4474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches Foo::Foo() and Foo::Foo(int)
44825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
4494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Foo {
4504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///    public:
4514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     Foo();
4524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     Foo(int);
4534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     int DoSomething();
4544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
45525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
4564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
457e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Decl,
4582dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXConstructorDecl> constructorDecl;
459e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
460e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches explicit C++ destructor declarations.
461e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
462e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Example matches Foo::~Foo()
46325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
464e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   class Foo {
465e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///    public:
466e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///     virtual ~Foo();
467e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   };
46825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
4692dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<
4702dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  Decl,
4712dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXDestructorDecl> destructorDecl;
472e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
473e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches enum declarations.
474e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
475e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Example matches X
47625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
477e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   enum X {
478e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///     A, B, C
479e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   };
48025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
481e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, EnumDecl> enumDecl;
482e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
483e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches enum constants.
484e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
485e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Example matches A, B, C
48625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
487e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   enum X {
488e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///     A, B, C
489e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   };
49025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
491e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<
492e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Decl,
4932dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  EnumConstantDecl> enumConstantDecl;
4944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
4954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches method declarations.
4964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
4974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches y
49825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
4994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X { void y() };
50025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
5012dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, CXXMethodDecl> methodDecl;
5024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
5034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches variable declarations.
5044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
5054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Note: this does not match declarations of member variables, which are
5064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// "field" declarations in Clang parlance.
5074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
5084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a
50925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
5104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   int a;
51125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
5122dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, VarDecl> varDecl;
5134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
5144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches field declarations.
5154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
5164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
51725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
5184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X { int m; };
51925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
5202dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// fieldDecl()
5214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches 'm'.
5222dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, FieldDecl> fieldDecl;
5234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
5244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches function declarations.
5254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
5264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches f
52725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
5284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void f();
52925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
5302dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, FunctionDecl> functionDecl;
5314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
5328456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// \brief Matches C++ function template declarations.
5338456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko///
5348456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// Example matches f
53525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
5368456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko///   template<class T> void f(T t) {}
53725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
5388456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenkoconst internal::VariadicDynCastAllOfMatcher<
5398456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko  Decl,
5402dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  FunctionTemplateDecl> functionTemplateDecl;
5414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
5424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches statements.
5434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
5444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
54525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
5464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   { ++a; }
54725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
5482dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// stmt()
5494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches both the compound statement '{ ++a; }' and '++a'.
55006b247f0ffb69854e32150c80f347a9376d3709bManuel Klimekconst internal::VariadicAllOfMatcher<Stmt> stmt;
5514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
5524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches declaration statements.
5534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
5544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
55525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
5564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   int a;
55725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
5582dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declStmt()
5594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches 'int a'.
5604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
561e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Stmt,
5622dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  DeclStmt> declStmt;
5634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
5644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches member expressions.
5654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
5664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
56725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
5684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y {
5694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
5704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     int a; static int b;
5714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
57225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
5732dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// memberExpr()
5744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches this->x, x, y.x, a, this->b
5752dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, MemberExpr> memberExpr;
5764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
5774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches call expressions.
5784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
5799f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek/// Example matches x.y() and y()
58025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
5814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   X x;
5824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   x.y();
5839f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek///   y();
58425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
5852dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CallExpr> callExpr;
586e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
58731f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \brief Matches lambda expressions.
58831f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper///
58931f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// Example matches [&](){return 5;}
59031f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \code
59131f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper///   [&](){return 5;}
59231f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \endcode
59331f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, LambdaExpr> lambdaExpr;
59431f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper
5959f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek/// \brief Matches member call expressions.
5969f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek///
5979f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek/// Example matches x.y()
59825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
5999f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek///   X x;
6009f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek///   x.y();
60125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
6022dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<
6032dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  Stmt,
6042dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXMemberCallExpr> memberCallExpr;
6059f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek
606e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches init list expressions.
607e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
608e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
60925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
610e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   int a[] = { 1, 2 };
611e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   struct B { int x, y; };
612e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   B b = { 5, 6 };
61325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
614e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// initList()
615e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches "{ 1, 2 }" and "{ 5, 6 }"
616e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, InitListExpr> initListExpr;
617e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
618e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches using declarations.
619e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
620e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
62125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
622e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   namespace X { int x; }
623e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   using X::x;
62425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
625e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// usingDecl()
626e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches \code using X::x \endcode
627e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, UsingDecl> usingDecl;
6284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
6294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches constructor call expressions (including implicit ones).
6304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
6314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches string(ptr, n) and ptr within arguments of f
6322dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = constructExpr())
63325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
6344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void f(const string &a, const string &b);
6354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   char *ptr;
6364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   int n;
6374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   f(string(ptr, n), ptr);
63825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
6394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
640e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Stmt,
6412dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXConstructExpr> constructExpr;
6424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
64370b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// \brief Matches implicit and explicit this expressions.
64470b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek///
64570b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// Example matches the implicit this expression in "return i".
64670b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek///     (matcher = thisExpr())
64770b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// \code
64870b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// struct foo {
64970b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek///   int i;
65070b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek///   int f() { return i; }
65170b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// };
65270b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// \endcode
65370b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimekconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXThisExpr> thisExpr;
65470b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek
6554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches nodes where temporaries are created.
6564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
6574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches FunctionTakesString(GetStringByValue())
6582dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = bindTemporaryExpr())
65925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
6604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   FunctionTakesString(GetStringByValue());
6614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   FunctionTakesStringByPointer(GetStringPointer());
66225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
6634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
664e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Stmt,
6652dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXBindTemporaryExpr> bindTemporaryExpr;
6664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
667e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \brief Matches nodes where temporaries are materialized.
668e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer///
669e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// Example: Given
670e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \code
671e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer///   struct T {void func()};
672e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer///   T f();
673e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer///   void g(T);
674e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \endcode
675e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// materializeTemporaryExpr() matches 'f()' in these statements
676e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \code
677e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer///   T u(f());
678e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer///   g(f());
679e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \endcode
680e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// but does not match
681e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \code
682e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer///   f();
683e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer///   f().func();
684e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \endcode
685e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzerconst internal::VariadicDynCastAllOfMatcher<
686e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer  Stmt,
687e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer  MaterializeTemporaryExpr> materializeTemporaryExpr;
688e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer
6894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches new expressions.
6904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
6914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
69225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
6934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   new X;
69425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
6952dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// newExpr()
6964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches 'new X'.
6972dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXNewExpr> newExpr;
698e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
699e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches delete expressions.
700e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
701e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
70225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
703e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   delete X;
70425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
7052dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// deleteExpr()
706e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches 'delete X'.
7072dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXDeleteExpr> deleteExpr;
708e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
709e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches array subscript expressions.
710e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
711e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
71225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
713e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   int i = a[1];
71425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
715e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// arraySubscriptExpr()
716e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches "a[1]"
717e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<
718e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Stmt,
719e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  ArraySubscriptExpr> arraySubscriptExpr;
7204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
7214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the value of a default argument at the call site.
7224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
7234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches the CXXDefaultArgExpr placeholder inserted for the
7244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     default value of the second parameter in the call expression f(42)
7252dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = defaultArgExpr())
72625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
7274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void f(int x, int y = 0);
7284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   f(42);
72925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
7304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
731e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Stmt,
7322dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXDefaultArgExpr> defaultArgExpr;
7334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
7344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches overloaded operator calls.
7354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
7364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Note that if an operator isn't overloaded, it won't match. Instead, use
7374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// binaryOperator matcher.
7384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Currently it does not match operators such as new delete.
7394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: figure out why these do not match?
7404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
7414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches both operator<<((o << b), c) and operator<<(o, b)
7422dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = operatorCallExpr())
74325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
7444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   ostream &operator<< (ostream &out, int i) { };
7454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   ostream &o; int b = 1, c = 1;
7464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   o << b << c;
74725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
7484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
749e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Stmt,
7502dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXOperatorCallExpr> operatorCallExpr;
7514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
7524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches expressions.
7534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
7544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches x()
75525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
7564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void f() { x(); }
75725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
7582dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, Expr> expr;
7594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
7604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches expressions that refer to declarations.
7614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
7624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches x in if (x)
76325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
7644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   bool x;
7654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   if (x) {}
76625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
7672dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, DeclRefExpr> declRefExpr;
7684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
7694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if statements.
7704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
7714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches 'if (x) {}'
77225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
7734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   if (x) {}
77425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
775e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, IfStmt> ifStmt;
7764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
7774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches for statements.
7784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
7794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches 'for (;;) {}'
78025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
7814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   for (;;) {}
78231f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper///   int i[] =  {1, 2, 3}; for (auto a : i);
78325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
7842dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, ForStmt> forStmt;
7854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
78631f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \brief Matches range-based for statements.
78731f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper///
78831f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// forRangeStmt() matches 'for (auto a : i)'
78931f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \code
79031f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper///   int i[] =  {1, 2, 3}; for (auto a : i);
79131f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper///   for(int j = 0; j < 5; ++j);
79231f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \endcode
79331f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXForRangeStmt> forRangeStmt;
79431f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper
7956a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches the increment statement of a for loop.
7966a12449ec8862211856447d3df4c082a346339f2Daniel Jasper///
7976a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// Example:
7986a12449ec8862211856447d3df4c082a346339f2Daniel Jasper///     forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
7996a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// matches '++x' in
80025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
8016a12449ec8862211856447d3df4c082a346339f2Daniel Jasper///     for (x; x < N; ++x) { }
80225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
8036a12449ec8862211856447d3df4c082a346339f2Daniel JasperAST_MATCHER_P(ForStmt, hasIncrement, internal::Matcher<Stmt>,
8046a12449ec8862211856447d3df4c082a346339f2Daniel Jasper              InnerMatcher) {
8056a12449ec8862211856447d3df4c082a346339f2Daniel Jasper  const Stmt *const Increment = Node.getInc();
8066a12449ec8862211856447d3df4c082a346339f2Daniel Jasper  return (Increment != NULL &&
8076a12449ec8862211856447d3df4c082a346339f2Daniel Jasper          InnerMatcher.matches(*Increment, Finder, Builder));
8086a12449ec8862211856447d3df4c082a346339f2Daniel Jasper}
8096a12449ec8862211856447d3df4c082a346339f2Daniel Jasper
8106a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches the initialization statement of a for loop.
8116a12449ec8862211856447d3df4c082a346339f2Daniel Jasper///
8126a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// Example:
8132dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     forStmt(hasLoopInit(declStmt()))
8146a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// matches 'int x = 0' in
81525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
8166a12449ec8862211856447d3df4c082a346339f2Daniel Jasper///     for (int x = 0; x < N; ++x) { }
81725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
8186a12449ec8862211856447d3df4c082a346339f2Daniel JasperAST_MATCHER_P(ForStmt, hasLoopInit, internal::Matcher<Stmt>,
8196a12449ec8862211856447d3df4c082a346339f2Daniel Jasper              InnerMatcher) {
8206a12449ec8862211856447d3df4c082a346339f2Daniel Jasper  const Stmt *const Init = Node.getInit();
8216a12449ec8862211856447d3df4c082a346339f2Daniel Jasper  return (Init != NULL && InnerMatcher.matches(*Init, Finder, Builder));
8226a12449ec8862211856447d3df4c082a346339f2Daniel Jasper}
8236a12449ec8862211856447d3df4c082a346339f2Daniel Jasper
8244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches while statements.
8254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
8264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
82725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
8284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   while (true) {}
82925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
8304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// whileStmt()
8314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches 'while (true) {}'.
8322dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, WhileStmt> whileStmt;
8334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
8344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches do statements.
8354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
8364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
83725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
8384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   do {} while (true);
83925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
8404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// doStmt()
8414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches 'do {} while(true)'
842e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, DoStmt> doStmt;
8434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
844b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches break statements.
845b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///
846b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given
847b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code
848b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   while (true) { break; }
849b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode
850b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// breakStmt()
851b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   matches 'break'
852b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, BreakStmt> breakStmt;
853b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper
854b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches continue statements.
855b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///
856b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given
857b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code
858b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   while (true) { continue; }
859b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode
860b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// continueStmt()
861b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   matches 'continue'
862b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, ContinueStmt> continueStmt;
863b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper
864b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches return statements.
865b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///
866b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given
867b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code
868b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   return 1;
869b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode
870b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// returnStmt()
871b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   matches 'return 1'
872b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, ReturnStmt> returnStmt;
873b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper
874b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches goto statements.
875b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///
876b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given
877b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code
878b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   goto FOO;
879b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   FOO: bar();
880b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode
881b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// gotoStmt()
882b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   matches 'goto FOO'
883b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, GotoStmt> gotoStmt;
884b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper
885b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches label statements.
886b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///
887b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given
888b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code
889b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   goto FOO;
890b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   FOO: bar();
891b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode
892b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// labelStmt()
893b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   matches 'FOO:'
894b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, LabelStmt> labelStmt;
895b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper
896b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches switch statements.
897b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///
898b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given
899b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code
900b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   switch(a) { case 42: break; default: break; }
901b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode
902b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// switchStmt()
903b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   matches 'switch(a)'.
904b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, SwitchStmt> switchStmt;
905b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper
9064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches case and default statements inside switch statements.
9074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
9084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
90925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
9104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   switch(a) { case 42: break; default: break; }
91125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
9124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// switchCase()
9134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches 'case 42: break;' and 'default: break;'.
9142dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, SwitchCase> switchCase;
9154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
916acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \brief Matches case statements inside switch statements.
917acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///
918acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// Given
919acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \code
920acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///   switch(a) { case 42: break; default: break; }
921acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \endcode
922acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// caseStmt()
923acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///   matches 'case 42: break;'.
924acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourneconst internal::VariadicDynCastAllOfMatcher<Stmt, CaseStmt> caseStmt;
925acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne
926acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \brief Matches default statements inside switch statements.
927acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///
928acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// Given
929acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \code
930acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///   switch(a) { case 42: break; default: break; }
931acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \endcode
932acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// defaultStmt()
933acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///   matches 'default: break;'.
934acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourneconst internal::VariadicDynCastAllOfMatcher<Stmt, DefaultStmt> defaultStmt;
935acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne
9364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches compound statements.
9374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
9384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches '{}' and '{{}}'in 'for (;;) {{}}'
93925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
9404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   for (;;) {{}}
94125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
9422dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CompoundStmt> compoundStmt;
9434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
944b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches catch statements.
945b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///
946b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code
947b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   try {} catch(int i) {}
948b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode
949b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// catchStmt()
950b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   matches 'catch(int i)'
951b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXCatchStmt> catchStmt;
952b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper
953b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches try statements.
954b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///
955b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code
956b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   try {} catch(int i) {}
957b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode
958b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// tryStmt()
959b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   matches 'try {}'
960b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXTryStmt> tryStmt;
961b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper
962b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches throw expressions.
963b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///
964b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code
965b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   try { throw 5; } catch(int i) {}
966b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode
967b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// throwExpr()
968b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   matches 'throw 5'
969b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXThrowExpr> throwExpr;
970b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper
971b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches null statements.
972b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///
973b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code
974b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   foo();;
975b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode
976b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// nullStmt()
977b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   matches the second ';'
978b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, NullStmt> nullStmt;
979b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper
980b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches asm statements.
981b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///
982b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code
983b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///  int i = 100;
984b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   __asm("mov al, 2");
985b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode
986b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// asmStmt()
987b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   matches '__asm("mov al, 2")'
988b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, AsmStmt> asmStmt;
989b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper
9904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches bool literals.
9914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
9924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches true
99325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
9944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   true
99525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
9964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
9973680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper  Stmt,
998e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  CXXBoolLiteralExpr> boolLiteral;
9994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
10004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches string literals (also matches wide string literals).
10014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
10024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches "abcd", L"abcd"
100325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
10044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   char *s = "abcd"; wchar_t *ws = L"abcd"
100525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
10064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
10073680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper  Stmt,
1008e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  StringLiteral> stringLiteral;
10094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
10104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches character literals (also matches wchar_t).
10114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
10124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
10134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// though.
10144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
10154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches 'a', L'a'
101625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
10174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   char ch = 'a'; wchar_t chw = L'a';
101825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
10194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
10203680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper  Stmt,
1021e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  CharacterLiteral> characterLiteral;
10224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
10234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches integer literals of all sizes / encodings.
10244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
10254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Not matching character-encoded integers such as L'a'.
10264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
10274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches 1, 1L, 0x1, 1U
10284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
10293680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper  Stmt,
1030e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  IntegerLiteral> integerLiteral;
10314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
103231f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \brief Matches user defined literal operator call.
103331f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper///
103431f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// Example match: "foo"_suffix
103531f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<
103631f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper  Stmt,
103731f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper  UserDefinedLiteral> userDefinedLiteral;
103831f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper
1039afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith/// \brief Matches compound (i.e. non-scalar) literals
1040afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith///
1041afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith/// Example match: {1}, (1, 2)
1042afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith/// \code
1043afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith///   int array[4] = {1}; vector int myvec = (vector int)(1, 2);
1044afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith/// \endcode
1045afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smithconst internal::VariadicDynCastAllOfMatcher<
1046afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith  Stmt,
1047afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith  CompoundLiteralExpr> compoundLiteralExpr;
1048afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith
104931f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \brief Matches nullptr literal.
105031f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<
105131f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper  Stmt,
105231f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper  CXXNullPtrLiteralExpr> nullPtrLiteralExpr;
105331f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper
10544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches binary operator expressions.
10554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
10564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a || b
105725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
10584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   !(a || b)
105925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
10604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
1061e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Stmt,
1062e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  BinaryOperator> binaryOperator;
10634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
10644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches unary operator expressions.
10654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
10664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches !a
106725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
10684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   !a || b
106925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
10704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
1071e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Stmt,
1072e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  UnaryOperator> unaryOperator;
10734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
10744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches conditional operator expressions.
10754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
10764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a ? b : c
107725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
10784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   (a ? b : c) + 42
107925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
10804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
1081e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Stmt,
1082e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  ConditionalOperator> conditionalOperator;
10834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
10844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a reinterpret_cast expression.
10854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
10864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Either the source expression or the destination type can be matched
10874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// using has(), but hasDestinationType() is more specific and can be
10884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// more readable.
10894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
10904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches reinterpret_cast<char*>(&p) in
109125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
10924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void* p = reinterpret_cast<char*>(&p);
109325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
10944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
10953680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper  Stmt,
10962dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXReinterpretCastExpr> reinterpretCastExpr;
10974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
10984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a C++ static_cast expression.
10994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
11004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \see hasDestinationType
11014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \see reinterpretCast
11024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
11034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example:
11042dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///   staticCastExpr()
11054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches
11064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   static_cast<long>(8)
11074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// in
110825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
11094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   long eight(static_cast<long>(8));
111025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
11114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
11123680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper  Stmt,
11132dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXStaticCastExpr> staticCastExpr;
11144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
11154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a dynamic_cast expression.
11164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
11174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example:
11182dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///   dynamicCastExpr()
11194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches
11204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   dynamic_cast<D*>(&b);
11214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// in
112225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
11234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   struct B { virtual ~B() {} }; struct D : B {};
11244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   B b;
11254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   D* p = dynamic_cast<D*>(&b);
112625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
11274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
11283680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper  Stmt,
11292dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXDynamicCastExpr> dynamicCastExpr;
11304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
11314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a const_cast expression.
11324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
11334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: Matches const_cast<int*>(&r) in
113425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
11354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   int n = 42;
113625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///   const int &r(n);
11374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   int* p = const_cast<int*>(&r);
113825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
11394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
11403680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper  Stmt,
11412dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXConstCastExpr> constCastExpr;
11424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
1143e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper/// \brief Matches a C-style cast expression.
1144e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper///
1145e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper/// Example: Matches (int*) 2.2f in
1146e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper/// \code
1147e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper///   int i = (int) 2.2f;
1148e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper/// \endcode
1149e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<
1150e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper  Stmt,
1151e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper  CStyleCastExpr> cStyleCastExpr;
1152e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper
11534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches explicit cast expressions.
11544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
11554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Matches any cast expression written in user code, whether it be a
11564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// C-style cast, a functional-style cast, or a keyword cast.
11574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
11584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Does not match implicit conversions.
11594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
11604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Note: the name "explicitCast" is chosen to match Clang's terminology, as
11614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Clang uses the term "cast" to apply to implicit conversions as well as to
11624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// actual cast expressions.
11634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
11644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \see hasDestinationType.
11654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
11664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: matches all five of the casts in
116725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
11684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42)))))
116925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
11704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// but does not match the implicit conversion in
117125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
11724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   long ell = 42;
117325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
11744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
11753680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper  Stmt,
11762dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  ExplicitCastExpr> explicitCastExpr;
11774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
11784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the implicit cast nodes of Clang's AST.
11794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
11804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// This matches many different places, including function call return value
11814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// eliding, as well as any type conversions.
11824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
11833680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper  Stmt,
11842dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  ImplicitCastExpr> implicitCastExpr;
11854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
1186089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// \brief Matches any cast nodes of Clang's AST.
1187089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///
1188089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Example: castExpr() matches each of the following:
118925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1190089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   (int) 3;
1191089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   const_cast<Expr *>(SubExpr);
1192089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   char c = 0;
119325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1194089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// but does not match
119525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1196089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   int i = (0);
1197089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   int k = 0;
119825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
11993680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CastExpr> castExpr;
1200089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer
12014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches functional cast expressions
12024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
12034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: Matches Foo(bar);
120425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
12054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   Foo f = bar;
12064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   Foo g = (Foo) bar;
12074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   Foo h = Foo(bar);
120825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
12094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
12103680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper  Stmt,
12112dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXFunctionalCastExpr> functionalCastExpr;
12124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
1213a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \brief Matches \c QualTypes in the clang AST.
1214a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasperconst internal::VariadicAllOfMatcher<QualType> qualType;
1215a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper
1216a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \brief Matches \c Types in the clang AST.
121706b247f0ffb69854e32150c80f347a9376d3709bManuel Klimekconst internal::VariadicAllOfMatcher<Type> type;
1218a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper
1219a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \brief Matches \c TypeLocs in the clang AST.
122006b247f0ffb69854e32150c80f347a9376d3709bManuel Klimekconst internal::VariadicAllOfMatcher<TypeLoc> typeLoc;
1221a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper
12227387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \brief Matches if any of the given matchers matches.
12237387673f83b8b37f660422947c9990778ba88193Manuel Klimek///
12247387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// Unlike \c anyOf, \c eachOf will generate a match result for each
12257387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// matching submatcher.
12267387673f83b8b37f660422947c9990778ba88193Manuel Klimek///
12277387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// For example, in:
12287387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \code
12297387673f83b8b37f660422947c9990778ba88193Manuel Klimek///   class A { int a; int b; };
12307387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \endcode
12317387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// The matcher:
12327387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \code
12337387673f83b8b37f660422947c9990778ba88193Manuel Klimek///   recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
12347387673f83b8b37f660422947c9990778ba88193Manuel Klimek///                     has(fieldDecl(hasName("b")).bind("v"))))
12357387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \endcode
12367387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// will generate two results binding "v", the first of which binds
12377387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// the field declaration of \c a, the second the field declaration of
12387387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \c b.
12397387673f83b8b37f660422947c9990778ba88193Manuel Klimek///
12407387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// Usable as: Any Matcher
12417387673f83b8b37f660422947c9990778ba88193Manuel Klimektemplate <typename M1, typename M2>
12427387673f83b8b37f660422947c9990778ba88193Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::EachOfMatcher, M1, M2>
12437387673f83b8b37f660422947c9990778ba88193Manuel KlimekeachOf(const M1 &P1, const M2 &P2) {
12447387673f83b8b37f660422947c9990778ba88193Manuel Klimek  return internal::PolymorphicMatcherWithParam2<internal::EachOfMatcher, M1,
12457387673f83b8b37f660422947c9990778ba88193Manuel Klimek                                                M2>(P1, P2);
12467387673f83b8b37f660422947c9990778ba88193Manuel Klimek}
12477387673f83b8b37f660422947c9990778ba88193Manuel Klimek
12484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Various overloads for the anyOf matcher.
12494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// @{
125025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek
125125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \brief Matches if any of the given matchers matches.
125225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
125325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher
125425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimektemplate<typename M1, typename M2>
125525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M1, M2>
125625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekanyOf(const M1 &P1, const M2 &P2) {
12574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher,
125825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek                                                M1, M2 >(P1, P2);
12594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
126025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimektemplate<typename M1, typename M2, typename M3>
126125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M1,
126225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M2, M3> >
126325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekanyOf(const M1 &P1, const M2 &P2, const M3 &P3) {
12644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return anyOf(P1, anyOf(P2, P3));
12654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
126625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimektemplate<typename M1, typename M2, typename M3, typename M4>
126725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M1,
126825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M2,
12694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek        internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher,
127025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek                                               M3, M4> > >
127125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekanyOf(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4) {
1272ff2fcb8db242a54f72bbb4e5595261e12672ed66Daniel Jasper  return anyOf(P1, anyOf(P2, anyOf(P3, P4)));
12734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
127425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimektemplate<typename M1, typename M2, typename M3, typename M4, typename M5>
127525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M1,
127625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M2,
127725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek        internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M3,
12784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek            internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher,
127925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek                                                   M4, M5> > > >
128025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekanyOf(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4, const M5 &P5) {
12814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return anyOf(P1, anyOf(P2, anyOf(P3, anyOf(P4, P5))));
12824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
128325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek
12844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// @}
12854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
12864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Various overloads for the allOf matcher.
12874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// @{
128825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek
128925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \brief Matches if all given matchers match.
129025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
129125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher
12927f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vanetemplate <typename M1, typename M2>
129325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::AllOfMatcher, M1, M2>
129425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekallOf(const M1 &P1, const M2 &P2) {
12957f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane  return internal::PolymorphicMatcherWithParam2<internal::AllOfMatcher, M1, M2>(
12967f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane      P1, P2);
12974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
12987f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vanetemplate <typename M1, typename M2, typename M3>
12997f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vaneinternal::PolymorphicMatcherWithParam2<
13007f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane    internal::AllOfMatcher, M1,
130125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    internal::PolymorphicMatcherWithParam2<internal::AllOfMatcher, M2, M3> >
130225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekallOf(const M1 &P1, const M2 &P2, const M3 &P3) {
13036a12449ec8862211856447d3df4c082a346339f2Daniel Jasper  return allOf(P1, allOf(P2, P3));
13044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
13057f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vanetemplate <typename M1, typename M2, typename M3, typename M4>
13067f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vaneinternal::PolymorphicMatcherWithParam2<
13077f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane    internal::AllOfMatcher, M1,
13087f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane    internal::PolymorphicMatcherWithParam2<
13097f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane        internal::AllOfMatcher, M2, internal::PolymorphicMatcherWithParam2<
13107f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane                                        internal::AllOfMatcher, M3, M4> > >
13117f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin VaneallOf(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4) {
13127f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane  return allOf(P1, allOf(P2, P3, P4));
13137f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane}
13147f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vanetemplate <typename M1, typename M2, typename M3, typename M4, typename M5>
13157f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vaneinternal::PolymorphicMatcherWithParam2<
13167f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane    internal::AllOfMatcher, M1,
13177f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane    internal::PolymorphicMatcherWithParam2<
13187f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane        internal::AllOfMatcher, M2,
13197f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane        internal::PolymorphicMatcherWithParam2<
13207f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane            internal::AllOfMatcher, M3,
13217f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane            internal::PolymorphicMatcherWithParam2<internal::AllOfMatcher, M4,
13227f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane                                                   M5> > > >
13237f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin VaneallOf(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4, const M5 &P5) {
13247f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane  return allOf(P1, allOf(P2, P3, P4, P5));
13257f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane}
132625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek
13274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// @}
13284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
1329e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1330e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
1331e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
133225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1333e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   Foo x = bar;
1334e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   int y = sizeof(x) + alignof(x);
133525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1336e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// unaryExprOrTypeTraitExpr()
1337e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches \c sizeof(x) and \c alignof(x)
1338e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<
1339e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Stmt,
1340e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  UnaryExprOrTypeTraitExpr> unaryExprOrTypeTraitExpr;
1341e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
1342e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches unary expressions that have a specific type of argument.
1343e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
1344e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
134525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1346e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
134725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1348e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
1349e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches \c sizeof(a) and \c alignof(c)
1350e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UnaryExprOrTypeTraitExpr, hasArgumentOfType,
135125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<QualType>, InnerMatcher) {
1352e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const QualType ArgumentType = Node.getTypeOfArgument();
135325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek  return InnerMatcher.matches(ArgumentType, Finder, Builder);
1354e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
1355e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
1356e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches unary expressions of a certain kind.
1357e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
1358e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
135925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1360e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   int x;
1361e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   int s = sizeof(x) + alignof(x)
136225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1363e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
1364e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches \c sizeof(x)
1365e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UnaryExprOrTypeTraitExpr, ofKind, UnaryExprOrTypeTrait, Kind) {
1366e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return Node.getKind() == Kind;
1367e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
1368e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
1369e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Same as unaryExprOrTypeTraitExpr, but only matching
1370e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// alignof.
1371e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<Stmt> alignOfExpr(
137225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
1373415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return stmt(unaryExprOrTypeTraitExpr(allOf(
137425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek      ofKind(UETT_AlignOf), InnerMatcher)));
1375e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
1376e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
1377e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Same as unaryExprOrTypeTraitExpr, but only matching
1378e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// sizeof.
1379e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<Stmt> sizeOfExpr(
138025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
1381415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return stmt(unaryExprOrTypeTraitExpr(
1382415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek      allOf(ofKind(UETT_SizeOf), InnerMatcher)));
1383e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
1384e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
13854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches NamedDecl nodes that have the specified name.
13864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
13874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Supports specifying enclosing namespaces or classes by prefixing the name
13884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with '<enclosing>::'.
13894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Does not match typedefs of an underlying type with the given name.
13904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
13914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X (Name == "X")
139225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
13934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X;
139425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
13954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
13964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
139725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
139825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///   namespace a { namespace b { class X; } }
139925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1400e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(NamedDecl, hasName, std::string, Name) {
14014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  assert(!Name.empty());
14024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  const std::string FullNameString = "::" + Node.getQualifiedNameAsString();
1403cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  const StringRef FullName = FullNameString;
1404cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  const StringRef Pattern = Name;
14054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  if (Pattern.startswith("::")) {
14064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    return FullName == Pattern;
14074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  } else {
14084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    return FullName.endswith(("::" + Pattern).str());
14094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  }
14104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
14114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
141231bdf071afc18bb9551e4f4254be297333200c4aManuel Klimek/// \brief Matches NamedDecl nodes whose fully qualified names contain
141331bdf071afc18bb9551e4f4254be297333200c4aManuel Klimek/// a substring matched by the given RegExp.
1414e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
1415e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Supports specifying enclosing namespaces or classes by
1416e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// prefixing the name with '<enclosing>::'.  Does not match typedefs
1417e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// of an underlying type with the given name.
1418e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
1419e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Example matches X (regexp == "::X")
142025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1421e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   class X;
142225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1423e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
1424e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Example matches X (regexp is one of "::X", "^foo::.*X", among others)
142525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
142625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///   namespace foo { namespace bar { class X; } }
142725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1428e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(NamedDecl, matchesName, std::string, RegExp) {
1429e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  assert(!RegExp.empty());
1430e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  std::string FullNameString = "::" + Node.getQualifiedNameAsString();
1431e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  llvm::Regex RE(RegExp);
1432e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return RE.match(FullNameString);
1433e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
1434e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
14354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches overloaded operator names.
14364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
14374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Matches overloaded operator names specified in strings without the
14386a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// "operator" prefix: e.g. "<<".
14394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
14406a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// Given:
144125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
14426a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   class A { int operator*(); };
14436a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   const A &operator<<(const A &a, const A &b);
14446a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   A a;
14456a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   a << a;   // <-- This matches
144625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
14476a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///
14486a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \c operatorCallExpr(hasOverloadedOperatorName("<<"))) matches the specified
14496a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// line and \c recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
14506a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// the declaration of \c A.
14516a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///
14526a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// Usable as: Matcher<CXXOperatorCallExpr>, Matcher<CXXMethodDecl>
14536a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vaneinline internal::PolymorphicMatcherWithParam1<
14546a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane    internal::HasOverloadedOperatorNameMatcher, StringRef>
14556a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin VanehasOverloadedOperatorName(const StringRef Name) {
14566a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane  return internal::PolymorphicMatcherWithParam1<
14576a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane      internal::HasOverloadedOperatorNameMatcher, StringRef>(Name);
14584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
14594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
14604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches C++ classes that are directly or indirectly derived from
146120b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper/// a class matching \c Base.
14624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
146376dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper/// Note that a class is not considered to be derived from itself.
14644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
146576dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper/// Example matches Y, Z, C (Base == hasName("X"))
146625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
146776dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper///   class X;
14684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y : public X {};  // directly derived
14694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Z : public Y {};  // indirectly derived
14704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   typedef X A;
14714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   typedef A B;
14724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class C : public B {};  // derived from a typedef of X
147325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
14744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
147520b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper/// In the following example, Bar matches isDerivedFrom(hasName("X")):
147625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
14774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Foo;
14784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   typedef Foo X;
14794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Bar : public Foo {};  // derived from a type that X is a typedef of
148025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
148120b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel JasperAST_MATCHER_P(CXXRecordDecl, isDerivedFrom,
148220b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper              internal::Matcher<NamedDecl>, Base) {
148320b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper  return Finder->classIsDerivedFrom(&Node, Base, Builder);
148420b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper}
148520b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper
148620b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper/// \brief Overloaded method as shortcut for \c isDerivedFrom(hasName(...)).
148720b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasperinline internal::Matcher<CXXRecordDecl> isDerivedFrom(StringRef BaseName) {
148820b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper  assert(!BaseName.empty());
148920b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper  return isDerivedFrom(hasName(BaseName));
14904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
14914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
149276dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper/// \brief Similar to \c isDerivedFrom(), but also matches classes that directly
149376dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper/// match \c Base.
149463d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasperinline internal::Matcher<CXXRecordDecl> isSameOrDerivedFrom(
149563d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper    internal::Matcher<NamedDecl> Base) {
149676dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper  return anyOf(Base, isDerivedFrom(Base));
149776dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper}
149876dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper
149963d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper/// \brief Overloaded method as shortcut for
150063d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper/// \c isSameOrDerivedFrom(hasName(...)).
150163d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasperinline internal::Matcher<CXXRecordDecl> isSameOrDerivedFrom(
150263d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper    StringRef BaseName) {
150376dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper  assert(!BaseName.empty());
150463d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper  return isSameOrDerivedFrom(hasName(BaseName));
150576dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper}
150676dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper
15076a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \brief Matches the first method of a class or struct that satisfies \c
15086a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// InnerMatcher.
15096a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///
15106a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// Given:
15116a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \code
15126a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   class A { void func(); };
15136a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   class B { void member(); };
15146a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \code
15156a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///
15166a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \c recordDecl(hasMethod(hasName("func"))) matches the declaration of \c A
15176a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// but not \c B.
15186a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin VaneAST_MATCHER_P(CXXRecordDecl, hasMethod, internal::Matcher<CXXMethodDecl>,
15196a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane              InnerMatcher) {
1520054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  return matchesFirstInPointerRange(InnerMatcher, Node.method_begin(),
1521054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek                                    Node.method_end(), Finder, Builder);
15226a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane}
15236a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane
15244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches AST nodes that have child AST nodes that match the
15254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// provided matcher.
15264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
15272dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
152825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
15294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X {};  // Matches X, because X::X is a class of name X inside X.
15304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y { class X {}; };
15314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Z { class Y { class X {}; }; };  // Does not match Z.
153225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
15334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
15344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// ChildT must be an AST base type.
153525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
153625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher
15374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename ChildT>
15384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinternal::ArgumentAdaptingMatcher<internal::HasMatcher, ChildT> has(
15394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    const internal::Matcher<ChildT> &ChildMatcher) {
15404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::ArgumentAdaptingMatcher<internal::HasMatcher,
15414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek                                           ChildT>(ChildMatcher);
15424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
15434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
15444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches AST nodes that have descendant AST nodes that match the
15454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// provided matcher.
15464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
15474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X, Y, Z
15482dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = recordDecl(hasDescendant(recordDecl(hasName("X")))))
154925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
15504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X {};  // Matches X, because X::X is a class of name X inside X.
15514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y { class X {}; };
15524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Z { class Y { class X {}; }; };
155325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
15544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
15554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// DescendantT must be an AST base type.
155625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
155725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher
15584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename DescendantT>
15594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinternal::ArgumentAdaptingMatcher<internal::HasDescendantMatcher, DescendantT>
15604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekhasDescendant(const internal::Matcher<DescendantT> &DescendantMatcher) {
15614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::ArgumentAdaptingMatcher<
15624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    internal::HasDescendantMatcher,
15634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    DescendantT>(DescendantMatcher);
15644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
15654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
15664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches AST nodes that have child AST nodes that match the
15674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// provided matcher.
15684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
15692dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
157025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
15714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X {};  // Matches X, because X::X is a class of name X inside X.
15724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y { class X {}; };
15734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Z { class Y { class X {}; }; };  // Does not match Z.
157425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
15754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
15764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// ChildT must be an AST base type.
15774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
15784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// As opposed to 'has', 'forEach' will cause a match for each result that
15794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches instead of only on the first one.
158025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
158125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher
15824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename ChildT>
15834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinternal::ArgumentAdaptingMatcher<internal::ForEachMatcher, ChildT> forEach(
158425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    const internal::Matcher<ChildT> &ChildMatcher) {
15854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::ArgumentAdaptingMatcher<
15864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    internal::ForEachMatcher,
15874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    ChildT>(ChildMatcher);
15884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
15894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
15904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches AST nodes that have descendant AST nodes that match the
15914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// provided matcher.
15924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
15934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X, A, B, C
15942dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X")))))
159525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
15964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X {};  // Matches X, because X::X is a class of name X inside X.
15974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class A { class X {}; };
15984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class B { class C { class X {}; }; };
159925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
16004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
16014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// DescendantT must be an AST base type.
16024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
16034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
16044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// each result that matches instead of only on the first one.
16054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
16064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Note: Recursively combined ForEachDescendant can cause many matches:
16072dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///   recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl()))))
16084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// will match 10 times (plus injected class name matches) on:
160925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
16104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class A { class B { class C { class D { class E {}; }; }; }; };
161125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
161225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
161325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher
16144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename DescendantT>
1615a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasperinternal::ArgumentAdaptingMatcher<internal::ForEachDescendantMatcher,
1616a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper                                  DescendantT>
16174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekforEachDescendant(
161825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    const internal::Matcher<DescendantT> &DescendantMatcher) {
16194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::ArgumentAdaptingMatcher<
16204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    internal::ForEachDescendantMatcher,
16214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    DescendantT>(DescendantMatcher);
16224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
16234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
1624152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \brief Matches if the node or any descendant matches.
1625152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek///
1626152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// Generates results for each match.
1627152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek///
1628152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// For example, in:
1629152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \code
1630152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek///   class A { class B {}; class C {}; };
1631152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \endcode
1632152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// The matcher:
1633152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \code
1634152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek///   recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m")))
1635152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \endcode
1636152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// will generate results for \c A, \c B and \c C.
1637152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek///
1638152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// Usable as: Any Matcher
1639152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimektemplate <typename T>
1640152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimekinternal::PolymorphicMatcherWithParam2<
1641152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek    internal::EachOfMatcher, internal::Matcher<T>,
1642152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek    internal::ArgumentAdaptingMatcher<internal::ForEachDescendantMatcher, T> >
1643152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel KlimekfindAll(const internal::Matcher<T> &Matcher) {
1644152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek  return eachOf(Matcher, forEachDescendant(Matcher));
1645152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek}
1646152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek
1647c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// \brief Matches AST nodes that have a parent that matches the provided
1648c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// matcher.
1649c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper///
1650c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// Given
1651c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// \code
1652c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
1653c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// \endcode
1654c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// \c compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
1655c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper///
1656c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// Usable as: Any Matcher
1657c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jaspertemplate <typename ParentT>
1658c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasperinternal::ArgumentAdaptingMatcher<internal::HasParentMatcher, ParentT>
1659c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel JasperhasParent(const internal::Matcher<ParentT> &ParentMatcher) {
1660c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper  return internal::ArgumentAdaptingMatcher<
1661c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper    internal::HasParentMatcher,
1662c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper    ParentT>(ParentMatcher);
1663c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper}
1664c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper
1665579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// \brief Matches AST nodes that have an ancestor that matches the provided
1666579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// matcher.
1667579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek///
1668579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// Given
1669579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// \code
1670579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// void f() { if (true) { int x = 42; } }
1671579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// void g() { for (;;) { int x = 43; } }
1672579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// \endcode
1673a1a4c0385a0fd458243d9e357e1eceb137f29abfNick Lewycky/// \c expr(integerLiteral(hasAncestor(ifStmt()))) matches \c 42, but not 43.
1674579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek///
1675579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// Usable as: Any Matcher
1676579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimektemplate <typename AncestorT>
1677579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimekinternal::ArgumentAdaptingMatcher<internal::HasAncestorMatcher, AncestorT>
1678579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel KlimekhasAncestor(const internal::Matcher<AncestorT> &AncestorMatcher) {
1679579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek  return internal::ArgumentAdaptingMatcher<
1680579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek    internal::HasAncestorMatcher,
1681579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek    AncestorT>(AncestorMatcher);
1682579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek}
1683579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek
16844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the provided matcher does not match.
16854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
16862dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches Y (matcher = recordDecl(unless(hasName("X"))))
168725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
16884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X {};
16894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y {};
169025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
169125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
169225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher
16934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename M>
169425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam1<internal::NotMatcher, M>
169525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekunless(const M &InnerMatcher) {
16964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::PolymorphicMatcherWithParam1<
16974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    internal::NotMatcher, M>(InnerMatcher);
16984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
16994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
170003a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// \brief Matches a node if the declaration associated with that node
170103a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// matches the given matcher.
170203a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek///
170303a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// The associated declaration is:
170403a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// - for type nodes, the declaration of the underlying type
170503a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// - for CallExpr, the declaration of the callee
170603a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// - for MemberExpr, the declaration of the referenced member
170703a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// - for CXXConstructExpr, the declaration of the constructor
170803a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek///
170903a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// Also usable as Matcher<T> for any T supporting the getDecl() member
171003a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// function. e.g. various subtypes of clang::Type and various expressions.
171103a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// FIXME: Add all node types for which this is matcher is usable due to
171203a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// getDecl().
1713523806028d812a7f29636c59a8bc0e7e3d3fd9aeEdwin Vane///
1714c711af2ddbbb1d46223cc9379d32a203fb5bc7f4Daniel Jasper/// Usable as: Matcher<QualType>, Matcher<CallExpr>, Matcher<CXXConstructExpr>,
17153abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///   Matcher<MemberExpr>, Matcher<TypedefType>,
17163abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///   Matcher<TemplateSpecializationType>
17174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinline internal::PolymorphicMatcherWithParam1< internal::HasDeclarationMatcher,
1718e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper                                     internal::Matcher<Decl> >
1719e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    hasDeclaration(const internal::Matcher<Decl> &InnerMatcher) {
17204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::PolymorphicMatcherWithParam1<
17214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    internal::HasDeclarationMatcher,
1722e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    internal::Matcher<Decl> >(InnerMatcher);
17234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
17244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
17254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches on the implicit object argument of a member call expression.
17264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
17272dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y"))))))
172825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
17294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y { public: void x(); };
17304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void z() { Y y; y.x(); }",
173125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
17324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
17334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: Overload to allow directly matching types?
1734e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXMemberCallExpr, on, internal::Matcher<Expr>,
17354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek              InnerMatcher) {
1736f8c12146fa2153a6d97b7c92d27d2ece0cd26e79Dmitri Gribenko  const Expr *ExprNode = Node.getImplicitObjectArgument()
1737f8c12146fa2153a6d97b7c92d27d2ece0cd26e79Dmitri Gribenko                            ->IgnoreParenImpCasts();
17384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (ExprNode != NULL &&
17394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*ExprNode, Finder, Builder));
17404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
17414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
17424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the call expression's callee expression matches.
17434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
17444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
174525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
17464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y { void x() { this->x(); x(); Y y; y.x(); } };
17474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void f() { f(); }
174825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
17492dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// callExpr(callee(expr()))
17504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches this->x(), x(), y.x(), f()
17514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with callee(...)
17524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matching this->x, x, y.x, f respectively
17534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
1754e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Note: Callee cannot take the more general internal::Matcher<Expr>
17554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// because this introduces ambiguous overloads with calls to Callee taking a
1756e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// internal::Matcher<Decl>, as the matcher hierarchy is purely
17574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// implemented in terms of implicit casts.
1758e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CallExpr, callee, internal::Matcher<Stmt>,
17594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek              InnerMatcher) {
1760e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Expr *ExprNode = Node.getCallee();
17614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (ExprNode != NULL &&
17624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*ExprNode, Finder, Builder));
17634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
17644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
17654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the call expression's callee's declaration matches the
17664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// given matcher.
17674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
17682dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x")))))
176925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
17704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y { public: void x(); };
17714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void z() { Y y; y.x();
177225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1773e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<CallExpr> callee(
1774e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    const internal::Matcher<Decl> &InnerMatcher) {
1775415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return callExpr(hasDeclaration(InnerMatcher));
17764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
17774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
17784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the expression's or declaration's type matches a type
17794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matcher.
17804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
17812dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
17822dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///             and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
178325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
17844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///  class X {};
17854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///  void y(X &x) { x; X z; }
178625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1787e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_POLYMORPHIC_MATCHER_P(hasType, internal::Matcher<QualType>,
17884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek                          InnerMatcher) {
1789e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  TOOLING_COMPILE_ASSERT((llvm::is_base_of<Expr, NodeType>::value ||
1790e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper                          llvm::is_base_of<ValueDecl, NodeType>::value),
17914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek                         instantiated_with_wrong_types);
17924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return InnerMatcher.matches(Node.getType(), Finder, Builder);
17934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
17944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
17954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Overloaded to match the declaration of the expression's or value
17964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// declaration's type.
17974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
17984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// In case of a value declaration (for example a variable declaration),
17994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// this resolves one layer of indirection. For example, in the value
18002dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
18012dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
18024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// of x."
18034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
18042dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
18052dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///             and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
180625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
18074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///  class X {};
18084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///  void y(X &x) { x; X z; }
180925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1810297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek///
1811297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// Usable as: Matcher<Expr>, Matcher<ValueDecl>
18124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinline internal::PolymorphicMatcherWithParam1<
1813415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  internal::matcher_hasType0Matcher,
1814e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  internal::Matcher<QualType> >
1815e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperhasType(const internal::Matcher<Decl> &InnerMatcher) {
1816415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return hasType(qualType(hasDeclaration(InnerMatcher)));
18174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
18184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
18191a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// \brief Matches if the type location of the declarator decl's type matches
18201a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// the inner matcher.
18211a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek///
18221a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// Given
18231a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// \code
18241a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek///   int x;
18251a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// \endcode
18261a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// declaratorDecl(hasTypeLoc(loc(asString("int"))))
18271a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek///   matches int x
18281a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel KlimekAST_MATCHER_P(DeclaratorDecl, hasTypeLoc, internal::Matcher<TypeLoc>, Inner) {
18291a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek  if (!Node.getTypeSourceInfo())
18301a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek    // This happens for example for implicit destructors.
18311a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek    return false;
18321a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek  return Inner.matches(Node.getTypeSourceInfo()->getTypeLoc(), Finder, Builder);
18331a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek}
18341a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek
1835e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches if the matched type is represented by the given string.
1836e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
1837e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
183825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1839e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   class Y { public: void x(); };
1840e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   void z() { Y* y; y->x(); }
184125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
18422dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// callExpr(on(hasType(asString("class Y *"))))
1843e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches y->x()
1844e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(QualType, asString, std::string, Name) {
1845e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return Name == Node.getAsString();
1846e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
1847e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
18484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the matched type is a pointer type and the pointee type
18494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches the specified matcher.
18504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
18514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches y->x()
18522dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = callExpr(on(hasType(pointsTo(recordDecl(hasName("Y")))))))
185325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
18544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y { public: void x(); };
18554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void z() { Y *y; y->x(); }
185625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
18574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekAST_MATCHER_P(
1858e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    QualType, pointsTo, internal::Matcher<QualType>,
18594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    InnerMatcher) {
1860e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return (!Node.isNull() && Node->isPointerType() &&
18614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(Node->getPointeeType(), Finder, Builder));
18624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
18634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
18644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Overloaded to match the pointee type's declaration.
1865e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<QualType> pointsTo(
1866e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    const internal::Matcher<Decl> &InnerMatcher) {
1867415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return pointsTo(qualType(hasDeclaration(InnerMatcher)));
18684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
18694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
18704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the matched type is a reference type and the referenced
18714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// type matches the specified matcher.
18724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
18734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X &x and const X &y
18742dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = varDecl(hasType(references(recordDecl(hasName("X"))))))
187525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
18764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X {
18774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     void a(X b) {
18784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///       X &x = b;
18794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///       const X &y = b;
18804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
188125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1882e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(QualType, references, internal::Matcher<QualType>,
18834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek              InnerMatcher) {
1884e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return (!Node.isNull() && Node->isReferenceType() &&
18854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(Node->getPointeeType(), Finder, Builder));
18864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
18874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
18886a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \brief Matches QualTypes whose canonical type matches InnerMatcher.
18896a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///
18906a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// Given:
18916a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \code
18926a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   typedef int &int_ref;
18936a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   int a;
18946a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   int_ref b = a;
18956a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \code
18966a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///
18976a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \c varDecl(hasType(qualType(referenceType()))))) will not match the
18986a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// declaration of b but \c
18996a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
19006a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin VaneAST_MATCHER_P(QualType, hasCanonicalType, internal::Matcher<QualType>,
19016a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane              InnerMatcher) {
190254eeac9cb538e4fc4eecd81f2eda8f6fa727ca76Edwin Vane  if (Node.isNull())
190354eeac9cb538e4fc4eecd81f2eda8f6fa727ca76Edwin Vane    return false;
19046a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane  return InnerMatcher.matches(Node.getCanonicalType(), Finder, Builder);
19056a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane}
19066a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane
19074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Overloaded to match the referenced type's declaration.
1908e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<QualType> references(
1909e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    const internal::Matcher<Decl> &InnerMatcher) {
1910415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return references(qualType(hasDeclaration(InnerMatcher)));
19114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
19124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
1913e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXMemberCallExpr, onImplicitObjectArgument,
1914e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
1915f8c12146fa2153a6d97b7c92d27d2ece0cd26e79Dmitri Gribenko  const Expr *ExprNode = Node.getImplicitObjectArgument();
19164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (ExprNode != NULL &&
19174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*ExprNode, Finder, Builder));
19184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
19194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
19204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the expression's type either matches the specified
19214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matcher, or is a pointer to a type that matches the InnerMatcher.
19229f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimekinline internal::Matcher<CXXMemberCallExpr> thisPointerType(
1923e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    const internal::Matcher<QualType> &InnerMatcher) {
19244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return onImplicitObjectArgument(
19254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek      anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))));
19264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
19274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
19284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Overloaded to match the type's declaration.
19299f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimekinline internal::Matcher<CXXMemberCallExpr> thisPointerType(
1930e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    const internal::Matcher<Decl> &InnerMatcher) {
19314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return onImplicitObjectArgument(
19324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek      anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))));
19334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
19344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
19354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a DeclRefExpr that refers to a declaration that matches the
19364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// specified matcher.
19374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
19384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches x in if(x)
19392dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = declRefExpr(to(varDecl(hasName("x")))))
194025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
19414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   bool x;
19424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   if (x) {}
194325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1944e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(DeclRefExpr, to, internal::Matcher<Decl>,
19454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek              InnerMatcher) {
1946e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Decl *DeclNode = Node.getDecl();
19474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (DeclNode != NULL &&
19484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*DeclNode, Finder, Builder));
19494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
19504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
1951e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches a \c DeclRefExpr that refers to a declaration through a
1952e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// specific using shadow declaration.
1953e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
1954e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// FIXME: This currently only works for functions. Fix.
1955e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
1956e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
195725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1958e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   namespace a { void f() {} }
1959e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   using a::f;
1960e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   void g() {
1961e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///     f();     // Matches this ..
1962e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///     a::f();  // .. but not this.
1963e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   }
196425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
19652dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declRefExpr(throughUsingDeclaration(anything()))
1966e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches \c f()
1967e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(DeclRefExpr, throughUsingDecl,
196825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<UsingShadowDecl>, InnerMatcher) {
1969e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const NamedDecl *FoundDecl = Node.getFoundDecl();
1970cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  if (const UsingShadowDecl *UsingDecl = dyn_cast<UsingShadowDecl>(FoundDecl))
197125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    return InnerMatcher.matches(*UsingDecl, Finder, Builder);
1972e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return false;
1973e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
1974e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
1975425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// \brief Matches the Decl of a DeclStmt which has a single declaration.
1976425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///
1977425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// Given
197825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1979425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int a, b;
1980425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int c;
198125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
19822dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declStmt(hasSingleDecl(anything()))
1983425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   matches 'int c;' but not 'int a, b;'.
1984425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam PanzerAST_MATCHER_P(DeclStmt, hasSingleDecl, internal::Matcher<Decl>, InnerMatcher) {
1985425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  if (Node.isSingleDecl()) {
1986425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer    const Decl *FoundDecl = Node.getSingleDecl();
1987425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer    return InnerMatcher.matches(*FoundDecl, Finder, Builder);
1988425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  }
1989425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  return false;
1990425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer}
1991425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer
19924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a variable declaration that has an initializer expression
19934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// that matches the given matcher.
19944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
19952dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches x (matcher = varDecl(hasInitializer(callExpr())))
199625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
19974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   bool y() { return true; }
19984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   bool x = y();
199925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
20004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekAST_MATCHER_P(
2001e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    VarDecl, hasInitializer, internal::Matcher<Expr>,
20024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    InnerMatcher) {
2003e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Expr *Initializer = Node.getAnyInitializer();
20044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (Initializer != NULL &&
20054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*Initializer, Finder, Builder));
20064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
20074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
20084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Checks that a call expression or a constructor call expression has
20094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// a specific number of arguments (including absent default arguments).
20104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
20112dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
201225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
20134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void f(int x, int y);
20144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   f(0, 0);
201525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
20164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekAST_POLYMORPHIC_MATCHER_P(argumentCountIs, unsigned, N) {
2017e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  TOOLING_COMPILE_ASSERT((llvm::is_base_of<CallExpr, NodeType>::value ||
2018e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper                          llvm::is_base_of<CXXConstructExpr,
20194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek                                           NodeType>::value),
20204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek                         instantiated_with_wrong_types);
20214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return Node.getNumArgs() == N;
20224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
20234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
20244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the n'th argument of a call expression or a constructor
20254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// call expression.
20264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
20274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches y in x(y)
20282dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = callExpr(hasArgument(0, declRefExpr())))
202925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
20304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void x(int) { int y; x(y); }
203125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
20324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekAST_POLYMORPHIC_MATCHER_P2(
2033e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    hasArgument, unsigned, N, internal::Matcher<Expr>, InnerMatcher) {
2034e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  TOOLING_COMPILE_ASSERT((llvm::is_base_of<CallExpr, NodeType>::value ||
2035e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper                         llvm::is_base_of<CXXConstructExpr,
20364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek                                          NodeType>::value),
20374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek                         instantiated_with_wrong_types);
20384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (N < Node.getNumArgs() &&
20394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(
20404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek              *Node.getArg(N)->IgnoreParenImpCasts(), Finder, Builder));
20414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
20424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
2043425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// \brief Matches declaration statements that contain a specific number of
2044425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// declarations.
2045425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///
2046425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// Example: Given
204725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2048425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int a, b;
2049425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int c;
2050425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int d = 2, e;
205125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2052425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// declCountIs(2)
2053425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2054425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam PanzerAST_MATCHER_P(DeclStmt, declCountIs, unsigned, N) {
2055217c484522926f9fc664ec3bfaf3cffe456244b0Benjamin Kramer  return std::distance(Node.decl_begin(), Node.decl_end()) == (ptrdiff_t)N;
2056425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer}
2057425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer
2058425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// \brief Matches the n'th declaration of a declaration statement.
2059425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///
2060425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// Note that this does not work for global declarations because the AST
2061425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// breaks up multiple-declaration DeclStmt's into multiple single-declaration
2062425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// DeclStmt's.
2063425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// Example: Given non-global declarations
206425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2065425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int a, b = 0;
2066425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int c;
2067425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int d = 2, e;
206825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
20692dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declStmt(containsDeclaration(
20702dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///       0, varDecl(hasInitializer(anything()))))
2071425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   matches only 'int d = 2, e;', and
20722dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declStmt(containsDeclaration(1, varDecl()))
207325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2074425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   matches 'int a, b = 0' as well as 'int d = 2, e;'
2075425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   but 'int c;' is not matched.
207625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2077425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam PanzerAST_MATCHER_P2(DeclStmt, containsDeclaration, unsigned, N,
2078425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer               internal::Matcher<Decl>, InnerMatcher) {
2079425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  const unsigned NumDecls = std::distance(Node.decl_begin(), Node.decl_end());
2080425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  if (N >= NumDecls)
2081425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer    return false;
2082425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  DeclStmt::const_decl_iterator Iterator = Node.decl_begin();
2083425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  std::advance(Iterator, N);
2084425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  return InnerMatcher.matches(**Iterator, Finder, Builder);
2085425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer}
2086425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer
20874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a constructor initializer.
20884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
20894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
209025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
20914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   struct Foo {
20924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     Foo() : foo_(1) { }
20934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     int foo_;
20944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
209525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
20962dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything()))))
2097e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   record matches Foo, hasAnyConstructorInitializer matches foo_(1)
2098e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXConstructorDecl, hasAnyConstructorInitializer,
2099e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<CXXCtorInitializer>, InnerMatcher) {
2100054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  return matchesFirstInPointerRange(InnerMatcher, Node.init_begin(),
2101054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek                                    Node.init_end(), Finder, Builder);
21024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
21034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
21044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the field declaration of a constructor initializer.
21054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
21064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
210725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
21084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   struct Foo {
21094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     Foo() : foo_(1) { }
21104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     int foo_;
21114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
211225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
21132dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
21144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     forField(hasName("foo_"))))))
21154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches Foo
21164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with forField matching foo_
2117e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXCtorInitializer, forField,
2118e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<FieldDecl>, InnerMatcher) {
2119e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const FieldDecl *NodeAsDecl = Node.getMember();
21204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (NodeAsDecl != NULL &&
21214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek      InnerMatcher.matches(*NodeAsDecl, Finder, Builder));
21224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
21234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
21244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the initializer expression of a constructor initializer.
21254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
21264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
212725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
21284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   struct Foo {
21294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     Foo() : foo_(1) { }
21304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     int foo_;
21314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
213225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
21332dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
21344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     withInitializer(integerLiteral(equals(1)))))))
21354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches Foo
21364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with withInitializer matching (1)
2137e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXCtorInitializer, withInitializer,
2138e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2139e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Expr* NodeAsExpr = Node.getInit();
21404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (NodeAsExpr != NULL &&
21414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek      InnerMatcher.matches(*NodeAsExpr, Finder, Builder));
21424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
21434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
21444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a contructor initializer if it is explicitly written in
21454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// code (as opposed to implicitly added by the compiler).
21464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
21474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
214825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
21494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   struct Foo {
21504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     Foo() { }
21514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     Foo(int) : foo_("A") { }
21524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     string foo_;
21534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
215425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
21552dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// constructorDecl(hasAnyConstructorInitializer(isWritten()))
21564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   will match Foo(int), but not Foo()
2157e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER(CXXCtorInitializer, isWritten) {
21584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return Node.isWritten();
21594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
21604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
21614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a constructor declaration that has been implicitly added
21624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// by the compiler (eg. implicit default/copy constructors).
2163e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER(CXXConstructorDecl, isImplicit) {
21644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return Node.isImplicit();
21654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
21664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
21674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches any argument of a call expression or a constructor call
21684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// expression.
21694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
21704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
217125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
21724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void x(int, int, int) { int y; x(1, y, 42); }
217325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
21742dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// callExpr(hasAnyArgument(declRefExpr()))
21754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches x(1, y, 42)
21764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with hasAnyArgument(...)
21774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matching y
2178054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek///
2179054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek/// FIXME: Currently this will ignore parentheses and implicit casts on
2180054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek/// the argument before applying the inner matcher. We'll want to remove
2181054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek/// this to allow for greater control by the user once \c ignoreImplicit()
2182054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek/// has been implemented.
2183e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_POLYMORPHIC_MATCHER_P(hasAnyArgument, internal::Matcher<Expr>,
21844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek                          InnerMatcher) {
2185e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  TOOLING_COMPILE_ASSERT((llvm::is_base_of<CallExpr, NodeType>::value ||
2186e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper                         llvm::is_base_of<CXXConstructExpr,
21874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek                                          NodeType>::value),
21884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek                         instantiated_with_wrong_types);
21894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  for (unsigned I = 0; I < Node.getNumArgs(); ++I) {
2190054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek    BoundNodesTreeBuilder Result(*Builder);
2191054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek    if (InnerMatcher.matches(*Node.getArg(I)->IgnoreParenImpCasts(), Finder,
2192054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek                             &Result)) {
2193054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek      *Builder = Result;
21944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek      return true;
21954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    }
21964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  }
21974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return false;
21984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
21994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
22004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the n'th parameter of a function declaration.
22014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
22024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
220325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
22044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X { void f(int x) {} };
220525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
22062dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// methodDecl(hasParameter(0, hasType(varDecl())))
22074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches f(int x) {}
22084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with hasParameter(...)
22094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matching int x
2210e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P2(FunctionDecl, hasParameter,
2211e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper               unsigned, N, internal::Matcher<ParmVarDecl>,
22124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek               InnerMatcher) {
22134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (N < Node.getNumParams() &&
22144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(
22154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek              *Node.getParamDecl(N), Finder, Builder));
22164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
22174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
22184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches any parameter of a function declaration.
22194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
22204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Does not match the 'this' parameter of a method.
22214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
22224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
222325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
22244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X { void f(int x, int y, int z) {} };
222525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
22262dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// methodDecl(hasAnyParameter(hasName("y")))
22274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches f(int x, int y, int z) {}
22284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with hasAnyParameter(...)
22294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matching int y
2230e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(FunctionDecl, hasAnyParameter,
2231e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<ParmVarDecl>, InnerMatcher) {
2232054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  return matchesFirstInPointerRange(InnerMatcher, Node.param_begin(),
2233054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek                                    Node.param_end(), Finder, Builder);
22344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
22354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
223636e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// \brief Matches \c FunctionDecls that have a specific parameter count.
223736e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper///
223836e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// Given
223936e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// \code
224036e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper///   void f(int i) {}
224136e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper///   void g(int i, int j) {}
224236e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// \endcode
224336e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// functionDecl(parameterCountIs(2))
224436e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper///   matches g(int i, int j) {}
224536e29d6732814e958aea4b2f403cec63d7ed3116Daniel JasperAST_MATCHER_P(FunctionDecl, parameterCountIs, unsigned, N) {
224636e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper  return Node.getNumParams() == N;
224736e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper}
224836e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper
2249e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches the return type of a function declaration.
2250e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
2251e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given:
225225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2253e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   class X { int f() { return 1; } };
225425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
22552dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// methodDecl(returns(asString("int")))
2256e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches int f() { return 1; }
225725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekAST_MATCHER_P(FunctionDecl, returns,
225825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<QualType>, InnerMatcher) {
225925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek  return InnerMatcher.matches(Node.getResultType(), Finder, Builder);
2260e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
2261e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
22628cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper/// \brief Matches extern "C" function declarations.
22638cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper///
22648cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper/// Given:
226525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
22668cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper///   extern "C" void f() {}
22678cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper///   extern "C" { void g() {} }
22688cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper///   void h() {}
226925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
22702dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// functionDecl(isExternC())
22718cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper///   matches the declaration of f and g, but not the declaration h
22728cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel JasperAST_MATCHER(FunctionDecl, isExternC) {
22738cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper  return Node.isExternC();
22748cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper}
22758cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper
22766a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches the condition expression of an if statement, for loop,
22776a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// or conditional operator.
22784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
22794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
228025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
22814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   if (true) {}
228225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2283e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_POLYMORPHIC_MATCHER_P(hasCondition, internal::Matcher<Expr>,
22844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek                          InnerMatcher) {
22854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  TOOLING_COMPILE_ASSERT(
2286e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    (llvm::is_base_of<IfStmt, NodeType>::value) ||
22876a12449ec8862211856447d3df4c082a346339f2Daniel Jasper    (llvm::is_base_of<ForStmt, NodeType>::value) ||
22886a12449ec8862211856447d3df4c082a346339f2Daniel Jasper    (llvm::is_base_of<WhileStmt, NodeType>::value) ||
22896a12449ec8862211856447d3df4c082a346339f2Daniel Jasper    (llvm::is_base_of<DoStmt, NodeType>::value) ||
2290e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    (llvm::is_base_of<ConditionalOperator, NodeType>::value),
22916a12449ec8862211856447d3df4c082a346339f2Daniel Jasper    has_condition_requires_if_statement_conditional_operator_or_loop);
2292e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Expr *const Condition = Node.getCond();
22934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (Condition != NULL &&
22944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*Condition, Finder, Builder));
22954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
22964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
22974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the condition variable statement in an if statement.
22984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
22994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
230025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
23014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   if (A* a = GetAPointer()) {}
230225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
23034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// hasConditionVariableStatment(...)
23044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches 'A* a = GetAPointer()'.
2305e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(IfStmt, hasConditionVariableStatement,
2306e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<DeclStmt>, InnerMatcher) {
2307e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const DeclStmt* const DeclarationStatement =
23084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    Node.getConditionVariableDeclStmt();
23094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return DeclarationStatement != NULL &&
23104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek         InnerMatcher.matches(*DeclarationStatement, Finder, Builder);
23114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
23124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
2313e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches the index expression of an array subscript expression.
2314e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
2315e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
231625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2317e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   int i[5];
2318e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   void f() { i[1] = 42; }
231925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2320e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// arraySubscriptExpression(hasIndex(integerLiteral()))
2321e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches \c i[1] with the \c integerLiteral() matching \c 1
2322e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ArraySubscriptExpr, hasIndex,
232325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<Expr>, InnerMatcher) {
2324e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  if (const Expr* Expression = Node.getIdx())
232525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    return InnerMatcher.matches(*Expression, Finder, Builder);
2326e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return false;
2327e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
2328e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
2329e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches the base expression of an array subscript expression.
2330e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
2331e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
233225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2333e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   int i[5];
2334e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   void f() { i[1] = 42; }
233525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
23362dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// arraySubscriptExpression(hasBase(implicitCastExpr(
23372dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     hasSourceExpression(declRefExpr()))))
23382dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///   matches \c i[1] with the \c declRefExpr() matching \c i
2339e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ArraySubscriptExpr, hasBase,
234025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<Expr>, InnerMatcher) {
2341e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  if (const Expr* Expression = Node.getBase())
234225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    return InnerMatcher.matches(*Expression, Finder, Builder);
2343e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return false;
2344e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
2345e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
23466a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches a 'for', 'while', or 'do while' statement that has
23476a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// a given body.
23484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
23494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
235025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
23514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   for (;;) {}
235225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
23532dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// hasBody(compoundStmt())
23544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches 'for (;;) {}'
23552dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// with compoundStmt()
23564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matching '{}'
23576a12449ec8862211856447d3df4c082a346339f2Daniel JasperAST_POLYMORPHIC_MATCHER_P(hasBody, internal::Matcher<Stmt>,
23586a12449ec8862211856447d3df4c082a346339f2Daniel Jasper                          InnerMatcher) {
23596a12449ec8862211856447d3df4c082a346339f2Daniel Jasper  TOOLING_COMPILE_ASSERT(
23606a12449ec8862211856447d3df4c082a346339f2Daniel Jasper      (llvm::is_base_of<DoStmt, NodeType>::value) ||
23616a12449ec8862211856447d3df4c082a346339f2Daniel Jasper      (llvm::is_base_of<ForStmt, NodeType>::value) ||
23626a12449ec8862211856447d3df4c082a346339f2Daniel Jasper      (llvm::is_base_of<WhileStmt, NodeType>::value),
23636a12449ec8862211856447d3df4c082a346339f2Daniel Jasper      has_body_requires_for_while_or_do_statement);
2364e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Stmt *const Statement = Node.getBody();
23654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (Statement != NULL &&
23664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*Statement, Finder, Builder));
23674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
23684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
23694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches compound statements where at least one substatement matches
23704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// a given matcher.
23714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
23724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
237325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
23744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   { {}; 1+2; }
237525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
23762dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// hasAnySubstatement(compoundStmt())
23774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches '{ {}; 1+2; }'
23782dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// with compoundStmt()
23794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matching '{}'
2380e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CompoundStmt, hasAnySubstatement,
2381e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Stmt>, InnerMatcher) {
2382054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  return matchesFirstInPointerRange(InnerMatcher, Node.body_begin(),
2383054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek                                    Node.body_end(), Finder, Builder);
23844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
23854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
23864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Checks that a compound statement contains a specific number of
23874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// child statements.
23884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
23894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: Given
239025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
23914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   { for (;;) {} }
239225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
23932dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// compoundStmt(statementCountIs(0)))
23944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches '{}'
23954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   but does not match the outer compound statement.
2396e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CompoundStmt, statementCountIs, unsigned, N) {
23974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return Node.size() == N;
23984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
23994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
24004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches literals that are equal to the given value.
24014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
24024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches true (matcher = boolLiteral(equals(true)))
240325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
24044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   true
240525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2406297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek///
2407297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// Usable as: Matcher<CharacterLiteral>, Matcher<CXXBoolLiteral>,
2408297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek///            Matcher<FloatingLiteral>, Matcher<IntegerLiteral>
24094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename ValueT>
24104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinternal::PolymorphicMatcherWithParam1<internal::ValueEqualsMatcher, ValueT>
24114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekequals(const ValueT &Value) {
24124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::PolymorphicMatcherWithParam1<
24134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    internal::ValueEqualsMatcher,
24144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    ValueT>(Value);
24154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
24164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
24174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the operator Name of operator expressions (binary or
24184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// unary).
24194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
24204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
242125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
24224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   !(a || b)
242325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
24244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekAST_POLYMORPHIC_MATCHER_P(hasOperatorName, std::string, Name) {
24254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  TOOLING_COMPILE_ASSERT(
2426e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    (llvm::is_base_of<BinaryOperator, NodeType>::value) ||
2427e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    (llvm::is_base_of<UnaryOperator, NodeType>::value),
24284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    has_condition_requires_if_statement_or_conditional_operator);
24294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return Name == Node.getOpcodeStr(Node.getOpcode());
24304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
24314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
24324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the left hand side of binary operator expressions.
24334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
24344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a (matcher = binaryOperator(hasLHS()))
243525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
24364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   a || b
243725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2438e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(BinaryOperator, hasLHS,
2439e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2440e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Expr *LeftHandSide = Node.getLHS();
24414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (LeftHandSide != NULL &&
24424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*LeftHandSide, Finder, Builder));
24434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
24444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
24454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the right hand side of binary operator expressions.
24464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
24474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches b (matcher = binaryOperator(hasRHS()))
244825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
24494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   a || b
245025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2451e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(BinaryOperator, hasRHS,
2452e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2453e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Expr *RightHandSide = Node.getRHS();
24544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (RightHandSide != NULL &&
24554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*RightHandSide, Finder, Builder));
24564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
24574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
24584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if either the left hand side or the right hand side of a
24594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// binary operator matches.
2460e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<BinaryOperator> hasEitherOperand(
2461e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    const internal::Matcher<Expr> &InnerMatcher) {
24624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return anyOf(hasLHS(InnerMatcher), hasRHS(InnerMatcher));
24634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
24644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
24654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the operand of a unary operator matches.
24664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
24679158a5624154bc43bbbf059c07a2f7b2cd45c1a1Alexander Kornienko/// Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true))))
246825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
24694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   !true
247025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2471e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UnaryOperator, hasUnaryOperand,
2472e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2473e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Expr * const Operand = Node.getSubExpr();
24744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (Operand != NULL &&
24754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*Operand, Finder, Builder));
24764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
24774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
2478715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek/// \brief Matches if the cast's source expression matches the given matcher.
24794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
24804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: matches "a string" (matcher =
24812dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///                                  hasSourceExpression(constructExpr()))
248225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
24834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class URL { URL(string); };
24844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// URL url = "a string";
2485715c9568ee5d75f25dab98229c87bcec880daf5dManuel KlimekAST_MATCHER_P(CastExpr, hasSourceExpression,
2486e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2487e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Expr* const SubExpression = Node.getSubExpr();
24884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (SubExpression != NULL &&
24894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*SubExpression, Finder, Builder));
24904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
24914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
24924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches casts whose destination type matches a given matcher.
24934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
24944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// (Note: Clang's AST refers to other conversions as "casts" too, and calls
24954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// actual casts "explicit" casts.)
2496e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ExplicitCastExpr, hasDestinationType,
2497e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<QualType>, InnerMatcher) {
2498e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const QualType NodeType = Node.getTypeAsWritten();
24994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return InnerMatcher.matches(NodeType, Finder, Builder);
25004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
25014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
25024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches implicit casts whose destination type matches a given
25034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matcher.
25044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
25054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: Unit test this matcher
2506e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ImplicitCastExpr, hasImplicitDestinationType,
2507e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<QualType>, InnerMatcher) {
25084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return InnerMatcher.matches(Node.getType(), Finder, Builder);
25094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
25104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
25114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the true branch expression of a conditional operator.
25124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
25134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a
251425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
25154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   condition ? a : b
251625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2517e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ConditionalOperator, hasTrueExpression,
2518e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2519e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Expr *Expression = Node.getTrueExpr();
25204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (Expression != NULL &&
25214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*Expression, Finder, Builder));
25224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
25234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
25244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the false branch expression of a conditional operator.
25254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
25264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches b
252725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
25284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   condition ? a : b
252925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2530e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ConditionalOperator, hasFalseExpression,
2531e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2532e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Expr *Expression = Node.getFalseExpr();
25334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (Expression != NULL &&
25344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*Expression, Finder, Builder));
25354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
25364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
25374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if a declaration has a body attached.
25384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
25394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches A, va, fa
254025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
25414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class A {};
25424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class B;  // Doesn't match, as it has no body.
25434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   int va;
25444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   extern int vb;  // Doesn't match, as it doesn't define the variable.
25454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void fa() {}
25464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void fb();  // Doesn't match, as it has no body.
254725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2548297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek///
2549297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// Usable as: Matcher<TagDecl>, Matcher<VarDecl>, Matcher<FunctionDecl>
2550415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_POLYMORPHIC_MATCHER(isDefinition) {
2551415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  TOOLING_COMPILE_ASSERT(
2552415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek      (llvm::is_base_of<TagDecl, NodeType>::value) ||
2553415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek      (llvm::is_base_of<VarDecl, NodeType>::value) ||
2554415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek      (llvm::is_base_of<FunctionDecl, NodeType>::value),
2555415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek      is_definition_requires_isThisDeclarationADefinition_method);
2556415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return Node.isThisDeclarationADefinition();
25574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
25584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
25594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the class declaration that the given method declaration
25604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// belongs to.
25614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
25624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: Generalize this for other kinds of declarations.
25634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: What other kind of declarations would we need to generalize
25644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// this to?
25654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
25664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches A() in the last line
25672dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = constructExpr(hasDeclaration(methodDecl(
25684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///         ofClass(hasName("A"))))))
256925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
25704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class A {
25714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///    public:
25724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     A();
25734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
25744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   A a = A();
257525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2576e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXMethodDecl, ofClass,
2577e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<CXXRecordDecl>, InnerMatcher) {
2578e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const CXXRecordDecl *Parent = Node.getParent();
25794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (Parent != NULL &&
25804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*Parent, Finder, Builder));
25814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
25824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
25835771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \brief Matches if the given method declaration is virtual.
25845771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///
25855771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// Given
25865771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \code
25875771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   class A {
25885771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///    public:
25895771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///     virtual void x();
25905771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   };
25915771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \endcode
25925771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   matches A::x
25935771a2f0830228ac50e3473740e24d9dca67b54fEdwin VaneAST_MATCHER(CXXMethodDecl, isVirtual) {
25945771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane  return Node.isVirtual();
25955771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane}
25965771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane
259732a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// \brief Matches if the given method declaration is const.
259832a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane///
259932a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// Given
260032a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// \code
260132a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// struct A {
260232a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane///   void foo() const;
260332a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane///   void bar();
260432a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// };
260532a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// \endcode
260632a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane///
260732a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// methodDecl(isConst()) matches A::foo() but not A::bar()
260832a6ebc63900b85780328c337787bb7adad2bcabEdwin VaneAST_MATCHER(CXXMethodDecl, isConst) {
260932a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane  return Node.isConst();
261032a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane}
261132a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane
26125771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \brief Matches if the given method declaration overrides another method.
26135771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///
26145771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// Given
26155771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \code
26165771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   class A {
26175771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///    public:
26185771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///     virtual void x();
26195771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   };
26205771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   class B : public A {
26215771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///    public:
26225771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///     virtual void x();
26235771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   };
26245771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \endcode
26255771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   matches B::x
26265771a2f0830228ac50e3473740e24d9dca67b54fEdwin VaneAST_MATCHER(CXXMethodDecl, isOverride) {
26275771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane  return Node.size_overridden_methods() > 0;
26285771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane}
26295771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane
26304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches member expressions that are called with '->' as opposed
26314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// to '.'.
26324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
26334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Member calls on the implicit this pointer match as called with '->'.
26344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
26354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
263625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
26374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y {
26384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
26394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     int a;
26404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     static int b;
26414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
264225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
26432dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// memberExpr(isArrow())
26444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches this->x, x, y.x, a, this->b
2645415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_MATCHER(MemberExpr, isArrow) {
2646415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return Node.isArrow();
26474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
26484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
26496a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches QualType nodes that are of integer type.
26506a12449ec8862211856447d3df4c082a346339f2Daniel Jasper///
26516a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// Given
265225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
26536a12449ec8862211856447d3df4c082a346339f2Daniel Jasper///   void a(int);
26546a12449ec8862211856447d3df4c082a346339f2Daniel Jasper///   void b(long);
26556a12449ec8862211856447d3df4c082a346339f2Daniel Jasper///   void c(double);
265625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
26572dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// functionDecl(hasAnyParameter(hasType(isInteger())))
26586a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// matches "a(int)", "b(long)", but not "c(double)".
26596a12449ec8862211856447d3df4c082a346339f2Daniel JasperAST_MATCHER(QualType, isInteger) {
26606a12449ec8862211856447d3df4c082a346339f2Daniel Jasper    return Node->isIntegerType();
26616a12449ec8862211856447d3df4c082a346339f2Daniel Jasper}
26626a12449ec8862211856447d3df4c082a346339f2Daniel Jasper
2663e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches QualType nodes that are const-qualified, i.e., that
26644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// include "top-level" const.
26654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
26664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
266725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
26684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void a(int);
26694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void b(int const);
26704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void c(const int);
26714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void d(const int*);
26724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void e(int const) {};
267325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
26742dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// functionDecl(hasAnyParameter(hasType(isConstQualified())))
26754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches "void b(int const)", "void c(const int)" and
26764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   "void e(int const) {}". It does not match d as there
26774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   is no top-level const on the parameter type "const int *".
2678415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_MATCHER(QualType, isConstQualified) {
2679415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return Node.isConstQualified();
26804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
26814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
26827b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// \brief Matches QualType nodes that have local CV-qualifiers attached to
26837b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// the node, not hidden within a typedef.
26847b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane///
26857b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// Given
26867b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// \code
26877b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane///   typedef const int const_int;
26887b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane///   const_int i;
26897b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane///   int *const j;
26907b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane///   int *volatile k;
26917b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane///   int m;
26927b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// \endcode
26937b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// \c varDecl(hasType(hasLocalQualifiers())) matches only \c j and \c k.
26947b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// \c i is const-qualified but the qualifier is not local.
26957b69cd09440976d6b93a0db661a770b2337be8d2Edwin VaneAST_MATCHER(QualType, hasLocalQualifiers) {
26967b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane  return Node.hasLocalQualifiers();
26977b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane}
26987b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane
26994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a member expression where the member is matched by a
27004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// given matcher.
27014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
27024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
270325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
27044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   struct { int first, second; } first, second;
27054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   int i(second.first);
27064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   int j(first.second);
270725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
27082dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// memberExpr(member(hasName("first")))
27094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches second.first
27104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   but not first.second (because the member name there is "second").
2711e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(MemberExpr, member,
2712e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<ValueDecl>, InnerMatcher) {
27134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return InnerMatcher.matches(*Node.getMemberDecl(), Finder, Builder);
27144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
27154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
27164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a member expression where the object expression is
27174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matched by a given matcher.
27184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
27194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
272025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
27214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   struct X { int m; };
27224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void f(X x) { x.m; m; }
272325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
27242dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))))
27254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches "x.m" and "m"
27264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with hasObjectExpression(...)
27274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matching "x" and the implicit object expression of "m" which has type X*.
2728e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(MemberExpr, hasObjectExpression,
2729e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
27304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return InnerMatcher.matches(*Node.getBase(), Finder, Builder);
27314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
27324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
2733e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches any using shadow declaration.
2734e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
2735e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
273625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2737e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   namespace X { void b(); }
2738e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   using X::b;
273925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2740e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
2741e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches \code using X::b \endcode
2742e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UsingDecl, hasAnyUsingShadowDecl,
274325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<UsingShadowDecl>, InnerMatcher) {
2744054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  return matchesFirstInPointerRange(InnerMatcher, Node.shadow_begin(),
2745054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek                                    Node.shadow_end(), Finder, Builder);
2746e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
2747e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
2748e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches a using shadow declaration where the target declaration is
2749e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matched by the given matcher.
2750e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
2751e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
275225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2753e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   namespace X { int a; void b(); }
2754e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   using X::a;
2755e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   using X::b;
275625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
27572dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
2758e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches \code using X::b \endcode
2759e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   but not \code using X::a \endcode
2760e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UsingShadowDecl, hasTargetDecl,
276125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<NamedDecl>, InnerMatcher) {
276225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek  return InnerMatcher.matches(*Node.getTargetDecl(), Finder, Builder);
2763e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
2764e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
27654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches template instantiations of function, class, or static
27664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// member variable template instantiations.
27674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
27684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
276925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
27704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   template <typename T> class X {}; class A {}; X<A> x;
277125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
27724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// or
277325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
27744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   template <typename T> class X {}; class A {}; template class X<A>;
277525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
27762dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(hasName("::X"), isTemplateInstantiation())
27774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches the template instantiation of X<A>.
27784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
27794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// But given
278025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
278125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///   template <typename T>  class X {}; class A {};
27824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   template <> class X<A> {}; X<A> x;
278325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
27842dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(hasName("::X"), isTemplateInstantiation())
27854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   does not match, as X<A> is an explicit template specialization.
2786297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek///
2787297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// Usable as: Matcher<FunctionDecl>, Matcher<VarDecl>, Matcher<CXXRecordDecl>
2788415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_POLYMORPHIC_MATCHER(isTemplateInstantiation) {
2789415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  TOOLING_COMPILE_ASSERT((llvm::is_base_of<FunctionDecl, NodeType>::value) ||
2790415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek                         (llvm::is_base_of<VarDecl, NodeType>::value) ||
2791415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek                         (llvm::is_base_of<CXXRecordDecl, NodeType>::value),
2792415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek                         requires_getTemplateSpecializationKind_method);
2793415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return (Node.getTemplateSpecializationKind() == TSK_ImplicitInstantiation ||
2794415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek          Node.getTemplateSpecializationKind() ==
2795415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek          TSK_ExplicitInstantiationDefinition);
27964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
27974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
27988456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// \brief Matches explicit template specializations of function, class, or
27998456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// static member variable template instantiations.
28008456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko///
28018456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// Given
280225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
28038456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko///   template<typename T> void A(T t) { }
28048456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko///   template<> void A(int N) { }
280525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
28062dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// functionDecl(isExplicitTemplateSpecialization())
28078456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko///   matches the specialization A<int>().
280825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
280925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Matcher<FunctionDecl>, Matcher<VarDecl>, Matcher<CXXRecordDecl>
2810415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_POLYMORPHIC_MATCHER(isExplicitTemplateSpecialization) {
2811415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  TOOLING_COMPILE_ASSERT((llvm::is_base_of<FunctionDecl, NodeType>::value) ||
2812415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek                         (llvm::is_base_of<VarDecl, NodeType>::value) ||
2813415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek                         (llvm::is_base_of<CXXRecordDecl, NodeType>::value),
2814415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek                         requires_getTemplateSpecializationKind_method);
2815415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return (Node.getTemplateSpecializationKind() == TSK_ExplicitSpecialization);
28168456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko}
28178456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko
2818ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches \c TypeLocs for which the given inner
2819ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// QualType-matcher matches.
2820ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasperinline internal::BindableMatcher<TypeLoc> loc(
2821ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper    const internal::Matcher<QualType> &InnerMatcher) {
2822ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper  return internal::BindableMatcher<TypeLoc>(
2823ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper      new internal::TypeLocTypeMatcher(InnerMatcher));
2824ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper}
2825ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2826ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches builtin Types.
2827ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2828ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2829ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2830ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   struct A {};
2831ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   A a;
2832ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int b;
2833ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   float c;
2834ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   bool d;
2835ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2836ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// builtinType()
2837ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int b", "float c" and "bool d"
2838ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(BuiltinType, builtinType);
2839ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2840ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches all kinds of arrays.
2841ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2842ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2843ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2844ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int a[] = { 2, 3 };
2845ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int b[4];
2846ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   void f() { int c[a[0]]; }
2847ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2848ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// arrayType()
2849ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int a[]", "int b[4]" and "int c[a[0]]";
2850ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(ArrayType, arrayType);
2851ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2852ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C99 complex types.
2853ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2854ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2855ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2856ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   _Complex float f;
2857ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2858ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// complexType()
2859ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "_Complex float f"
2860ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(ComplexType, complexType);
2861ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2862ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches arrays and C99 complex types that have a specific element
2863ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// type.
2864ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2865ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2866ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2867ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   struct A {};
2868ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   A a[7];
2869ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int b[7];
2870ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2871ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// arrayType(hasElementType(builtinType()))
2872ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int b[7]"
2873ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2874ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Usable as: Matcher<ArrayType>, Matcher<ComplexType>
2875ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPELOC_TRAVERSE_MATCHER(hasElementType, getElement);
2876ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2877ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C arrays with a specified constant size.
2878ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2879ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2880ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2881ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   void() {
2882ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     int a[2];
2883ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     int b[] = { 2, 3 };
2884ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     int c[b[0]];
2885ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   }
2886ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2887ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// constantArrayType()
2888ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int a[2]"
2889ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(ConstantArrayType, constantArrayType);
2890ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2891ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches \c ConstantArrayType nodes that have the specified size.
2892ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2893ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2894ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2895ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int a[42];
2896ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int b[2 * 21];
2897ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int c[41], d[43];
2898ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2899ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// constantArrayType(hasSize(42))
2900ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int a[42]" and "int b[2 * 21]"
2901ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_MATCHER_P(ConstantArrayType, hasSize, unsigned, N) {
2902ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper  return Node.getSize() == N;
2903ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper}
2904ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2905ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C++ arrays whose size is a value-dependent expression.
2906ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2907ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2908ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2909ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   template<typename T, int Size>
2910ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   class array {
2911ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     T data[Size];
2912ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   };
2913ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2914ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// dependentSizedArrayType
2915ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "T data[Size]"
2916ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(DependentSizedArrayType, dependentSizedArrayType);
2917ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2918ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C arrays with unspecified size.
2919ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2920ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2921ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2922ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int a[] = { 2, 3 };
2923ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int b[42];
2924ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   void f(int c[]) { int d[a[0]]; };
2925ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2926ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// incompleteArrayType()
2927ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int a[]" and "int c[]"
2928ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(IncompleteArrayType, incompleteArrayType);
2929ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2930ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C arrays with a specified size that is not an
2931ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// integer-constant-expression.
2932ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2933ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2934ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2935ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   void f() {
2936ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     int a[] = { 2, 3 }
2937ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     int b[42];
2938ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     int c[a[0]];
2939ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2940ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// variableArrayType()
2941ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int c[a[0]]"
2942ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(VariableArrayType, variableArrayType);
2943ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2944ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches \c VariableArrayType nodes that have a specific size
2945ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// expression.
2946ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2947ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2948ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2949ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   void f(int b) {
2950ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     int a[b];
2951ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   }
2952ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2953ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
2954ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   varDecl(hasName("b")))))))
2955ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int a[b]"
2956ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_MATCHER_P(VariableArrayType, hasSizeExpr,
2957ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2958ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper  return InnerMatcher.matches(*Node.getSizeExpr(), Finder, Builder);
2959ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper}
2960ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2961ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches atomic types.
2962ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2963ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2964ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2965ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   _Atomic(int) i;
2966ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2967ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// atomicType()
2968ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "_Atomic(int) i"
2969ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(AtomicType, atomicType);
2970ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2971ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches atomic types with a specific value type.
2972ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2973ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2974ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2975ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   _Atomic(int) i;
2976ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   _Atomic(float) f;
2977ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2978ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// atomicType(hasValueType(isInteger()))
2979ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///  matches "_Atomic(int) i"
2980ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2981ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Usable as: Matcher<AtomicType>
2982ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPELOC_TRAVERSE_MATCHER(hasValueType, getValue);
2983ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2984ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches types nodes representing C++11 auto types.
2985ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2986ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given:
2987ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2988ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   auto n = 4;
2989ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int v[] = { 2, 3 }
2990ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   for (auto i : v) { }
2991ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2992ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// autoType()
2993ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "auto n" and "auto i"
2994ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(AutoType, autoType);
2995ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2996ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches \c AutoType nodes where the deduced type is a specific type.
2997ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2998ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Note: There is no \c TypeLoc for the deduced type and thus no
2999ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \c getDeducedLoc() matcher.
3000ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3001ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3002ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3003ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   auto a = 1;
3004ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   auto b = 2.0;
3005ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3006ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// autoType(hasDeducedType(isInteger()))
3007ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "auto a"
3008ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3009ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Usable as: Matcher<AutoType>
3010ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_TRAVERSE_MATCHER(hasDeducedType, getDeducedType);
3011ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3012a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \brief Matches \c FunctionType nodes.
3013a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper///
3014a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// Given
3015a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \code
3016a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper///   int (*f)(int);
3017a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper///   void g();
3018a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \endcode
3019a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// functionType()
3020a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper///   matches "int (*f)(int)" and the type of "g".
3021a267cf6f87dc695143d65fc61ec1744564f55932Daniel JasperAST_TYPE_MATCHER(FunctionType, functionType);
3022a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper
302388be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \brief Matches \c ParenType nodes.
302488be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///
302588be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// Given
302688be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \code
302788be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///   int (*ptr_to_array)[4];
302888be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///   int *array_of_ptrs[4];
302988be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \endcode
303088be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///
303188be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \c varDecl(hasType(pointsTo(parenType()))) matches \c ptr_to_array but not
303288be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \c array_of_ptrs.
303388be2fdec7a1375bc729a6499629532e7872f11aEdwin VaneAST_TYPE_MATCHER(ParenType, parenType);
303488be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane
303588be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \brief Matches \c ParenType nodes where the inner type is a specific type.
303688be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///
303788be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// Given
303888be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \code
303988be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///   int (*ptr_to_array)[4];
304088be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///   int (*ptr_to_func)(int);
304188be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \endcode
304288be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///
304388be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \c varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
304488be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \c ptr_to_func but not \c ptr_to_array.
304588be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///
304688be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// Usable as: Matcher<ParenType>
304788be2fdec7a1375bc729a6499629532e7872f11aEdwin VaneAST_TYPE_TRAVERSE_MATCHER(innerType, getInnerType);
304888be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane
3049ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches block pointer types, i.e. types syntactically represented as
3050ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// "void (^)(int)".
3051ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3052ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// The \c pointee is always required to be a \c FunctionType.
3053ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(BlockPointerType, blockPointerType);
3054ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3055ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches member pointer types.
3056ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3057ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3058ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   struct A { int i; }
3059ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   A::* ptr = A::i;
3060ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3061ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// memberPointerType()
3062ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "A::* ptr"
3063ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(MemberPointerType, memberPointerType);
3064ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3065ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches pointer types.
3066ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3067ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3068ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3069ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int *a;
3070ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int &b = *a;
3071ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int c = 5;
3072ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3073ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// pointerType()
3074ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int *a"
3075ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(PointerType, pointerType);
3076ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3077f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \brief Matches both lvalue and rvalue reference types.
3078ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3079ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3080ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3081ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int *a;
3082ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int &b = *a;
3083f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int &&c = 1;
3084f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &d = b;
3085f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &&e = c;
3086f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &&f = 2;
3087f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int g = 5;
3088ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3089f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///
3090f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \c referenceType() matches the types of \c b, \c c, \c d, \c e, and \c f.
3091ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(ReferenceType, referenceType);
3092ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3093f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \brief Matches lvalue reference types.
3094f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///
3095f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// Given:
3096f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \code
3097f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int *a;
3098f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int &b = *a;
3099f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int &&c = 1;
3100f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &d = b;
3101f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &&e = c;
3102f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &&f = 2;
3103f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int g = 5;
3104f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \endcode
3105f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///
3106f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \c lValueReferenceType() matches the types of \c b, \c d, and \c e. \c e is
3107f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// matched since the type is deduced as int& by reference collapsing rules.
3108f4b48042724d2253d0426cadcb93e24eeb47e264Edwin VaneAST_TYPE_MATCHER(LValueReferenceType, lValueReferenceType);
3109f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane
3110f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \brief Matches rvalue reference types.
3111f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///
3112f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// Given:
3113f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \code
3114f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int *a;
3115f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int &b = *a;
3116f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int &&c = 1;
3117f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &d = b;
3118f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &&e = c;
3119f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &&f = 2;
3120f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int g = 5;
3121f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \endcode
3122f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///
3123f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \c rValueReferenceType() matches the types of \c c and \c f. \c e is not
3124f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// matched as it is deduced to int& by reference collapsing rules.
3125f4b48042724d2253d0426cadcb93e24eeb47e264Edwin VaneAST_TYPE_MATCHER(RValueReferenceType, rValueReferenceType);
3126f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane
3127ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Narrows PointerType (and similar) matchers to those where the
3128ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \c pointee matches a given matcher.
3129ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3130ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3131ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3132ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int *a;
3133ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int const *b;
3134ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   float const *f;
3135ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3136ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// pointerType(pointee(isConstQualified(), isInteger()))
3137ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int const *b"
3138ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3139ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Usable as: Matcher<BlockPointerType>, Matcher<MemberPointerType>,
3140ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   Matcher<PointerType>, Matcher<ReferenceType>
3141ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPELOC_TRAVERSE_MATCHER(pointee, getPointee);
3142ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3143ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches typedef types.
3144ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3145ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3146ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3147ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   typedef int X;
3148ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3149ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// typedefType()
3150ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "typedef int X"
3151ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(TypedefType, typedefType);
3152ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
31533abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// \brief Matches template specialization types.
31543abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///
31553abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// Given
31563abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// \code
31573abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///   template <typename T>
31583abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///   class C { };
31593abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///
31603abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///   template class C<int>;  // A
31613abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///   C<char> var;            // B
31623abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// \code
31633abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///
31643abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// \c templateSpecializationType() matches the type of the explicit
31653abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// instantiation in \c A and the type of the variable declaration in \c B.
31663abf77872ca6c520903f9174cf6cd89a50df2714Edwin VaneAST_TYPE_MATCHER(TemplateSpecializationType, templateSpecializationType);
31673abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane
3168742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \brief Matches record types (e.g. structs, classes).
3169742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3170742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Given
3171742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3172742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   class C {};
3173742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   struct S {};
3174742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3175742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   C c;
3176742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   S s;
3177742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3178742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3179742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c recordType() matches the type of the variable declarations of both \c c
3180742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// and \c s.
3181742d9e77e32f014194679575c97c6bb4fd0998c4Edwin VaneAST_TYPE_MATCHER(RecordType, recordType);
3182742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane
3183742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \brief Matches types specified with an elaborated type keyword or with a
3184742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// qualified name.
3185742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3186742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Given
3187742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3188742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   namespace N {
3189742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     namespace M {
3190742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///       class D {};
3191742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     }
3192742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   }
3193742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   class C {};
3194742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3195742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   class C c;
3196742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   N::M::D d;
3197742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3198742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3199742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c elaboratedType() matches the type of the variable declarations of both
3200742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c c and \c d.
3201742d9e77e32f014194679575c97c6bb4fd0998c4Edwin VaneAST_TYPE_MATCHER(ElaboratedType, elaboratedType);
3202742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane
3203742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \brief Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
3204aec89ac22e1876bb1cfff9062c882a622bc84510Edwin Vane/// matches \c InnerMatcher if the qualifier exists.
3205742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3206742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Given
3207742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3208742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   namespace N {
3209742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     namespace M {
3210742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///       class D {};
3211742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     }
3212742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   }
3213742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   N::M::D d;
3214742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3215742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3216742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
3217742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// matches the type of the variable declaration of \c d.
3218742d9e77e32f014194679575c97c6bb4fd0998c4Edwin VaneAST_MATCHER_P(ElaboratedType, hasQualifier,
3219742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane              internal::Matcher<NestedNameSpecifier>, InnerMatcher) {
3220aec89ac22e1876bb1cfff9062c882a622bc84510Edwin Vane  if (const NestedNameSpecifier *Qualifier = Node.getQualifier())
3221aec89ac22e1876bb1cfff9062c882a622bc84510Edwin Vane    return InnerMatcher.matches(*Qualifier, Finder, Builder);
3222aec89ac22e1876bb1cfff9062c882a622bc84510Edwin Vane
3223aec89ac22e1876bb1cfff9062c882a622bc84510Edwin Vane  return false;
3224742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane}
3225742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane
3226742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \brief Matches ElaboratedTypes whose named type matches \c InnerMatcher.
3227742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3228742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Given
3229742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3230742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   namespace N {
3231742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     namespace M {
3232742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///       class D {};
3233742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     }
3234742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   }
3235742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   N::M::D d;
3236742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3237742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3238742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c elaboratedType(namesType(recordType(
3239742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
3240742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// declaration of \c d.
3241742d9e77e32f014194679575c97c6bb4fd0998c4Edwin VaneAST_MATCHER_P(ElaboratedType, namesType, internal::Matcher<QualType>,
3242742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane              InnerMatcher) {
3243742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane  return InnerMatcher.matches(Node.getNamedType(), Finder, Builder);
3244742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane}
3245742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane
3246742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \brief Matches declarations whose declaration context, interpreted as a
3247742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Decl, matches \c InnerMatcher.
3248742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3249742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Given
3250742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3251742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   namespace N {
3252742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     namespace M {
3253742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///       class D {};
3254742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     }
3255742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   }
3256742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3257742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3258742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c recordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
3259742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// declaration of \c class \c D.
3260742d9e77e32f014194679575c97c6bb4fd0998c4Edwin VaneAST_MATCHER_P(Decl, hasDeclContext, internal::Matcher<Decl>, InnerMatcher) {
3261742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane  return InnerMatcher.matches(*Decl::castFromDeclContext(Node.getDeclContext()),
3262742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane                              Finder, Builder);
3263742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane}
3264742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane
3265a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Matches nested name specifiers.
3266a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///
3267a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// Given
3268a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \code
3269a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   namespace ns {
3270a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///     struct A { static void f(); };
3271a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///     void A::f() {}
3272a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///     void g() { A::f(); }
3273a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   }
3274a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   ns::A a;
3275a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \endcode
3276a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifier()
3277a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   matches "ns::" and both "A::"
3278a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasperconst internal::VariadicAllOfMatcher<NestedNameSpecifier> nestedNameSpecifier;
3279a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper
3280a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Same as \c nestedNameSpecifier but matches \c NestedNameSpecifierLoc.
3281a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasperconst internal::VariadicAllOfMatcher<
3282a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper  NestedNameSpecifierLoc> nestedNameSpecifierLoc;
3283a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper
3284a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Matches \c NestedNameSpecifierLocs for which the given inner
3285a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// NestedNameSpecifier-matcher matches.
3286a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasperinline internal::BindableMatcher<NestedNameSpecifierLoc> loc(
3287a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper    const internal::Matcher<NestedNameSpecifier> &InnerMatcher) {
3288a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper  return internal::BindableMatcher<NestedNameSpecifierLoc>(
3289a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper      new internal::LocMatcher<NestedNameSpecifierLoc, NestedNameSpecifier>(
3290a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper          InnerMatcher));
3291a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper}
3292a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper
3293a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Matches nested name specifiers that specify a type matching the
3294a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// given \c QualType matcher without qualifiers.
3295a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///
3296a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// Given
3297a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \code
3298a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   struct A { struct B { struct C {}; }; };
3299a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   A::B::C c;
3300a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \endcode
3301a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A")))))
3302a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   matches "A::"
3303a7564433191601cb8851196b8dde39392c9c05eeDaniel JasperAST_MATCHER_P(NestedNameSpecifier, specifiesType,
3304a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper              internal::Matcher<QualType>, InnerMatcher) {
3305a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper  if (Node.getAsType() == NULL)
3306a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper    return false;
3307a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper  return InnerMatcher.matches(QualType(Node.getAsType(), 0), Finder, Builder);
3308a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper}
3309a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper
3310ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches nested name specifier locs that specify a type matching the
3311ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// given \c TypeLoc.
3312ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3313ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3314ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3315ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   struct A { struct B { struct C {}; }; };
3316ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   A::B::C c;
3317ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3318ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
3319ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   hasDeclaration(recordDecl(hasName("A")))))))
3320ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "A::"
3321ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_MATCHER_P(NestedNameSpecifierLoc, specifiesTypeLoc,
3322ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper              internal::Matcher<TypeLoc>, InnerMatcher) {
3323ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper  return InnerMatcher.matches(Node.getTypeLoc(), Finder, Builder);
3324ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper}
3325ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3326ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches on the prefix of a \c NestedNameSpecifier.
3327a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///
3328a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// Given
3329a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \code
3330a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   struct A { struct B { struct C {}; }; };
3331a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   A::B::C c;
3332a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \endcode
3333a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
3334ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "A::"
3335415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_MATCHER_P_OVERLOAD(NestedNameSpecifier, hasPrefix,
3336415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek                       internal::Matcher<NestedNameSpecifier>, InnerMatcher,
3337415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek                       0) {
3338415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  NestedNameSpecifier *NextNode = Node.getPrefix();
3339415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  if (NextNode == NULL)
3340415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek    return false;
3341415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return InnerMatcher.matches(*NextNode, Finder, Builder);
3342ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper}
3343ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3344ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches on the prefix of a \c NestedNameSpecifierLoc.
3345ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3346ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3347ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3348ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   struct A { struct B { struct C {}; }; };
3349ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   A::B::C c;
3350ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3351a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
3352ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "A::"
3353415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_MATCHER_P_OVERLOAD(NestedNameSpecifierLoc, hasPrefix,
3354415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek                       internal::Matcher<NestedNameSpecifierLoc>, InnerMatcher,
3355415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek                       1) {
3356415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  NestedNameSpecifierLoc NextNode = Node.getPrefix();
3357415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  if (!NextNode)
3358415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek    return false;
3359415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return InnerMatcher.matches(NextNode, Finder, Builder);
3360ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper}
3361a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper
3362a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Matches nested name specifiers that specify a namespace matching the
3363a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// given namespace matcher.
3364a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///
3365a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// Given
3366a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \code
3367a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   namespace ns { struct A {}; }
3368a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   ns::A a;
3369a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \endcode
3370a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifier(specifiesNamespace(hasName("ns")))
3371a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   matches "ns::"
3372a7564433191601cb8851196b8dde39392c9c05eeDaniel JasperAST_MATCHER_P(NestedNameSpecifier, specifiesNamespace,
3373a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper              internal::Matcher<NamespaceDecl>, InnerMatcher) {
3374a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper  if (Node.getAsNamespace() == NULL)
3375a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper    return false;
3376a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper  return InnerMatcher.matches(*Node.getAsNamespace(), Finder, Builder);
3377a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper}
3378a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper
3379fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \brief Overloads for the \c equalsNode matcher.
3380fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// FIXME: Implement for other node types.
3381fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// @{
3382fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek
3383fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \brief Matches if a node equals another node.
3384fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek///
3385fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \c Decl has pointer identity in the AST.
3386fa37c5ca61af275a329386407e58cf70f4d9f596Manuel KlimekAST_MATCHER_P_OVERLOAD(Decl, equalsNode, Decl*, Other, 0) {
3387fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek  return &Node == Other;
3388fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek}
3389fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \brief Matches if a node equals another node.
3390fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek///
3391fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \c Stmt has pointer identity in the AST.
3392fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek///
3393fa37c5ca61af275a329386407e58cf70f4d9f596Manuel KlimekAST_MATCHER_P_OVERLOAD(Stmt, equalsNode, Stmt*, Other, 1) {
3394fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek  return &Node == Other;
3395fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek}
3396fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek
3397fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// @}
3398fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek
3399acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \brief Matches each case or default statement belonging to the given switch
3400acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// statement. This matcher may produce multiple matches.
3401acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///
3402acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// Given
3403acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \code
3404acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///   switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
3405acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \endcode
3406acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
3407acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///   matches four times, with "c" binding each of "case 1:", "case 2:",
3408acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// "case 3:" and "case 4:", and "s" respectively binding "switch (1)",
3409acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// "switch (1)", "switch (2)" and "switch (2)".
3410acf02715ab1aa1e5a791f20e0d1ca217af256823Peter CollingbourneAST_MATCHER_P(SwitchStmt, forEachSwitchCase, internal::Matcher<SwitchCase>,
3411acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne              InnerMatcher) {
3412054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  BoundNodesTreeBuilder Result;
3413acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  // FIXME: getSwitchCaseList() does not necessarily guarantee a stable
3414acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  // iteration order. We should use the more general iterating matchers once
3415acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  // they are capable of expressing this matcher (for example, it should ignore
3416acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  // case statements belonging to nested switch statements).
3417acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  bool Matched = false;
3418acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  for (const SwitchCase *SC = Node.getSwitchCaseList(); SC;
3419acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne       SC = SC->getNextSwitchCase()) {
3420054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek    BoundNodesTreeBuilder CaseBuilder(*Builder);
3421acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne    bool CaseMatched = InnerMatcher.matches(*SC, Finder, &CaseBuilder);
3422acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne    if (CaseMatched) {
3423acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne      Matched = true;
3424054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek      Result.addMatch(CaseBuilder);
3425acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne    }
3426acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  }
3427054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  *Builder = Result;
3428acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  return Matched;
3429acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne}
3430acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne
3431acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \brief If the given case statement does not use the GNU case range
3432acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// extension, matches the constant given in the statement.
3433acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///
3434acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// Given
3435acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \code
3436acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///   switch (1) { case 1: case 1+1: case 3 ... 4: ; }
3437acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \endcode
3438acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// caseStmt(hasCaseConstant(integerLiteral()))
3439acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///   matches "case 1:"
3440acf02715ab1aa1e5a791f20e0d1ca217af256823Peter CollingbourneAST_MATCHER_P(CaseStmt, hasCaseConstant, internal::Matcher<Expr>,
3441acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne              InnerMatcher) {
3442acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  if (Node.getRHS())
3443acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne    return false;
3444acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne
3445acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  return InnerMatcher.matches(*Node.getLHS(), Finder, Builder);
3446acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne}
3447acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne
34484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} // end namespace ast_matchers
34494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} // end namespace clang
34504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
34514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek#endif // LLVM_CLANG_AST_MATCHERS_AST_MATCHERS_H
3452