ASTMatchers.h revision 06963013d1972f1f7a58875bb40976b60522700b
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
24406963013d1972f1f7a58875bb40976b60522700bManuel Klimek/// \brief Matches constructor initializers.
24506963013d1972f1f7a58875bb40976b60522700bManuel Klimek///
24606963013d1972f1f7a58875bb40976b60522700bManuel Klimek/// Examples matches \c i(42).
24706963013d1972f1f7a58875bb40976b60522700bManuel Klimek/// \code
24806963013d1972f1f7a58875bb40976b60522700bManuel Klimek///   class C {
24906963013d1972f1f7a58875bb40976b60522700bManuel Klimek///     C() : i(42) {}
25006963013d1972f1f7a58875bb40976b60522700bManuel Klimek///     int i;
25106963013d1972f1f7a58875bb40976b60522700bManuel Klimek///   };
25206963013d1972f1f7a58875bb40976b60522700bManuel Klimek/// \endcode
25306963013d1972f1f7a58875bb40976b60522700bManuel Klimekconst internal::VariadicAllOfMatcher<CXXCtorInitializer> ctorInitializer;
25406963013d1972f1f7a58875bb40976b60522700bManuel Klimek
255f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \brief Matches public C++ declarations.
256f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///
257f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// Given
258f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \code
259f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   class C {
260f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   public:    int a;
261f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   protected: int b;
262f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   private:   int c;
263f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   };
264f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \endcode
265f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// fieldDecl(isPublic())
266f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   matches 'int a;'
267f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel JasperAST_MATCHER(Decl, isPublic) {
268f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper  return Node.getAccess() == AS_public;
269f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper}
270f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper
271f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \brief Matches protected C++ declarations.
272f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///
273f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// Given
274f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \code
275f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   class C {
276f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   public:    int a;
277f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   protected: int b;
278f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   private:   int c;
279f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   };
280f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \endcode
281f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// fieldDecl(isProtected())
282f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   matches 'int b;'
283f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel JasperAST_MATCHER(Decl, isProtected) {
284f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper  return Node.getAccess() == AS_protected;
285f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper}
286f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper
287f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \brief Matches private C++ declarations.
288f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///
289f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// Given
290f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \code
291f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   class C {
292f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   public:    int a;
293f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   protected: int b;
294f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   private:   int c;
295f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   };
296f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \endcode
297f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// fieldDecl(isPrivate())
298f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper///   matches 'int c;'
299f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel JasperAST_MATCHER(Decl, isPrivate) {
300f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper  return Node.getAccess() == AS_private;
301f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper}
302f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper
303e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches classTemplateSpecializations that have at least one
30425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// TemplateArgument matching the given InnerMatcher.
305e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
306e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
30725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
308e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   template<typename T> class A {};
309e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   template<> class A<double> {};
310e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   A<int> a;
31125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
3122dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// classTemplateSpecializationDecl(hasAnyTemplateArgument(
313e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///     refersToType(asString("int"))))
314e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches the specialization \c A<int>
315e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ClassTemplateSpecializationDecl, hasAnyTemplateArgument,
31625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<TemplateArgument>, InnerMatcher) {
317054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  llvm::ArrayRef<TemplateArgument> List = Node.getTemplateArgs().asArray();
318054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  return matchesFirstInRange(InnerMatcher, List.begin(), List.end(), Finder,
319054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek                             Builder);
320e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
321e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
322089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// \brief Matches expressions that match InnerMatcher after any implicit casts
323089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// are stripped off.
324089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///
325089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Parentheses and explicit casts are not discarded.
326089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Given
32725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
328089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   int arr[5];
329089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   int a = 0;
330089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   char b = 0;
331089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   const int c = a;
332089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   int *d = arr;
333089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   long e = (long) 0l;
33425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
335089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// The matchers
33625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
3372dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///    varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
3382dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///    varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
33925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
340089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// would match the declarations for a, b, c, and d, but not e.
34125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// While
34225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
3432dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///    varDecl(hasInitializer(integerLiteral()))
3442dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///    varDecl(hasInitializer(declRefExpr()))
34525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
346089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// only match the declarations for b, c, and d.
347089e5b3bf2e57da0173b170ad501867b43395385Sam PanzerAST_MATCHER_P(Expr, ignoringImpCasts,
348089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer              internal::Matcher<Expr>, InnerMatcher) {
349089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer  return InnerMatcher.matches(*Node.IgnoreImpCasts(), Finder, Builder);
350089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer}
351089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer
352089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// \brief Matches expressions that match InnerMatcher after parentheses and
353089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// casts are stripped off.
354089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///
355089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Implicit and non-C Style casts are also discarded.
356089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Given
35725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
358089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   int a = 0;
359089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   char b = (0);
360089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   void* c = reinterpret_cast<char*>(0);
361089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   char d = char(0);
36225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
363089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// The matcher
3642dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///    varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
365089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// would match the declarations for a, b, c, and d.
366089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// while
3672dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///    varDecl(hasInitializer(integerLiteral()))
368089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// only match the declaration for a.
369089e5b3bf2e57da0173b170ad501867b43395385Sam PanzerAST_MATCHER_P(Expr, ignoringParenCasts, internal::Matcher<Expr>, InnerMatcher) {
370089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer  return InnerMatcher.matches(*Node.IgnoreParenCasts(), Finder, Builder);
371089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer}
372089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer
373089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// \brief Matches expressions that match InnerMatcher after implicit casts and
374089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// parentheses are stripped off.
375089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///
376089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Explicit casts are not discarded.
377089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Given
37825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
379089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   int arr[5];
380089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   int a = 0;
381089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   char b = (0);
382089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   const int c = a;
383089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   int *d = (arr);
384089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   long e = ((long) 0l);
38525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
386089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// The matchers
3872dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///    varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
3882dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///    varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
389089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// would match the declarations for a, b, c, and d, but not e.
390089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// while
3912dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///    varDecl(hasInitializer(integerLiteral()))
3922dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///    varDecl(hasInitializer(declRefExpr()))
393089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// would only match the declaration for a.
394089e5b3bf2e57da0173b170ad501867b43395385Sam PanzerAST_MATCHER_P(Expr, ignoringParenImpCasts,
395089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer              internal::Matcher<Expr>, InnerMatcher) {
396089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer  return InnerMatcher.matches(*Node.IgnoreParenImpCasts(), Finder, Builder);
397089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer}
398089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer
399e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches classTemplateSpecializations where the n'th TemplateArgument
40025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// matches the given InnerMatcher.
401e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
402e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
40325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
404e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   template<typename T, typename U> class A {};
405e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   A<bool, int> b;
406e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   A<int, bool> c;
40725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
4082dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// classTemplateSpecializationDecl(hasTemplateArgument(
409e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///     1, refersToType(asString("int"))))
410e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches the specialization \c A<bool, int>
411e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P2(ClassTemplateSpecializationDecl, hasTemplateArgument,
41225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek               unsigned, N, internal::Matcher<TemplateArgument>, InnerMatcher) {
413e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const TemplateArgumentList &List = Node.getTemplateArgs();
414e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  if (List.size() <= N)
415e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    return false;
41625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek  return InnerMatcher.matches(List.get(N), Finder, Builder);
417e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
418e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
419e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches a TemplateArgument that refers to a certain type.
420e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
421e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
42225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
423e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   struct X {};
424e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   template<typename T> struct A {};
425e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   A<X> a;
42625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
4272dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// classTemplateSpecializationDecl(hasAnyTemplateArgument(
428e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///     refersToType(class(hasName("X")))))
429e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches the specialization \c A<X>
430e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(TemplateArgument, refersToType,
43125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<QualType>, InnerMatcher) {
432e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  if (Node.getKind() != TemplateArgument::Type)
433e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    return false;
43425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek  return InnerMatcher.matches(Node.getAsType(), Finder, Builder);
435e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
436e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
437e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches a TemplateArgument that refers to a certain declaration.
438e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
439e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
44025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
441e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   template<typename T> struct A {};
442e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   struct B { B* next; };
443e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   A<&B::next> a;
44425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
4452dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// classTemplateSpecializationDecl(hasAnyTemplateArgument(
4462dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     refersToDeclaration(fieldDecl(hasName("next"))))
4472dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///   matches the specialization \c A<&B::next> with \c fieldDecl(...) matching
448e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///     \c B::next
449e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(TemplateArgument, refersToDeclaration,
45025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<Decl>, InnerMatcher) {
451aaa8e45b8e392a1f1b7498e2f00c6ed66d41119aDaniel Jasper  if (Node.getKind() == TemplateArgument::Declaration)
452aaa8e45b8e392a1f1b7498e2f00c6ed66d41119aDaniel Jasper    return InnerMatcher.matches(*Node.getAsDecl(), Finder, Builder);
453e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return false;
454e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
4554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
4564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches C++ constructor declarations.
4574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
4584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches Foo::Foo() and Foo::Foo(int)
45925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
4604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Foo {
4614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///    public:
4624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     Foo();
4634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     Foo(int);
4644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     int DoSomething();
4654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
46625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
4674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
468e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Decl,
4692dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXConstructorDecl> constructorDecl;
470e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
471e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches explicit C++ destructor declarations.
472e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
473e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Example matches Foo::~Foo()
47425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
475e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   class Foo {
476e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///    public:
477e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///     virtual ~Foo();
478e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   };
47925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
4802dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<
4812dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  Decl,
4822dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXDestructorDecl> destructorDecl;
483e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
484e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches enum declarations.
485e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
486e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Example matches X
48725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
488e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   enum X {
489e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///     A, B, C
490e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   };
49125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
492e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, EnumDecl> enumDecl;
493e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
494e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches enum constants.
495e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
496e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Example matches A, B, C
49725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
498e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   enum X {
499e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///     A, B, C
500e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   };
50125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
502e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<
503e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Decl,
5042dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  EnumConstantDecl> enumConstantDecl;
5054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
5064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches method declarations.
5074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
5084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches y
50925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
5104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X { void y() };
51125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
5122dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, CXXMethodDecl> methodDecl;
5134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
5144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches variable declarations.
5154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
5164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Note: this does not match declarations of member variables, which are
5174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// "field" declarations in Clang parlance.
5184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
5194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a
52025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
5214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   int a;
52225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
5232dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, VarDecl> varDecl;
5244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
5254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches field declarations.
5264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
5274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
52825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
5294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X { int m; };
53025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
5312dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// fieldDecl()
5324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches 'm'.
5332dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, FieldDecl> fieldDecl;
5344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
5354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches function declarations.
5364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
5374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches f
53825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
5394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void f();
54025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
5412dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, FunctionDecl> functionDecl;
5424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
5438456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// \brief Matches C++ function template declarations.
5448456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko///
5458456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// Example matches f
54625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
5478456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko///   template<class T> void f(T t) {}
54825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
5498456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenkoconst internal::VariadicDynCastAllOfMatcher<
5508456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko  Decl,
5512dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  FunctionTemplateDecl> functionTemplateDecl;
5524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
5534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches statements.
5544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
5554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
55625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
5574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   { ++a; }
55825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
5592dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// stmt()
5604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches both the compound statement '{ ++a; }' and '++a'.
56106b247f0ffb69854e32150c80f347a9376d3709bManuel Klimekconst internal::VariadicAllOfMatcher<Stmt> stmt;
5624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
5634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches declaration statements.
5644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
5654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
56625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
5674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   int a;
56825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
5692dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declStmt()
5704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches 'int a'.
5714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
572e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Stmt,
5732dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  DeclStmt> declStmt;
5744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
5754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches member expressions.
5764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
5774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
57825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
5794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y {
5804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
5814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     int a; static int b;
5824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
58325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
5842dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// memberExpr()
5854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches this->x, x, y.x, a, this->b
5862dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, MemberExpr> memberExpr;
5874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
5884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches call expressions.
5894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
5909f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek/// Example matches x.y() and y()
59125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
5924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   X x;
5934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   x.y();
5949f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek///   y();
59525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
5962dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CallExpr> callExpr;
597e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
59831f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \brief Matches lambda expressions.
59931f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper///
60031f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// Example matches [&](){return 5;}
60131f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \code
60231f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper///   [&](){return 5;}
60331f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \endcode
60431f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, LambdaExpr> lambdaExpr;
60531f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper
6069f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek/// \brief Matches member call expressions.
6079f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek///
6089f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek/// Example matches x.y()
60925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
6109f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek///   X x;
6119f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek///   x.y();
61225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
6132dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<
6142dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  Stmt,
6152dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXMemberCallExpr> memberCallExpr;
6169f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek
617e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches init list expressions.
618e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
619e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
62025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
621e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   int a[] = { 1, 2 };
622e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   struct B { int x, y; };
623e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   B b = { 5, 6 };
62425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
625e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// initList()
626e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches "{ 1, 2 }" and "{ 5, 6 }"
627e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, InitListExpr> initListExpr;
628e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
629e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches using declarations.
630e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
631e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
63225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
633e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   namespace X { int x; }
634e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   using X::x;
63525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
636e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// usingDecl()
637e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches \code using X::x \endcode
638e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, UsingDecl> usingDecl;
6394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
640d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella/// \brief Matches unresolved using value declarations.
641d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella///
642d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella/// Given
643d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella/// \code
644d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella///   template<typename X>
645d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella///   class C : private X {
646d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella///     using X::x;
647d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella///   };
648d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella/// \endcode
649d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella/// unresolvedUsingValueDecl()
650d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella///   matches \code using X::x \endcode
651d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanellaconst internal::VariadicDynCastAllOfMatcher<
652d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella  Decl,
653d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella  UnresolvedUsingValueDecl> unresolvedUsingValueDecl;
654d4de59d3e54421ef88316d650e35802ba9c572cfEnea Zaffanella
6554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches constructor call expressions (including implicit ones).
6564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
6574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches string(ptr, n) and ptr within arguments of f
6582dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = constructExpr())
65925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
6604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void f(const string &a, const string &b);
6614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   char *ptr;
6624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   int n;
6634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   f(string(ptr, n), ptr);
66425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
6654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
666e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Stmt,
6672dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXConstructExpr> constructExpr;
6684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
669bd9cbd22b832ce65a085801259cf2d3df77830e4Enea Zaffanella/// \brief Matches unresolved constructor call expressions.
670bd9cbd22b832ce65a085801259cf2d3df77830e4Enea Zaffanella///
671bd9cbd22b832ce65a085801259cf2d3df77830e4Enea Zaffanella/// Example matches T(t) in return statement of f
672bd9cbd22b832ce65a085801259cf2d3df77830e4Enea Zaffanella///     (matcher = unresolvedConstructExpr())
673bd9cbd22b832ce65a085801259cf2d3df77830e4Enea Zaffanella/// \code
674bd9cbd22b832ce65a085801259cf2d3df77830e4Enea Zaffanella///   template <typename T>
675bd9cbd22b832ce65a085801259cf2d3df77830e4Enea Zaffanella///   void f(const T& t) { return T(t); }
676bd9cbd22b832ce65a085801259cf2d3df77830e4Enea Zaffanella/// \endcode
677bd9cbd22b832ce65a085801259cf2d3df77830e4Enea Zaffanellaconst internal::VariadicDynCastAllOfMatcher<
678bd9cbd22b832ce65a085801259cf2d3df77830e4Enea Zaffanella  Stmt,
679bd9cbd22b832ce65a085801259cf2d3df77830e4Enea Zaffanella  CXXUnresolvedConstructExpr> unresolvedConstructExpr;
680bd9cbd22b832ce65a085801259cf2d3df77830e4Enea Zaffanella
68170b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// \brief Matches implicit and explicit this expressions.
68270b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek///
68370b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// Example matches the implicit this expression in "return i".
68470b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek///     (matcher = thisExpr())
68570b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// \code
68670b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// struct foo {
68770b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek///   int i;
68870b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek///   int f() { return i; }
68970b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// };
69070b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// \endcode
69170b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimekconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXThisExpr> thisExpr;
69270b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek
6934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches nodes where temporaries are created.
6944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
6954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches FunctionTakesString(GetStringByValue())
6962dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = bindTemporaryExpr())
69725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
6984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   FunctionTakesString(GetStringByValue());
6994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   FunctionTakesStringByPointer(GetStringPointer());
70025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
7014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
702e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Stmt,
7032dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXBindTemporaryExpr> bindTemporaryExpr;
7044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
705e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \brief Matches nodes where temporaries are materialized.
706e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer///
707e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// Example: Given
708e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \code
709e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer///   struct T {void func()};
710e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer///   T f();
711e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer///   void g(T);
712e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \endcode
713e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// materializeTemporaryExpr() matches 'f()' in these statements
714e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \code
715e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer///   T u(f());
716e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer///   g(f());
717e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \endcode
718e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// but does not match
719e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \code
720e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer///   f();
721e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer///   f().func();
722e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \endcode
723e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzerconst internal::VariadicDynCastAllOfMatcher<
724e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer  Stmt,
725e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer  MaterializeTemporaryExpr> materializeTemporaryExpr;
726e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer
7274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches new expressions.
7284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
7294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
73025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
7314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   new X;
73225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
7332dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// newExpr()
7344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches 'new X'.
7352dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXNewExpr> newExpr;
736e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
737e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches delete expressions.
738e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
739e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
74025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
741e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   delete X;
74225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
7432dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// deleteExpr()
744e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches 'delete X'.
7452dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXDeleteExpr> deleteExpr;
746e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
747e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches array subscript expressions.
748e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
749e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
75025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
751e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   int i = a[1];
75225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
753e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// arraySubscriptExpr()
754e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches "a[1]"
755e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<
756e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Stmt,
757e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  ArraySubscriptExpr> arraySubscriptExpr;
7584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
7594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the value of a default argument at the call site.
7604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
7614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches the CXXDefaultArgExpr placeholder inserted for the
7624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     default value of the second parameter in the call expression f(42)
7632dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = defaultArgExpr())
76425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
7654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void f(int x, int y = 0);
7664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   f(42);
76725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
7684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
769e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Stmt,
7702dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXDefaultArgExpr> defaultArgExpr;
7714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
7724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches overloaded operator calls.
7734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
7744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Note that if an operator isn't overloaded, it won't match. Instead, use
7754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// binaryOperator matcher.
7764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Currently it does not match operators such as new delete.
7774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: figure out why these do not match?
7784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
7794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches both operator<<((o << b), c) and operator<<(o, b)
7802dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = operatorCallExpr())
78125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
7824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   ostream &operator<< (ostream &out, int i) { };
7834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   ostream &o; int b = 1, c = 1;
7844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   o << b << c;
78525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
7864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
787e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Stmt,
7882dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXOperatorCallExpr> operatorCallExpr;
7894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
7904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches expressions.
7914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
7924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches x()
79325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
7944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void f() { x(); }
79525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
7962dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, Expr> expr;
7974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
7984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches expressions that refer to declarations.
7994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
8004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches x in if (x)
80125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
8024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   bool x;
8034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   if (x) {}
80425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
8052dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, DeclRefExpr> declRefExpr;
8064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
8074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if statements.
8084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
8094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches 'if (x) {}'
81025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
8114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   if (x) {}
81225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
813e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, IfStmt> ifStmt;
8144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
8154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches for statements.
8164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
8174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches 'for (;;) {}'
81825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
8194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   for (;;) {}
82031f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper///   int i[] =  {1, 2, 3}; for (auto a : i);
82125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
8222dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, ForStmt> forStmt;
8234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
82431f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \brief Matches range-based for statements.
82531f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper///
82631f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// forRangeStmt() matches 'for (auto a : i)'
82731f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \code
82831f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper///   int i[] =  {1, 2, 3}; for (auto a : i);
82931f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper///   for(int j = 0; j < 5; ++j);
83031f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \endcode
83131f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXForRangeStmt> forRangeStmt;
83231f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper
8336a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches the increment statement of a for loop.
8346a12449ec8862211856447d3df4c082a346339f2Daniel Jasper///
8356a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// Example:
8366a12449ec8862211856447d3df4c082a346339f2Daniel Jasper///     forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
8376a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// matches '++x' in
83825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
8396a12449ec8862211856447d3df4c082a346339f2Daniel Jasper///     for (x; x < N; ++x) { }
84025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
8416a12449ec8862211856447d3df4c082a346339f2Daniel JasperAST_MATCHER_P(ForStmt, hasIncrement, internal::Matcher<Stmt>,
8426a12449ec8862211856447d3df4c082a346339f2Daniel Jasper              InnerMatcher) {
8436a12449ec8862211856447d3df4c082a346339f2Daniel Jasper  const Stmt *const Increment = Node.getInc();
8446a12449ec8862211856447d3df4c082a346339f2Daniel Jasper  return (Increment != NULL &&
8456a12449ec8862211856447d3df4c082a346339f2Daniel Jasper          InnerMatcher.matches(*Increment, Finder, Builder));
8466a12449ec8862211856447d3df4c082a346339f2Daniel Jasper}
8476a12449ec8862211856447d3df4c082a346339f2Daniel Jasper
8486a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches the initialization statement of a for loop.
8496a12449ec8862211856447d3df4c082a346339f2Daniel Jasper///
8506a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// Example:
8512dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     forStmt(hasLoopInit(declStmt()))
8526a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// matches 'int x = 0' in
85325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
8546a12449ec8862211856447d3df4c082a346339f2Daniel Jasper///     for (int x = 0; x < N; ++x) { }
85525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
8566a12449ec8862211856447d3df4c082a346339f2Daniel JasperAST_MATCHER_P(ForStmt, hasLoopInit, internal::Matcher<Stmt>,
8576a12449ec8862211856447d3df4c082a346339f2Daniel Jasper              InnerMatcher) {
8586a12449ec8862211856447d3df4c082a346339f2Daniel Jasper  const Stmt *const Init = Node.getInit();
8596a12449ec8862211856447d3df4c082a346339f2Daniel Jasper  return (Init != NULL && InnerMatcher.matches(*Init, Finder, Builder));
8606a12449ec8862211856447d3df4c082a346339f2Daniel Jasper}
8616a12449ec8862211856447d3df4c082a346339f2Daniel Jasper
8624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches while statements.
8634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
8644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
86525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
8664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   while (true) {}
86725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
8684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// whileStmt()
8694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches 'while (true) {}'.
8702dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, WhileStmt> whileStmt;
8714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
8724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches do statements.
8734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
8744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
87525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
8764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   do {} while (true);
87725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
8784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// doStmt()
8794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches 'do {} while(true)'
880e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, DoStmt> doStmt;
8814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
882b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches break statements.
883b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///
884b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given
885b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code
886b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   while (true) { break; }
887b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode
888b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// breakStmt()
889b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   matches 'break'
890b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, BreakStmt> breakStmt;
891b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper
892b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches continue statements.
893b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///
894b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given
895b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code
896b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   while (true) { continue; }
897b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode
898b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// continueStmt()
899b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   matches 'continue'
900b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, ContinueStmt> continueStmt;
901b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper
902b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches return statements.
903b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///
904b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given
905b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code
906b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   return 1;
907b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode
908b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// returnStmt()
909b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   matches 'return 1'
910b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, ReturnStmt> returnStmt;
911b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper
912b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches goto statements.
913b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///
914b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given
915b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code
916b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   goto FOO;
917b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   FOO: bar();
918b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode
919b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// gotoStmt()
920b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   matches 'goto FOO'
921b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, GotoStmt> gotoStmt;
922b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper
923b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches label statements.
924b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///
925b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given
926b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code
927b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   goto FOO;
928b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   FOO: bar();
929b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode
930b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// labelStmt()
931b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   matches 'FOO:'
932b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, LabelStmt> labelStmt;
933b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper
934b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches switch statements.
935b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///
936b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given
937b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code
938b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   switch(a) { case 42: break; default: break; }
939b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode
940b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// switchStmt()
941b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   matches 'switch(a)'.
942b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, SwitchStmt> switchStmt;
943b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper
9444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches case and default statements inside switch statements.
9454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
9464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
94725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
9484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   switch(a) { case 42: break; default: break; }
94925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
9504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// switchCase()
9514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches 'case 42: break;' and 'default: break;'.
9522dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, SwitchCase> switchCase;
9534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
954acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \brief Matches case statements inside switch statements.
955acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///
956acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// Given
957acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \code
958acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///   switch(a) { case 42: break; default: break; }
959acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \endcode
960acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// caseStmt()
961acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///   matches 'case 42: break;'.
962acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourneconst internal::VariadicDynCastAllOfMatcher<Stmt, CaseStmt> caseStmt;
963acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne
964acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \brief Matches default statements inside switch statements.
965acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///
966acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// Given
967acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \code
968acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///   switch(a) { case 42: break; default: break; }
969acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \endcode
970acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// defaultStmt()
971acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///   matches 'default: break;'.
972acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourneconst internal::VariadicDynCastAllOfMatcher<Stmt, DefaultStmt> defaultStmt;
973acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne
9744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches compound statements.
9754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
9764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches '{}' and '{{}}'in 'for (;;) {{}}'
97725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
9784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   for (;;) {{}}
97925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
9802dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CompoundStmt> compoundStmt;
9814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
982b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches catch statements.
983b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///
984b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code
985b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   try {} catch(int i) {}
986b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode
987b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// catchStmt()
988b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   matches 'catch(int i)'
989b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXCatchStmt> catchStmt;
990b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper
991b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches try statements.
992b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///
993b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code
994b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   try {} catch(int i) {}
995b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode
996b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// tryStmt()
997b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   matches 'try {}'
998b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXTryStmt> tryStmt;
999b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper
1000b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches throw expressions.
1001b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///
1002b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code
1003b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   try { throw 5; } catch(int i) {}
1004b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode
1005b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// throwExpr()
1006b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   matches 'throw 5'
1007b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXThrowExpr> throwExpr;
1008b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper
1009b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches null statements.
1010b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///
1011b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code
1012b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   foo();;
1013b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode
1014b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// nullStmt()
1015b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   matches the second ';'
1016b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, NullStmt> nullStmt;
1017b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper
1018b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches asm statements.
1019b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///
1020b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code
1021b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///  int i = 100;
1022b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   __asm("mov al, 2");
1023b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode
1024b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// asmStmt()
1025b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper///   matches '__asm("mov al, 2")'
1026b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, AsmStmt> asmStmt;
1027b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper
10284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches bool literals.
10294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
10304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches true
103125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
10324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   true
103325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
10344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
10353680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper  Stmt,
1036e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  CXXBoolLiteralExpr> boolLiteral;
10374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
10384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches string literals (also matches wide string literals).
10394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
10404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches "abcd", L"abcd"
104125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
10424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   char *s = "abcd"; wchar_t *ws = L"abcd"
104325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
10444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
10453680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper  Stmt,
1046e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  StringLiteral> stringLiteral;
10474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
10484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches character literals (also matches wchar_t).
10494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
10504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
10514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// though.
10524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
10534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches 'a', L'a'
105425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
10554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   char ch = 'a'; wchar_t chw = L'a';
105625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
10574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
10583680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper  Stmt,
1059e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  CharacterLiteral> characterLiteral;
10604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
10614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches integer literals of all sizes / encodings.
10624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
10634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Not matching character-encoded integers such as L'a'.
10644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
10654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches 1, 1L, 0x1, 1U
10664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
10673680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper  Stmt,
1068e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  IntegerLiteral> integerLiteral;
10694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
107031f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \brief Matches user defined literal operator call.
107131f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper///
107231f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// Example match: "foo"_suffix
107331f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<
107431f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper  Stmt,
107531f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper  UserDefinedLiteral> userDefinedLiteral;
107631f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper
1077afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith/// \brief Matches compound (i.e. non-scalar) literals
1078afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith///
1079afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith/// Example match: {1}, (1, 2)
1080afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith/// \code
1081afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith///   int array[4] = {1}; vector int myvec = (vector int)(1, 2);
1082afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith/// \endcode
1083afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smithconst internal::VariadicDynCastAllOfMatcher<
1084afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith  Stmt,
1085afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith  CompoundLiteralExpr> compoundLiteralExpr;
1086afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith
108731f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \brief Matches nullptr literal.
108831f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<
108931f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper  Stmt,
109031f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper  CXXNullPtrLiteralExpr> nullPtrLiteralExpr;
109131f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper
10924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches binary operator expressions.
10934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
10944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a || b
109525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
10964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   !(a || b)
109725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
10984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
1099e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Stmt,
1100e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  BinaryOperator> binaryOperator;
11014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
11024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches unary operator expressions.
11034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
11044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches !a
110525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
11064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   !a || b
110725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
11084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
1109e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Stmt,
1110e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  UnaryOperator> unaryOperator;
11114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
11124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches conditional operator expressions.
11134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
11144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a ? b : c
111525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
11164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   (a ? b : c) + 42
111725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
11184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
1119e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Stmt,
1120e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  ConditionalOperator> conditionalOperator;
11214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
11224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a reinterpret_cast expression.
11234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
11244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Either the source expression or the destination type can be matched
11254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// using has(), but hasDestinationType() is more specific and can be
11264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// more readable.
11274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
11284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches reinterpret_cast<char*>(&p) in
112925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
11304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void* p = reinterpret_cast<char*>(&p);
113125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
11324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
11333680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper  Stmt,
11342dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXReinterpretCastExpr> reinterpretCastExpr;
11354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
11364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a C++ static_cast expression.
11374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
11384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \see hasDestinationType
11394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \see reinterpretCast
11404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
11414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example:
11422dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///   staticCastExpr()
11434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches
11444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   static_cast<long>(8)
11454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// in
114625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
11474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   long eight(static_cast<long>(8));
114825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
11494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
11503680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper  Stmt,
11512dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXStaticCastExpr> staticCastExpr;
11524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
11534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a dynamic_cast expression.
11544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
11554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example:
11562dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///   dynamicCastExpr()
11574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches
11584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   dynamic_cast<D*>(&b);
11594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// in
116025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
11614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   struct B { virtual ~B() {} }; struct D : B {};
11624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   B b;
11634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   D* p = dynamic_cast<D*>(&b);
116425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
11654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
11663680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper  Stmt,
11672dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXDynamicCastExpr> dynamicCastExpr;
11684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
11694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a const_cast expression.
11704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
11714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: Matches const_cast<int*>(&r) in
117225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
11734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   int n = 42;
117425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///   const int &r(n);
11754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   int* p = const_cast<int*>(&r);
117625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
11774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
11783680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper  Stmt,
11792dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXConstCastExpr> constCastExpr;
11804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
1181e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper/// \brief Matches a C-style cast expression.
1182e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper///
1183e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper/// Example: Matches (int*) 2.2f in
1184e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper/// \code
1185e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper///   int i = (int) 2.2f;
1186e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper/// \endcode
1187e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<
1188e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper  Stmt,
1189e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper  CStyleCastExpr> cStyleCastExpr;
1190e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper
11914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches explicit cast expressions.
11924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
11934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Matches any cast expression written in user code, whether it be a
11944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// C-style cast, a functional-style cast, or a keyword cast.
11954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
11964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Does not match implicit conversions.
11974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
11984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Note: the name "explicitCast" is chosen to match Clang's terminology, as
11994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Clang uses the term "cast" to apply to implicit conversions as well as to
12004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// actual cast expressions.
12014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
12024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \see hasDestinationType.
12034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
12044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: matches all five of the casts in
120525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
12064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42)))))
120725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
12084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// but does not match the implicit conversion in
120925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
12104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   long ell = 42;
121125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
12124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
12133680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper  Stmt,
12142dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  ExplicitCastExpr> explicitCastExpr;
12154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
12164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the implicit cast nodes of Clang's AST.
12174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
12184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// This matches many different places, including function call return value
12194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// eliding, as well as any type conversions.
12204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
12213680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper  Stmt,
12222dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  ImplicitCastExpr> implicitCastExpr;
12234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
1224089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// \brief Matches any cast nodes of Clang's AST.
1225089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///
1226089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Example: castExpr() matches each of the following:
122725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1228089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   (int) 3;
1229089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   const_cast<Expr *>(SubExpr);
1230089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   char c = 0;
123125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1232089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// but does not match
123325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1234089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   int i = (0);
1235089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer///   int k = 0;
123625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
12373680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CastExpr> castExpr;
1238089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer
12394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches functional cast expressions
12404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
12414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: Matches Foo(bar);
124225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
12434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   Foo f = bar;
12444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   Foo g = (Foo) bar;
12454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   Foo h = Foo(bar);
124625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
12474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher<
12483680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper  Stmt,
12492dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper  CXXFunctionalCastExpr> functionalCastExpr;
12504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
1251a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \brief Matches \c QualTypes in the clang AST.
1252a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasperconst internal::VariadicAllOfMatcher<QualType> qualType;
1253a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper
1254a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \brief Matches \c Types in the clang AST.
125506b247f0ffb69854e32150c80f347a9376d3709bManuel Klimekconst internal::VariadicAllOfMatcher<Type> type;
1256a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper
1257a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \brief Matches \c TypeLocs in the clang AST.
125806b247f0ffb69854e32150c80f347a9376d3709bManuel Klimekconst internal::VariadicAllOfMatcher<TypeLoc> typeLoc;
1259a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper
12607387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \brief Matches if any of the given matchers matches.
12617387673f83b8b37f660422947c9990778ba88193Manuel Klimek///
12627387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// Unlike \c anyOf, \c eachOf will generate a match result for each
12637387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// matching submatcher.
12647387673f83b8b37f660422947c9990778ba88193Manuel Klimek///
12657387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// For example, in:
12667387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \code
12677387673f83b8b37f660422947c9990778ba88193Manuel Klimek///   class A { int a; int b; };
12687387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \endcode
12697387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// The matcher:
12707387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \code
12717387673f83b8b37f660422947c9990778ba88193Manuel Klimek///   recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
12727387673f83b8b37f660422947c9990778ba88193Manuel Klimek///                     has(fieldDecl(hasName("b")).bind("v"))))
12737387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \endcode
12747387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// will generate two results binding "v", the first of which binds
12757387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// the field declaration of \c a, the second the field declaration of
12767387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \c b.
12777387673f83b8b37f660422947c9990778ba88193Manuel Klimek///
12787387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// Usable as: Any Matcher
12797387673f83b8b37f660422947c9990778ba88193Manuel Klimektemplate <typename M1, typename M2>
12807387673f83b8b37f660422947c9990778ba88193Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::EachOfMatcher, M1, M2>
12817387673f83b8b37f660422947c9990778ba88193Manuel KlimekeachOf(const M1 &P1, const M2 &P2) {
12827387673f83b8b37f660422947c9990778ba88193Manuel Klimek  return internal::PolymorphicMatcherWithParam2<internal::EachOfMatcher, M1,
12837387673f83b8b37f660422947c9990778ba88193Manuel Klimek                                                M2>(P1, P2);
12847387673f83b8b37f660422947c9990778ba88193Manuel Klimek}
12857387673f83b8b37f660422947c9990778ba88193Manuel Klimek
12864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Various overloads for the anyOf matcher.
12874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// @{
128825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek
128925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \brief Matches if any of the given matchers matches.
129025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
129125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher
129225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimektemplate<typename M1, typename M2>
129325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M1, M2>
129425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekanyOf(const M1 &P1, const M2 &P2) {
12954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher,
129625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek                                                M1, M2 >(P1, P2);
12974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
129825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimektemplate<typename M1, typename M2, typename M3>
129925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M1,
130025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M2, M3> >
130125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekanyOf(const M1 &P1, const M2 &P2, const M3 &P3) {
13024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return anyOf(P1, anyOf(P2, P3));
13034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
130425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimektemplate<typename M1, typename M2, typename M3, typename M4>
130525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M1,
130625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M2,
13074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek        internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher,
130825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek                                               M3, M4> > >
130925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekanyOf(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4) {
1310ff2fcb8db242a54f72bbb4e5595261e12672ed66Daniel Jasper  return anyOf(P1, anyOf(P2, anyOf(P3, P4)));
13114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
131225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimektemplate<typename M1, typename M2, typename M3, typename M4, typename M5>
131325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M1,
131425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M2,
131525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek        internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M3,
13164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek            internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher,
131725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek                                                   M4, M5> > > >
131825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekanyOf(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4, const M5 &P5) {
13194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return anyOf(P1, anyOf(P2, anyOf(P3, anyOf(P4, P5))));
13204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
132125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek
13224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// @}
13234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
13244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Various overloads for the allOf matcher.
13254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// @{
132625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek
132725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \brief Matches if all given matchers match.
132825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
132925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher
13307f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vanetemplate <typename M1, typename M2>
133125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::AllOfMatcher, M1, M2>
133225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekallOf(const M1 &P1, const M2 &P2) {
13337f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane  return internal::PolymorphicMatcherWithParam2<internal::AllOfMatcher, M1, M2>(
13347f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane      P1, P2);
13354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
13367f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vanetemplate <typename M1, typename M2, typename M3>
13377f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vaneinternal::PolymorphicMatcherWithParam2<
13387f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane    internal::AllOfMatcher, M1,
133925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    internal::PolymorphicMatcherWithParam2<internal::AllOfMatcher, M2, M3> >
134025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekallOf(const M1 &P1, const M2 &P2, const M3 &P3) {
13416a12449ec8862211856447d3df4c082a346339f2Daniel Jasper  return allOf(P1, allOf(P2, P3));
13424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
13437f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vanetemplate <typename M1, typename M2, typename M3, typename M4>
13447f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vaneinternal::PolymorphicMatcherWithParam2<
13457f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane    internal::AllOfMatcher, M1,
13467f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane    internal::PolymorphicMatcherWithParam2<
13477f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane        internal::AllOfMatcher, M2, internal::PolymorphicMatcherWithParam2<
13487f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane                                        internal::AllOfMatcher, M3, M4> > >
13497f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin VaneallOf(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4) {
13507f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane  return allOf(P1, allOf(P2, P3, P4));
13517f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane}
13527f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vanetemplate <typename M1, typename M2, typename M3, typename M4, typename M5>
13537f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vaneinternal::PolymorphicMatcherWithParam2<
13547f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane    internal::AllOfMatcher, M1,
13557f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane    internal::PolymorphicMatcherWithParam2<
13567f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane        internal::AllOfMatcher, M2,
13577f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane        internal::PolymorphicMatcherWithParam2<
13587f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane            internal::AllOfMatcher, M3,
13597f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane            internal::PolymorphicMatcherWithParam2<internal::AllOfMatcher, M4,
13607f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane                                                   M5> > > >
13617f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin VaneallOf(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4, const M5 &P5) {
13627f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane  return allOf(P1, allOf(P2, P3, P4, P5));
13637f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane}
136425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek
13654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// @}
13664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
1367e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1368e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
1369e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
137025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1371e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   Foo x = bar;
1372e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   int y = sizeof(x) + alignof(x);
137325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1374e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// unaryExprOrTypeTraitExpr()
1375e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches \c sizeof(x) and \c alignof(x)
1376e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<
1377e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Stmt,
1378e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  UnaryExprOrTypeTraitExpr> unaryExprOrTypeTraitExpr;
1379e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
1380e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches unary expressions that have a specific type of argument.
1381e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
1382e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
138325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1384e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
138525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1386e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
1387e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches \c sizeof(a) and \c alignof(c)
1388e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UnaryExprOrTypeTraitExpr, hasArgumentOfType,
138925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<QualType>, InnerMatcher) {
1390e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const QualType ArgumentType = Node.getTypeOfArgument();
139125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek  return InnerMatcher.matches(ArgumentType, Finder, Builder);
1392e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
1393e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
1394e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches unary expressions of a certain kind.
1395e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
1396e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
139725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1398e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   int x;
1399e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   int s = sizeof(x) + alignof(x)
140025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1401e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
1402e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches \c sizeof(x)
1403e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UnaryExprOrTypeTraitExpr, ofKind, UnaryExprOrTypeTrait, Kind) {
1404e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return Node.getKind() == Kind;
1405e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
1406e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
1407e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Same as unaryExprOrTypeTraitExpr, but only matching
1408e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// alignof.
1409e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<Stmt> alignOfExpr(
141025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
1411415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return stmt(unaryExprOrTypeTraitExpr(allOf(
141225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek      ofKind(UETT_AlignOf), InnerMatcher)));
1413e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
1414e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
1415e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Same as unaryExprOrTypeTraitExpr, but only matching
1416e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// sizeof.
1417e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<Stmt> sizeOfExpr(
141825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
1419415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return stmt(unaryExprOrTypeTraitExpr(
1420415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek      allOf(ofKind(UETT_SizeOf), InnerMatcher)));
1421e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
1422e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
14234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches NamedDecl nodes that have the specified name.
14244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
14254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Supports specifying enclosing namespaces or classes by prefixing the name
14264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with '<enclosing>::'.
14274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Does not match typedefs of an underlying type with the given name.
14284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
14294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X (Name == "X")
143025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
14314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X;
143225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
14334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
14344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
143525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
143625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///   namespace a { namespace b { class X; } }
143725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1438e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(NamedDecl, hasName, std::string, Name) {
14394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  assert(!Name.empty());
14404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  const std::string FullNameString = "::" + Node.getQualifiedNameAsString();
1441cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  const StringRef FullName = FullNameString;
1442cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  const StringRef Pattern = Name;
14434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  if (Pattern.startswith("::")) {
14444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    return FullName == Pattern;
14454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  } else {
14464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    return FullName.endswith(("::" + Pattern).str());
14474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  }
14484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
14494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
145031bdf071afc18bb9551e4f4254be297333200c4aManuel Klimek/// \brief Matches NamedDecl nodes whose fully qualified names contain
145131bdf071afc18bb9551e4f4254be297333200c4aManuel Klimek/// a substring matched by the given RegExp.
1452e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
1453e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Supports specifying enclosing namespaces or classes by
1454e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// prefixing the name with '<enclosing>::'.  Does not match typedefs
1455e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// of an underlying type with the given name.
1456e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
1457e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Example matches X (regexp == "::X")
145825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1459e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   class X;
146025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1461e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
1462e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Example matches X (regexp is one of "::X", "^foo::.*X", among others)
146325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
146425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///   namespace foo { namespace bar { class X; } }
146525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1466e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(NamedDecl, matchesName, std::string, RegExp) {
1467e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  assert(!RegExp.empty());
1468e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  std::string FullNameString = "::" + Node.getQualifiedNameAsString();
1469e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  llvm::Regex RE(RegExp);
1470e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return RE.match(FullNameString);
1471e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
1472e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
14734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches overloaded operator names.
14744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
14754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Matches overloaded operator names specified in strings without the
14766a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// "operator" prefix: e.g. "<<".
14774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
14786a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// Given:
147925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
14806a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   class A { int operator*(); };
14816a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   const A &operator<<(const A &a, const A &b);
14826a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   A a;
14836a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   a << a;   // <-- This matches
148425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
14856a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///
14866a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \c operatorCallExpr(hasOverloadedOperatorName("<<"))) matches the specified
14876a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// line and \c recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
14886a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// the declaration of \c A.
14896a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///
14906a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// Usable as: Matcher<CXXOperatorCallExpr>, Matcher<CXXMethodDecl>
14916a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vaneinline internal::PolymorphicMatcherWithParam1<
1492ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    internal::HasOverloadedOperatorNameMatcher, StringRef,
1493ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    AST_POLYMORPHIC_SUPPORTED_TYPES_2(CXXOperatorCallExpr, CXXMethodDecl)>
14946a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin VanehasOverloadedOperatorName(const StringRef Name) {
14956a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane  return internal::PolymorphicMatcherWithParam1<
1496ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen      internal::HasOverloadedOperatorNameMatcher, StringRef,
1497ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen      AST_POLYMORPHIC_SUPPORTED_TYPES_2(CXXOperatorCallExpr, CXXMethodDecl)>(
1498ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen      Name);
14994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
15004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
15014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches C++ classes that are directly or indirectly derived from
150220b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper/// a class matching \c Base.
15034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
150476dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper/// Note that a class is not considered to be derived from itself.
15054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
150676dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper/// Example matches Y, Z, C (Base == hasName("X"))
150725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
150876dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper///   class X;
15094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y : public X {};  // directly derived
15104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Z : public Y {};  // indirectly derived
15114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   typedef X A;
15124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   typedef A B;
15134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class C : public B {};  // derived from a typedef of X
151425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
15154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
151620b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper/// In the following example, Bar matches isDerivedFrom(hasName("X")):
151725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
15184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Foo;
15194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   typedef Foo X;
15204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Bar : public Foo {};  // derived from a type that X is a typedef of
152125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
152220b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel JasperAST_MATCHER_P(CXXRecordDecl, isDerivedFrom,
152320b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper              internal::Matcher<NamedDecl>, Base) {
152420b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper  return Finder->classIsDerivedFrom(&Node, Base, Builder);
152520b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper}
152620b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper
152720b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper/// \brief Overloaded method as shortcut for \c isDerivedFrom(hasName(...)).
152820b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasperinline internal::Matcher<CXXRecordDecl> isDerivedFrom(StringRef BaseName) {
152920b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper  assert(!BaseName.empty());
153020b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper  return isDerivedFrom(hasName(BaseName));
15314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
15324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
153376dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper/// \brief Similar to \c isDerivedFrom(), but also matches classes that directly
153476dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper/// match \c Base.
153563d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasperinline internal::Matcher<CXXRecordDecl> isSameOrDerivedFrom(
153663d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper    internal::Matcher<NamedDecl> Base) {
153776dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper  return anyOf(Base, isDerivedFrom(Base));
153876dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper}
153976dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper
154063d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper/// \brief Overloaded method as shortcut for
154163d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper/// \c isSameOrDerivedFrom(hasName(...)).
154263d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasperinline internal::Matcher<CXXRecordDecl> isSameOrDerivedFrom(
154363d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper    StringRef BaseName) {
154476dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper  assert(!BaseName.empty());
154563d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper  return isSameOrDerivedFrom(hasName(BaseName));
154676dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper}
154776dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper
15486a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \brief Matches the first method of a class or struct that satisfies \c
15496a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// InnerMatcher.
15506a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///
15516a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// Given:
15526a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \code
15536a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   class A { void func(); };
15546a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   class B { void member(); };
15556a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \code
15566a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///
15576a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \c recordDecl(hasMethod(hasName("func"))) matches the declaration of \c A
15586a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// but not \c B.
15596a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin VaneAST_MATCHER_P(CXXRecordDecl, hasMethod, internal::Matcher<CXXMethodDecl>,
15606a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane              InnerMatcher) {
1561054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  return matchesFirstInPointerRange(InnerMatcher, Node.method_begin(),
1562054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek                                    Node.method_end(), Finder, Builder);
15636a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane}
15646a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane
15654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches AST nodes that have child AST nodes that match the
15664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// provided matcher.
15674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
15682dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
156925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
15704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X {};  // Matches X, because X::X is a class of name X inside X.
15714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y { class X {}; };
15724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Z { class Y { class X {}; }; };  // Does not match Z.
157325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
15744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
15754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// ChildT must be an AST base type.
157625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
157725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher
15784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename ChildT>
15794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinternal::ArgumentAdaptingMatcher<internal::HasMatcher, ChildT> has(
15804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    const internal::Matcher<ChildT> &ChildMatcher) {
15814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::ArgumentAdaptingMatcher<internal::HasMatcher,
15824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek                                           ChildT>(ChildMatcher);
15834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
15844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
15854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches AST nodes that have descendant AST nodes that match the
15864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// provided matcher.
15874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
15884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X, Y, Z
15892dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = recordDecl(hasDescendant(recordDecl(hasName("X")))))
159025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
15914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X {};  // Matches X, because X::X is a class of name X inside X.
15924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y { class X {}; };
15934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Z { class Y { class X {}; }; };
159425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
15954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
15964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// DescendantT must be an AST base type.
159725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
159825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher
15994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename DescendantT>
16004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinternal::ArgumentAdaptingMatcher<internal::HasDescendantMatcher, DescendantT>
16014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekhasDescendant(const internal::Matcher<DescendantT> &DescendantMatcher) {
16024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::ArgumentAdaptingMatcher<
16034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    internal::HasDescendantMatcher,
16044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    DescendantT>(DescendantMatcher);
16054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
16064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
16074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches AST nodes that have child AST nodes that match the
16084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// provided matcher.
16094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
16102dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
161125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
16124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X {};  // Matches X, because X::X is a class of name X inside X.
16134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y { class X {}; };
16144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Z { class Y { class X {}; }; };  // Does not match Z.
161525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
16164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
16174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// ChildT must be an AST base type.
16184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
16194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// As opposed to 'has', 'forEach' will cause a match for each result that
16204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches instead of only on the first one.
162125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
162225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher
16234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename ChildT>
16244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinternal::ArgumentAdaptingMatcher<internal::ForEachMatcher, ChildT> forEach(
162525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    const internal::Matcher<ChildT> &ChildMatcher) {
16264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::ArgumentAdaptingMatcher<
16274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    internal::ForEachMatcher,
16284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    ChildT>(ChildMatcher);
16294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
16304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
16314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches AST nodes that have descendant AST nodes that match the
16324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// provided matcher.
16334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
16344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X, A, B, C
16352dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X")))))
163625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
16374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X {};  // Matches X, because X::X is a class of name X inside X.
16384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class A { class X {}; };
16394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class B { class C { class X {}; }; };
164025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
16414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
16424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// DescendantT must be an AST base type.
16434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
16444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
16454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// each result that matches instead of only on the first one.
16464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
16474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Note: Recursively combined ForEachDescendant can cause many matches:
16482dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///   recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl()))))
16494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// will match 10 times (plus injected class name matches) on:
165025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
16514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class A { class B { class C { class D { class E {}; }; }; }; };
165225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
165325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
165425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher
16554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename DescendantT>
1656a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasperinternal::ArgumentAdaptingMatcher<internal::ForEachDescendantMatcher,
1657a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper                                  DescendantT>
16584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekforEachDescendant(
165925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    const internal::Matcher<DescendantT> &DescendantMatcher) {
16604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::ArgumentAdaptingMatcher<
16614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    internal::ForEachDescendantMatcher,
16624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    DescendantT>(DescendantMatcher);
16634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
16644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
1665152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \brief Matches if the node or any descendant matches.
1666152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek///
1667152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// Generates results for each match.
1668152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek///
1669152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// For example, in:
1670152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \code
1671152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek///   class A { class B {}; class C {}; };
1672152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \endcode
1673152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// The matcher:
1674152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \code
1675152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek///   recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m")))
1676152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \endcode
1677152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// will generate results for \c A, \c B and \c C.
1678152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek///
1679152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// Usable as: Any Matcher
1680152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimektemplate <typename T>
1681152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimekinternal::PolymorphicMatcherWithParam2<
1682152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek    internal::EachOfMatcher, internal::Matcher<T>,
1683152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek    internal::ArgumentAdaptingMatcher<internal::ForEachDescendantMatcher, T> >
1684152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel KlimekfindAll(const internal::Matcher<T> &Matcher) {
1685152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek  return eachOf(Matcher, forEachDescendant(Matcher));
1686152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek}
1687152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek
1688c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// \brief Matches AST nodes that have a parent that matches the provided
1689c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// matcher.
1690c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper///
1691c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// Given
1692c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// \code
1693c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
1694c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// \endcode
1695c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// \c compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
1696c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper///
1697c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// Usable as: Any Matcher
1698c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jaspertemplate <typename ParentT>
1699c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasperinternal::ArgumentAdaptingMatcher<internal::HasParentMatcher, ParentT>
1700c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel JasperhasParent(const internal::Matcher<ParentT> &ParentMatcher) {
1701c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper  return internal::ArgumentAdaptingMatcher<
1702c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper    internal::HasParentMatcher,
1703c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper    ParentT>(ParentMatcher);
1704c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper}
1705c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper
1706579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// \brief Matches AST nodes that have an ancestor that matches the provided
1707579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// matcher.
1708579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek///
1709579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// Given
1710579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// \code
1711579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// void f() { if (true) { int x = 42; } }
1712579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// void g() { for (;;) { int x = 43; } }
1713579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// \endcode
1714a1a4c0385a0fd458243d9e357e1eceb137f29abfNick Lewycky/// \c expr(integerLiteral(hasAncestor(ifStmt()))) matches \c 42, but not 43.
1715579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek///
1716579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// Usable as: Any Matcher
1717579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimektemplate <typename AncestorT>
1718579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimekinternal::ArgumentAdaptingMatcher<internal::HasAncestorMatcher, AncestorT>
1719579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel KlimekhasAncestor(const internal::Matcher<AncestorT> &AncestorMatcher) {
1720579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek  return internal::ArgumentAdaptingMatcher<
1721579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek    internal::HasAncestorMatcher,
1722579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek    AncestorT>(AncestorMatcher);
1723579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek}
1724579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek
17254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the provided matcher does not match.
17264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
17272dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches Y (matcher = recordDecl(unless(hasName("X"))))
172825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
17294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X {};
17304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y {};
173125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
173225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
173325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher
17344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename M>
173525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam1<internal::NotMatcher, M>
173625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekunless(const M &InnerMatcher) {
17374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::PolymorphicMatcherWithParam1<
17384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    internal::NotMatcher, M>(InnerMatcher);
17394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
17404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
174103a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// \brief Matches a node if the declaration associated with that node
174203a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// matches the given matcher.
174303a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek///
174403a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// The associated declaration is:
174503a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// - for type nodes, the declaration of the underlying type
174603a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// - for CallExpr, the declaration of the callee
174703a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// - for MemberExpr, the declaration of the referenced member
174803a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// - for CXXConstructExpr, the declaration of the constructor
174903a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek///
175003a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// Also usable as Matcher<T> for any T supporting the getDecl() member
175103a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// function. e.g. various subtypes of clang::Type and various expressions.
175203a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// FIXME: Add all node types for which this is matcher is usable due to
175303a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// getDecl().
1754523806028d812a7f29636c59a8bc0e7e3d3fd9aeEdwin Vane///
1755c711af2ddbbb1d46223cc9379d32a203fb5bc7f4Daniel Jasper/// Usable as: Matcher<QualType>, Matcher<CallExpr>, Matcher<CXXConstructExpr>,
17563abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///   Matcher<MemberExpr>, Matcher<TypedefType>,
17573abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///   Matcher<TemplateSpecializationType>
17584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinline internal::PolymorphicMatcherWithParam1< internal::HasDeclarationMatcher,
1759e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper                                     internal::Matcher<Decl> >
1760e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    hasDeclaration(const internal::Matcher<Decl> &InnerMatcher) {
17614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::PolymorphicMatcherWithParam1<
17624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    internal::HasDeclarationMatcher,
1763e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    internal::Matcher<Decl> >(InnerMatcher);
17644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
17654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
17664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches on the implicit object argument of a member call expression.
17674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
17682dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y"))))))
176925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
17704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y { public: void x(); };
17714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void z() { Y y; y.x(); }",
177225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
17734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
17744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: Overload to allow directly matching types?
1775e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXMemberCallExpr, on, internal::Matcher<Expr>,
17764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek              InnerMatcher) {
1777f8c12146fa2153a6d97b7c92d27d2ece0cd26e79Dmitri Gribenko  const Expr *ExprNode = Node.getImplicitObjectArgument()
1778f8c12146fa2153a6d97b7c92d27d2ece0cd26e79Dmitri Gribenko                            ->IgnoreParenImpCasts();
17794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (ExprNode != NULL &&
17804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*ExprNode, Finder, Builder));
17814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
17824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
17834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the call expression's callee expression matches.
17844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
17854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
178625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
17874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y { void x() { this->x(); x(); Y y; y.x(); } };
17884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void f() { f(); }
178925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
17902dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// callExpr(callee(expr()))
17914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches this->x(), x(), y.x(), f()
17924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with callee(...)
17934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matching this->x, x, y.x, f respectively
17944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
1795e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Note: Callee cannot take the more general internal::Matcher<Expr>
17964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// because this introduces ambiguous overloads with calls to Callee taking a
1797e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// internal::Matcher<Decl>, as the matcher hierarchy is purely
17984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// implemented in terms of implicit casts.
1799e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CallExpr, callee, internal::Matcher<Stmt>,
18004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek              InnerMatcher) {
1801e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Expr *ExprNode = Node.getCallee();
18024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (ExprNode != NULL &&
18034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*ExprNode, Finder, Builder));
18044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
18054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
18064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the call expression's callee's declaration matches the
18074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// given matcher.
18084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
18092dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x")))))
181025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
18114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y { public: void x(); };
18124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void z() { Y y; y.x();
181325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1814e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<CallExpr> callee(
1815e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    const internal::Matcher<Decl> &InnerMatcher) {
1816415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return callExpr(hasDeclaration(InnerMatcher));
18174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
18184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
18194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the expression's or declaration's type matches a type
18204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matcher.
18214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
18222dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
18232dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///             and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
182425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
18254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///  class X {};
18264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///  void y(X &x) { x; X z; }
182725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1828ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel BenzaquenAST_POLYMORPHIC_MATCHER_P(hasType,
1829ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                          AST_POLYMORPHIC_SUPPORTED_TYPES_2(Expr, ValueDecl),
1830ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                          internal::Matcher<QualType>, InnerMatcher) {
18314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return InnerMatcher.matches(Node.getType(), Finder, Builder);
18324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
18334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
18344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Overloaded to match the declaration of the expression's or value
18354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// declaration's type.
18364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
18374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// In case of a value declaration (for example a variable declaration),
18384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// this resolves one layer of indirection. For example, in the value
18392dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
18402dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
18414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// of x."
18424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
18432dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
18442dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///             and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
184525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
18464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///  class X {};
18474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///  void y(X &x) { x; X z; }
184825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1849297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek///
1850297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// Usable as: Matcher<Expr>, Matcher<ValueDecl>
18514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinline internal::PolymorphicMatcherWithParam1<
1852ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    internal::matcher_hasType0Matcher, internal::Matcher<QualType>,
1853ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    AST_POLYMORPHIC_SUPPORTED_TYPES_2(Expr, ValueDecl)>
1854e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperhasType(const internal::Matcher<Decl> &InnerMatcher) {
1855415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return hasType(qualType(hasDeclaration(InnerMatcher)));
18564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
18574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
18581a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// \brief Matches if the type location of the declarator decl's type matches
18591a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// the inner matcher.
18601a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek///
18611a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// Given
18621a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// \code
18631a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek///   int x;
18641a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// \endcode
18651a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek/// declaratorDecl(hasTypeLoc(loc(asString("int"))))
18661a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek///   matches int x
18671a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel KlimekAST_MATCHER_P(DeclaratorDecl, hasTypeLoc, internal::Matcher<TypeLoc>, Inner) {
18681a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek  if (!Node.getTypeSourceInfo())
18691a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek    // This happens for example for implicit destructors.
18701a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek    return false;
18711a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek  return Inner.matches(Node.getTypeSourceInfo()->getTypeLoc(), Finder, Builder);
18721a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek}
18731a68afd5bbecd05a3bb22854954aa4e5448c4470Manuel Klimek
1874e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches if the matched type is represented by the given string.
1875e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
1876e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
187725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1878e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   class Y { public: void x(); };
1879e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   void z() { Y* y; y->x(); }
188025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
18812dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// callExpr(on(hasType(asString("class Y *"))))
1882e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches y->x()
1883e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(QualType, asString, std::string, Name) {
1884e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return Name == Node.getAsString();
1885e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
1886e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
18874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the matched type is a pointer type and the pointee type
18884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches the specified matcher.
18894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
18904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches y->x()
18912dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = callExpr(on(hasType(pointsTo(recordDecl(hasName("Y")))))))
189225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
18934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y { public: void x(); };
18944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void z() { Y *y; y->x(); }
189525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
18964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekAST_MATCHER_P(
1897e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    QualType, pointsTo, internal::Matcher<QualType>,
18984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    InnerMatcher) {
1899e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return (!Node.isNull() && Node->isPointerType() &&
19004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(Node->getPointeeType(), Finder, Builder));
19014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
19024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
19034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Overloaded to match the pointee type's declaration.
1904e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<QualType> pointsTo(
1905e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    const internal::Matcher<Decl> &InnerMatcher) {
1906415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return pointsTo(qualType(hasDeclaration(InnerMatcher)));
19074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
19084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
19094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the matched type is a reference type and the referenced
19104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// type matches the specified matcher.
19114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
19124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X &x and const X &y
19132dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = varDecl(hasType(references(recordDecl(hasName("X"))))))
191425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
19154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X {
19164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     void a(X b) {
19174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///       X &x = b;
19184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///       const X &y = b;
19194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
192025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1921e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(QualType, references, internal::Matcher<QualType>,
19224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek              InnerMatcher) {
1923e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return (!Node.isNull() && Node->isReferenceType() &&
19244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(Node->getPointeeType(), Finder, Builder));
19254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
19264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
19276a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \brief Matches QualTypes whose canonical type matches InnerMatcher.
19286a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///
19296a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// Given:
19306a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \code
19316a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   typedef int &int_ref;
19326a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   int a;
19336a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///   int_ref b = a;
19346a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \code
19356a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane///
19366a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \c varDecl(hasType(qualType(referenceType()))))) will not match the
19376a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// declaration of b but \c
19386a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
19396a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin VaneAST_MATCHER_P(QualType, hasCanonicalType, internal::Matcher<QualType>,
19406a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane              InnerMatcher) {
194154eeac9cb538e4fc4eecd81f2eda8f6fa727ca76Edwin Vane  if (Node.isNull())
194254eeac9cb538e4fc4eecd81f2eda8f6fa727ca76Edwin Vane    return false;
19436a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane  return InnerMatcher.matches(Node.getCanonicalType(), Finder, Builder);
19446a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane}
19456a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane
19464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Overloaded to match the referenced type's declaration.
1947e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<QualType> references(
1948e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    const internal::Matcher<Decl> &InnerMatcher) {
1949415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return references(qualType(hasDeclaration(InnerMatcher)));
19504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
19514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
1952e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXMemberCallExpr, onImplicitObjectArgument,
1953e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
1954f8c12146fa2153a6d97b7c92d27d2ece0cd26e79Dmitri Gribenko  const Expr *ExprNode = Node.getImplicitObjectArgument();
19554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (ExprNode != NULL &&
19564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*ExprNode, Finder, Builder));
19574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
19584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
19594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the expression's type either matches the specified
19604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matcher, or is a pointer to a type that matches the InnerMatcher.
19619f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimekinline internal::Matcher<CXXMemberCallExpr> thisPointerType(
1962e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    const internal::Matcher<QualType> &InnerMatcher) {
19634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return onImplicitObjectArgument(
19644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek      anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))));
19654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
19664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
19674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Overloaded to match the type's declaration.
19689f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimekinline internal::Matcher<CXXMemberCallExpr> thisPointerType(
1969e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    const internal::Matcher<Decl> &InnerMatcher) {
19704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return onImplicitObjectArgument(
19714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek      anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))));
19724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
19734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
19744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a DeclRefExpr that refers to a declaration that matches the
19754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// specified matcher.
19764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
19774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches x in if(x)
19782dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = declRefExpr(to(varDecl(hasName("x")))))
197925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
19804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   bool x;
19814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   if (x) {}
198225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
1983e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(DeclRefExpr, to, internal::Matcher<Decl>,
19844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek              InnerMatcher) {
1985e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Decl *DeclNode = Node.getDecl();
19864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (DeclNode != NULL &&
19874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*DeclNode, Finder, Builder));
19884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
19894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
1990e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches a \c DeclRefExpr that refers to a declaration through a
1991e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// specific using shadow declaration.
1992e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
1993e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// FIXME: This currently only works for functions. Fix.
1994e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
1995e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
199625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
1997e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   namespace a { void f() {} }
1998e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   using a::f;
1999e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   void g() {
2000e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///     f();     // Matches this ..
2001e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///     a::f();  // .. but not this.
2002e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   }
200325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
20042dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declRefExpr(throughUsingDeclaration(anything()))
2005e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches \c f()
2006e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(DeclRefExpr, throughUsingDecl,
200725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<UsingShadowDecl>, InnerMatcher) {
2008e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const NamedDecl *FoundDecl = Node.getFoundDecl();
2009cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  if (const UsingShadowDecl *UsingDecl = dyn_cast<UsingShadowDecl>(FoundDecl))
201025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    return InnerMatcher.matches(*UsingDecl, Finder, Builder);
2011e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return false;
2012e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
2013e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
2014425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// \brief Matches the Decl of a DeclStmt which has a single declaration.
2015425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///
2016425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// Given
201725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2018425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int a, b;
2019425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int c;
202025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
20212dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declStmt(hasSingleDecl(anything()))
2022425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   matches 'int c;' but not 'int a, b;'.
2023425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam PanzerAST_MATCHER_P(DeclStmt, hasSingleDecl, internal::Matcher<Decl>, InnerMatcher) {
2024425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  if (Node.isSingleDecl()) {
2025425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer    const Decl *FoundDecl = Node.getSingleDecl();
2026425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer    return InnerMatcher.matches(*FoundDecl, Finder, Builder);
2027425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  }
2028425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  return false;
2029425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer}
2030425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer
20314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a variable declaration that has an initializer expression
20324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// that matches the given matcher.
20334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
20342dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches x (matcher = varDecl(hasInitializer(callExpr())))
203525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
20364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   bool y() { return true; }
20374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   bool x = y();
203825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
20394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekAST_MATCHER_P(
2040e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    VarDecl, hasInitializer, internal::Matcher<Expr>,
20414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    InnerMatcher) {
2042e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Expr *Initializer = Node.getAnyInitializer();
20434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (Initializer != NULL &&
20444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*Initializer, Finder, Builder));
20454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
20464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
20474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Checks that a call expression or a constructor call expression has
20484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// a specific number of arguments (including absent default arguments).
20494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
20502dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
205125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
20524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void f(int x, int y);
20534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   f(0, 0);
205425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2055ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel BenzaquenAST_POLYMORPHIC_MATCHER_P(argumentCountIs, AST_POLYMORPHIC_SUPPORTED_TYPES_2(
2056ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                                               CallExpr, CXXConstructExpr),
2057ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                          unsigned, N) {
20584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return Node.getNumArgs() == N;
20594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
20604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
20614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the n'th argument of a call expression or a constructor
20624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// call expression.
20634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
20644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches y in x(y)
20652dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = callExpr(hasArgument(0, declRefExpr())))
206625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
20674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void x(int) { int y; x(y); }
206825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
20694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekAST_POLYMORPHIC_MATCHER_P2(
2070ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    hasArgument,
2071ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    AST_POLYMORPHIC_SUPPORTED_TYPES_2(CallExpr, CXXConstructExpr),
2072ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    unsigned, N, internal::Matcher<Expr>, InnerMatcher) {
20734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (N < Node.getNumArgs() &&
20744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(
20754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek              *Node.getArg(N)->IgnoreParenImpCasts(), Finder, Builder));
20764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
20774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
2078425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// \brief Matches declaration statements that contain a specific number of
2079425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// declarations.
2080425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///
2081425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// Example: Given
208225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2083425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int a, b;
2084425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int c;
2085425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int d = 2, e;
208625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2087425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// declCountIs(2)
2088425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2089425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam PanzerAST_MATCHER_P(DeclStmt, declCountIs, unsigned, N) {
2090217c484522926f9fc664ec3bfaf3cffe456244b0Benjamin Kramer  return std::distance(Node.decl_begin(), Node.decl_end()) == (ptrdiff_t)N;
2091425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer}
2092425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer
2093425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// \brief Matches the n'th declaration of a declaration statement.
2094425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///
2095425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// Note that this does not work for global declarations because the AST
2096425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// breaks up multiple-declaration DeclStmt's into multiple single-declaration
2097425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// DeclStmt's.
2098425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// Example: Given non-global declarations
209925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2100425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int a, b = 0;
2101425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int c;
2102425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   int d = 2, e;
210325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
21042dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declStmt(containsDeclaration(
21052dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///       0, varDecl(hasInitializer(anything()))))
2106425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   matches only 'int d = 2, e;', and
21072dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declStmt(containsDeclaration(1, varDecl()))
210825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2109425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   matches 'int a, b = 0' as well as 'int d = 2, e;'
2110425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer///   but 'int c;' is not matched.
211125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2112425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam PanzerAST_MATCHER_P2(DeclStmt, containsDeclaration, unsigned, N,
2113425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer               internal::Matcher<Decl>, InnerMatcher) {
2114425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  const unsigned NumDecls = std::distance(Node.decl_begin(), Node.decl_end());
2115425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  if (N >= NumDecls)
2116425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer    return false;
2117425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  DeclStmt::const_decl_iterator Iterator = Node.decl_begin();
2118425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  std::advance(Iterator, N);
2119425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer  return InnerMatcher.matches(**Iterator, Finder, Builder);
2120425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer}
2121425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer
21224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a constructor initializer.
21234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
21244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
212525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
21264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   struct Foo {
21274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     Foo() : foo_(1) { }
21284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     int foo_;
21294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
213025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
21312dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything()))))
2132e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   record matches Foo, hasAnyConstructorInitializer matches foo_(1)
2133e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXConstructorDecl, hasAnyConstructorInitializer,
2134e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<CXXCtorInitializer>, InnerMatcher) {
2135054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  return matchesFirstInPointerRange(InnerMatcher, Node.init_begin(),
2136054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek                                    Node.init_end(), Finder, Builder);
21374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
21384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
21394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the field declaration of a constructor initializer.
21404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
21414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
214225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
21434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   struct Foo {
21444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     Foo() : foo_(1) { }
21454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     int foo_;
21464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
214725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
21482dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
21494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     forField(hasName("foo_"))))))
21504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches Foo
21514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with forField matching foo_
2152e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXCtorInitializer, forField,
2153e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<FieldDecl>, InnerMatcher) {
2154e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const FieldDecl *NodeAsDecl = Node.getMember();
21554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (NodeAsDecl != NULL &&
21564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek      InnerMatcher.matches(*NodeAsDecl, Finder, Builder));
21574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
21584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
21594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the initializer expression of a constructor initializer.
21604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
21614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
216225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
21634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   struct Foo {
21644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     Foo() : foo_(1) { }
21654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     int foo_;
21664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
216725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
21682dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
21694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     withInitializer(integerLiteral(equals(1)))))))
21704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches Foo
21714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with withInitializer matching (1)
2172e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXCtorInitializer, withInitializer,
2173e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2174e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Expr* NodeAsExpr = Node.getInit();
21754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (NodeAsExpr != NULL &&
21764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek      InnerMatcher.matches(*NodeAsExpr, Finder, Builder));
21774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
21784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
21794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a contructor initializer if it is explicitly written in
21804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// code (as opposed to implicitly added by the compiler).
21814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
21824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
218325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
21844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   struct Foo {
21854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     Foo() { }
21864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     Foo(int) : foo_("A") { }
21874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     string foo_;
21884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
218925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
21902dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// constructorDecl(hasAnyConstructorInitializer(isWritten()))
21914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   will match Foo(int), but not Foo()
2192e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER(CXXCtorInitializer, isWritten) {
21934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return Node.isWritten();
21944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
21954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
21964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a constructor declaration that has been implicitly added
21974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// by the compiler (eg. implicit default/copy constructors).
2198e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER(CXXConstructorDecl, isImplicit) {
21994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return Node.isImplicit();
22004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
22014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
22024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches any argument of a call expression or a constructor call
22034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// expression.
22044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
22054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
220625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
22074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void x(int, int, int) { int y; x(1, y, 42); }
220825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
22092dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// callExpr(hasAnyArgument(declRefExpr()))
22104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches x(1, y, 42)
22114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with hasAnyArgument(...)
22124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matching y
2213054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek///
2214054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek/// FIXME: Currently this will ignore parentheses and implicit casts on
2215054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek/// the argument before applying the inner matcher. We'll want to remove
2216054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek/// this to allow for greater control by the user once \c ignoreImplicit()
2217054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek/// has been implemented.
2218ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel BenzaquenAST_POLYMORPHIC_MATCHER_P(hasAnyArgument, AST_POLYMORPHIC_SUPPORTED_TYPES_2(
2219ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                                              CallExpr, CXXConstructExpr),
2220ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                          internal::Matcher<Expr>, InnerMatcher) {
22214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  for (unsigned I = 0; I < Node.getNumArgs(); ++I) {
2222054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek    BoundNodesTreeBuilder Result(*Builder);
2223054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek    if (InnerMatcher.matches(*Node.getArg(I)->IgnoreParenImpCasts(), Finder,
2224054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek                             &Result)) {
2225054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek      *Builder = Result;
22264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek      return true;
22274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    }
22284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  }
22294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return false;
22304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
22314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
22324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the n'th parameter of a function declaration.
22334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
22344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
223525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
22364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X { void f(int x) {} };
223725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
22382dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// methodDecl(hasParameter(0, hasType(varDecl())))
22394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches f(int x) {}
22404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with hasParameter(...)
22414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matching int x
2242e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P2(FunctionDecl, hasParameter,
2243e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper               unsigned, N, internal::Matcher<ParmVarDecl>,
22444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek               InnerMatcher) {
22454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (N < Node.getNumParams() &&
22464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(
22474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek              *Node.getParamDecl(N), Finder, Builder));
22484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
22494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
22504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches any parameter of a function declaration.
22514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
22524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Does not match the 'this' parameter of a method.
22534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
22544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
225525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
22564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class X { void f(int x, int y, int z) {} };
225725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
22582dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// methodDecl(hasAnyParameter(hasName("y")))
22594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches f(int x, int y, int z) {}
22604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with hasAnyParameter(...)
22614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matching int y
2262e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(FunctionDecl, hasAnyParameter,
2263e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<ParmVarDecl>, InnerMatcher) {
2264054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  return matchesFirstInPointerRange(InnerMatcher, Node.param_begin(),
2265054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek                                    Node.param_end(), Finder, Builder);
22664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
22674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
226836e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// \brief Matches \c FunctionDecls that have a specific parameter count.
226936e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper///
227036e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// Given
227136e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// \code
227236e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper///   void f(int i) {}
227336e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper///   void g(int i, int j) {}
227436e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// \endcode
227536e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// functionDecl(parameterCountIs(2))
227636e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper///   matches g(int i, int j) {}
227736e29d6732814e958aea4b2f403cec63d7ed3116Daniel JasperAST_MATCHER_P(FunctionDecl, parameterCountIs, unsigned, N) {
227836e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper  return Node.getNumParams() == N;
227936e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper}
228036e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper
2281e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches the return type of a function declaration.
2282e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
2283e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given:
228425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2285e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   class X { int f() { return 1; } };
228625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
22872dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// methodDecl(returns(asString("int")))
2288e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches int f() { return 1; }
228925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekAST_MATCHER_P(FunctionDecl, returns,
229025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<QualType>, InnerMatcher) {
229125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek  return InnerMatcher.matches(Node.getResultType(), Finder, Builder);
2292e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
2293e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
22948cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper/// \brief Matches extern "C" function declarations.
22958cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper///
22968cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper/// Given:
229725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
22988cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper///   extern "C" void f() {}
22998cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper///   extern "C" { void g() {} }
23008cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper///   void h() {}
230125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
23022dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// functionDecl(isExternC())
23038cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper///   matches the declaration of f and g, but not the declaration h
23048cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel JasperAST_MATCHER(FunctionDecl, isExternC) {
23058cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper  return Node.isExternC();
23068cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper}
23078cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper
23086a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches the condition expression of an if statement, for loop,
23096a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// or conditional operator.
23104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
23114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
231225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
23134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   if (true) {}
231425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2315ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel BenzaquenAST_POLYMORPHIC_MATCHER_P(
2316ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    hasCondition, AST_POLYMORPHIC_SUPPORTED_TYPES_5(
2317ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                      IfStmt, ForStmt, WhileStmt, DoStmt, ConditionalOperator),
2318ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    internal::Matcher<Expr>, InnerMatcher) {
2319e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Expr *const Condition = Node.getCond();
23204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (Condition != NULL &&
23214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*Condition, Finder, Builder));
23224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
23234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
2324cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimeknamespace internal {
2325cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimekstruct NotEqualsBoundNodePredicate {
2326cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  bool operator()(const internal::BoundNodesMap &Nodes) const {
2327cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek    return Nodes.getNode(ID) != Node;
2328cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  }
2329cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  std::string ID;
2330cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  ast_type_traits::DynTypedNode Node;
2331cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek};
2332cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek} // namespace internal
2333cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek
2334cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// \brief Matches if a node equals a previously bound node.
2335cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek///
2336cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// Matches a node if it equals the node previously bound to \p ID.
2337cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek///
2338cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// Given
2339cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// \code
2340cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek///   class X { int a; int b; };
2341cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// \endcode
2342cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// recordDecl(
2343cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek///     has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2344cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek///     has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2345cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek///   matches the class \c X, as \c a and \c b have the same type.
2346cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek///
2347cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// Note that when multiple matches are involved via \c forEach* matchers,
2348cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// \c equalsBoundNodes acts as a filter.
2349cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// For example:
2350cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// compoundStmt(
2351cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek///     forEachDescendant(varDecl().bind("d")),
2352cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek///     forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2353cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// will trigger a match for each combination of variable declaration
2354cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek/// and reference to that variable declaration within a compound statement.
2355ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel BenzaquenAST_POLYMORPHIC_MATCHER_P(equalsBoundNode, AST_POLYMORPHIC_SUPPORTED_TYPES_4(
2356ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                                               Stmt, Decl, Type, QualType),
2357ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                          std::string, ID) {
2358cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  // FIXME: Figure out whether it makes sense to allow this
2359cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  // on any other node types.
2360cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  // For *Loc it probably does not make sense, as those seem
2361cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  // unique. For NestedNameSepcifier it might make sense, as
2362cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  // those also have pointer identity, but I'm not sure whether
2363cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  // they're ever reused.
2364cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  internal::NotEqualsBoundNodePredicate Predicate;
2365cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  Predicate.ID = ID;
2366cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  Predicate.Node = ast_type_traits::DynTypedNode::create(Node);
2367cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek  return Builder->removeBindings(Predicate);
2368cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek}
2369cf52ca6bb6dd76a1bd967bc422287fafafa1e45aManuel Klimek
23704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the condition variable statement in an if statement.
23714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
23724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
237325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
23744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   if (A* a = GetAPointer()) {}
237525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
23764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// hasConditionVariableStatment(...)
23774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches 'A* a = GetAPointer()'.
2378e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(IfStmt, hasConditionVariableStatement,
2379e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<DeclStmt>, InnerMatcher) {
2380e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const DeclStmt* const DeclarationStatement =
23814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    Node.getConditionVariableDeclStmt();
23824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return DeclarationStatement != NULL &&
23834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek         InnerMatcher.matches(*DeclarationStatement, Finder, Builder);
23844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
23854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
2386e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches the index expression of an array subscript expression.
2387e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
2388e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
238925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2390e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   int i[5];
2391e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   void f() { i[1] = 42; }
239225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2393e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// arraySubscriptExpression(hasIndex(integerLiteral()))
2394e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches \c i[1] with the \c integerLiteral() matching \c 1
2395e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ArraySubscriptExpr, hasIndex,
239625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<Expr>, InnerMatcher) {
2397e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  if (const Expr* Expression = Node.getIdx())
239825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    return InnerMatcher.matches(*Expression, Finder, Builder);
2399e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return false;
2400e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
2401e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
2402e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches the base expression of an array subscript expression.
2403e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
2404e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
240525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2406e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   int i[5];
2407e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   void f() { i[1] = 42; }
240825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
24092dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// arraySubscriptExpression(hasBase(implicitCastExpr(
24102dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     hasSourceExpression(declRefExpr()))))
24112dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///   matches \c i[1] with the \c declRefExpr() matching \c i
2412e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ArraySubscriptExpr, hasBase,
241325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<Expr>, InnerMatcher) {
2414e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  if (const Expr* Expression = Node.getBase())
241525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek    return InnerMatcher.matches(*Expression, Finder, Builder);
2416e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  return false;
2417e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
2418e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
24196a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches a 'for', 'while', or 'do while' statement that has
24206a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// a given body.
24214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
24224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
242325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
24244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   for (;;) {}
242525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
24262dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// hasBody(compoundStmt())
24274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches 'for (;;) {}'
24282dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// with compoundStmt()
24294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matching '{}'
2430ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel BenzaquenAST_POLYMORPHIC_MATCHER_P(
2431ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    hasBody, AST_POLYMORPHIC_SUPPORTED_TYPES_3(DoStmt, ForStmt, WhileStmt),
2432ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    internal::Matcher<Stmt>, InnerMatcher) {
2433e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Stmt *const Statement = Node.getBody();
24344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (Statement != NULL &&
24354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*Statement, Finder, Builder));
24364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
24374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
24384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches compound statements where at least one substatement matches
24394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// a given matcher.
24404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
24414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
244225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
24434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   { {}; 1+2; }
244425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
24452dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// hasAnySubstatement(compoundStmt())
24464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches '{ {}; 1+2; }'
24472dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// with compoundStmt()
24484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matching '{}'
2449e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CompoundStmt, hasAnySubstatement,
2450e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Stmt>, InnerMatcher) {
2451054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  return matchesFirstInPointerRange(InnerMatcher, Node.body_begin(),
2452054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek                                    Node.body_end(), Finder, Builder);
24534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
24544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
24554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Checks that a compound statement contains a specific number of
24564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// child statements.
24574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
24584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: Given
245925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
24604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   { for (;;) {} }
246125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
24622dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// compoundStmt(statementCountIs(0)))
24634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches '{}'
24644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   but does not match the outer compound statement.
2465e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CompoundStmt, statementCountIs, unsigned, N) {
24664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return Node.size() == N;
24674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
24684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
24694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches literals that are equal to the given value.
24704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
24714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches true (matcher = boolLiteral(equals(true)))
247225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
24734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   true
247425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2475297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek///
2476297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// Usable as: Matcher<CharacterLiteral>, Matcher<CXXBoolLiteral>,
2477297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek///            Matcher<FloatingLiteral>, Matcher<IntegerLiteral>
24784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename ValueT>
24794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinternal::PolymorphicMatcherWithParam1<internal::ValueEqualsMatcher, ValueT>
24804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekequals(const ValueT &Value) {
24814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return internal::PolymorphicMatcherWithParam1<
24824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    internal::ValueEqualsMatcher,
24834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek    ValueT>(Value);
24844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
24854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
24864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the operator Name of operator expressions (binary or
24874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// unary).
24884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
24894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
249025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
24914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   !(a || b)
249225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2493ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel BenzaquenAST_POLYMORPHIC_MATCHER_P(hasOperatorName, AST_POLYMORPHIC_SUPPORTED_TYPES_2(
2494ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                                               BinaryOperator, UnaryOperator),
2495ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                          std::string, Name) {
24964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return Name == Node.getOpcodeStr(Node.getOpcode());
24974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
24984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
24994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the left hand side of binary operator expressions.
25004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
25014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a (matcher = binaryOperator(hasLHS()))
250225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
25034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   a || b
250425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2505e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(BinaryOperator, hasLHS,
2506e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2507e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Expr *LeftHandSide = Node.getLHS();
25084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (LeftHandSide != NULL &&
25094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*LeftHandSide, Finder, Builder));
25104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
25114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
25124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the right hand side of binary operator expressions.
25134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
25144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches b (matcher = binaryOperator(hasRHS()))
251525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
25164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   a || b
251725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2518e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(BinaryOperator, hasRHS,
2519e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2520e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Expr *RightHandSide = Node.getRHS();
25214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (RightHandSide != NULL &&
25224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*RightHandSide, Finder, Builder));
25234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
25244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
25254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if either the left hand side or the right hand side of a
25264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// binary operator matches.
2527e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<BinaryOperator> hasEitherOperand(
2528e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper    const internal::Matcher<Expr> &InnerMatcher) {
25294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return anyOf(hasLHS(InnerMatcher), hasRHS(InnerMatcher));
25304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
25314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
25324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the operand of a unary operator matches.
25334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
25349158a5624154bc43bbbf059c07a2f7b2cd45c1a1Alexander Kornienko/// Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true))))
253525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
25364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   !true
253725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2538e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UnaryOperator, hasUnaryOperand,
2539e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2540e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Expr * const Operand = Node.getSubExpr();
25414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (Operand != NULL &&
25424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*Operand, Finder, Builder));
25434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
25444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
2545715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek/// \brief Matches if the cast's source expression matches the given matcher.
25464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
25474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: matches "a string" (matcher =
25482dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///                                  hasSourceExpression(constructExpr()))
254925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
25504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class URL { URL(string); };
25514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// URL url = "a string";
2552715c9568ee5d75f25dab98229c87bcec880daf5dManuel KlimekAST_MATCHER_P(CastExpr, hasSourceExpression,
2553e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2554e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const Expr* const SubExpression = Node.getSubExpr();
25554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (SubExpression != NULL &&
25564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*SubExpression, Finder, Builder));
25574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
25584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
25594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches casts whose destination type matches a given matcher.
25604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
25614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// (Note: Clang's AST refers to other conversions as "casts" too, and calls
25624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// actual casts "explicit" casts.)
2563e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ExplicitCastExpr, hasDestinationType,
2564e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<QualType>, InnerMatcher) {
2565e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const QualType NodeType = Node.getTypeAsWritten();
25664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return InnerMatcher.matches(NodeType, Finder, Builder);
25674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
25684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
25694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches implicit casts whose destination type matches a given
25704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matcher.
25714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
25724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: Unit test this matcher
2573e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ImplicitCastExpr, hasImplicitDestinationType,
2574e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<QualType>, InnerMatcher) {
25754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return InnerMatcher.matches(Node.getType(), Finder, Builder);
25764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
25774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
25784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the true branch expression of a conditional operator.
25794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
25804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a
258125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
25824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   condition ? a : b
258325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2584e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ConditionalOperator, hasTrueExpression,
2585e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2586e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Expr *Expression = Node.getTrueExpr();
25874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (Expression != NULL &&
25884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*Expression, Finder, Builder));
25894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
25904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
25914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the false branch expression of a conditional operator.
25924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
25934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches b
259425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
25954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   condition ? a : b
259625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2597e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ConditionalOperator, hasFalseExpression,
2598e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
2599e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  Expr *Expression = Node.getFalseExpr();
26004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (Expression != NULL &&
26014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*Expression, Finder, Builder));
26024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
26034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
26044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if a declaration has a body attached.
26054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
26064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches A, va, fa
260725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
26084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class A {};
26094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class B;  // Doesn't match, as it has no body.
26104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   int va;
26114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   extern int vb;  // Doesn't match, as it doesn't define the variable.
26124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void fa() {}
26134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void fb();  // Doesn't match, as it has no body.
261425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2615297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek///
2616297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// Usable as: Matcher<TagDecl>, Matcher<VarDecl>, Matcher<FunctionDecl>
2617ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel BenzaquenAST_POLYMORPHIC_MATCHER(isDefinition, AST_POLYMORPHIC_SUPPORTED_TYPES_3(
2618ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen                                          TagDecl, VarDecl, FunctionDecl)) {
2619415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return Node.isThisDeclarationADefinition();
26204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
26214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
26224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the class declaration that the given method declaration
26234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// belongs to.
26244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
26254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: Generalize this for other kinds of declarations.
26264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: What other kind of declarations would we need to generalize
26274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// this to?
26284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
26294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches A() in the last line
26302dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper///     (matcher = constructExpr(hasDeclaration(methodDecl(
26314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///         ofClass(hasName("A"))))))
263225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
26334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class A {
26344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///    public:
26354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     A();
26364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
26374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   A a = A();
263825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2639e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXMethodDecl, ofClass,
2640e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<CXXRecordDecl>, InnerMatcher) {
2641e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper  const CXXRecordDecl *Parent = Node.getParent();
26424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return (Parent != NULL &&
26434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek          InnerMatcher.matches(*Parent, Finder, Builder));
26444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
26454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
26465771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \brief Matches if the given method declaration is virtual.
26475771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///
26485771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// Given
26495771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \code
26505771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   class A {
26515771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///    public:
26525771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///     virtual void x();
26535771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   };
26545771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \endcode
26555771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   matches A::x
26565771a2f0830228ac50e3473740e24d9dca67b54fEdwin VaneAST_MATCHER(CXXMethodDecl, isVirtual) {
26575771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane  return Node.isVirtual();
26585771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane}
26595771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane
266032a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// \brief Matches if the given method declaration is const.
266132a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane///
266232a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// Given
266332a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// \code
266432a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// struct A {
266532a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane///   void foo() const;
266632a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane///   void bar();
266732a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// };
266832a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// \endcode
266932a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane///
267032a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// methodDecl(isConst()) matches A::foo() but not A::bar()
267132a6ebc63900b85780328c337787bb7adad2bcabEdwin VaneAST_MATCHER(CXXMethodDecl, isConst) {
267232a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane  return Node.isConst();
267332a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane}
267432a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane
26755771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \brief Matches if the given method declaration overrides another method.
26765771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///
26775771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// Given
26785771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \code
26795771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   class A {
26805771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///    public:
26815771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///     virtual void x();
26825771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   };
26835771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   class B : public A {
26845771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///    public:
26855771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///     virtual void x();
26865771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   };
26875771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \endcode
26885771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane///   matches B::x
26895771a2f0830228ac50e3473740e24d9dca67b54fEdwin VaneAST_MATCHER(CXXMethodDecl, isOverride) {
26905771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane  return Node.size_overridden_methods() > 0;
26915771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane}
26925771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane
26934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches member expressions that are called with '->' as opposed
26944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// to '.'.
26954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
26964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Member calls on the implicit this pointer match as called with '->'.
26974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
26984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
269925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
27004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   class Y {
27014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
27024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     int a;
27034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///     static int b;
27044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   };
270525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
27062dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// memberExpr(isArrow())
27074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches this->x, x, y.x, a, this->b
2708415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_MATCHER(MemberExpr, isArrow) {
2709415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return Node.isArrow();
27104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
27114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
27126a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches QualType nodes that are of integer type.
27136a12449ec8862211856447d3df4c082a346339f2Daniel Jasper///
27146a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// Given
271525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
27166a12449ec8862211856447d3df4c082a346339f2Daniel Jasper///   void a(int);
27176a12449ec8862211856447d3df4c082a346339f2Daniel Jasper///   void b(long);
27186a12449ec8862211856447d3df4c082a346339f2Daniel Jasper///   void c(double);
271925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
27202dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// functionDecl(hasAnyParameter(hasType(isInteger())))
27216a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// matches "a(int)", "b(long)", but not "c(double)".
27226a12449ec8862211856447d3df4c082a346339f2Daniel JasperAST_MATCHER(QualType, isInteger) {
27236a12449ec8862211856447d3df4c082a346339f2Daniel Jasper    return Node->isIntegerType();
27246a12449ec8862211856447d3df4c082a346339f2Daniel Jasper}
27256a12449ec8862211856447d3df4c082a346339f2Daniel Jasper
2726e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches QualType nodes that are const-qualified, i.e., that
27274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// include "top-level" const.
27284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
27294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
273025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
27314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void a(int);
27324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void b(int const);
27334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void c(const int);
27344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void d(const int*);
27354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void e(int const) {};
273625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
27372dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// functionDecl(hasAnyParameter(hasType(isConstQualified())))
27384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches "void b(int const)", "void c(const int)" and
27394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   "void e(int const) {}". It does not match d as there
27404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   is no top-level const on the parameter type "const int *".
2741415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_MATCHER(QualType, isConstQualified) {
2742415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return Node.isConstQualified();
27434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
27444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
27457b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// \brief Matches QualType nodes that have local CV-qualifiers attached to
27467b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// the node, not hidden within a typedef.
27477b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane///
27487b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// Given
27497b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// \code
27507b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane///   typedef const int const_int;
27517b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane///   const_int i;
27527b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane///   int *const j;
27537b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane///   int *volatile k;
27547b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane///   int m;
27557b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// \endcode
27567b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// \c varDecl(hasType(hasLocalQualifiers())) matches only \c j and \c k.
27577b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// \c i is const-qualified but the qualifier is not local.
27587b69cd09440976d6b93a0db661a770b2337be8d2Edwin VaneAST_MATCHER(QualType, hasLocalQualifiers) {
27597b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane  return Node.hasLocalQualifiers();
27607b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane}
27617b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane
27624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a member expression where the member is matched by a
27634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// given matcher.
27644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
27654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
276625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
27674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   struct { int first, second; } first, second;
27684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   int i(second.first);
27694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   int j(first.second);
277025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
27712dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// memberExpr(member(hasName("first")))
27724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches second.first
27734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   but not first.second (because the member name there is "second").
2774e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(MemberExpr, member,
2775e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<ValueDecl>, InnerMatcher) {
27764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return InnerMatcher.matches(*Node.getMemberDecl(), Finder, Builder);
27774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
27784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
27794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a member expression where the object expression is
27804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matched by a given matcher.
27814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
27824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
278325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
27844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   struct X { int m; };
27854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   void f(X x) { x.m; m; }
278625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
27872dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))))
27884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches "x.m" and "m"
27894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with hasObjectExpression(...)
27904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matching "x" and the implicit object expression of "m" which has type X*.
2791e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(MemberExpr, hasObjectExpression,
2792e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
27934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek  return InnerMatcher.matches(*Node.getBase(), Finder, Builder);
27944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
27954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
2796e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches any using shadow declaration.
2797e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
2798e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
279925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2800e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   namespace X { void b(); }
2801e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   using X::b;
280225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
2803e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
2804e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches \code using X::b \endcode
2805e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UsingDecl, hasAnyUsingShadowDecl,
280625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<UsingShadowDecl>, InnerMatcher) {
2807054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  return matchesFirstInPointerRange(InnerMatcher, Node.shadow_begin(),
2808054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek                                    Node.shadow_end(), Finder, Builder);
2809e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
2810e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
2811e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches a using shadow declaration where the target declaration is
2812e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matched by the given matcher.
2813e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///
2814e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given
281525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
2816e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   namespace X { int a; void b(); }
2817e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   using X::a;
2818e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   using X::b;
281925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
28202dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
2821e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   matches \code using X::b \endcode
2822e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper///   but not \code using X::a \endcode
2823e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UsingShadowDecl, hasTargetDecl,
282425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek              internal::Matcher<NamedDecl>, InnerMatcher) {
282525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek  return InnerMatcher.matches(*Node.getTargetDecl(), Finder, Builder);
2826e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper}
2827e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper
28284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches template instantiations of function, class, or static
28294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// member variable template instantiations.
28304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
28314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given
283225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
28334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   template <typename T> class X {}; class A {}; X<A> x;
283425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
28354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// or
283625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
28374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   template <typename T> class X {}; class A {}; template class X<A>;
283825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
28392dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(hasName("::X"), isTemplateInstantiation())
28404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   matches the template instantiation of X<A>.
28414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///
28424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// But given
284325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
284425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///   template <typename T>  class X {}; class A {};
28454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   template <> class X<A> {}; X<A> x;
284625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
28472dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(hasName("::X"), isTemplateInstantiation())
28484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek///   does not match, as X<A> is an explicit template specialization.
2849297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek///
2850297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// Usable as: Matcher<FunctionDecl>, Matcher<VarDecl>, Matcher<CXXRecordDecl>
2851ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel BenzaquenAST_POLYMORPHIC_MATCHER(
2852ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    isTemplateInstantiation,
2853ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    AST_POLYMORPHIC_SUPPORTED_TYPES_3(FunctionDecl, VarDecl, CXXRecordDecl)) {
2854415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return (Node.getTemplateSpecializationKind() == TSK_ImplicitInstantiation ||
2855415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek          Node.getTemplateSpecializationKind() ==
2856415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek          TSK_ExplicitInstantiationDefinition);
28574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek}
28584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
28598456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// \brief Matches explicit template specializations of function, class, or
28608456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// static member variable template instantiations.
28618456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko///
28628456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// Given
286325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code
28648456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko///   template<typename T> void A(T t) { }
28658456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko///   template<> void A(int N) { }
286625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode
28672dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// functionDecl(isExplicitTemplateSpecialization())
28688456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko///   matches the specialization A<int>().
286925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek///
287025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Matcher<FunctionDecl>, Matcher<VarDecl>, Matcher<CXXRecordDecl>
2871ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel BenzaquenAST_POLYMORPHIC_MATCHER(
2872ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    isExplicitTemplateSpecialization,
2873ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    AST_POLYMORPHIC_SUPPORTED_TYPES_3(FunctionDecl, VarDecl, CXXRecordDecl)) {
2874415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return (Node.getTemplateSpecializationKind() == TSK_ExplicitSpecialization);
28758456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko}
28768456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko
2877ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches \c TypeLocs for which the given inner
2878ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// QualType-matcher matches.
2879ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasperinline internal::BindableMatcher<TypeLoc> loc(
2880ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper    const internal::Matcher<QualType> &InnerMatcher) {
2881ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper  return internal::BindableMatcher<TypeLoc>(
2882ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper      new internal::TypeLocTypeMatcher(InnerMatcher));
2883ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper}
2884ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2885ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches builtin Types.
2886ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2887ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2888ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2889ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   struct A {};
2890ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   A a;
2891ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int b;
2892ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   float c;
2893ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   bool d;
2894ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2895ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// builtinType()
2896ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int b", "float c" and "bool d"
2897ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(BuiltinType, builtinType);
2898ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2899ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches all kinds of arrays.
2900ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2901ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2902ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2903ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int a[] = { 2, 3 };
2904ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int b[4];
2905ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   void f() { int c[a[0]]; }
2906ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2907ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// arrayType()
2908ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int a[]", "int b[4]" and "int c[a[0]]";
2909ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(ArrayType, arrayType);
2910ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2911ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C99 complex types.
2912ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2913ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2914ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2915ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   _Complex float f;
2916ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2917ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// complexType()
2918ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "_Complex float f"
2919ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(ComplexType, complexType);
2920ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2921ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches arrays and C99 complex types that have a specific element
2922ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// type.
2923ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2924ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2925ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2926ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   struct A {};
2927ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   A a[7];
2928ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int b[7];
2929ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2930ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// arrayType(hasElementType(builtinType()))
2931ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int b[7]"
2932ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2933ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Usable as: Matcher<ArrayType>, Matcher<ComplexType>
29343f84bb341bfb1312842b09db71d76bc3898ba247Samuel BenzaquenAST_TYPELOC_TRAVERSE_MATCHER(
29353f84bb341bfb1312842b09db71d76bc3898ba247Samuel Benzaquen    hasElementType, getElement,
29363f84bb341bfb1312842b09db71d76bc3898ba247Samuel Benzaquen    AST_POLYMORPHIC_SUPPORTED_TYPES_2(ArrayType, ComplexType));
2937ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2938ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C arrays with a specified constant size.
2939ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2940ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2941ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2942ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   void() {
2943ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     int a[2];
2944ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     int b[] = { 2, 3 };
2945ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     int c[b[0]];
2946ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   }
2947ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2948ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// constantArrayType()
2949ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int a[2]"
2950ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(ConstantArrayType, constantArrayType);
2951ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2952ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches \c ConstantArrayType nodes that have the specified size.
2953ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2954ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2955ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2956ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int a[42];
2957ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int b[2 * 21];
2958ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int c[41], d[43];
2959ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2960ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// constantArrayType(hasSize(42))
2961ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int a[42]" and "int b[2 * 21]"
2962ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_MATCHER_P(ConstantArrayType, hasSize, unsigned, N) {
2963ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper  return Node.getSize() == N;
2964ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper}
2965ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2966ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C++ arrays whose size is a value-dependent expression.
2967ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2968ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2969ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2970ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   template<typename T, int Size>
2971ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   class array {
2972ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     T data[Size];
2973ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   };
2974ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2975ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// dependentSizedArrayType
2976ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "T data[Size]"
2977ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(DependentSizedArrayType, dependentSizedArrayType);
2978ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2979ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C arrays with unspecified size.
2980ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2981ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2982ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2983ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int a[] = { 2, 3 };
2984ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int b[42];
2985ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   void f(int c[]) { int d[a[0]]; };
2986ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
2987ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// incompleteArrayType()
2988ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int a[]" and "int c[]"
2989ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(IncompleteArrayType, incompleteArrayType);
2990ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
2991ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C arrays with a specified size that is not an
2992ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// integer-constant-expression.
2993ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
2994ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
2995ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
2996ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   void f() {
2997ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     int a[] = { 2, 3 }
2998ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     int b[42];
2999ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     int c[a[0]];
3000ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3001ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// variableArrayType()
3002ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int c[a[0]]"
3003ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(VariableArrayType, variableArrayType);
3004ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3005ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches \c VariableArrayType nodes that have a specific size
3006ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// expression.
3007ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3008ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3009ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3010ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   void f(int b) {
3011ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///     int a[b];
3012ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   }
3013ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3014ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
3015ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   varDecl(hasName("b")))))))
3016ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int a[b]"
3017ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_MATCHER_P(VariableArrayType, hasSizeExpr,
3018ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper              internal::Matcher<Expr>, InnerMatcher) {
3019ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper  return InnerMatcher.matches(*Node.getSizeExpr(), Finder, Builder);
3020ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper}
3021ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3022ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches atomic types.
3023ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3024ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3025ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3026ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   _Atomic(int) i;
3027ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3028ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// atomicType()
3029ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "_Atomic(int) i"
3030ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(AtomicType, atomicType);
3031ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3032ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches atomic types with a specific value type.
3033ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3034ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3035ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3036ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   _Atomic(int) i;
3037ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   _Atomic(float) f;
3038ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3039ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// atomicType(hasValueType(isInteger()))
3040ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///  matches "_Atomic(int) i"
3041ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3042ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Usable as: Matcher<AtomicType>
30433f84bb341bfb1312842b09db71d76bc3898ba247Samuel BenzaquenAST_TYPELOC_TRAVERSE_MATCHER(hasValueType, getValue,
30443f84bb341bfb1312842b09db71d76bc3898ba247Samuel Benzaquen                             AST_POLYMORPHIC_SUPPORTED_TYPES_1(AtomicType));
3045ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3046ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches types nodes representing C++11 auto types.
3047ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3048ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given:
3049ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3050ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   auto n = 4;
3051ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int v[] = { 2, 3 }
3052ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   for (auto i : v) { }
3053ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3054ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// autoType()
3055ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "auto n" and "auto i"
3056ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(AutoType, autoType);
3057ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3058ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches \c AutoType nodes where the deduced type is a specific type.
3059ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3060ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Note: There is no \c TypeLoc for the deduced type and thus no
3061ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \c getDeducedLoc() matcher.
3062ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3063ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3064ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3065ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   auto a = 1;
3066ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   auto b = 2.0;
3067ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3068ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// autoType(hasDeducedType(isInteger()))
3069ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "auto a"
3070ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3071ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Usable as: Matcher<AutoType>
30723f84bb341bfb1312842b09db71d76bc3898ba247Samuel BenzaquenAST_TYPE_TRAVERSE_MATCHER(hasDeducedType, getDeducedType,
30733f84bb341bfb1312842b09db71d76bc3898ba247Samuel Benzaquen                          AST_POLYMORPHIC_SUPPORTED_TYPES_1(AutoType));
3074ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3075a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \brief Matches \c FunctionType nodes.
3076a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper///
3077a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// Given
3078a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \code
3079a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper///   int (*f)(int);
3080a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper///   void g();
3081a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \endcode
3082a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// functionType()
3083a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper///   matches "int (*f)(int)" and the type of "g".
3084a267cf6f87dc695143d65fc61ec1744564f55932Daniel JasperAST_TYPE_MATCHER(FunctionType, functionType);
3085a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper
308688be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \brief Matches \c ParenType nodes.
308788be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///
308888be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// Given
308988be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \code
309088be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///   int (*ptr_to_array)[4];
309188be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///   int *array_of_ptrs[4];
309288be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \endcode
309388be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///
309488be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \c varDecl(hasType(pointsTo(parenType()))) matches \c ptr_to_array but not
309588be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \c array_of_ptrs.
309688be2fdec7a1375bc729a6499629532e7872f11aEdwin VaneAST_TYPE_MATCHER(ParenType, parenType);
309788be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane
309888be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \brief Matches \c ParenType nodes where the inner type is a specific type.
309988be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///
310088be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// Given
310188be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \code
310288be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///   int (*ptr_to_array)[4];
310388be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///   int (*ptr_to_func)(int);
310488be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \endcode
310588be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///
310688be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \c varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
310788be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \c ptr_to_func but not \c ptr_to_array.
310888be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane///
310988be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// Usable as: Matcher<ParenType>
31103f84bb341bfb1312842b09db71d76bc3898ba247Samuel BenzaquenAST_TYPE_TRAVERSE_MATCHER(innerType, getInnerType,
31113f84bb341bfb1312842b09db71d76bc3898ba247Samuel Benzaquen                          AST_POLYMORPHIC_SUPPORTED_TYPES_1(ParenType));
311288be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane
3113ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches block pointer types, i.e. types syntactically represented as
3114ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// "void (^)(int)".
3115ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3116ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// The \c pointee is always required to be a \c FunctionType.
3117ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(BlockPointerType, blockPointerType);
3118ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3119ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches member pointer types.
3120ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3121ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3122ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   struct A { int i; }
3123ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   A::* ptr = A::i;
3124ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3125ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// memberPointerType()
3126ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "A::* ptr"
3127ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(MemberPointerType, memberPointerType);
3128ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3129ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches pointer types.
3130ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3131ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3132ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3133ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int *a;
3134ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int &b = *a;
3135ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int c = 5;
3136ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3137ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// pointerType()
3138ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int *a"
3139ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(PointerType, pointerType);
3140ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3141f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \brief Matches both lvalue and rvalue reference types.
3142ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3143ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3144ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3145ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int *a;
3146ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int &b = *a;
3147f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int &&c = 1;
3148f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &d = b;
3149f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &&e = c;
3150f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &&f = 2;
3151f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int g = 5;
3152ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3153f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///
3154f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \c referenceType() matches the types of \c b, \c c, \c d, \c e, and \c f.
3155ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(ReferenceType, referenceType);
3156ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3157f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \brief Matches lvalue reference types.
3158f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///
3159f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// Given:
3160f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \code
3161f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int *a;
3162f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int &b = *a;
3163f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int &&c = 1;
3164f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &d = b;
3165f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &&e = c;
3166f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &&f = 2;
3167f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int g = 5;
3168f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \endcode
3169f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///
3170f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \c lValueReferenceType() matches the types of \c b, \c d, and \c e. \c e is
3171f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// matched since the type is deduced as int& by reference collapsing rules.
3172f4b48042724d2253d0426cadcb93e24eeb47e264Edwin VaneAST_TYPE_MATCHER(LValueReferenceType, lValueReferenceType);
3173f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane
3174f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \brief Matches rvalue reference types.
3175f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///
3176f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// Given:
3177f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \code
3178f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int *a;
3179f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int &b = *a;
3180f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int &&c = 1;
3181f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &d = b;
3182f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &&e = c;
3183f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   auto &&f = 2;
3184f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///   int g = 5;
3185f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \endcode
3186f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane///
3187f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \c rValueReferenceType() matches the types of \c c and \c f. \c e is not
3188f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// matched as it is deduced to int& by reference collapsing rules.
3189f4b48042724d2253d0426cadcb93e24eeb47e264Edwin VaneAST_TYPE_MATCHER(RValueReferenceType, rValueReferenceType);
3190f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane
3191ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Narrows PointerType (and similar) matchers to those where the
3192ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \c pointee matches a given matcher.
3193ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3194ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3195ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3196ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int *a;
3197ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   int const *b;
3198ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   float const *f;
3199ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3200ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// pointerType(pointee(isConstQualified(), isInteger()))
3201ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "int const *b"
3202ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3203ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Usable as: Matcher<BlockPointerType>, Matcher<MemberPointerType>,
3204ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   Matcher<PointerType>, Matcher<ReferenceType>
32053f84bb341bfb1312842b09db71d76bc3898ba247Samuel BenzaquenAST_TYPELOC_TRAVERSE_MATCHER(
32063f84bb341bfb1312842b09db71d76bc3898ba247Samuel Benzaquen    pointee, getPointee,
32073f84bb341bfb1312842b09db71d76bc3898ba247Samuel Benzaquen    AST_POLYMORPHIC_SUPPORTED_TYPES_4(BlockPointerType, MemberPointerType,
32083f84bb341bfb1312842b09db71d76bc3898ba247Samuel Benzaquen                                      PointerType, ReferenceType));
3209ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3210ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches typedef types.
3211ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3212ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3213ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3214ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   typedef int X;
3215ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3216ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// typedefType()
3217ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "typedef int X"
3218ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(TypedefType, typedefType);
3219ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
32203abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// \brief Matches template specialization types.
32213abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///
32223abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// Given
32233abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// \code
32243abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///   template <typename T>
32253abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///   class C { };
32263abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///
32273abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///   template class C<int>;  // A
32283abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///   C<char> var;            // B
32293abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// \code
32303abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane///
32313abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// \c templateSpecializationType() matches the type of the explicit
32323abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// instantiation in \c A and the type of the variable declaration in \c B.
32333abf77872ca6c520903f9174cf6cd89a50df2714Edwin VaneAST_TYPE_MATCHER(TemplateSpecializationType, templateSpecializationType);
32343abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane
32352d77634e839880704d51656bebd1d2daff661d4eEnea Zaffanella/// \brief Matches types nodes representing unary type transformations.
32362d77634e839880704d51656bebd1d2daff661d4eEnea Zaffanella///
32372d77634e839880704d51656bebd1d2daff661d4eEnea Zaffanella/// Given:
32382d77634e839880704d51656bebd1d2daff661d4eEnea Zaffanella/// \code
32392d77634e839880704d51656bebd1d2daff661d4eEnea Zaffanella///   typedef __underlying_type(T) type;
32402d77634e839880704d51656bebd1d2daff661d4eEnea Zaffanella/// \endcode
32412d77634e839880704d51656bebd1d2daff661d4eEnea Zaffanella/// unaryTransformType()
32422d77634e839880704d51656bebd1d2daff661d4eEnea Zaffanella///   matches "__underlying_type(T)"
32432d77634e839880704d51656bebd1d2daff661d4eEnea ZaffanellaAST_TYPE_MATCHER(UnaryTransformType, unaryTransformType);
32442d77634e839880704d51656bebd1d2daff661d4eEnea Zaffanella
3245742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \brief Matches record types (e.g. structs, classes).
3246742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3247742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Given
3248742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3249742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   class C {};
3250742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   struct S {};
3251742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3252742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   C c;
3253742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   S s;
3254742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3255742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3256742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c recordType() matches the type of the variable declarations of both \c c
3257742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// and \c s.
3258742d9e77e32f014194679575c97c6bb4fd0998c4Edwin VaneAST_TYPE_MATCHER(RecordType, recordType);
3259742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane
3260742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \brief Matches types specified with an elaborated type keyword or with a
3261742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// qualified name.
3262742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3263742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Given
3264742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3265742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   namespace N {
3266742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     namespace M {
3267742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///       class D {};
3268742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     }
3269742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   }
3270742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   class C {};
3271742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3272742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   class C c;
3273742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   N::M::D d;
3274742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3275742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3276742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c elaboratedType() matches the type of the variable declarations of both
3277742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c c and \c d.
3278742d9e77e32f014194679575c97c6bb4fd0998c4Edwin VaneAST_TYPE_MATCHER(ElaboratedType, elaboratedType);
3279742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane
3280742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \brief Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
3281aec89ac22e1876bb1cfff9062c882a622bc84510Edwin Vane/// matches \c InnerMatcher if the qualifier exists.
3282742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3283742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Given
3284742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3285742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   namespace N {
3286742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     namespace M {
3287742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///       class D {};
3288742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     }
3289742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   }
3290742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   N::M::D d;
3291742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3292742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3293742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
3294742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// matches the type of the variable declaration of \c d.
3295742d9e77e32f014194679575c97c6bb4fd0998c4Edwin VaneAST_MATCHER_P(ElaboratedType, hasQualifier,
3296742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane              internal::Matcher<NestedNameSpecifier>, InnerMatcher) {
3297aec89ac22e1876bb1cfff9062c882a622bc84510Edwin Vane  if (const NestedNameSpecifier *Qualifier = Node.getQualifier())
3298aec89ac22e1876bb1cfff9062c882a622bc84510Edwin Vane    return InnerMatcher.matches(*Qualifier, Finder, Builder);
3299aec89ac22e1876bb1cfff9062c882a622bc84510Edwin Vane
3300aec89ac22e1876bb1cfff9062c882a622bc84510Edwin Vane  return false;
3301742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane}
3302742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane
3303742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \brief Matches ElaboratedTypes whose named type matches \c InnerMatcher.
3304742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3305742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Given
3306742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3307742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   namespace N {
3308742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     namespace M {
3309742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///       class D {};
3310742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     }
3311742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   }
3312742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   N::M::D d;
3313742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3314742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3315742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c elaboratedType(namesType(recordType(
3316742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
3317742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// declaration of \c d.
3318742d9e77e32f014194679575c97c6bb4fd0998c4Edwin VaneAST_MATCHER_P(ElaboratedType, namesType, internal::Matcher<QualType>,
3319742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane              InnerMatcher) {
3320742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane  return InnerMatcher.matches(Node.getNamedType(), Finder, Builder);
3321742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane}
3322742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane
3323742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \brief Matches declarations whose declaration context, interpreted as a
3324742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Decl, matches \c InnerMatcher.
3325742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3326742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Given
3327742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3328742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   namespace N {
3329742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     namespace M {
3330742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///       class D {};
3331742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///     }
3332742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///   }
3333742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code
3334742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane///
3335742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c recordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
3336742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// declaration of \c class \c D.
3337742d9e77e32f014194679575c97c6bb4fd0998c4Edwin VaneAST_MATCHER_P(Decl, hasDeclContext, internal::Matcher<Decl>, InnerMatcher) {
3338742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane  return InnerMatcher.matches(*Decl::castFromDeclContext(Node.getDeclContext()),
3339742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane                              Finder, Builder);
3340742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane}
3341742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane
3342a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Matches nested name specifiers.
3343a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///
3344a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// Given
3345a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \code
3346a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   namespace ns {
3347a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///     struct A { static void f(); };
3348a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///     void A::f() {}
3349a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///     void g() { A::f(); }
3350a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   }
3351a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   ns::A a;
3352a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \endcode
3353a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifier()
3354a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   matches "ns::" and both "A::"
3355a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasperconst internal::VariadicAllOfMatcher<NestedNameSpecifier> nestedNameSpecifier;
3356a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper
3357a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Same as \c nestedNameSpecifier but matches \c NestedNameSpecifierLoc.
3358a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasperconst internal::VariadicAllOfMatcher<
3359a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper  NestedNameSpecifierLoc> nestedNameSpecifierLoc;
3360a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper
3361a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Matches \c NestedNameSpecifierLocs for which the given inner
3362a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// NestedNameSpecifier-matcher matches.
3363a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasperinline internal::BindableMatcher<NestedNameSpecifierLoc> loc(
3364a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper    const internal::Matcher<NestedNameSpecifier> &InnerMatcher) {
3365a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper  return internal::BindableMatcher<NestedNameSpecifierLoc>(
3366a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper      new internal::LocMatcher<NestedNameSpecifierLoc, NestedNameSpecifier>(
3367a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper          InnerMatcher));
3368a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper}
3369a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper
3370a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Matches nested name specifiers that specify a type matching the
3371a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// given \c QualType matcher without qualifiers.
3372a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///
3373a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// Given
3374a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \code
3375a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   struct A { struct B { struct C {}; }; };
3376a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   A::B::C c;
3377a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \endcode
3378a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A")))))
3379a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   matches "A::"
3380a7564433191601cb8851196b8dde39392c9c05eeDaniel JasperAST_MATCHER_P(NestedNameSpecifier, specifiesType,
3381a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper              internal::Matcher<QualType>, InnerMatcher) {
3382a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper  if (Node.getAsType() == NULL)
3383a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper    return false;
3384a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper  return InnerMatcher.matches(QualType(Node.getAsType(), 0), Finder, Builder);
3385a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper}
3386a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper
3387ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches nested name specifier locs that specify a type matching the
3388ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// given \c TypeLoc.
3389ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3390ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3391ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3392ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   struct A { struct B { struct C {}; }; };
3393ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   A::B::C c;
3394ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3395ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
3396ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   hasDeclaration(recordDecl(hasName("A")))))))
3397ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "A::"
3398ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_MATCHER_P(NestedNameSpecifierLoc, specifiesTypeLoc,
3399ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper              internal::Matcher<TypeLoc>, InnerMatcher) {
3400ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper  return InnerMatcher.matches(Node.getTypeLoc(), Finder, Builder);
3401ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper}
3402ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3403ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches on the prefix of a \c NestedNameSpecifier.
3404a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///
3405a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// Given
3406a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \code
3407a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   struct A { struct B { struct C {}; }; };
3408a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   A::B::C c;
3409a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \endcode
3410a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
3411ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "A::"
3412415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_MATCHER_P_OVERLOAD(NestedNameSpecifier, hasPrefix,
3413415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek                       internal::Matcher<NestedNameSpecifier>, InnerMatcher,
3414415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek                       0) {
3415415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  NestedNameSpecifier *NextNode = Node.getPrefix();
3416415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  if (NextNode == NULL)
3417415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek    return false;
3418415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return InnerMatcher.matches(*NextNode, Finder, Builder);
3419ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper}
3420ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper
3421ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches on the prefix of a \c NestedNameSpecifierLoc.
3422ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///
3423ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given
3424ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code
3425ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   struct A { struct B { struct C {}; }; };
3426ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   A::B::C c;
3427ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode
3428a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
3429ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper///   matches "A::"
3430415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_MATCHER_P_OVERLOAD(NestedNameSpecifierLoc, hasPrefix,
3431415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek                       internal::Matcher<NestedNameSpecifierLoc>, InnerMatcher,
3432415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek                       1) {
3433415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  NestedNameSpecifierLoc NextNode = Node.getPrefix();
3434415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  if (!NextNode)
3435415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek    return false;
3436415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek  return InnerMatcher.matches(NextNode, Finder, Builder);
3437ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper}
3438a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper
3439a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Matches nested name specifiers that specify a namespace matching the
3440a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// given namespace matcher.
3441a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///
3442a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// Given
3443a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \code
3444a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   namespace ns { struct A {}; }
3445a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   ns::A a;
3446a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \endcode
3447a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifier(specifiesNamespace(hasName("ns")))
3448a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper///   matches "ns::"
3449a7564433191601cb8851196b8dde39392c9c05eeDaniel JasperAST_MATCHER_P(NestedNameSpecifier, specifiesNamespace,
3450a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper              internal::Matcher<NamespaceDecl>, InnerMatcher) {
3451a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper  if (Node.getAsNamespace() == NULL)
3452a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper    return false;
3453a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper  return InnerMatcher.matches(*Node.getAsNamespace(), Finder, Builder);
3454a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper}
3455a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper
3456fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \brief Overloads for the \c equalsNode matcher.
3457fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// FIXME: Implement for other node types.
3458fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// @{
3459fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek
3460fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \brief Matches if a node equals another node.
3461fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek///
3462fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \c Decl has pointer identity in the AST.
3463fa37c5ca61af275a329386407e58cf70f4d9f596Manuel KlimekAST_MATCHER_P_OVERLOAD(Decl, equalsNode, Decl*, Other, 0) {
3464fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek  return &Node == Other;
3465fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek}
3466fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \brief Matches if a node equals another node.
3467fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek///
3468fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \c Stmt has pointer identity in the AST.
3469fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek///
3470fa37c5ca61af275a329386407e58cf70f4d9f596Manuel KlimekAST_MATCHER_P_OVERLOAD(Stmt, equalsNode, Stmt*, Other, 1) {
3471fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek  return &Node == Other;
3472fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek}
3473fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek
3474fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// @}
3475fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek
3476acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \brief Matches each case or default statement belonging to the given switch
3477acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// statement. This matcher may produce multiple matches.
3478acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///
3479acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// Given
3480acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \code
3481acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///   switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
3482acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \endcode
3483acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
3484acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///   matches four times, with "c" binding each of "case 1:", "case 2:",
3485acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// "case 3:" and "case 4:", and "s" respectively binding "switch (1)",
3486acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// "switch (1)", "switch (2)" and "switch (2)".
3487acf02715ab1aa1e5a791f20e0d1ca217af256823Peter CollingbourneAST_MATCHER_P(SwitchStmt, forEachSwitchCase, internal::Matcher<SwitchCase>,
3488acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne              InnerMatcher) {
3489054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  BoundNodesTreeBuilder Result;
3490acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  // FIXME: getSwitchCaseList() does not necessarily guarantee a stable
3491acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  // iteration order. We should use the more general iterating matchers once
3492acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  // they are capable of expressing this matcher (for example, it should ignore
3493acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  // case statements belonging to nested switch statements).
3494acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  bool Matched = false;
3495acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  for (const SwitchCase *SC = Node.getSwitchCaseList(); SC;
3496acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne       SC = SC->getNextSwitchCase()) {
3497054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek    BoundNodesTreeBuilder CaseBuilder(*Builder);
3498acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne    bool CaseMatched = InnerMatcher.matches(*SC, Finder, &CaseBuilder);
3499acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne    if (CaseMatched) {
3500acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne      Matched = true;
3501054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek      Result.addMatch(CaseBuilder);
3502acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne    }
3503acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  }
3504054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek  *Builder = Result;
3505acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  return Matched;
3506acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne}
3507acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne
350806963013d1972f1f7a58875bb40976b60522700bManuel Klimek/// \brief Matches each constructor initializer in a constructor definition.
350906963013d1972f1f7a58875bb40976b60522700bManuel Klimek///
351006963013d1972f1f7a58875bb40976b60522700bManuel Klimek/// Given
351106963013d1972f1f7a58875bb40976b60522700bManuel Klimek/// \code
351206963013d1972f1f7a58875bb40976b60522700bManuel Klimek///   class A { A() : i(42), j(42) {} int i; int j; };
351306963013d1972f1f7a58875bb40976b60522700bManuel Klimek/// \endcode
351406963013d1972f1f7a58875bb40976b60522700bManuel Klimek/// constructorDecl(forEachConstructorInitializer(forField(decl().bind("x"))))
351506963013d1972f1f7a58875bb40976b60522700bManuel Klimek///   will trigger two matches, binding for 'i' and 'j' respectively.
351606963013d1972f1f7a58875bb40976b60522700bManuel KlimekAST_MATCHER_P(CXXConstructorDecl, forEachConstructorInitializer,
351706963013d1972f1f7a58875bb40976b60522700bManuel Klimek              internal::Matcher<CXXCtorInitializer>, InnerMatcher) {
351806963013d1972f1f7a58875bb40976b60522700bManuel Klimek  BoundNodesTreeBuilder Result;
351906963013d1972f1f7a58875bb40976b60522700bManuel Klimek  bool Matched = false;
352006963013d1972f1f7a58875bb40976b60522700bManuel Klimek  for (CXXConstructorDecl::init_const_iterator I = Node.init_begin(),
352106963013d1972f1f7a58875bb40976b60522700bManuel Klimek                                               E = Node.init_end();
352206963013d1972f1f7a58875bb40976b60522700bManuel Klimek       I != E; ++I) {
352306963013d1972f1f7a58875bb40976b60522700bManuel Klimek    BoundNodesTreeBuilder InitBuilder(*Builder);
352406963013d1972f1f7a58875bb40976b60522700bManuel Klimek    if (InnerMatcher.matches(**I, Finder, &InitBuilder)) {
352506963013d1972f1f7a58875bb40976b60522700bManuel Klimek      Matched = true;
352606963013d1972f1f7a58875bb40976b60522700bManuel Klimek      Result.addMatch(InitBuilder);
352706963013d1972f1f7a58875bb40976b60522700bManuel Klimek    }
352806963013d1972f1f7a58875bb40976b60522700bManuel Klimek  }
352906963013d1972f1f7a58875bb40976b60522700bManuel Klimek  *Builder = Result;
353006963013d1972f1f7a58875bb40976b60522700bManuel Klimek  return Matched;
353106963013d1972f1f7a58875bb40976b60522700bManuel Klimek}
353206963013d1972f1f7a58875bb40976b60522700bManuel Klimek
3533acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \brief If the given case statement does not use the GNU case range
3534acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// extension, matches the constant given in the statement.
3535acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///
3536acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// Given
3537acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \code
3538acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///   switch (1) { case 1: case 1+1: case 3 ... 4: ; }
3539acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \endcode
3540acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// caseStmt(hasCaseConstant(integerLiteral()))
3541acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne///   matches "case 1:"
3542acf02715ab1aa1e5a791f20e0d1ca217af256823Peter CollingbourneAST_MATCHER_P(CaseStmt, hasCaseConstant, internal::Matcher<Expr>,
3543acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne              InnerMatcher) {
3544acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  if (Node.getRHS())
3545acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne    return false;
3546acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne
3547acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne  return InnerMatcher.matches(*Node.getLHS(), Finder, Builder);
3548acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne}
3549acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne
35504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} // end namespace ast_matchers
35514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} // end namespace clang
35524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek
35534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek#endif // LLVM_CLANG_AST_MATCHERS_AST_MATCHERS_H
3554