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