ASTMatchers.h revision 2d77634e839880704d51656bebd1d2daff661d4e
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<
1454ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    internal::HasOverloadedOperatorNameMatcher, StringRef,
1455ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    AST_POLYMORPHIC_SUPPORTED_TYPES_2(CXXOperatorCallExpr, CXXMethodDecl)>
14566a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin VanehasOverloadedOperatorName(const StringRef Name) {
14576a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane  return internal::PolymorphicMatcherWithParam1<
1458ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen      internal::HasOverloadedOperatorNameMatcher, StringRef,
1459ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen      AST_POLYMORPHIC_SUPPORTED_TYPES_2(CXXOperatorCallExpr, CXXMethodDecl)>(
1460ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen      Name);
14614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
14624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
14634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches C++ classes that are directly or indirectly derived from
146420b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper/// a class matching \c Base.
14654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
146676dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper/// Note that a class is not considered to be derived from itself.
14674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
146876dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper/// Example matches Y, Z, C (Base == hasName("X"))
146925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
147076dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper///   class X;
14714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y : public X {};  // directly derived
14724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Z : public Y {};  // indirectly derived
14734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   typedef X A;
14744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   typedef A B;
14754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class C : public B {};  // derived from a typedef of X
147625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
14774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
147820b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper/// In the following example, Bar matches isDerivedFrom(hasName("X")):
147925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
14804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Foo;
14814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   typedef Foo X;
14824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Bar : public Foo {};  // derived from a type that X is a typedef of
148325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
148420b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel JasperAST_MATCHER_P(CXXRecordDecl, isDerivedFrom,
148520b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper              internal::Matcher<NamedDecl>, Base) {
148620b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper  return Finder->classIsDerivedFrom(&Node, Base, Builder);
148720b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper}
148820b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper
148920b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper/// \brief Overloaded method as shortcut for \c isDerivedFrom(hasName(...)).
149020b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasperinline internal::Matcher<CXXRecordDecl> isDerivedFrom(StringRef BaseName) {
149120b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper  assert(!BaseName.empty());
149220b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper  return isDerivedFrom(hasName(BaseName));
14934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
14944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
149576dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper/// \brief Similar to \c isDerivedFrom(), but also matches classes that directly
149676dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper/// match \c Base.
149763d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasperinline internal::Matcher<CXXRecordDecl> isSameOrDerivedFrom(
149863d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper    internal::Matcher<NamedDecl> Base) {
149976dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper  return anyOf(Base, isDerivedFrom(Base));
150076dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper}
150176dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper
150263d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper/// \brief Overloaded method as shortcut for
150363d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper/// \c isSameOrDerivedFrom(hasName(...)).
150463d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasperinline internal::Matcher<CXXRecordDecl> isSameOrDerivedFrom(
150563d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper    StringRef BaseName) {
150676dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper  assert(!BaseName.empty());
150763d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper  return isSameOrDerivedFrom(hasName(BaseName));
150876dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper}
150976dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper
15106a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \brief Matches the first method of a class or struct that satisfies \c
15116a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// InnerMatcher.
15126a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///
15136a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// Given:
15146a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \code
15156a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   class A { void func(); };
15166a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   class B { void member(); };
15176a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \code
15186a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///
15196a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \c recordDecl(hasMethod(hasName("func"))) matches the declaration of \c A
15206a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// but not \c B.
15216a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin VaneAST_MATCHER_P(CXXRecordDecl, hasMethod, internal::Matcher<CXXMethodDecl>,
15226a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane              InnerMatcher) {
1523054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  return matchesFirstInPointerRange(InnerMatcher, Node.method_begin(),
1524054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek                                    Node.method_end(), Finder, Builder);
15256a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane}
15266a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane
15274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches AST nodes that have child AST nodes that match the
15284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// provided matcher.
15294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
15302dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
153125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
15324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X {};  // Matches X, because X::X is a class of name X inside X.
15334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y { class X {}; };
15344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Z { class Y { class X {}; }; };  // Does not match Z.
153525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
15364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
15374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// ChildT must be an AST base type.
153825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
153925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher
15404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename ChildT>
15414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinternal::ArgumentAdaptingMatcher<internal::HasMatcher, ChildT> has(
15424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    const internal::Matcher<ChildT> &ChildMatcher) {
15434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::ArgumentAdaptingMatcher<internal::HasMatcher,
15444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek                                           ChildT>(ChildMatcher);
15454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
15464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
15474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches AST nodes that have descendant AST nodes that match the
15484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// provided matcher.
15494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
15504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X, Y, Z
15512dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = recordDecl(hasDescendant(recordDecl(hasName("X")))))
155225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
15534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X {};  // Matches X, because X::X is a class of name X inside X.
15544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y { class X {}; };
15554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Z { class Y { class X {}; }; };
155625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
15574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
15584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// DescendantT must be an AST base type.
155925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
156025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher
15614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename DescendantT>
15624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinternal::ArgumentAdaptingMatcher<internal::HasDescendantMatcher, DescendantT>
15634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekhasDescendant(const internal::Matcher<DescendantT> &DescendantMatcher) {
15644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::ArgumentAdaptingMatcher<
15654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    internal::HasDescendantMatcher,
15664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    DescendantT>(DescendantMatcher);
15674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
15684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
15694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches AST nodes that have child AST nodes that match the
15704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// provided matcher.
15714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
15722dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
157325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
15744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X {};  // Matches X, because X::X is a class of name X inside X.
15754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y { class X {}; };
15764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Z { class Y { class X {}; }; };  // Does not match Z.
157725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
15784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
15794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// ChildT must be an AST base type.
15804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
15814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// As opposed to 'has', 'forEach' will cause a match for each result that
15824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches instead of only on the first one.
158325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
158425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher
15854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename ChildT>
15864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinternal::ArgumentAdaptingMatcher<internal::ForEachMatcher, ChildT> forEach(
158725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    const internal::Matcher<ChildT> &ChildMatcher) {
15884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::ArgumentAdaptingMatcher<
15894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    internal::ForEachMatcher,
15904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    ChildT>(ChildMatcher);
15914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
15924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
15934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches AST nodes that have descendant AST nodes that match the
15944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// provided matcher.
15954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
15964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X, A, B, C
15972dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X")))))
159825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
15994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X {};  // Matches X, because X::X is a class of name X inside X.
16004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class A { class X {}; };
16014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class B { class C { class X {}; }; };
160225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
16034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
16044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// DescendantT must be an AST base type.
16054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
16064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
16074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// each result that matches instead of only on the first one.
16084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
16094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Note: Recursively combined ForEachDescendant can cause many matches:
16102dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///   recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl()))))
16114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// will match 10 times (plus injected class name matches) on:
161225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
16134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class A { class B { class C { class D { class E {}; }; }; }; };
161425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
161525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
161625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher
16174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename DescendantT>
1618a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasperinternal::ArgumentAdaptingMatcher<internal::ForEachDescendantMatcher,
1619a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper                                  DescendantT>
16204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekforEachDescendant(
162125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    const internal::Matcher<DescendantT> &DescendantMatcher) {
16224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::ArgumentAdaptingMatcher<
16234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    internal::ForEachDescendantMatcher,
16244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    DescendantT>(DescendantMatcher);
16254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
16264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
1627152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \brief Matches if the node or any descendant matches.
1628152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek///
1629152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// Generates results for each match.
1630152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek///
1631152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// For example, in:
1632152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \code
1633152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek///   class A { class B {}; class C {}; };
1634152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \endcode
1635152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// The matcher:
1636152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \code
1637152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek///   recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m")))
1638152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \endcode
1639152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// will generate results for \c A, \c B and \c C.
1640152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek///
1641152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// Usable as: Any Matcher
1642152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimektemplate <typename T>
1643152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimekinternal::PolymorphicMatcherWithParam2<
1644152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek    internal::EachOfMatcher, internal::Matcher<T>,
1645152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek    internal::ArgumentAdaptingMatcher<internal::ForEachDescendantMatcher, T> >
1646152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel KlimekfindAll(const internal::Matcher<T> &Matcher) {
1647152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek  return eachOf(Matcher, forEachDescendant(Matcher));
1648152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek}
1649152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek
1650c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// \brief Matches AST nodes that have a parent that matches the provided
1651c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// matcher.
1652c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper///
1653c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// Given
1654c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// \code
1655c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
1656c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// \endcode
1657c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// \c compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
1658c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper///
1659c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// Usable as: Any Matcher
1660c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jaspertemplate <typename ParentT>
1661c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasperinternal::ArgumentAdaptingMatcher<internal::HasParentMatcher, ParentT>
1662c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel JasperhasParent(const internal::Matcher<ParentT> &ParentMatcher) {
1663c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper  return internal::ArgumentAdaptingMatcher<
1664c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper    internal::HasParentMatcher,
1665c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper    ParentT>(ParentMatcher);
1666c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper}
1667c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper
1668579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// \brief Matches AST nodes that have an ancestor that matches the provided
1669579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// matcher.
1670579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek///
1671579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// Given
1672579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// \code
1673579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// void f() { if (true) { int x = 42; } }
1674579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// void g() { for (;;) { int x = 43; } }
1675579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// \endcode
1676a1a4c0385a0fd458243d9e357e1eceb137f29abfNick Lewycky/// \c expr(integerLiteral(hasAncestor(ifStmt()))) matches \c 42, but not 43.
1677579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek///
1678579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// Usable as: Any Matcher
1679579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimektemplate <typename AncestorT>
1680579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimekinternal::ArgumentAdaptingMatcher<internal::HasAncestorMatcher, AncestorT>
1681579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel KlimekhasAncestor(const internal::Matcher<AncestorT> &AncestorMatcher) {
1682579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek  return internal::ArgumentAdaptingMatcher<
1683579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek    internal::HasAncestorMatcher,
1684579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek    AncestorT>(AncestorMatcher);
1685579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek}
1686579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek
16874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the provided matcher does not match.
16884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
16892dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches Y (matcher = recordDecl(unless(hasName("X"))))
169025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
16914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X {};
16924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y {};
169325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
169425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
169525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher
16964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename M>
169725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam1<internal::NotMatcher, M>
169825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekunless(const M &InnerMatcher) {
16994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::PolymorphicMatcherWithParam1<
17004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    internal::NotMatcher, M>(InnerMatcher);
17014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
17024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
170303a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// \brief Matches a node if the declaration associated with that node
170403a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// matches the given matcher.
170503a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek///
170603a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// The associated declaration is:
170703a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// - for type nodes, the declaration of the underlying type
170803a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// - for CallExpr, the declaration of the callee
170903a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// - for MemberExpr, the declaration of the referenced member
171003a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// - for CXXConstructExpr, the declaration of the constructor
171103a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek///
171203a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// Also usable as Matcher<T> for any T supporting the getDecl() member
171303a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// function. e.g. various subtypes of clang::Type and various expressions.
171403a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// FIXME: Add all node types for which this is matcher is usable due to
171503a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// getDecl().
1716523806028d812a7f29636c59a8bc0e7e3d3fd9aeEdwin Vane///
1717c711af2ddbbb1d46223cc9379d32a203fb5bc7f4Daniel Jasper/// Usable as: Matcher<QualType>, Matcher<CallExpr>, Matcher<CXXConstructExpr>,
17183abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///   Matcher<MemberExpr>, Matcher<TypedefType>,
17193abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///   Matcher<TemplateSpecializationType>
17204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinline internal::PolymorphicMatcherWithParam1< internal::HasDeclarationMatcher,
1721e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper                                     internal::Matcher<Decl> >
1722e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    hasDeclaration(const internal::Matcher<Decl> &InnerMatcher) {
17234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::PolymorphicMatcherWithParam1<
17244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    internal::HasDeclarationMatcher,
1725e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    internal::Matcher<Decl> >(InnerMatcher);
17264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
17274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
17284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches on the implicit object argument of a member call expression.
17294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
17302dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y"))))))
173125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
17324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y { public: void x(); };
17334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void z() { Y y; y.x(); }",
173425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
17354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
17364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: Overload to allow directly matching types?
1737e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXMemberCallExpr, on, internal::Matcher<Expr>,
17384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek              InnerMatcher) {
1739f8c12146fa2153a6d97b7c92d27d2ece0cd26e79Dmitri Gribenko  const Expr *ExprNode = Node.getImplicitObjectArgument()
1740f8c12146fa2153a6d97b7c92d27d2ece0cd26e79Dmitri Gribenko                            ->IgnoreParenImpCasts();
17414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (ExprNode != NULL &&
17424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*ExprNode, Finder, Builder));
17434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
17444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
17454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the call expression's callee expression matches.
17464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
17474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
174825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
17494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y { void x() { this->x(); x(); Y y; y.x(); } };
17504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void f() { f(); }
175125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
17522dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// callExpr(callee(expr()))
17534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches this->x(), x(), y.x(), f()
17544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with callee(...)
17554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matching this->x, x, y.x, f respectively
17564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
1757e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Note: Callee cannot take the more general internal::Matcher<Expr>
17584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// because this introduces ambiguous overloads with calls to Callee taking a
1759e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// internal::Matcher<Decl>, as the matcher hierarchy is purely
17604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// implemented in terms of implicit casts.
1761e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CallExpr, callee, internal::Matcher<Stmt>,
17624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek              InnerMatcher) {
1763e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Expr *ExprNode = Node.getCallee();
17644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (ExprNode != NULL &&
17654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*ExprNode, Finder, Builder));
17664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
17674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
17684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the call expression's callee's declaration matches the
17694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// given matcher.
17704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
17712dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x")))))
177225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
17734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y { public: void x(); };
17744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void z() { Y y; y.x();
177525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1776e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<CallExpr> callee(
1777e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    const internal::Matcher<Decl> &InnerMatcher) {
1778415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return callExpr(hasDeclaration(InnerMatcher));
17794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
17804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
17814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the expression's or declaration's type matches a type
17824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matcher.
17834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
17842dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
17852dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///             and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
178625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
17874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///  class X {};
17884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///  void y(X &x) { x; X z; }
178925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1790ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel BenzaquenAST_POLYMORPHIC_MATCHER_P(hasType,
1791ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                          AST_POLYMORPHIC_SUPPORTED_TYPES_2(Expr, ValueDecl),
1792ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                          internal::Matcher<QualType>, InnerMatcher) {
17934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return InnerMatcher.matches(Node.getType(), Finder, Builder);
17944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
17954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
17964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Overloaded to match the declaration of the expression's or value
17974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// declaration's type.
17984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
17994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// In case of a value declaration (for example a variable declaration),
18004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// this resolves one layer of indirection. For example, in the value
18012dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
18022dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
18034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// of x."
18044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
18052dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
18062dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///             and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
180725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
18084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///  class X {};
18094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///  void y(X &x) { x; X z; }
181025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1811297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek///
1812297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// Usable as: Matcher<Expr>, Matcher<ValueDecl>
18134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinline internal::PolymorphicMatcherWithParam1<
1814ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    internal::matcher_hasType0Matcher, internal::Matcher<QualType>,
1815ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    AST_POLYMORPHIC_SUPPORTED_TYPES_2(Expr, ValueDecl)>
1816e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperhasType(const internal::Matcher<Decl> &InnerMatcher) {
1817415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return hasType(qualType(hasDeclaration(InnerMatcher)));
18184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
18194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
18201a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// \brief Matches if the type location of the declarator decl's type matches
18211a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// the inner matcher.
18221a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek///
18231a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// Given
18241a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// \code
18251a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek///   int x;
18261a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// \endcode
18271a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// declaratorDecl(hasTypeLoc(loc(asString("int"))))
18281a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek///   matches int x
18291a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel KlimekAST_MATCHER_P(DeclaratorDecl, hasTypeLoc, internal::Matcher<TypeLoc>, Inner) {
18301a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek  if (!Node.getTypeSourceInfo())
18311a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek    // This happens for example for implicit destructors.
18321a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek    return false;
18331a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek  return Inner.matches(Node.getTypeSourceInfo()->getTypeLoc(), Finder, Builder);
18341a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek}
18351a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek
1836e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches if the matched type is represented by the given string.
1837e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
1838e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
183925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1840e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   class Y { public: void x(); };
1841e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   void z() { Y* y; y->x(); }
184225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
18432dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// callExpr(on(hasType(asString("class Y *"))))
1844e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches y->x()
1845e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(QualType, asString, std::string, Name) {
1846e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return Name == Node.getAsString();
1847e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
1848e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
18494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the matched type is a pointer type and the pointee type
18504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches the specified matcher.
18514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
18524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches y->x()
18532dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = callExpr(on(hasType(pointsTo(recordDecl(hasName("Y")))))))
185425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
18554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y { public: void x(); };
18564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void z() { Y *y; y->x(); }
185725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
18584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekAST_MATCHER_P(
1859e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    QualType, pointsTo, internal::Matcher<QualType>,
18604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    InnerMatcher) {
1861e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return (!Node.isNull() && Node->isPointerType() &&
18624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(Node->getPointeeType(), Finder, Builder));
18634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
18644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
18654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Overloaded to match the pointee type's declaration.
1866e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<QualType> pointsTo(
1867e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    const internal::Matcher<Decl> &InnerMatcher) {
1868415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return pointsTo(qualType(hasDeclaration(InnerMatcher)));
18694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
18704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
18714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the matched type is a reference type and the referenced
18724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// type matches the specified matcher.
18734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
18744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X &x and const X &y
18752dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = varDecl(hasType(references(recordDecl(hasName("X"))))))
187625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
18774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X {
18784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     void a(X b) {
18794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///       X &x = b;
18804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///       const X &y = b;
18814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
188225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1883e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(QualType, references, internal::Matcher<QualType>,
18844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek              InnerMatcher) {
1885e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return (!Node.isNull() && Node->isReferenceType() &&
18864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(Node->getPointeeType(), Finder, Builder));
18874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
18884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
18896a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \brief Matches QualTypes whose canonical type matches InnerMatcher.
18906a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///
18916a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// Given:
18926a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \code
18936a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   typedef int &int_ref;
18946a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   int a;
18956a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   int_ref b = a;
18966a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \code
18976a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///
18986a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \c varDecl(hasType(qualType(referenceType()))))) will not match the
18996a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// declaration of b but \c
19006a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
19016a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin VaneAST_MATCHER_P(QualType, hasCanonicalType, internal::Matcher<QualType>,
19026a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane              InnerMatcher) {
190354eeac9cb538e4fc4eecd81f2eda8f6fa727ca76Edwin Vane  if (Node.isNull())
190454eeac9cb538e4fc4eecd81f2eda8f6fa727ca76Edwin Vane    return false;
19056a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane  return InnerMatcher.matches(Node.getCanonicalType(), Finder, Builder);
19066a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane}
19076a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane
19084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Overloaded to match the referenced type's declaration.
1909e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<QualType> references(
1910e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    const internal::Matcher<Decl> &InnerMatcher) {
1911415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return references(qualType(hasDeclaration(InnerMatcher)));
19124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
19134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
1914e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXMemberCallExpr, onImplicitObjectArgument,
1915e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
1916f8c12146fa2153a6d97b7c92d27d2ece0cd26e79Dmitri Gribenko  const Expr *ExprNode = Node.getImplicitObjectArgument();
19174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (ExprNode != NULL &&
19184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*ExprNode, Finder, Builder));
19194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
19204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
19214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the expression's type either matches the specified
19224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matcher, or is a pointer to a type that matches the InnerMatcher.
19239f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimekinline internal::Matcher<CXXMemberCallExpr> thisPointerType(
1924e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    const internal::Matcher<QualType> &InnerMatcher) {
19254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return onImplicitObjectArgument(
19264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek      anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))));
19274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
19284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
19294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Overloaded to match the type's declaration.
19309f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimekinline internal::Matcher<CXXMemberCallExpr> thisPointerType(
1931e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    const internal::Matcher<Decl> &InnerMatcher) {
19324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return onImplicitObjectArgument(
19334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek      anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))));
19344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
19354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
19364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a DeclRefExpr that refers to a declaration that matches the
19374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// specified matcher.
19384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
19394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches x in if(x)
19402dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = declRefExpr(to(varDecl(hasName("x")))))
194125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
19424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   bool x;
19434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   if (x) {}
194425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1945e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(DeclRefExpr, to, internal::Matcher<Decl>,
19464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek              InnerMatcher) {
1947e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Decl *DeclNode = Node.getDecl();
19484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (DeclNode != NULL &&
19494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*DeclNode, Finder, Builder));
19504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
19514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
1952e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches a \c DeclRefExpr that refers to a declaration through a
1953e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// specific using shadow declaration.
1954e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
1955e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// FIXME: This currently only works for functions. Fix.
1956e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
1957e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
195825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1959e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   namespace a { void f() {} }
1960e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   using a::f;
1961e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   void g() {
1962e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///     f();     // Matches this ..
1963e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///     a::f();  // .. but not this.
1964e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   }
196525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
19662dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declRefExpr(throughUsingDeclaration(anything()))
1967e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches \c f()
1968e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(DeclRefExpr, throughUsingDecl,
196925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<UsingShadowDecl>, InnerMatcher) {
1970e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const NamedDecl *FoundDecl = Node.getFoundDecl();
1971cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  if (const UsingShadowDecl *UsingDecl = dyn_cast<UsingShadowDecl>(FoundDecl))
197225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    return InnerMatcher.matches(*UsingDecl, Finder, Builder);
1973e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return false;
1974e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
1975e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
1976425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// \brief Matches the Decl of a DeclStmt which has a single declaration.
1977425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///
1978425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// Given
197925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1980425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int a, b;
1981425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int c;
198225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
19832dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declStmt(hasSingleDecl(anything()))
1984425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   matches 'int c;' but not 'int a, b;'.
1985425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam PanzerAST_MATCHER_P(DeclStmt, hasSingleDecl, internal::Matcher<Decl>, InnerMatcher) {
1986425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  if (Node.isSingleDecl()) {
1987425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer    const Decl *FoundDecl = Node.getSingleDecl();
1988425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer    return InnerMatcher.matches(*FoundDecl, Finder, Builder);
1989425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  }
1990425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  return false;
1991425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer}
1992425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer
19934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a variable declaration that has an initializer expression
19944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// that matches the given matcher.
19954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
19962dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches x (matcher = varDecl(hasInitializer(callExpr())))
199725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
19984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   bool y() { return true; }
19994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   bool x = y();
200025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
20014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekAST_MATCHER_P(
2002e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    VarDecl, hasInitializer, internal::Matcher<Expr>,
20034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    InnerMatcher) {
2004e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Expr *Initializer = Node.getAnyInitializer();
20054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (Initializer != NULL &&
20064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*Initializer, Finder, Builder));
20074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
20084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
20094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Checks that a call expression or a constructor call expression has
20104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// a specific number of arguments (including absent default arguments).
20114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
20122dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
201325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
20144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void f(int x, int y);
20154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   f(0, 0);
201625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2017ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel BenzaquenAST_POLYMORPHIC_MATCHER_P(argumentCountIs, AST_POLYMORPHIC_SUPPORTED_TYPES_2(
2018ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                                               CallExpr, CXXConstructExpr),
2019ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                          unsigned, N) {
20204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return Node.getNumArgs() == N;
20214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
20224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
20234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the n'th argument of a call expression or a constructor
20244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// call expression.
20254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
20264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches y in x(y)
20272dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = callExpr(hasArgument(0, declRefExpr())))
202825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
20294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void x(int) { int y; x(y); }
203025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
20314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekAST_POLYMORPHIC_MATCHER_P2(
2032ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    hasArgument,
2033ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    AST_POLYMORPHIC_SUPPORTED_TYPES_2(CallExpr, CXXConstructExpr),
2034ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    unsigned, N, internal::Matcher<Expr>, InnerMatcher) {
20354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (N < Node.getNumArgs() &&
20364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(
20374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek              *Node.getArg(N)->IgnoreParenImpCasts(), Finder, Builder));
20384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
20394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
2040425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// \brief Matches declaration statements that contain a specific number of
2041425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// declarations.
2042425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///
2043425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// Example: Given
204425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2045425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int a, b;
2046425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int c;
2047425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int d = 2, e;
204825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2049425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// declCountIs(2)
2050425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2051425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam PanzerAST_MATCHER_P(DeclStmt, declCountIs, unsigned, N) {
2052217c484522926f9fc664ec3bfaf3cffe456244b0Benjamin Kramer  return std::distance(Node.decl_begin(), Node.decl_end()) == (ptrdiff_t)N;
2053425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer}
2054425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer
2055425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// \brief Matches the n'th declaration of a declaration statement.
2056425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///
2057425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// Note that this does not work for global declarations because the AST
2058425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// breaks up multiple-declaration DeclStmt's into multiple single-declaration
2059425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// DeclStmt's.
2060425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// Example: Given non-global declarations
206125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2062425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int a, b = 0;
2063425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int c;
2064425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int d = 2, e;
206525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
20662dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declStmt(containsDeclaration(
20672dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///       0, varDecl(hasInitializer(anything()))))
2068425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   matches only 'int d = 2, e;', and
20692dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declStmt(containsDeclaration(1, varDecl()))
207025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2071425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   matches 'int a, b = 0' as well as 'int d = 2, e;'
2072425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   but 'int c;' is not matched.
207325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2074425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam PanzerAST_MATCHER_P2(DeclStmt, containsDeclaration, unsigned, N,
2075425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer               internal::Matcher<Decl>, InnerMatcher) {
2076425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  const unsigned NumDecls = std::distance(Node.decl_begin(), Node.decl_end());
2077425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  if (N >= NumDecls)
2078425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer    return false;
2079425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  DeclStmt::const_decl_iterator Iterator = Node.decl_begin();
2080425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  std::advance(Iterator, N);
2081425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  return InnerMatcher.matches(**Iterator, Finder, Builder);
2082425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer}
2083425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer
20844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a constructor initializer.
20854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
20864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
208725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
20884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   struct Foo {
20894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     Foo() : foo_(1) { }
20904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     int foo_;
20914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
209225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
20932dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything()))))
2094e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   record matches Foo, hasAnyConstructorInitializer matches foo_(1)
2095e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXConstructorDecl, hasAnyConstructorInitializer,
2096e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<CXXCtorInitializer>, InnerMatcher) {
2097054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  return matchesFirstInPointerRange(InnerMatcher, Node.init_begin(),
2098054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek                                    Node.init_end(), Finder, Builder);
20994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
21004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
21014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the field declaration of a constructor initializer.
21024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
21034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
210425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
21054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   struct Foo {
21064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     Foo() : foo_(1) { }
21074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     int foo_;
21084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
210925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
21102dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
21114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     forField(hasName("foo_"))))))
21124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches Foo
21134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with forField matching foo_
2114e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXCtorInitializer, forField,
2115e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<FieldDecl>, InnerMatcher) {
2116e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const FieldDecl *NodeAsDecl = Node.getMember();
21174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (NodeAsDecl != NULL &&
21184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek      InnerMatcher.matches(*NodeAsDecl, Finder, Builder));
21194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
21204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
21214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the initializer expression of a constructor initializer.
21224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
21234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
212425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
21254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   struct Foo {
21264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     Foo() : foo_(1) { }
21274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     int foo_;
21284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
212925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
21302dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
21314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     withInitializer(integerLiteral(equals(1)))))))
21324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches Foo
21334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with withInitializer matching (1)
2134e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXCtorInitializer, withInitializer,
2135e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2136e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Expr* NodeAsExpr = Node.getInit();
21374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (NodeAsExpr != NULL &&
21384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek      InnerMatcher.matches(*NodeAsExpr, Finder, Builder));
21394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
21404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
21414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a contructor initializer if it is explicitly written in
21424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// code (as opposed to implicitly added by the compiler).
21434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
21444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
214525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
21464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   struct Foo {
21474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     Foo() { }
21484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     Foo(int) : foo_("A") { }
21494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     string foo_;
21504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
215125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
21522dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// constructorDecl(hasAnyConstructorInitializer(isWritten()))
21534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   will match Foo(int), but not Foo()
2154e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER(CXXCtorInitializer, isWritten) {
21554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return Node.isWritten();
21564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
21574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
21584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a constructor declaration that has been implicitly added
21594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// by the compiler (eg. implicit default/copy constructors).
2160e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER(CXXConstructorDecl, isImplicit) {
21614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return Node.isImplicit();
21624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
21634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
21644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches any argument of a call expression or a constructor call
21654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// expression.
21664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
21674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
216825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
21694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void x(int, int, int) { int y; x(1, y, 42); }
217025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
21712dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// callExpr(hasAnyArgument(declRefExpr()))
21724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches x(1, y, 42)
21734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with hasAnyArgument(...)
21744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matching y
2175054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek///
2176054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek/// FIXME: Currently this will ignore parentheses and implicit casts on
2177054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek/// the argument before applying the inner matcher. We'll want to remove
2178054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek/// this to allow for greater control by the user once \c ignoreImplicit()
2179054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek/// has been implemented.
2180ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel BenzaquenAST_POLYMORPHIC_MATCHER_P(hasAnyArgument, AST_POLYMORPHIC_SUPPORTED_TYPES_2(
2181ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                                              CallExpr, CXXConstructExpr),
2182ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                          internal::Matcher<Expr>, InnerMatcher) {
21834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  for (unsigned I = 0; I < Node.getNumArgs(); ++I) {
2184054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek    BoundNodesTreeBuilder Result(*Builder);
2185054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek    if (InnerMatcher.matches(*Node.getArg(I)->IgnoreParenImpCasts(), Finder,
2186054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek                             &Result)) {
2187054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek      *Builder = Result;
21884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek      return true;
21894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    }
21904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  }
21914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return false;
21924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
21934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
21944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the n'th parameter of a function declaration.
21954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
21964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
219725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
21984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X { void f(int x) {} };
219925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
22002dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// methodDecl(hasParameter(0, hasType(varDecl())))
22014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches f(int x) {}
22024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with hasParameter(...)
22034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matching int x
2204e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P2(FunctionDecl, hasParameter,
2205e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper               unsigned, N, internal::Matcher<ParmVarDecl>,
22064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek               InnerMatcher) {
22074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (N < Node.getNumParams() &&
22084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(
22094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek              *Node.getParamDecl(N), Finder, Builder));
22104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
22114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
22124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches any parameter of a function declaration.
22134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
22144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Does not match the 'this' parameter of a method.
22154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
22164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
221725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
22184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X { void f(int x, int y, int z) {} };
221925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
22202dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// methodDecl(hasAnyParameter(hasName("y")))
22214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches f(int x, int y, int z) {}
22224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with hasAnyParameter(...)
22234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matching int y
2224e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(FunctionDecl, hasAnyParameter,
2225e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<ParmVarDecl>, InnerMatcher) {
2226054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  return matchesFirstInPointerRange(InnerMatcher, Node.param_begin(),
2227054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek                                    Node.param_end(), Finder, Builder);
22284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
22294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
223036e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// \brief Matches \c FunctionDecls that have a specific parameter count.
223136e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper///
223236e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// Given
223336e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// \code
223436e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper///   void f(int i) {}
223536e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper///   void g(int i, int j) {}
223636e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// \endcode
223736e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// functionDecl(parameterCountIs(2))
223836e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper///   matches g(int i, int j) {}
223936e29d6732814e958aea4b2f403cec63d7ed3116Daniel JasperAST_MATCHER_P(FunctionDecl, parameterCountIs, unsigned, N) {
224036e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper  return Node.getNumParams() == N;
224136e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper}
224236e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper
2243e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches the return type of a function declaration.
2244e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
2245e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given:
224625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2247e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   class X { int f() { return 1; } };
224825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
22492dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// methodDecl(returns(asString("int")))
2250e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches int f() { return 1; }
225125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekAST_MATCHER_P(FunctionDecl, returns,
225225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<QualType>, InnerMatcher) {
225325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek  return InnerMatcher.matches(Node.getResultType(), Finder, Builder);
2254e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
2255e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
22568cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper/// \brief Matches extern "C" function declarations.
22578cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper///
22588cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper/// Given:
225925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
22608cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper///   extern "C" void f() {}
22618cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper///   extern "C" { void g() {} }
22628cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper///   void h() {}
226325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
22642dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// functionDecl(isExternC())
22658cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper///   matches the declaration of f and g, but not the declaration h
22668cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel JasperAST_MATCHER(FunctionDecl, isExternC) {
22678cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper  return Node.isExternC();
22688cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper}
22698cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper
22706a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches the condition expression of an if statement, for loop,
22716a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// or conditional operator.
22724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
22734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
227425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
22754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   if (true) {}
227625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2277ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel BenzaquenAST_POLYMORPHIC_MATCHER_P(
2278ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    hasCondition, AST_POLYMORPHIC_SUPPORTED_TYPES_5(
2279ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                      IfStmt, ForStmt, WhileStmt, DoStmt, ConditionalOperator),
2280ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    internal::Matcher<Expr>, InnerMatcher) {
2281e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Expr *const Condition = Node.getCond();
22824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (Condition != NULL &&
22834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*Condition, Finder, Builder));
22844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
22854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
2286cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimeknamespace internal {
2287cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimekstruct NotEqualsBoundNodePredicate {
2288cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  bool operator()(const internal::BoundNodesMap &Nodes) const {
2289cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek    return Nodes.getNode(ID) != Node;
2290cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  }
2291cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  std::string ID;
2292cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  ast_type_traits::DynTypedNode Node;
2293cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek};
2294cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek} // namespace internal
2295cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek
2296cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// \brief Matches if a node equals a previously bound node.
2297cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek///
2298cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// Matches a node if it equals the node previously bound to \p ID.
2299cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek///
2300cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// Given
2301cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// \code
2302cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek///   class X { int a; int b; };
2303cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// \endcode
2304cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// recordDecl(
2305cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek///     has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2306cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek///     has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2307cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek///   matches the class \c X, as \c a and \c b have the same type.
2308cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek///
2309cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// Note that when multiple matches are involved via \c forEach* matchers,
2310cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// \c equalsBoundNodes acts as a filter.
2311cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// For example:
2312cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// compoundStmt(
2313cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek///     forEachDescendant(varDecl().bind("d")),
2314cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek///     forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2315cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// will trigger a match for each combination of variable declaration
2316cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// and reference to that variable declaration within a compound statement.
2317ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel BenzaquenAST_POLYMORPHIC_MATCHER_P(equalsBoundNode, AST_POLYMORPHIC_SUPPORTED_TYPES_4(
2318ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                                               Stmt, Decl, Type, QualType),
2319ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                          std::string, ID) {
2320cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  // FIXME: Figure out whether it makes sense to allow this
2321cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  // on any other node types.
2322cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  // For *Loc it probably does not make sense, as those seem
2323cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  // unique. For NestedNameSepcifier it might make sense, as
2324cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  // those also have pointer identity, but I'm not sure whether
2325cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  // they're ever reused.
2326cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  internal::NotEqualsBoundNodePredicate Predicate;
2327cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  Predicate.ID = ID;
2328cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  Predicate.Node = ast_type_traits::DynTypedNode::create(Node);
2329cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  return Builder->removeBindings(Predicate);
2330cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek}
2331cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek
23324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the condition variable statement in an if statement.
23334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
23344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
233525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
23364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   if (A* a = GetAPointer()) {}
233725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
23384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// hasConditionVariableStatment(...)
23394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches 'A* a = GetAPointer()'.
2340e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(IfStmt, hasConditionVariableStatement,
2341e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<DeclStmt>, InnerMatcher) {
2342e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const DeclStmt* const DeclarationStatement =
23434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    Node.getConditionVariableDeclStmt();
23444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return DeclarationStatement != NULL &&
23454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek         InnerMatcher.matches(*DeclarationStatement, Finder, Builder);
23464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
23474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
2348e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches the index expression of an array subscript expression.
2349e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
2350e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
235125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2352e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   int i[5];
2353e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   void f() { i[1] = 42; }
235425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2355e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// arraySubscriptExpression(hasIndex(integerLiteral()))
2356e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches \c i[1] with the \c integerLiteral() matching \c 1
2357e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ArraySubscriptExpr, hasIndex,
235825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<Expr>, InnerMatcher) {
2359e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  if (const Expr* Expression = Node.getIdx())
236025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    return InnerMatcher.matches(*Expression, Finder, Builder);
2361e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return false;
2362e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
2363e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
2364e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches the base expression of an array subscript expression.
2365e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
2366e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
236725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2368e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   int i[5];
2369e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   void f() { i[1] = 42; }
237025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
23712dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// arraySubscriptExpression(hasBase(implicitCastExpr(
23722dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     hasSourceExpression(declRefExpr()))))
23732dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///   matches \c i[1] with the \c declRefExpr() matching \c i
2374e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ArraySubscriptExpr, hasBase,
237525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<Expr>, InnerMatcher) {
2376e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  if (const Expr* Expression = Node.getBase())
237725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    return InnerMatcher.matches(*Expression, Finder, Builder);
2378e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return false;
2379e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
2380e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
23816a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches a 'for', 'while', or 'do while' statement that has
23826a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// a given body.
23834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
23844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
238525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
23864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   for (;;) {}
238725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
23882dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// hasBody(compoundStmt())
23894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches 'for (;;) {}'
23902dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// with compoundStmt()
23914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matching '{}'
2392ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel BenzaquenAST_POLYMORPHIC_MATCHER_P(
2393ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    hasBody, AST_POLYMORPHIC_SUPPORTED_TYPES_3(DoStmt, ForStmt, WhileStmt),
2394ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    internal::Matcher<Stmt>, InnerMatcher) {
2395e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Stmt *const Statement = Node.getBody();
23964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (Statement != NULL &&
23974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*Statement, Finder, Builder));
23984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
23994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
24004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches compound statements where at least one substatement matches
24014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// a given matcher.
24024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
24034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
240425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
24054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   { {}; 1+2; }
240625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
24072dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// hasAnySubstatement(compoundStmt())
24084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches '{ {}; 1+2; }'
24092dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// with compoundStmt()
24104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matching '{}'
2411e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CompoundStmt, hasAnySubstatement,
2412e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Stmt>, InnerMatcher) {
2413054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  return matchesFirstInPointerRange(InnerMatcher, Node.body_begin(),
2414054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek                                    Node.body_end(), Finder, Builder);
24154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
24164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
24174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Checks that a compound statement contains a specific number of
24184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// child statements.
24194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
24204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: Given
242125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
24224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   { for (;;) {} }
242325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
24242dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// compoundStmt(statementCountIs(0)))
24254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches '{}'
24264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   but does not match the outer compound statement.
2427e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CompoundStmt, statementCountIs, unsigned, N) {
24284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return Node.size() == N;
24294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
24304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
24314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches literals that are equal to the given value.
24324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
24334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches true (matcher = boolLiteral(equals(true)))
243425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
24354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   true
243625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2437297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek///
2438297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// Usable as: Matcher<CharacterLiteral>, Matcher<CXXBoolLiteral>,
2439297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek///            Matcher<FloatingLiteral>, Matcher<IntegerLiteral>
24404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename ValueT>
24414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinternal::PolymorphicMatcherWithParam1<internal::ValueEqualsMatcher, ValueT>
24424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekequals(const ValueT &Value) {
24434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::PolymorphicMatcherWithParam1<
24444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    internal::ValueEqualsMatcher,
24454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    ValueT>(Value);
24464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
24474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
24484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the operator Name of operator expressions (binary or
24494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// unary).
24504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
24514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
245225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
24534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   !(a || b)
245425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2455ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel BenzaquenAST_POLYMORPHIC_MATCHER_P(hasOperatorName, AST_POLYMORPHIC_SUPPORTED_TYPES_2(
2456ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                                               BinaryOperator, UnaryOperator),
2457ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                          std::string, Name) {
24584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return Name == Node.getOpcodeStr(Node.getOpcode());
24594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
24604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
24614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the left hand side of binary operator expressions.
24624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
24634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a (matcher = binaryOperator(hasLHS()))
246425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
24654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   a || b
246625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2467e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(BinaryOperator, hasLHS,
2468e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2469e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Expr *LeftHandSide = Node.getLHS();
24704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (LeftHandSide != NULL &&
24714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*LeftHandSide, Finder, Builder));
24724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
24734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
24744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the right hand side of binary operator expressions.
24754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
24764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches b (matcher = binaryOperator(hasRHS()))
247725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
24784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   a || b
247925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2480e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(BinaryOperator, hasRHS,
2481e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2482e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Expr *RightHandSide = Node.getRHS();
24834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (RightHandSide != NULL &&
24844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*RightHandSide, Finder, Builder));
24854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
24864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
24874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if either the left hand side or the right hand side of a
24884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// binary operator matches.
2489e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<BinaryOperator> hasEitherOperand(
2490e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    const internal::Matcher<Expr> &InnerMatcher) {
24914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return anyOf(hasLHS(InnerMatcher), hasRHS(InnerMatcher));
24924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
24934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
24944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the operand of a unary operator matches.
24954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
24969158a5624154bc43bbbf059c07a2f7b2cd45c1a1Alexander Kornienko/// Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true))))
249725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
24984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   !true
249925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2500e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UnaryOperator, hasUnaryOperand,
2501e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2502e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Expr * const Operand = Node.getSubExpr();
25034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (Operand != NULL &&
25044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*Operand, Finder, Builder));
25054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
25064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
2507715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek/// \brief Matches if the cast's source expression matches the given matcher.
25084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
25094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: matches "a string" (matcher =
25102dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///                                  hasSourceExpression(constructExpr()))
251125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
25124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class URL { URL(string); };
25134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// URL url = "a string";
2514715c9568ee5d75f25dab98229c87bcec880daf5dManuel KlimekAST_MATCHER_P(CastExpr, hasSourceExpression,
2515e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2516e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Expr* const SubExpression = Node.getSubExpr();
25174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (SubExpression != NULL &&
25184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*SubExpression, Finder, Builder));
25194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
25204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
25214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches casts whose destination type matches a given matcher.
25224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
25234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// (Note: Clang's AST refers to other conversions as "casts" too, and calls
25244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// actual casts "explicit" casts.)
2525e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ExplicitCastExpr, hasDestinationType,
2526e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<QualType>, InnerMatcher) {
2527e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const QualType NodeType = Node.getTypeAsWritten();
25284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return InnerMatcher.matches(NodeType, Finder, Builder);
25294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
25304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
25314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches implicit casts whose destination type matches a given
25324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matcher.
25334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
25344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: Unit test this matcher
2535e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ImplicitCastExpr, hasImplicitDestinationType,
2536e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<QualType>, InnerMatcher) {
25374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return InnerMatcher.matches(Node.getType(), Finder, Builder);
25384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
25394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
25404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the true branch expression of a conditional operator.
25414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
25424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a
254325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
25444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   condition ? a : b
254525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2546e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ConditionalOperator, hasTrueExpression,
2547e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2548e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Expr *Expression = Node.getTrueExpr();
25494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (Expression != NULL &&
25504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*Expression, Finder, Builder));
25514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
25524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
25534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the false branch expression of a conditional operator.
25544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
25554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches b
255625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
25574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   condition ? a : b
255825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2559e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ConditionalOperator, hasFalseExpression,
2560e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2561e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Expr *Expression = Node.getFalseExpr();
25624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (Expression != NULL &&
25634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*Expression, Finder, Builder));
25644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
25654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
25664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if a declaration has a body attached.
25674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
25684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches A, va, fa
256925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
25704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class A {};
25714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class B;  // Doesn't match, as it has no body.
25724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   int va;
25734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   extern int vb;  // Doesn't match, as it doesn't define the variable.
25744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void fa() {}
25754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void fb();  // Doesn't match, as it has no body.
257625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2577297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek///
2578297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// Usable as: Matcher<TagDecl>, Matcher<VarDecl>, Matcher<FunctionDecl>
2579ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel BenzaquenAST_POLYMORPHIC_MATCHER(isDefinition, AST_POLYMORPHIC_SUPPORTED_TYPES_3(
2580ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                                          TagDecl, VarDecl, FunctionDecl)) {
2581415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return Node.isThisDeclarationADefinition();
25824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
25834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
25844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the class declaration that the given method declaration
25854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// belongs to.
25864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
25874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: Generalize this for other kinds of declarations.
25884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: What other kind of declarations would we need to generalize
25894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// this to?
25904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
25914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches A() in the last line
25922dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = constructExpr(hasDeclaration(methodDecl(
25934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///         ofClass(hasName("A"))))))
259425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
25954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class A {
25964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///    public:
25974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     A();
25984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
25994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   A a = A();
260025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2601e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXMethodDecl, ofClass,
2602e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<CXXRecordDecl>, InnerMatcher) {
2603e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const CXXRecordDecl *Parent = Node.getParent();
26044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (Parent != NULL &&
26054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*Parent, Finder, Builder));
26064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
26074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
26085771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \brief Matches if the given method declaration is virtual.
26095771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///
26105771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// Given
26115771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \code
26125771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   class A {
26135771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///    public:
26145771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///     virtual void x();
26155771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   };
26165771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \endcode
26175771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   matches A::x
26185771a2f0830228ac50e3473740e24d9dca67b54fEdwin VaneAST_MATCHER(CXXMethodDecl, isVirtual) {
26195771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane  return Node.isVirtual();
26205771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane}
26215771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane
262232a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// \brief Matches if the given method declaration is const.
262332a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane///
262432a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// Given
262532a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// \code
262632a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// struct A {
262732a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane///   void foo() const;
262832a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane///   void bar();
262932a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// };
263032a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// \endcode
263132a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane///
263232a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// methodDecl(isConst()) matches A::foo() but not A::bar()
263332a6ebc63900b85780328c337787bb7adad2bcabEdwin VaneAST_MATCHER(CXXMethodDecl, isConst) {
263432a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane  return Node.isConst();
263532a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane}
263632a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane
26375771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \brief Matches if the given method declaration overrides another method.
26385771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///
26395771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// Given
26405771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \code
26415771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   class A {
26425771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///    public:
26435771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///     virtual void x();
26445771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   };
26455771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   class B : public A {
26465771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///    public:
26475771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///     virtual void x();
26485771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   };
26495771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \endcode
26505771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   matches B::x
26515771a2f0830228ac50e3473740e24d9dca67b54fEdwin VaneAST_MATCHER(CXXMethodDecl, isOverride) {
26525771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane  return Node.size_overridden_methods() > 0;
26535771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane}
26545771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane
26554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches member expressions that are called with '->' as opposed
26564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// to '.'.
26574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
26584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Member calls on the implicit this pointer match as called with '->'.
26594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
26604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
266125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
26624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y {
26634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
26644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     int a;
26654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     static int b;
26664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
266725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
26682dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// memberExpr(isArrow())
26694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches this->x, x, y.x, a, this->b
2670415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_MATCHER(MemberExpr, isArrow) {
2671415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return Node.isArrow();
26724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
26734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
26746a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches QualType nodes that are of integer type.
26756a12449ec8862211856447d3df4c082a346339f2Daniel Jasper///
26766a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// Given
267725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
26786a12449ec8862211856447d3df4c082a346339f2Daniel Jasper///   void a(int);
26796a12449ec8862211856447d3df4c082a346339f2Daniel Jasper///   void b(long);
26806a12449ec8862211856447d3df4c082a346339f2Daniel Jasper///   void c(double);
268125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
26822dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// functionDecl(hasAnyParameter(hasType(isInteger())))
26836a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// matches "a(int)", "b(long)", but not "c(double)".
26846a12449ec8862211856447d3df4c082a346339f2Daniel JasperAST_MATCHER(QualType, isInteger) {
26856a12449ec8862211856447d3df4c082a346339f2Daniel Jasper    return Node->isIntegerType();
26866a12449ec8862211856447d3df4c082a346339f2Daniel Jasper}
26876a12449ec8862211856447d3df4c082a346339f2Daniel Jasper
2688e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches QualType nodes that are const-qualified, i.e., that
26894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// include "top-level" const.
26904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
26914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
269225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
26934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void a(int);
26944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void b(int const);
26954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void c(const int);
26964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void d(const int*);
26974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void e(int const) {};
269825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
26992dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// functionDecl(hasAnyParameter(hasType(isConstQualified())))
27004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches "void b(int const)", "void c(const int)" and
27014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   "void e(int const) {}". It does not match d as there
27024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   is no top-level const on the parameter type "const int *".
2703415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_MATCHER(QualType, isConstQualified) {
2704415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return Node.isConstQualified();
27054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
27064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
27077b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// \brief Matches QualType nodes that have local CV-qualifiers attached to
27087b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// the node, not hidden within a typedef.
27097b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane///
27107b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// Given
27117b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// \code
27127b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane///   typedef const int const_int;
27137b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane///   const_int i;
27147b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane///   int *const j;
27157b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane///   int *volatile k;
27167b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane///   int m;
27177b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// \endcode
27187b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// \c varDecl(hasType(hasLocalQualifiers())) matches only \c j and \c k.
27197b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// \c i is const-qualified but the qualifier is not local.
27207b69cd09440976d6b93a0db661a770b2337be8d2Edwin VaneAST_MATCHER(QualType, hasLocalQualifiers) {
27217b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane  return Node.hasLocalQualifiers();
27227b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane}
27237b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane
27244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a member expression where the member is matched by a
27254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// given matcher.
27264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
27274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
272825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
27294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   struct { int first, second; } first, second;
27304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   int i(second.first);
27314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   int j(first.second);
273225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
27332dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// memberExpr(member(hasName("first")))
27344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches second.first
27354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   but not first.second (because the member name there is "second").
2736e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(MemberExpr, member,
2737e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<ValueDecl>, InnerMatcher) {
27384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return InnerMatcher.matches(*Node.getMemberDecl(), Finder, Builder);
27394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
27404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
27414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a member expression where the object expression is
27424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matched by a given matcher.
27434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
27444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
274525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
27464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   struct X { int m; };
27474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void f(X x) { x.m; m; }
274825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
27492dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))))
27504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches "x.m" and "m"
27514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with hasObjectExpression(...)
27524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matching "x" and the implicit object expression of "m" which has type X*.
2753e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(MemberExpr, hasObjectExpression,
2754e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
27554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return InnerMatcher.matches(*Node.getBase(), Finder, Builder);
27564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
27574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
2758e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches any using shadow declaration.
2759e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
2760e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
276125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2762e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   namespace X { void b(); }
2763e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   using X::b;
276425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2765e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
2766e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches \code using X::b \endcode
2767e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UsingDecl, hasAnyUsingShadowDecl,
276825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<UsingShadowDecl>, InnerMatcher) {
2769054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  return matchesFirstInPointerRange(InnerMatcher, Node.shadow_begin(),
2770054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek                                    Node.shadow_end(), Finder, Builder);
2771e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
2772e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
2773e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches a using shadow declaration where the target declaration is
2774e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matched by the given matcher.
2775e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
2776e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
277725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2778e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   namespace X { int a; void b(); }
2779e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   using X::a;
2780e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   using X::b;
278125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
27822dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
2783e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches \code using X::b \endcode
2784e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   but not \code using X::a \endcode
2785e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UsingShadowDecl, hasTargetDecl,
278625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<NamedDecl>, InnerMatcher) {
278725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek  return InnerMatcher.matches(*Node.getTargetDecl(), Finder, Builder);
2788e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
2789e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
27904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches template instantiations of function, class, or static
27914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// member variable template instantiations.
27924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
27934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
279425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
27954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   template <typename T> class X {}; class A {}; X<A> x;
279625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
27974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// or
279825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
27994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   template <typename T> class X {}; class A {}; template class X<A>;
280025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
28012dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(hasName("::X"), isTemplateInstantiation())
28024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches the template instantiation of X<A>.
28034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
28044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// But given
280525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
280625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///   template <typename T>  class X {}; class A {};
28074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   template <> class X<A> {}; X<A> x;
280825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
28092dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(hasName("::X"), isTemplateInstantiation())
28104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   does not match, as X<A> is an explicit template specialization.
2811297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek///
2812297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// Usable as: Matcher<FunctionDecl>, Matcher<VarDecl>, Matcher<CXXRecordDecl>
2813ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel BenzaquenAST_POLYMORPHIC_MATCHER(
2814ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    isTemplateInstantiation,
2815ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    AST_POLYMORPHIC_SUPPORTED_TYPES_3(FunctionDecl, VarDecl, CXXRecordDecl)) {
2816415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return (Node.getTemplateSpecializationKind() == TSK_ImplicitInstantiation ||
2817415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek          Node.getTemplateSpecializationKind() ==
2818415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek          TSK_ExplicitInstantiationDefinition);
28194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
28204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
28218456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// \brief Matches explicit template specializations of function, class, or
28228456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// static member variable template instantiations.
28238456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko///
28248456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// Given
282525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
28268456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko///   template<typename T> void A(T t) { }
28278456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko///   template<> void A(int N) { }
282825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
28292dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// functionDecl(isExplicitTemplateSpecialization())
28308456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko///   matches the specialization A<int>().
283125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
283225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Matcher<FunctionDecl>, Matcher<VarDecl>, Matcher<CXXRecordDecl>
2833ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel BenzaquenAST_POLYMORPHIC_MATCHER(
2834ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    isExplicitTemplateSpecialization,
2835ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    AST_POLYMORPHIC_SUPPORTED_TYPES_3(FunctionDecl, VarDecl, CXXRecordDecl)) {
2836415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return (Node.getTemplateSpecializationKind() == TSK_ExplicitSpecialization);
28378456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko}
28388456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko
2839ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches \c TypeLocs for which the given inner
2840ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// QualType-matcher matches.
2841ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasperinline internal::BindableMatcher<TypeLoc> loc(
2842ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper    const internal::Matcher<QualType> &InnerMatcher) {
2843ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper  return internal::BindableMatcher<TypeLoc>(
2844ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper      new internal::TypeLocTypeMatcher(InnerMatcher));
2845ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper}
2846ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2847ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches builtin Types.
2848ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2849ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2850ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2851ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   struct A {};
2852ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   A a;
2853ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int b;
2854ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   float c;
2855ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   bool d;
2856ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2857ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// builtinType()
2858ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int b", "float c" and "bool d"
2859ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(BuiltinType, builtinType);
2860ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2861ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches all kinds of arrays.
2862ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2863ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2864ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2865ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int a[] = { 2, 3 };
2866ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int b[4];
2867ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   void f() { int c[a[0]]; }
2868ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2869ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// arrayType()
2870ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int a[]", "int b[4]" and "int c[a[0]]";
2871ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(ArrayType, arrayType);
2872ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2873ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C99 complex types.
2874ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2875ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2876ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2877ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   _Complex float f;
2878ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2879ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// complexType()
2880ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "_Complex float f"
2881ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(ComplexType, complexType);
2882ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2883ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches arrays and C99 complex types that have a specific element
2884ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// type.
2885ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2886ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2887ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2888ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   struct A {};
2889ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   A a[7];
2890ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int b[7];
2891ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2892ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// arrayType(hasElementType(builtinType()))
2893ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int b[7]"
2894ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2895ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Usable as: Matcher<ArrayType>, Matcher<ComplexType>
2896ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPELOC_TRAVERSE_MATCHER(hasElementType, getElement);
2897ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2898ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C arrays with a specified constant size.
2899ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2900ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2901ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2902ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   void() {
2903ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     int a[2];
2904ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     int b[] = { 2, 3 };
2905ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     int c[b[0]];
2906ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   }
2907ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2908ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// constantArrayType()
2909ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int a[2]"
2910ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(ConstantArrayType, constantArrayType);
2911ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2912ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches \c ConstantArrayType nodes that have the specified size.
2913ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2914ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2915ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2916ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int a[42];
2917ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int b[2 * 21];
2918ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int c[41], d[43];
2919ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2920ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// constantArrayType(hasSize(42))
2921ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int a[42]" and "int b[2 * 21]"
2922ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_MATCHER_P(ConstantArrayType, hasSize, unsigned, N) {
2923ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper  return Node.getSize() == N;
2924ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper}
2925ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2926ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C++ arrays whose size is a value-dependent expression.
2927ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2928ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2929ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2930ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   template<typename T, int Size>
2931ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   class array {
2932ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     T data[Size];
2933ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   };
2934ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2935ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// dependentSizedArrayType
2936ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "T data[Size]"
2937ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(DependentSizedArrayType, dependentSizedArrayType);
2938ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2939ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C arrays with unspecified size.
2940ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2941ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2942ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2943ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int a[] = { 2, 3 };
2944ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int b[42];
2945ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   void f(int c[]) { int d[a[0]]; };
2946ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2947ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// incompleteArrayType()
2948ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int a[]" and "int c[]"
2949ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(IncompleteArrayType, incompleteArrayType);
2950ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2951ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C arrays with a specified size that is not an
2952ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// integer-constant-expression.
2953ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2954ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2955ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2956ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   void f() {
2957ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     int a[] = { 2, 3 }
2958ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     int b[42];
2959ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     int c[a[0]];
2960ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2961ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// variableArrayType()
2962ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int c[a[0]]"
2963ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(VariableArrayType, variableArrayType);
2964ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2965ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches \c VariableArrayType nodes that have a specific size
2966ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// expression.
2967ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2968ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2969ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2970ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   void f(int b) {
2971ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     int a[b];
2972ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   }
2973ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2974ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
2975ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   varDecl(hasName("b")))))))
2976ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int a[b]"
2977ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_MATCHER_P(VariableArrayType, hasSizeExpr,
2978ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2979ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper  return InnerMatcher.matches(*Node.getSizeExpr(), Finder, Builder);
2980ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper}
2981ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2982ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches atomic types.
2983ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2984ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2985ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2986ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   _Atomic(int) i;
2987ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2988ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// atomicType()
2989ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "_Atomic(int) i"
2990ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(AtomicType, atomicType);
2991ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2992ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches atomic types with a specific value type.
2993ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2994ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2995ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2996ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   _Atomic(int) i;
2997ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   _Atomic(float) f;
2998ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2999ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// atomicType(hasValueType(isInteger()))
3000ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///  matches "_Atomic(int) i"
3001ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3002ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Usable as: Matcher<AtomicType>
3003ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPELOC_TRAVERSE_MATCHER(hasValueType, getValue);
3004ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3005ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches types nodes representing C++11 auto types.
3006ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3007ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given:
3008ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3009ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   auto n = 4;
3010ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int v[] = { 2, 3 }
3011ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   for (auto i : v) { }
3012ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3013ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// autoType()
3014ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "auto n" and "auto i"
3015ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(AutoType, autoType);
3016ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3017ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches \c AutoType nodes where the deduced type is a specific type.
3018ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3019ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Note: There is no \c TypeLoc for the deduced type and thus no
3020ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \c getDeducedLoc() matcher.
3021ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3022ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3023ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3024ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   auto a = 1;
3025ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   auto b = 2.0;
3026ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3027ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// autoType(hasDeducedType(isInteger()))
3028ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "auto a"
3029ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3030ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Usable as: Matcher<AutoType>
3031ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_TRAVERSE_MATCHER(hasDeducedType, getDeducedType);
3032ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3033a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \brief Matches \c FunctionType nodes.
3034a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper///
3035a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// Given
3036a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \code
3037a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper///   int (*f)(int);
3038a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper///   void g();
3039a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \endcode
3040a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// functionType()
3041a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper///   matches "int (*f)(int)" and the type of "g".
3042a267cf6f87dc695143d65fc61ec1744564f55932Daniel JasperAST_TYPE_MATCHER(FunctionType, functionType);
3043a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper
304488be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \brief Matches \c ParenType nodes.
304588be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///
304688be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// Given
304788be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \code
304888be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///   int (*ptr_to_array)[4];
304988be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///   int *array_of_ptrs[4];
305088be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \endcode
305188be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///
305288be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \c varDecl(hasType(pointsTo(parenType()))) matches \c ptr_to_array but not
305388be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \c array_of_ptrs.
305488be2fdec7a1375bc729a6499629532e7872f11aEdwin VaneAST_TYPE_MATCHER(ParenType, parenType);
305588be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane
305688be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \brief Matches \c ParenType nodes where the inner type is a specific type.
305788be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///
305888be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// Given
305988be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \code
306088be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///   int (*ptr_to_array)[4];
306188be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///   int (*ptr_to_func)(int);
306288be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \endcode
306388be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///
306488be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \c varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
306588be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \c ptr_to_func but not \c ptr_to_array.
306688be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///
306788be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// Usable as: Matcher<ParenType>
306888be2fdec7a1375bc729a6499629532e7872f11aEdwin VaneAST_TYPE_TRAVERSE_MATCHER(innerType, getInnerType);
306988be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane
3070ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches block pointer types, i.e. types syntactically represented as
3071ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// "void (^)(int)".
3072ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3073ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// The \c pointee is always required to be a \c FunctionType.
3074ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(BlockPointerType, blockPointerType);
3075ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3076ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches member pointer types.
3077ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3078ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3079ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   struct A { int i; }
3080ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   A::* ptr = A::i;
3081ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3082ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// memberPointerType()
3083ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "A::* ptr"
3084ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(MemberPointerType, memberPointerType);
3085ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3086ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches pointer types.
3087ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3088ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3089ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3090ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int *a;
3091ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int &b = *a;
3092ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int c = 5;
3093ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3094ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// pointerType()
3095ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int *a"
3096ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(PointerType, pointerType);
3097ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3098f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \brief Matches both lvalue and rvalue reference types.
3099ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3100ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3101ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3102ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int *a;
3103ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int &b = *a;
3104f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int &&c = 1;
3105f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &d = b;
3106f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &&e = c;
3107f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &&f = 2;
3108f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int g = 5;
3109ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3110f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///
3111f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \c referenceType() matches the types of \c b, \c c, \c d, \c e, and \c f.
3112ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(ReferenceType, referenceType);
3113ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3114f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \brief Matches lvalue reference types.
3115f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///
3116f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// Given:
3117f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \code
3118f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int *a;
3119f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int &b = *a;
3120f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int &&c = 1;
3121f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &d = b;
3122f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &&e = c;
3123f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &&f = 2;
3124f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int g = 5;
3125f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \endcode
3126f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///
3127f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \c lValueReferenceType() matches the types of \c b, \c d, and \c e. \c e is
3128f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// matched since the type is deduced as int& by reference collapsing rules.
3129f4b48042724d2253d0426cadcb93e24eeb47e264Edwin VaneAST_TYPE_MATCHER(LValueReferenceType, lValueReferenceType);
3130f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane
3131f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \brief Matches rvalue reference types.
3132f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///
3133f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// Given:
3134f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \code
3135f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int *a;
3136f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int &b = *a;
3137f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int &&c = 1;
3138f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &d = b;
3139f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &&e = c;
3140f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &&f = 2;
3141f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int g = 5;
3142f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \endcode
3143f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///
3144f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \c rValueReferenceType() matches the types of \c c and \c f. \c e is not
3145f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// matched as it is deduced to int& by reference collapsing rules.
3146f4b48042724d2253d0426cadcb93e24eeb47e264Edwin VaneAST_TYPE_MATCHER(RValueReferenceType, rValueReferenceType);
3147f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane
3148ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Narrows PointerType (and similar) matchers to those where the
3149ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \c pointee matches a given matcher.
3150ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3151ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3152ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3153ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int *a;
3154ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int const *b;
3155ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   float const *f;
3156ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3157ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// pointerType(pointee(isConstQualified(), isInteger()))
3158ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int const *b"
3159ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3160ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Usable as: Matcher<BlockPointerType>, Matcher<MemberPointerType>,
3161ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   Matcher<PointerType>, Matcher<ReferenceType>
3162ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPELOC_TRAVERSE_MATCHER(pointee, getPointee);
3163ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3164ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches typedef types.
3165ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3166ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3167ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3168ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   typedef int X;
3169ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3170ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// typedefType()
3171ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "typedef int X"
3172ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(TypedefType, typedefType);
3173ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
31743abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// \brief Matches template specialization types.
31753abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///
31763abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// Given
31773abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// \code
31783abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///   template <typename T>
31793abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///   class C { };
31803abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///
31813abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///   template class C<int>;  // A
31823abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///   C<char> var;            // B
31833abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// \code
31843abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///
31853abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// \c templateSpecializationType() matches the type of the explicit
31863abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// instantiation in \c A and the type of the variable declaration in \c B.
31873abf77872ca6c520903f9174cf6cd89a50df2714Edwin VaneAST_TYPE_MATCHER(TemplateSpecializationType, templateSpecializationType);
31883abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane
31892d77634e839880704d51656bebd1d2daff661d4eEnea Zaffanella/// \brief Matches types nodes representing unary type transformations.
31902d77634e839880704d51656bebd1d2daff661d4eEnea Zaffanella///
31912d77634e839880704d51656bebd1d2daff661d4eEnea Zaffanella/// Given:
31922d77634e839880704d51656bebd1d2daff661d4eEnea Zaffanella/// \code
31932d77634e839880704d51656bebd1d2daff661d4eEnea Zaffanella///   typedef __underlying_type(T) type;
31942d77634e839880704d51656bebd1d2daff661d4eEnea Zaffanella/// \endcode
31952d77634e839880704d51656bebd1d2daff661d4eEnea Zaffanella/// unaryTransformType()
31962d77634e839880704d51656bebd1d2daff661d4eEnea Zaffanella///   matches "__underlying_type(T)"
31972d77634e839880704d51656bebd1d2daff661d4eEnea ZaffanellaAST_TYPE_MATCHER(UnaryTransformType, unaryTransformType);
31982d77634e839880704d51656bebd1d2daff661d4eEnea Zaffanella
3199742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \brief Matches record types (e.g. structs, classes).
3200742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3201742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Given
3202742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3203742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   class C {};
3204742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   struct S {};
3205742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3206742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   C c;
3207742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   S s;
3208742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3209742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3210742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c recordType() matches the type of the variable declarations of both \c c
3211742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// and \c s.
3212742d9e77e32f014194679575c97c6bb4fd0998c4Edwin VaneAST_TYPE_MATCHER(RecordType, recordType);
3213742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane
3214742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \brief Matches types specified with an elaborated type keyword or with a
3215742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// qualified name.
3216742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3217742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Given
3218742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3219742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   namespace N {
3220742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     namespace M {
3221742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///       class D {};
3222742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     }
3223742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   }
3224742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   class C {};
3225742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3226742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   class C c;
3227742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   N::M::D d;
3228742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3229742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3230742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c elaboratedType() matches the type of the variable declarations of both
3231742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c c and \c d.
3232742d9e77e32f014194679575c97c6bb4fd0998c4Edwin VaneAST_TYPE_MATCHER(ElaboratedType, elaboratedType);
3233742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane
3234742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \brief Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
3235aec89ac22e1876bb1cfff9062c882a622bc84510Edwin Vane/// matches \c InnerMatcher if the qualifier exists.
3236742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3237742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Given
3238742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3239742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   namespace N {
3240742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     namespace M {
3241742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///       class D {};
3242742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     }
3243742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   }
3244742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   N::M::D d;
3245742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3246742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3247742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
3248742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// matches the type of the variable declaration of \c d.
3249742d9e77e32f014194679575c97c6bb4fd0998c4Edwin VaneAST_MATCHER_P(ElaboratedType, hasQualifier,
3250742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane              internal::Matcher<NestedNameSpecifier>, InnerMatcher) {
3251aec89ac22e1876bb1cfff9062c882a622bc84510Edwin Vane  if (const NestedNameSpecifier *Qualifier = Node.getQualifier())
3252aec89ac22e1876bb1cfff9062c882a622bc84510Edwin Vane    return InnerMatcher.matches(*Qualifier, Finder, Builder);
3253aec89ac22e1876bb1cfff9062c882a622bc84510Edwin Vane
3254aec89ac22e1876bb1cfff9062c882a622bc84510Edwin Vane  return false;
3255742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane}
3256742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane
3257742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \brief Matches ElaboratedTypes whose named type matches \c InnerMatcher.
3258742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3259742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Given
3260742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3261742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   namespace N {
3262742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     namespace M {
3263742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///       class D {};
3264742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     }
3265742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   }
3266742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   N::M::D d;
3267742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3268742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3269742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c elaboratedType(namesType(recordType(
3270742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
3271742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// declaration of \c d.
3272742d9e77e32f014194679575c97c6bb4fd0998c4Edwin VaneAST_MATCHER_P(ElaboratedType, namesType, internal::Matcher<QualType>,
3273742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane              InnerMatcher) {
3274742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane  return InnerMatcher.matches(Node.getNamedType(), Finder, Builder);
3275742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane}
3276742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane
3277742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \brief Matches declarations whose declaration context, interpreted as a
3278742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Decl, matches \c InnerMatcher.
3279742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3280742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Given
3281742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3282742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   namespace N {
3283742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     namespace M {
3284742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///       class D {};
3285742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     }
3286742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   }
3287742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3288742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3289742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c recordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
3290742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// declaration of \c class \c D.
3291742d9e77e32f014194679575c97c6bb4fd0998c4Edwin VaneAST_MATCHER_P(Decl, hasDeclContext, internal::Matcher<Decl>, InnerMatcher) {
3292742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane  return InnerMatcher.matches(*Decl::castFromDeclContext(Node.getDeclContext()),
3293742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane                              Finder, Builder);
3294742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane}
3295742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane
3296a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Matches nested name specifiers.
3297a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///
3298a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// Given
3299a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \code
3300a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   namespace ns {
3301a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///     struct A { static void f(); };
3302a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///     void A::f() {}
3303a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///     void g() { A::f(); }
3304a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   }
3305a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   ns::A a;
3306a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \endcode
3307a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifier()
3308a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   matches "ns::" and both "A::"
3309a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasperconst internal::VariadicAllOfMatcher<NestedNameSpecifier> nestedNameSpecifier;
3310a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper
3311a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Same as \c nestedNameSpecifier but matches \c NestedNameSpecifierLoc.
3312a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasperconst internal::VariadicAllOfMatcher<
3313a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper  NestedNameSpecifierLoc> nestedNameSpecifierLoc;
3314a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper
3315a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Matches \c NestedNameSpecifierLocs for which the given inner
3316a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// NestedNameSpecifier-matcher matches.
3317a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasperinline internal::BindableMatcher<NestedNameSpecifierLoc> loc(
3318a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper    const internal::Matcher<NestedNameSpecifier> &InnerMatcher) {
3319a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper  return internal::BindableMatcher<NestedNameSpecifierLoc>(
3320a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper      new internal::LocMatcher<NestedNameSpecifierLoc, NestedNameSpecifier>(
3321a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper          InnerMatcher));
3322a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper}
3323a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper
3324a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Matches nested name specifiers that specify a type matching the
3325a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// given \c QualType matcher without qualifiers.
3326a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///
3327a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// Given
3328a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \code
3329a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   struct A { struct B { struct C {}; }; };
3330a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   A::B::C c;
3331a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \endcode
3332a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A")))))
3333a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   matches "A::"
3334a7564433191601cb8851196b8dde39392c9c05eeDaniel JasperAST_MATCHER_P(NestedNameSpecifier, specifiesType,
3335a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper              internal::Matcher<QualType>, InnerMatcher) {
3336a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper  if (Node.getAsType() == NULL)
3337a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper    return false;
3338a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper  return InnerMatcher.matches(QualType(Node.getAsType(), 0), Finder, Builder);
3339a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper}
3340a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper
3341ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches nested name specifier locs that specify a type matching the
3342ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// given \c TypeLoc.
3343ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3344ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3345ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3346ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   struct A { struct B { struct C {}; }; };
3347ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   A::B::C c;
3348ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3349ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
3350ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   hasDeclaration(recordDecl(hasName("A")))))))
3351ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "A::"
3352ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_MATCHER_P(NestedNameSpecifierLoc, specifiesTypeLoc,
3353ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper              internal::Matcher<TypeLoc>, InnerMatcher) {
3354ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper  return InnerMatcher.matches(Node.getTypeLoc(), Finder, Builder);
3355ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper}
3356ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3357ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches on the prefix of a \c NestedNameSpecifier.
3358a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///
3359a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// Given
3360a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \code
3361a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   struct A { struct B { struct C {}; }; };
3362a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   A::B::C c;
3363a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \endcode
3364a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
3365ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "A::"
3366415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_MATCHER_P_OVERLOAD(NestedNameSpecifier, hasPrefix,
3367415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek                       internal::Matcher<NestedNameSpecifier>, InnerMatcher,
3368415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek                       0) {
3369415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  NestedNameSpecifier *NextNode = Node.getPrefix();
3370415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  if (NextNode == NULL)
3371415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek    return false;
3372415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return InnerMatcher.matches(*NextNode, Finder, Builder);
3373ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper}
3374ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3375ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches on the prefix of a \c NestedNameSpecifierLoc.
3376ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3377ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3378ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3379ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   struct A { struct B { struct C {}; }; };
3380ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   A::B::C c;
3381ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3382a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
3383ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "A::"
3384415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_MATCHER_P_OVERLOAD(NestedNameSpecifierLoc, hasPrefix,
3385415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek                       internal::Matcher<NestedNameSpecifierLoc>, InnerMatcher,
3386415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek                       1) {
3387415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  NestedNameSpecifierLoc NextNode = Node.getPrefix();
3388415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  if (!NextNode)
3389415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek    return false;
3390415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return InnerMatcher.matches(NextNode, Finder, Builder);
3391ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper}
3392a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper
3393a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Matches nested name specifiers that specify a namespace matching the
3394a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// given namespace matcher.
3395a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///
3396a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// Given
3397a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \code
3398a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   namespace ns { struct A {}; }
3399a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   ns::A a;
3400a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \endcode
3401a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifier(specifiesNamespace(hasName("ns")))
3402a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   matches "ns::"
3403a7564433191601cb8851196b8dde39392c9c05eeDaniel JasperAST_MATCHER_P(NestedNameSpecifier, specifiesNamespace,
3404a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper              internal::Matcher<NamespaceDecl>, InnerMatcher) {
3405a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper  if (Node.getAsNamespace() == NULL)
3406a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper    return false;
3407a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper  return InnerMatcher.matches(*Node.getAsNamespace(), Finder, Builder);
3408a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper}
3409a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper
3410fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \brief Overloads for the \c equalsNode matcher.
3411fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// FIXME: Implement for other node types.
3412fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// @{
3413fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek
3414fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \brief Matches if a node equals another node.
3415fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek///
3416fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \c Decl has pointer identity in the AST.
3417fa37c5ca61af275a329386407e58cf70f4d9f596Manuel KlimekAST_MATCHER_P_OVERLOAD(Decl, equalsNode, Decl*, Other, 0) {
3418fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek  return &Node == Other;
3419fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek}
3420fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \brief Matches if a node equals another node.
3421fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek///
3422fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \c Stmt has pointer identity in the AST.
3423fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek///
3424fa37c5ca61af275a329386407e58cf70f4d9f596Manuel KlimekAST_MATCHER_P_OVERLOAD(Stmt, equalsNode, Stmt*, Other, 1) {
3425fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek  return &Node == Other;
3426fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek}
3427fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek
3428fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// @}
3429fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek
3430acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \brief Matches each case or default statement belonging to the given switch
3431acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// statement. This matcher may produce multiple matches.
3432acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///
3433acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// Given
3434acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \code
3435acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///   switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
3436acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \endcode
3437acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
3438acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///   matches four times, with "c" binding each of "case 1:", "case 2:",
3439acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// "case 3:" and "case 4:", and "s" respectively binding "switch (1)",
3440acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// "switch (1)", "switch (2)" and "switch (2)".
3441acf02715ab1aa1e5a791f20e0d1ca217af256823Peter CollingbourneAST_MATCHER_P(SwitchStmt, forEachSwitchCase, internal::Matcher<SwitchCase>,
3442acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne              InnerMatcher) {
3443054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  BoundNodesTreeBuilder Result;
3444acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  // FIXME: getSwitchCaseList() does not necessarily guarantee a stable
3445acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  // iteration order. We should use the more general iterating matchers once
3446acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  // they are capable of expressing this matcher (for example, it should ignore
3447acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  // case statements belonging to nested switch statements).
3448acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  bool Matched = false;
3449acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  for (const SwitchCase *SC = Node.getSwitchCaseList(); SC;
3450acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne       SC = SC->getNextSwitchCase()) {
3451054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek    BoundNodesTreeBuilder CaseBuilder(*Builder);
3452acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne    bool CaseMatched = InnerMatcher.matches(*SC, Finder, &CaseBuilder);
3453acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne    if (CaseMatched) {
3454acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne      Matched = true;
3455054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek      Result.addMatch(CaseBuilder);
3456acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne    }
3457acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  }
3458054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  *Builder = Result;
3459acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  return Matched;
3460acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne}
3461acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne
3462acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \brief If the given case statement does not use the GNU case range
3463acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// extension, matches the constant given in the statement.
3464acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///
3465acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// Given
3466acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \code
3467acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///   switch (1) { case 1: case 1+1: case 3 ... 4: ; }
3468acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \endcode
3469acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// caseStmt(hasCaseConstant(integerLiteral()))
3470acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///   matches "case 1:"
3471acf02715ab1aa1e5a791f20e0d1ca217af256823Peter CollingbourneAST_MATCHER_P(CaseStmt, hasCaseConstant, internal::Matcher<Expr>,
3472acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne              InnerMatcher) {
3473acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  if (Node.getRHS())
3474acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne    return false;
3475acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne
3476acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  return InnerMatcher.matches(*Node.getLHS(), Finder, Builder);
3477acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne}
3478acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne
34794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} // end namespace ast_matchers
34804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} // end namespace clang
34814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
34824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek#endif // LLVM_CLANG_AST_MATCHERS_AST_MATCHERS_H
3483