ASTMatchers.h revision 054d049174eb1ec8e93a4a0831c0d8caac00cb3a
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 207f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \brief Matches C++ access specifier declarations. 208f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// 209f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// Given 210f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \code 211f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// class C { 212f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// public: 213f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// int a; 214f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// }; 215f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \endcode 216f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// accessSpecDecl() 217f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// matches 'public:' 218f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasperconst internal::VariadicDynCastAllOfMatcher< 219f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper Decl, 220f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper AccessSpecDecl> accessSpecDecl; 221f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper 222f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \brief Matches public C++ declarations. 223f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// 224f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// Given 225f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \code 226f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// class C { 227f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// public: int a; 228f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// protected: int b; 229f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// private: int c; 230f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// }; 231f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \endcode 232f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// fieldDecl(isPublic()) 233f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// matches 'int a;' 234f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel JasperAST_MATCHER(Decl, isPublic) { 235f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper return Node.getAccess() == AS_public; 236f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper} 237f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper 238f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \brief Matches protected C++ declarations. 239f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// 240f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// Given 241f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \code 242f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// class C { 243f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// public: int a; 244f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// protected: int b; 245f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// private: int c; 246f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// }; 247f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \endcode 248f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// fieldDecl(isProtected()) 249f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// matches 'int b;' 250f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel JasperAST_MATCHER(Decl, isProtected) { 251f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper return Node.getAccess() == AS_protected; 252f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper} 253f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper 254f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \brief Matches private C++ declarations. 255f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// 256f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// Given 257f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \code 258f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// class C { 259f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// public: int a; 260f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// protected: int b; 261f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// private: int c; 262f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// }; 263f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// \endcode 264f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// fieldDecl(isPrivate()) 265f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper/// matches 'int c;' 266f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel JasperAST_MATCHER(Decl, isPrivate) { 267f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper return Node.getAccess() == AS_private; 268f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper} 269f3197e9eb02120522c1f60f88dacc1cfe5b210f0Daniel Jasper 270e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches classTemplateSpecializations that have at least one 27125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// TemplateArgument matching the given InnerMatcher. 272e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 273e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 27425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 275e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// template<typename T> class A {}; 276e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// template<> class A<double> {}; 277e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// A<int> a; 27825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2792dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// classTemplateSpecializationDecl(hasAnyTemplateArgument( 280e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// refersToType(asString("int")))) 281e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches the specialization \c A<int> 282e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ClassTemplateSpecializationDecl, hasAnyTemplateArgument, 28325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::Matcher<TemplateArgument>, InnerMatcher) { 284054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek llvm::ArrayRef<TemplateArgument> List = Node.getTemplateArgs().asArray(); 285054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek return matchesFirstInRange(InnerMatcher, List.begin(), List.end(), Finder, 286054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek Builder); 287e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 288e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 289089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// \brief Matches expressions that match InnerMatcher after any implicit casts 290089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// are stripped off. 291089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// 292089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Parentheses and explicit casts are not discarded. 293089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Given 29425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 295089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// int arr[5]; 296089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// int a = 0; 297089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// char b = 0; 298089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// const int c = a; 299089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// int *d = arr; 300089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// long e = (long) 0l; 30125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 302089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// The matchers 30325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 3042dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 3052dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 30625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 307089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// would match the declarations for a, b, c, and d, but not e. 30825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// While 30925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 3102dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// varDecl(hasInitializer(integerLiteral())) 3112dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// varDecl(hasInitializer(declRefExpr())) 31225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 313089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// only match the declarations for b, c, and d. 314089e5b3bf2e57da0173b170ad501867b43395385Sam PanzerAST_MATCHER_P(Expr, ignoringImpCasts, 315089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer internal::Matcher<Expr>, InnerMatcher) { 316089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer return InnerMatcher.matches(*Node.IgnoreImpCasts(), Finder, Builder); 317089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer} 318089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer 319089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// \brief Matches expressions that match InnerMatcher after parentheses and 320089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// casts are stripped off. 321089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// 322089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Implicit and non-C Style casts are also discarded. 323089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Given 32425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 325089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// int a = 0; 326089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// char b = (0); 327089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// void* c = reinterpret_cast<char*>(0); 328089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// char d = char(0); 32925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 330089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// The matcher 3312dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 332089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// would match the declarations for a, b, c, and d. 333089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// while 3342dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// varDecl(hasInitializer(integerLiteral())) 335089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// only match the declaration for a. 336089e5b3bf2e57da0173b170ad501867b43395385Sam PanzerAST_MATCHER_P(Expr, ignoringParenCasts, internal::Matcher<Expr>, InnerMatcher) { 337089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer return InnerMatcher.matches(*Node.IgnoreParenCasts(), Finder, Builder); 338089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer} 339089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer 340089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// \brief Matches expressions that match InnerMatcher after implicit casts and 341089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// parentheses are stripped off. 342089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// 343089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Explicit casts are not discarded. 344089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Given 34525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 346089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// int arr[5]; 347089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// int a = 0; 348089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// char b = (0); 349089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// const int c = a; 350089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// int *d = (arr); 351089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// long e = ((long) 0l); 35225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 353089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// The matchers 3542dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 3552dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 356089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// would match the declarations for a, b, c, and d, but not e. 357089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// while 3582dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// varDecl(hasInitializer(integerLiteral())) 3592dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// varDecl(hasInitializer(declRefExpr())) 360089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// would only match the declaration for a. 361089e5b3bf2e57da0173b170ad501867b43395385Sam PanzerAST_MATCHER_P(Expr, ignoringParenImpCasts, 362089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer internal::Matcher<Expr>, InnerMatcher) { 363089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer return InnerMatcher.matches(*Node.IgnoreParenImpCasts(), Finder, Builder); 364089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer} 365089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer 366e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches classTemplateSpecializations where the n'th TemplateArgument 36725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// matches the given InnerMatcher. 368e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 369e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 37025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 371e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// template<typename T, typename U> class A {}; 372e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// A<bool, int> b; 373e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// A<int, bool> c; 37425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 3752dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// classTemplateSpecializationDecl(hasTemplateArgument( 376e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 1, refersToType(asString("int")))) 377e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches the specialization \c A<bool, int> 378e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P2(ClassTemplateSpecializationDecl, hasTemplateArgument, 37925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek unsigned, N, internal::Matcher<TemplateArgument>, InnerMatcher) { 380e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const TemplateArgumentList &List = Node.getTemplateArgs(); 381e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper if (List.size() <= N) 382e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return false; 38325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek return InnerMatcher.matches(List.get(N), Finder, Builder); 384e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 385e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 386e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches a TemplateArgument that refers to a certain type. 387e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 388e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 38925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 390e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// struct X {}; 391e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// template<typename T> struct A {}; 392e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// A<X> a; 39325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 3942dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// classTemplateSpecializationDecl(hasAnyTemplateArgument( 395e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// refersToType(class(hasName("X"))))) 396e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches the specialization \c A<X> 397e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(TemplateArgument, refersToType, 39825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::Matcher<QualType>, InnerMatcher) { 399e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper if (Node.getKind() != TemplateArgument::Type) 400e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return false; 40125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek return InnerMatcher.matches(Node.getAsType(), Finder, Builder); 402e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 403e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 404e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches a TemplateArgument that refers to a certain declaration. 405e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 406e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 40725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 408e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// template<typename T> struct A {}; 409e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// struct B { B* next; }; 410e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// A<&B::next> a; 41125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 4122dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// classTemplateSpecializationDecl(hasAnyTemplateArgument( 4132dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// refersToDeclaration(fieldDecl(hasName("next")))) 4142dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// matches the specialization \c A<&B::next> with \c fieldDecl(...) matching 415e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \c B::next 416e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(TemplateArgument, refersToDeclaration, 41725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::Matcher<Decl>, InnerMatcher) { 418aaa8e45b8e392a1f1b7498e2f00c6ed66d41119aDaniel Jasper if (Node.getKind() == TemplateArgument::Declaration) 419aaa8e45b8e392a1f1b7498e2f00c6ed66d41119aDaniel Jasper return InnerMatcher.matches(*Node.getAsDecl(), Finder, Builder); 420e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return false; 421e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 4224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 4234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches C++ constructor declarations. 4244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 4254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches Foo::Foo() and Foo::Foo(int) 42625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 4274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Foo { 4284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// public: 4294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Foo(); 4304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Foo(int); 4314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int DoSomething(); 4324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// }; 43325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 4344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 435e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Decl, 4362dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXConstructorDecl> constructorDecl; 437e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 438e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches explicit C++ destructor declarations. 439e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 440e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Example matches Foo::~Foo() 44125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 442e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// class Foo { 443e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// public: 444e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// virtual ~Foo(); 445e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// }; 44625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 4472dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher< 4482dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper Decl, 4492dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXDestructorDecl> destructorDecl; 450e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 451e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches enum declarations. 452e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 453e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Example matches X 45425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 455e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// enum X { 456e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// A, B, C 457e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// }; 45825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 459e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, EnumDecl> enumDecl; 460e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 461e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches enum constants. 462e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 463e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Example matches A, B, C 46425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 465e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// enum X { 466e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// A, B, C 467e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// }; 46825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 469e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher< 470e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Decl, 4712dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper EnumConstantDecl> enumConstantDecl; 4724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 4734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches method declarations. 4744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 4754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches y 47625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 4774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X { void y() }; 47825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 4792dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, CXXMethodDecl> methodDecl; 4804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 4814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches variable declarations. 4824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 4834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Note: this does not match declarations of member variables, which are 4844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// "field" declarations in Clang parlance. 4854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 4864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a 48725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 4884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int a; 48925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 4902dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, VarDecl> varDecl; 4914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 4924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches field declarations. 4934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 4944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 49525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 4964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X { int m; }; 49725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 4982dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// fieldDecl() 4994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches 'm'. 5002dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, FieldDecl> fieldDecl; 5014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 5024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches function declarations. 5034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 5044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches f 50525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 5064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void f(); 50725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 5082dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, FunctionDecl> functionDecl; 5094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 5108456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// \brief Matches C++ function template declarations. 5118456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// 5128456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// Example matches f 51325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 5148456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// template<class T> void f(T t) {} 51525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 5168456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenkoconst internal::VariadicDynCastAllOfMatcher< 5178456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko Decl, 5182dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper FunctionTemplateDecl> functionTemplateDecl; 5194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 5204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches statements. 5214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 5224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 52325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 5244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// { ++a; } 52525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 5262dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// stmt() 5274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches both the compound statement '{ ++a; }' and '++a'. 52806b247f0ffb69854e32150c80f347a9376d3709bManuel Klimekconst internal::VariadicAllOfMatcher<Stmt> stmt; 5294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 5304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches declaration statements. 5314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 5324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 53325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 5344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int a; 53525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 5362dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declStmt() 5374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches 'int a'. 5384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 539e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Stmt, 5402dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper DeclStmt> declStmt; 5414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 5424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches member expressions. 5434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 5444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 54525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 5464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Y { 5474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 5484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int a; static int b; 5494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// }; 55025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 5512dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// memberExpr() 5524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches this->x, x, y.x, a, this->b 5532dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, MemberExpr> memberExpr; 5544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 5554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches call expressions. 5564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 5579f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek/// Example matches x.y() and y() 55825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 5594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// X x; 5604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// x.y(); 5619f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek/// y(); 56225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 5632dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CallExpr> callExpr; 564e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 56531f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \brief Matches lambda expressions. 56631f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// 56731f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// Example matches [&](){return 5;} 56831f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \code 56931f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// [&](){return 5;} 57031f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \endcode 57131f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, LambdaExpr> lambdaExpr; 57231f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper 5739f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek/// \brief Matches member call expressions. 5749f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek/// 5759f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek/// Example matches x.y() 57625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 5779f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek/// X x; 5789f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek/// x.y(); 57925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 5802dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher< 5812dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper Stmt, 5822dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXMemberCallExpr> memberCallExpr; 5839f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek 584e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches init list expressions. 585e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 586e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 58725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 588e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// int a[] = { 1, 2 }; 589e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// struct B { int x, y; }; 590e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// B b = { 5, 6 }; 59125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 592e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// initList() 593e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches "{ 1, 2 }" and "{ 5, 6 }" 594e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, InitListExpr> initListExpr; 595e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 596e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches using declarations. 597e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 598e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 59925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 600e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// namespace X { int x; } 601e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// using X::x; 60225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 603e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// usingDecl() 604e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches \code using X::x \endcode 605e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, UsingDecl> usingDecl; 6064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 6074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches constructor call expressions (including implicit ones). 6084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 6094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches string(ptr, n) and ptr within arguments of f 6102dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher = constructExpr()) 61125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 6124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void f(const string &a, const string &b); 6134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// char *ptr; 6144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int n; 6154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// f(string(ptr, n), ptr); 61625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 6174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 618e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Stmt, 6192dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXConstructExpr> constructExpr; 6204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 62170b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// \brief Matches implicit and explicit this expressions. 62270b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// 62370b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// Example matches the implicit this expression in "return i". 62470b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// (matcher = thisExpr()) 62570b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// \code 62670b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// struct foo { 62770b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// int i; 62870b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// int f() { return i; } 62970b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// }; 63070b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// \endcode 63170b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimekconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXThisExpr> thisExpr; 63270b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek 6334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches nodes where temporaries are created. 6344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 6354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches FunctionTakesString(GetStringByValue()) 6362dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher = bindTemporaryExpr()) 63725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 6384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FunctionTakesString(GetStringByValue()); 6394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FunctionTakesStringByPointer(GetStringPointer()); 64025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 6414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 642e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Stmt, 6432dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXBindTemporaryExpr> bindTemporaryExpr; 6444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 645e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \brief Matches nodes where temporaries are materialized. 646e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// 647e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// Example: Given 648e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \code 649e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// struct T {void func()}; 650e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// T f(); 651e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// void g(T); 652e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \endcode 653e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// materializeTemporaryExpr() matches 'f()' in these statements 654e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \code 655e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// T u(f()); 656e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// g(f()); 657e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \endcode 658e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// but does not match 659e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \code 660e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// f(); 661e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// f().func(); 662e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \endcode 663e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzerconst internal::VariadicDynCastAllOfMatcher< 664e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer Stmt, 665e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer MaterializeTemporaryExpr> materializeTemporaryExpr; 666e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer 6674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches new expressions. 6684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 6694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 67025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 6714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// new X; 67225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 6732dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// newExpr() 6744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches 'new X'. 6752dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXNewExpr> newExpr; 676e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 677e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches delete expressions. 678e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 679e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 68025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 681e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// delete X; 68225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 6832dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// deleteExpr() 684e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches 'delete X'. 6852dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXDeleteExpr> deleteExpr; 686e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 687e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches array subscript expressions. 688e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 689e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 69025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 691e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// int i = a[1]; 69225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 693e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// arraySubscriptExpr() 694e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches "a[1]" 695e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher< 696e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Stmt, 697e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper ArraySubscriptExpr> arraySubscriptExpr; 6984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 6994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the value of a default argument at the call site. 7004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 7014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches the CXXDefaultArgExpr placeholder inserted for the 7024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// default value of the second parameter in the call expression f(42) 7032dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher = defaultArgExpr()) 70425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 7054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void f(int x, int y = 0); 7064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// f(42); 70725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 7084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 709e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Stmt, 7102dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXDefaultArgExpr> defaultArgExpr; 7114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 7124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches overloaded operator calls. 7134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 7144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Note that if an operator isn't overloaded, it won't match. Instead, use 7154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// binaryOperator matcher. 7164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Currently it does not match operators such as new delete. 7174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: figure out why these do not match? 7184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 7194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches both operator<<((o << b), c) and operator<<(o, b) 7202dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher = operatorCallExpr()) 72125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 7224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// ostream &operator<< (ostream &out, int i) { }; 7234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// ostream &o; int b = 1, c = 1; 7244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// o << b << c; 72525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 7264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 727e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Stmt, 7282dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXOperatorCallExpr> operatorCallExpr; 7294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 7304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches expressions. 7314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 7324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches x() 73325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 7344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void f() { x(); } 73525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 7362dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, Expr> expr; 7374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 7384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches expressions that refer to declarations. 7394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 7404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches x in if (x) 74125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 7424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// bool x; 7434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// if (x) {} 74425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 7452dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, DeclRefExpr> declRefExpr; 7464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 7474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if statements. 7484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 7494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches 'if (x) {}' 75025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 7514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// if (x) {} 75225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 753e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, IfStmt> ifStmt; 7544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 7554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches for statements. 7564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 7574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches 'for (;;) {}' 75825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 7594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// for (;;) {} 76031f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// int i[] = {1, 2, 3}; for (auto a : i); 76125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 7622dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, ForStmt> forStmt; 7634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 76431f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \brief Matches range-based for statements. 76531f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// 76631f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// forRangeStmt() matches 'for (auto a : i)' 76731f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \code 76831f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// int i[] = {1, 2, 3}; for (auto a : i); 76931f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// for(int j = 0; j < 5; ++j); 77031f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \endcode 77131f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXForRangeStmt> forRangeStmt; 77231f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper 7736a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches the increment statement of a for loop. 7746a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// 7756a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// Example: 7766a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 7776a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// matches '++x' in 77825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 7796a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// for (x; x < N; ++x) { } 78025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 7816a12449ec8862211856447d3df4c082a346339f2Daniel JasperAST_MATCHER_P(ForStmt, hasIncrement, internal::Matcher<Stmt>, 7826a12449ec8862211856447d3df4c082a346339f2Daniel Jasper InnerMatcher) { 7836a12449ec8862211856447d3df4c082a346339f2Daniel Jasper const Stmt *const Increment = Node.getInc(); 7846a12449ec8862211856447d3df4c082a346339f2Daniel Jasper return (Increment != NULL && 7856a12449ec8862211856447d3df4c082a346339f2Daniel Jasper InnerMatcher.matches(*Increment, Finder, Builder)); 7866a12449ec8862211856447d3df4c082a346339f2Daniel Jasper} 7876a12449ec8862211856447d3df4c082a346339f2Daniel Jasper 7886a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches the initialization statement of a for loop. 7896a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// 7906a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// Example: 7912dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// forStmt(hasLoopInit(declStmt())) 7926a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// matches 'int x = 0' in 79325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 7946a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// for (int x = 0; x < N; ++x) { } 79525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 7966a12449ec8862211856447d3df4c082a346339f2Daniel JasperAST_MATCHER_P(ForStmt, hasLoopInit, internal::Matcher<Stmt>, 7976a12449ec8862211856447d3df4c082a346339f2Daniel Jasper InnerMatcher) { 7986a12449ec8862211856447d3df4c082a346339f2Daniel Jasper const Stmt *const Init = Node.getInit(); 7996a12449ec8862211856447d3df4c082a346339f2Daniel Jasper return (Init != NULL && InnerMatcher.matches(*Init, Finder, Builder)); 8006a12449ec8862211856447d3df4c082a346339f2Daniel Jasper} 8016a12449ec8862211856447d3df4c082a346339f2Daniel Jasper 8024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches while statements. 8034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 8044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 80525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 8064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// while (true) {} 80725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 8084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// whileStmt() 8094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches 'while (true) {}'. 8102dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, WhileStmt> whileStmt; 8114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 8124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches do statements. 8134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 8144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 81525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 8164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// do {} while (true); 81725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 8184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// doStmt() 8194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches 'do {} while(true)' 820e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, DoStmt> doStmt; 8214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 822b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches break statements. 823b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// 824b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given 825b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code 826b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// while (true) { break; } 827b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode 828b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// breakStmt() 829b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// matches 'break' 830b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, BreakStmt> breakStmt; 831b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper 832b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches continue statements. 833b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// 834b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given 835b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code 836b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// while (true) { continue; } 837b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode 838b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// continueStmt() 839b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// matches 'continue' 840b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, ContinueStmt> continueStmt; 841b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper 842b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches return statements. 843b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// 844b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given 845b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code 846b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// return 1; 847b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode 848b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// returnStmt() 849b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// matches 'return 1' 850b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, ReturnStmt> returnStmt; 851b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper 852b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches goto statements. 853b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// 854b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given 855b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code 856b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// goto FOO; 857b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// FOO: bar(); 858b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode 859b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// gotoStmt() 860b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// matches 'goto FOO' 861b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, GotoStmt> gotoStmt; 862b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper 863b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches label statements. 864b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// 865b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given 866b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code 867b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// goto FOO; 868b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// FOO: bar(); 869b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode 870b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// labelStmt() 871b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// matches 'FOO:' 872b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, LabelStmt> labelStmt; 873b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper 874b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches switch statements. 875b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// 876b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given 877b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code 878b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// switch(a) { case 42: break; default: break; } 879b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode 880b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// switchStmt() 881b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// matches 'switch(a)'. 882b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, SwitchStmt> switchStmt; 883b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper 8844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches case and default statements inside switch statements. 8854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 8864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 88725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 8884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// switch(a) { case 42: break; default: break; } 88925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 8904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// switchCase() 8914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches 'case 42: break;' and 'default: break;'. 8922dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, SwitchCase> switchCase; 8934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 894acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \brief Matches case statements inside switch statements. 895acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// 896acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// Given 897acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \code 898acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// switch(a) { case 42: break; default: break; } 899acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \endcode 900acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// caseStmt() 901acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// matches 'case 42: break;'. 902acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourneconst internal::VariadicDynCastAllOfMatcher<Stmt, CaseStmt> caseStmt; 903acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne 904acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \brief Matches default statements inside switch statements. 905acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// 906acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// Given 907acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \code 908acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// switch(a) { case 42: break; default: break; } 909acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \endcode 910acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// defaultStmt() 911acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// matches 'default: break;'. 912acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourneconst internal::VariadicDynCastAllOfMatcher<Stmt, DefaultStmt> defaultStmt; 913acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne 9144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches compound statements. 9154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 9164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches '{}' and '{{}}'in 'for (;;) {{}}' 91725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 9184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// for (;;) {{}} 91925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 9202dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CompoundStmt> compoundStmt; 9214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 922b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches catch statements. 923b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// 924b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code 925b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// try {} catch(int i) {} 926b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode 927b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// catchStmt() 928b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// matches 'catch(int i)' 929b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXCatchStmt> catchStmt; 930b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper 931b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches try statements. 932b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// 933b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code 934b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// try {} catch(int i) {} 935b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode 936b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// tryStmt() 937b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// matches 'try {}' 938b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXTryStmt> tryStmt; 939b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper 940b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches throw expressions. 941b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// 942b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code 943b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// try { throw 5; } catch(int i) {} 944b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode 945b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// throwExpr() 946b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// matches 'throw 5' 947b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXThrowExpr> throwExpr; 948b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper 949b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches null statements. 950b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// 951b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code 952b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// foo();; 953b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode 954b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// nullStmt() 955b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// matches the second ';' 956b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, NullStmt> nullStmt; 957b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper 958b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches asm statements. 959b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// 960b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code 961b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// int i = 100; 962b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// __asm("mov al, 2"); 963b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode 964b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// asmStmt() 965b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// matches '__asm("mov al, 2")' 966b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, AsmStmt> asmStmt; 967b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper 9684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches bool literals. 9694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 9704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches true 97125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 9724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// true 97325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 9744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 9753680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper Stmt, 976e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper CXXBoolLiteralExpr> boolLiteral; 9774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 9784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches string literals (also matches wide string literals). 9794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 9804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches "abcd", L"abcd" 98125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 9824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// char *s = "abcd"; wchar_t *ws = L"abcd" 98325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 9844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 9853680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper Stmt, 986e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper StringLiteral> stringLiteral; 9874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 9884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches character literals (also matches wchar_t). 9894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 9904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), 9914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// though. 9924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 9934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches 'a', L'a' 99425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 9954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// char ch = 'a'; wchar_t chw = L'a'; 99625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 9974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 9983680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper Stmt, 999e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper CharacterLiteral> characterLiteral; 10004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 10014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches integer literals of all sizes / encodings. 10024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 10034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Not matching character-encoded integers such as L'a'. 10044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 10054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches 1, 1L, 0x1, 1U 10064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 10073680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper Stmt, 1008e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper IntegerLiteral> integerLiteral; 10094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 101031f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \brief Matches user defined literal operator call. 101131f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// 101231f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// Example match: "foo"_suffix 101331f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasperconst internal::VariadicDynCastAllOfMatcher< 101431f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper Stmt, 101531f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper UserDefinedLiteral> userDefinedLiteral; 101631f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper 1017afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith/// \brief Matches compound (i.e. non-scalar) literals 1018afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith/// 1019afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith/// Example match: {1}, (1, 2) 1020afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith/// \code 1021afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith/// int array[4] = {1}; vector int myvec = (vector int)(1, 2); 1022afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith/// \endcode 1023afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smithconst internal::VariadicDynCastAllOfMatcher< 1024afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith Stmt, 1025afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith CompoundLiteralExpr> compoundLiteralExpr; 1026afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith 102731f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \brief Matches nullptr literal. 102831f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasperconst internal::VariadicDynCastAllOfMatcher< 102931f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper Stmt, 103031f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper CXXNullPtrLiteralExpr> nullPtrLiteralExpr; 103131f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper 10324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches binary operator expressions. 10334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 10344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a || b 103525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 10364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// !(a || b) 103725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 10384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 1039e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Stmt, 1040e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper BinaryOperator> binaryOperator; 10414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 10424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches unary operator expressions. 10434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 10444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches !a 104525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 10464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// !a || b 104725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 10484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 1049e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Stmt, 1050e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper UnaryOperator> unaryOperator; 10514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 10524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches conditional operator expressions. 10534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 10544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a ? b : c 105525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 10564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// (a ? b : c) + 42 105725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 10584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 1059e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Stmt, 1060e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper ConditionalOperator> conditionalOperator; 10614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 10624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a reinterpret_cast expression. 10634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 10644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Either the source expression or the destination type can be matched 10654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// using has(), but hasDestinationType() is more specific and can be 10664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// more readable. 10674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 10684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches reinterpret_cast<char*>(&p) in 106925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 10704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void* p = reinterpret_cast<char*>(&p); 107125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 10724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 10733680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper Stmt, 10742dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXReinterpretCastExpr> reinterpretCastExpr; 10754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 10764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a C++ static_cast expression. 10774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 10784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \see hasDestinationType 10794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \see reinterpretCast 10804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 10814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: 10822dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// staticCastExpr() 10834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches 10844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// static_cast<long>(8) 10854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// in 108625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 10874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// long eight(static_cast<long>(8)); 108825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 10894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 10903680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper Stmt, 10912dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXStaticCastExpr> staticCastExpr; 10924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 10934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a dynamic_cast expression. 10944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 10954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: 10962dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// dynamicCastExpr() 10974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches 10984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// dynamic_cast<D*>(&b); 10994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// in 110025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 11014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// struct B { virtual ~B() {} }; struct D : B {}; 11024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// B b; 11034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// D* p = dynamic_cast<D*>(&b); 110425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 11054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 11063680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper Stmt, 11072dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXDynamicCastExpr> dynamicCastExpr; 11084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 11094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a const_cast expression. 11104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 11114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: Matches const_cast<int*>(&r) in 111225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 11134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int n = 42; 111425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// const int &r(n); 11154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int* p = const_cast<int*>(&r); 111625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 11174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 11183680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper Stmt, 11192dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXConstCastExpr> constCastExpr; 11204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 1121e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper/// \brief Matches a C-style cast expression. 1122e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper/// 1123e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper/// Example: Matches (int*) 2.2f in 1124e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper/// \code 1125e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper/// int i = (int) 2.2f; 1126e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper/// \endcode 1127e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasperconst internal::VariadicDynCastAllOfMatcher< 1128e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper Stmt, 1129e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper CStyleCastExpr> cStyleCastExpr; 1130e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper 11314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches explicit cast expressions. 11324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 11334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Matches any cast expression written in user code, whether it be a 11344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// C-style cast, a functional-style cast, or a keyword cast. 11354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 11364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Does not match implicit conversions. 11374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 11384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Note: the name "explicitCast" is chosen to match Clang's terminology, as 11394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Clang uses the term "cast" to apply to implicit conversions as well as to 11404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// actual cast expressions. 11414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 11424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \see hasDestinationType. 11434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 11444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: matches all five of the casts in 114525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 11464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) 114725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 11484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// but does not match the implicit conversion in 114925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 11504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// long ell = 42; 115125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 11524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 11533680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper Stmt, 11542dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper ExplicitCastExpr> explicitCastExpr; 11554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 11564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the implicit cast nodes of Clang's AST. 11574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 11584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// This matches many different places, including function call return value 11594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// eliding, as well as any type conversions. 11604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 11613680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper Stmt, 11622dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper ImplicitCastExpr> implicitCastExpr; 11634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 1164089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// \brief Matches any cast nodes of Clang's AST. 1165089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// 1166089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Example: castExpr() matches each of the following: 116725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1168089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// (int) 3; 1169089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// const_cast<Expr *>(SubExpr); 1170089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// char c = 0; 117125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1172089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// but does not match 117325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1174089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// int i = (0); 1175089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// int k = 0; 117625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 11773680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CastExpr> castExpr; 1178089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer 11794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches functional cast expressions 11804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 11814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: Matches Foo(bar); 118225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 11834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Foo f = bar; 11844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Foo g = (Foo) bar; 11854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Foo h = Foo(bar); 118625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 11874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 11883680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper Stmt, 11892dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXFunctionalCastExpr> functionalCastExpr; 11904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 1191a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \brief Matches \c QualTypes in the clang AST. 1192a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasperconst internal::VariadicAllOfMatcher<QualType> qualType; 1193a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper 1194a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \brief Matches \c Types in the clang AST. 119506b247f0ffb69854e32150c80f347a9376d3709bManuel Klimekconst internal::VariadicAllOfMatcher<Type> type; 1196a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper 1197a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \brief Matches \c TypeLocs in the clang AST. 119806b247f0ffb69854e32150c80f347a9376d3709bManuel Klimekconst internal::VariadicAllOfMatcher<TypeLoc> typeLoc; 1199a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper 12007387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \brief Matches if any of the given matchers matches. 12017387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// 12027387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// Unlike \c anyOf, \c eachOf will generate a match result for each 12037387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// matching submatcher. 12047387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// 12057387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// For example, in: 12067387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \code 12077387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// class A { int a; int b; }; 12087387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \endcode 12097387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// The matcher: 12107387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \code 12117387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 12127387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// has(fieldDecl(hasName("b")).bind("v")))) 12137387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \endcode 12147387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// will generate two results binding "v", the first of which binds 12157387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// the field declaration of \c a, the second the field declaration of 12167387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \c b. 12177387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// 12187387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// Usable as: Any Matcher 12197387673f83b8b37f660422947c9990778ba88193Manuel Klimektemplate <typename M1, typename M2> 12207387673f83b8b37f660422947c9990778ba88193Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::EachOfMatcher, M1, M2> 12217387673f83b8b37f660422947c9990778ba88193Manuel KlimekeachOf(const M1 &P1, const M2 &P2) { 12227387673f83b8b37f660422947c9990778ba88193Manuel Klimek return internal::PolymorphicMatcherWithParam2<internal::EachOfMatcher, M1, 12237387673f83b8b37f660422947c9990778ba88193Manuel Klimek M2>(P1, P2); 12247387673f83b8b37f660422947c9990778ba88193Manuel Klimek} 12257387673f83b8b37f660422947c9990778ba88193Manuel Klimek 12264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Various overloads for the anyOf matcher. 12274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// @{ 122825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek 122925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \brief Matches if any of the given matchers matches. 123025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// 123125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher 123225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimektemplate<typename M1, typename M2> 123325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M1, M2> 123425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekanyOf(const M1 &P1, const M2 &P2) { 12354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, 123625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek M1, M2 >(P1, P2); 12374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 123825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimektemplate<typename M1, typename M2, typename M3> 123925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M1, 124025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M2, M3> > 124125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekanyOf(const M1 &P1, const M2 &P2, const M3 &P3) { 12424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return anyOf(P1, anyOf(P2, P3)); 12434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 124425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimektemplate<typename M1, typename M2, typename M3, typename M4> 124525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M1, 124625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M2, 12474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, 124825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek M3, M4> > > 124925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekanyOf(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4) { 1250ff2fcb8db242a54f72bbb4e5595261e12672ed66Daniel Jasper return anyOf(P1, anyOf(P2, anyOf(P3, P4))); 12514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 125225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimektemplate<typename M1, typename M2, typename M3, typename M4, typename M5> 125325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M1, 125425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M2, 125525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M3, 12564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, 125725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek M4, M5> > > > 125825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekanyOf(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4, const M5 &P5) { 12594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return anyOf(P1, anyOf(P2, anyOf(P3, anyOf(P4, P5)))); 12604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 126125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek 12624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// @} 12634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 12644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Various overloads for the allOf matcher. 12654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// @{ 126625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek 126725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \brief Matches if all given matchers match. 126825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// 126925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher 12707f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vanetemplate <typename M1, typename M2> 127125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::AllOfMatcher, M1, M2> 127225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekallOf(const M1 &P1, const M2 &P2) { 12737f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane return internal::PolymorphicMatcherWithParam2<internal::AllOfMatcher, M1, M2>( 12747f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane P1, P2); 12754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 12767f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vanetemplate <typename M1, typename M2, typename M3> 12777f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vaneinternal::PolymorphicMatcherWithParam2< 12787f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane internal::AllOfMatcher, M1, 127925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::PolymorphicMatcherWithParam2<internal::AllOfMatcher, M2, M3> > 128025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekallOf(const M1 &P1, const M2 &P2, const M3 &P3) { 12816a12449ec8862211856447d3df4c082a346339f2Daniel Jasper return allOf(P1, allOf(P2, P3)); 12824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 12837f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vanetemplate <typename M1, typename M2, typename M3, typename M4> 12847f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vaneinternal::PolymorphicMatcherWithParam2< 12857f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane internal::AllOfMatcher, M1, 12867f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane internal::PolymorphicMatcherWithParam2< 12877f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane internal::AllOfMatcher, M2, internal::PolymorphicMatcherWithParam2< 12887f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane internal::AllOfMatcher, M3, M4> > > 12897f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin VaneallOf(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4) { 12907f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane return allOf(P1, allOf(P2, P3, P4)); 12917f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane} 12927f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vanetemplate <typename M1, typename M2, typename M3, typename M4, typename M5> 12937f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vaneinternal::PolymorphicMatcherWithParam2< 12947f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane internal::AllOfMatcher, M1, 12957f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane internal::PolymorphicMatcherWithParam2< 12967f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane internal::AllOfMatcher, M2, 12977f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane internal::PolymorphicMatcherWithParam2< 12987f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane internal::AllOfMatcher, M3, 12997f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane internal::PolymorphicMatcherWithParam2<internal::AllOfMatcher, M4, 13007f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane M5> > > > 13017f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin VaneallOf(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4, const M5 &P5) { 13027f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane return allOf(P1, allOf(P2, P3, P4, P5)); 13037f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane} 130425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek 13054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// @} 13064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 1307e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) 1308e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 1309e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 131025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1311e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Foo x = bar; 1312e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// int y = sizeof(x) + alignof(x); 131325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1314e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// unaryExprOrTypeTraitExpr() 1315e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches \c sizeof(x) and \c alignof(x) 1316e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher< 1317e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Stmt, 1318e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper UnaryExprOrTypeTraitExpr> unaryExprOrTypeTraitExpr; 1319e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 1320e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches unary expressions that have a specific type of argument. 1321e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 1322e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 132325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1324e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 132525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1326e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 1327e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches \c sizeof(a) and \c alignof(c) 1328e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UnaryExprOrTypeTraitExpr, hasArgumentOfType, 132925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::Matcher<QualType>, InnerMatcher) { 1330e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const QualType ArgumentType = Node.getTypeOfArgument(); 133125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek return InnerMatcher.matches(ArgumentType, Finder, Builder); 1332e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 1333e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 1334e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches unary expressions of a certain kind. 1335e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 1336e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 133725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1338e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// int x; 1339e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// int s = sizeof(x) + alignof(x) 134025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1341e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 1342e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches \c sizeof(x) 1343e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UnaryExprOrTypeTraitExpr, ofKind, UnaryExprOrTypeTrait, Kind) { 1344e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return Node.getKind() == Kind; 1345e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 1346e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 1347e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Same as unaryExprOrTypeTraitExpr, but only matching 1348e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// alignof. 1349e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<Stmt> alignOfExpr( 135025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) { 1351415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return stmt(unaryExprOrTypeTraitExpr(allOf( 135225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek ofKind(UETT_AlignOf), InnerMatcher))); 1353e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 1354e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 1355e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Same as unaryExprOrTypeTraitExpr, but only matching 1356e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// sizeof. 1357e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<Stmt> sizeOfExpr( 135825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) { 1359415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return stmt(unaryExprOrTypeTraitExpr( 1360415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek allOf(ofKind(UETT_SizeOf), InnerMatcher))); 1361e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 1362e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 13634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches NamedDecl nodes that have the specified name. 13644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 13654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Supports specifying enclosing namespaces or classes by prefixing the name 13664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with '<enclosing>::'. 13674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Does not match typedefs of an underlying type with the given name. 13684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 13694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X (Name == "X") 137025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 13714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X; 137225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 13734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 13744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 137525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 137625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// namespace a { namespace b { class X; } } 137725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1378e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(NamedDecl, hasName, std::string, Name) { 13794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek assert(!Name.empty()); 13804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek const std::string FullNameString = "::" + Node.getQualifiedNameAsString(); 1381cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko const StringRef FullName = FullNameString; 1382cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko const StringRef Pattern = Name; 13834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek if (Pattern.startswith("::")) { 13844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return FullName == Pattern; 13854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek } else { 13864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return FullName.endswith(("::" + Pattern).str()); 13874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek } 13884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 13894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 139031bdf071afc18bb9551e4f4254be297333200c4aManuel Klimek/// \brief Matches NamedDecl nodes whose fully qualified names contain 139131bdf071afc18bb9551e4f4254be297333200c4aManuel Klimek/// a substring matched by the given RegExp. 1392e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 1393e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Supports specifying enclosing namespaces or classes by 1394e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// prefixing the name with '<enclosing>::'. Does not match typedefs 1395e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// of an underlying type with the given name. 1396e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 1397e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Example matches X (regexp == "::X") 139825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1399e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// class X; 140025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1401e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 1402e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Example matches X (regexp is one of "::X", "^foo::.*X", among others) 140325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 140425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// namespace foo { namespace bar { class X; } } 140525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1406e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(NamedDecl, matchesName, std::string, RegExp) { 1407e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper assert(!RegExp.empty()); 1408e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper std::string FullNameString = "::" + Node.getQualifiedNameAsString(); 1409e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper llvm::Regex RE(RegExp); 1410e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return RE.match(FullNameString); 1411e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 1412e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 14134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches overloaded operator names. 14144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 14154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Matches overloaded operator names specified in strings without the 14166a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// "operator" prefix: e.g. "<<". 14174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 14186a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// Given: 141925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 14206a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// class A { int operator*(); }; 14216a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// const A &operator<<(const A &a, const A &b); 14226a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// A a; 14236a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// a << a; // <-- This matches 142425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 14256a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// 14266a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \c operatorCallExpr(hasOverloadedOperatorName("<<"))) matches the specified 14276a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// line and \c recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches 14286a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// the declaration of \c A. 14296a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// 14306a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// Usable as: Matcher<CXXOperatorCallExpr>, Matcher<CXXMethodDecl> 14316a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vaneinline internal::PolymorphicMatcherWithParam1< 14326a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane internal::HasOverloadedOperatorNameMatcher, StringRef> 14336a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin VanehasOverloadedOperatorName(const StringRef Name) { 14346a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane return internal::PolymorphicMatcherWithParam1< 14356a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane internal::HasOverloadedOperatorNameMatcher, StringRef>(Name); 14364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 14374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 14384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches C++ classes that are directly or indirectly derived from 143920b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper/// a class matching \c Base. 14404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 144176dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper/// Note that a class is not considered to be derived from itself. 14424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 144376dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper/// Example matches Y, Z, C (Base == hasName("X")) 144425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 144576dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper/// class X; 14464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Y : public X {}; // directly derived 14474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Z : public Y {}; // indirectly derived 14484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// typedef X A; 14494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// typedef A B; 14504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class C : public B {}; // derived from a typedef of X 145125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 14524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 145320b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper/// In the following example, Bar matches isDerivedFrom(hasName("X")): 145425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 14554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Foo; 14564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// typedef Foo X; 14574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Bar : public Foo {}; // derived from a type that X is a typedef of 145825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 145920b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel JasperAST_MATCHER_P(CXXRecordDecl, isDerivedFrom, 146020b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper internal::Matcher<NamedDecl>, Base) { 146120b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper return Finder->classIsDerivedFrom(&Node, Base, Builder); 146220b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper} 146320b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper 146420b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper/// \brief Overloaded method as shortcut for \c isDerivedFrom(hasName(...)). 146520b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasperinline internal::Matcher<CXXRecordDecl> isDerivedFrom(StringRef BaseName) { 146620b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper assert(!BaseName.empty()); 146720b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper return isDerivedFrom(hasName(BaseName)); 14684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 14694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 147076dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper/// \brief Similar to \c isDerivedFrom(), but also matches classes that directly 147176dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper/// match \c Base. 147263d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasperinline internal::Matcher<CXXRecordDecl> isSameOrDerivedFrom( 147363d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper internal::Matcher<NamedDecl> Base) { 147476dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper return anyOf(Base, isDerivedFrom(Base)); 147576dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper} 147676dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper 147763d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper/// \brief Overloaded method as shortcut for 147863d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper/// \c isSameOrDerivedFrom(hasName(...)). 147963d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasperinline internal::Matcher<CXXRecordDecl> isSameOrDerivedFrom( 148063d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper StringRef BaseName) { 148176dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper assert(!BaseName.empty()); 148263d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper return isSameOrDerivedFrom(hasName(BaseName)); 148376dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper} 148476dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper 14856a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \brief Matches the first method of a class or struct that satisfies \c 14866a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// InnerMatcher. 14876a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// 14886a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// Given: 14896a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \code 14906a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// class A { void func(); }; 14916a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// class B { void member(); }; 14926a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \code 14936a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// 14946a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \c recordDecl(hasMethod(hasName("func"))) matches the declaration of \c A 14956a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// but not \c B. 14966a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin VaneAST_MATCHER_P(CXXRecordDecl, hasMethod, internal::Matcher<CXXMethodDecl>, 14976a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane InnerMatcher) { 1498054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek return matchesFirstInPointerRange(InnerMatcher, Node.method_begin(), 1499054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek Node.method_end(), Finder, Builder); 15006a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane} 15016a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane 15024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches AST nodes that have child AST nodes that match the 15034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// provided matcher. 15044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 15052dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X"))) 150625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 15074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X {}; // Matches X, because X::X is a class of name X inside X. 15084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Y { class X {}; }; 15094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Z { class Y { class X {}; }; }; // Does not match Z. 151025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 15114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 15124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// ChildT must be an AST base type. 151325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// 151425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher 15154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename ChildT> 15164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinternal::ArgumentAdaptingMatcher<internal::HasMatcher, ChildT> has( 15174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek const internal::Matcher<ChildT> &ChildMatcher) { 15184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return internal::ArgumentAdaptingMatcher<internal::HasMatcher, 15194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek ChildT>(ChildMatcher); 15204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 15214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 15224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches AST nodes that have descendant AST nodes that match the 15234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// provided matcher. 15244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 15254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X, Y, Z 15262dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher = recordDecl(hasDescendant(recordDecl(hasName("X"))))) 152725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 15284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X {}; // Matches X, because X::X is a class of name X inside X. 15294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Y { class X {}; }; 15304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Z { class Y { class X {}; }; }; 153125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 15324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 15334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// DescendantT must be an AST base type. 153425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// 153525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher 15364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename DescendantT> 15374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinternal::ArgumentAdaptingMatcher<internal::HasDescendantMatcher, DescendantT> 15384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekhasDescendant(const internal::Matcher<DescendantT> &DescendantMatcher) { 15394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return internal::ArgumentAdaptingMatcher< 15404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek internal::HasDescendantMatcher, 15414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek DescendantT>(DescendantMatcher); 15424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 15434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 15444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches AST nodes that have child AST nodes that match the 15454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// provided matcher. 15464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 15472dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X"))) 154825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 15494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X {}; // Matches X, because X::X is a class of name X inside X. 15504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Y { class X {}; }; 15514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Z { class Y { class X {}; }; }; // Does not match Z. 155225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 15534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 15544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// ChildT must be an AST base type. 15554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 15564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// As opposed to 'has', 'forEach' will cause a match for each result that 15574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches instead of only on the first one. 155825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// 155925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher 15604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename ChildT> 15614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinternal::ArgumentAdaptingMatcher<internal::ForEachMatcher, ChildT> forEach( 156225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek const internal::Matcher<ChildT> &ChildMatcher) { 15634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return internal::ArgumentAdaptingMatcher< 15644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek internal::ForEachMatcher, 15654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek ChildT>(ChildMatcher); 15664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 15674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 15684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches AST nodes that have descendant AST nodes that match the 15694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// provided matcher. 15704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 15714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X, A, B, C 15722dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X"))))) 157325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 15744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X {}; // Matches X, because X::X is a class of name X inside X. 15754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class A { class X {}; }; 15764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class B { class C { class X {}; }; }; 157725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 15784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 15794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// DescendantT must be an AST base type. 15804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 15814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 15824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// each result that matches instead of only on the first one. 15834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 15844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Note: Recursively combined ForEachDescendant can cause many matches: 15852dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl())))) 15864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// will match 10 times (plus injected class name matches) on: 158725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 15884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class A { class B { class C { class D { class E {}; }; }; }; }; 158925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 159025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// 159125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher 15924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename DescendantT> 1593a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasperinternal::ArgumentAdaptingMatcher<internal::ForEachDescendantMatcher, 1594a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper DescendantT> 15954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekforEachDescendant( 159625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek const internal::Matcher<DescendantT> &DescendantMatcher) { 15974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return internal::ArgumentAdaptingMatcher< 15984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek internal::ForEachDescendantMatcher, 15994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek DescendantT>(DescendantMatcher); 16004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 16014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 1602152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \brief Matches if the node or any descendant matches. 1603152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// 1604152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// Generates results for each match. 1605152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// 1606152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// For example, in: 1607152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \code 1608152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// class A { class B {}; class C {}; }; 1609152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \endcode 1610152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// The matcher: 1611152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \code 1612152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m"))) 1613152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \endcode 1614152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// will generate results for \c A, \c B and \c C. 1615152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// 1616152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// Usable as: Any Matcher 1617152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimektemplate <typename T> 1618152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimekinternal::PolymorphicMatcherWithParam2< 1619152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek internal::EachOfMatcher, internal::Matcher<T>, 1620152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek internal::ArgumentAdaptingMatcher<internal::ForEachDescendantMatcher, T> > 1621152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel KlimekfindAll(const internal::Matcher<T> &Matcher) { 1622152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek return eachOf(Matcher, forEachDescendant(Matcher)); 1623152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek} 1624152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek 1625c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// \brief Matches AST nodes that have a parent that matches the provided 1626c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// matcher. 1627c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// 1628c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// Given 1629c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// \code 1630c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 1631c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// \endcode 1632c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// \c compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 1633c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// 1634c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// Usable as: Any Matcher 1635c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jaspertemplate <typename ParentT> 1636c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasperinternal::ArgumentAdaptingMatcher<internal::HasParentMatcher, ParentT> 1637c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel JasperhasParent(const internal::Matcher<ParentT> &ParentMatcher) { 1638c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper return internal::ArgumentAdaptingMatcher< 1639c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper internal::HasParentMatcher, 1640c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper ParentT>(ParentMatcher); 1641c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper} 1642c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper 1643579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// \brief Matches AST nodes that have an ancestor that matches the provided 1644579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// matcher. 1645579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// 1646579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// Given 1647579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// \code 1648579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// void f() { if (true) { int x = 42; } } 1649579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// void g() { for (;;) { int x = 43; } } 1650579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// \endcode 1651a1a4c0385a0fd458243d9e357e1eceb137f29abfNick Lewycky/// \c expr(integerLiteral(hasAncestor(ifStmt()))) matches \c 42, but not 43. 1652579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// 1653579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// Usable as: Any Matcher 1654579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimektemplate <typename AncestorT> 1655579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimekinternal::ArgumentAdaptingMatcher<internal::HasAncestorMatcher, AncestorT> 1656579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel KlimekhasAncestor(const internal::Matcher<AncestorT> &AncestorMatcher) { 1657579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek return internal::ArgumentAdaptingMatcher< 1658579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek internal::HasAncestorMatcher, 1659579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek AncestorT>(AncestorMatcher); 1660579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek} 1661579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek 16624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the provided matcher does not match. 16634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 16642dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches Y (matcher = recordDecl(unless(hasName("X")))) 166525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 16664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X {}; 16674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Y {}; 166825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 166925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// 167025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher 16714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename M> 167225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam1<internal::NotMatcher, M> 167325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekunless(const M &InnerMatcher) { 16744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return internal::PolymorphicMatcherWithParam1< 16754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek internal::NotMatcher, M>(InnerMatcher); 16764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 16774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 167803a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// \brief Matches a node if the declaration associated with that node 167903a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// matches the given matcher. 168003a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// 168103a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// The associated declaration is: 168203a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// - for type nodes, the declaration of the underlying type 168303a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// - for CallExpr, the declaration of the callee 168403a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// - for MemberExpr, the declaration of the referenced member 168503a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// - for CXXConstructExpr, the declaration of the constructor 168603a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// 168703a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// Also usable as Matcher<T> for any T supporting the getDecl() member 168803a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// function. e.g. various subtypes of clang::Type and various expressions. 168903a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// FIXME: Add all node types for which this is matcher is usable due to 169003a83238c39e290ed6e2ced7663efa9fa8c19158Manuel Klimek/// getDecl(). 1691523806028d812a7f29636c59a8bc0e7e3d3fd9aeEdwin Vane/// 1692c711af2ddbbb1d46223cc9379d32a203fb5bc7f4Daniel Jasper/// Usable as: Matcher<QualType>, Matcher<CallExpr>, Matcher<CXXConstructExpr>, 16933abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// Matcher<MemberExpr>, Matcher<TypedefType>, 16943abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// Matcher<TemplateSpecializationType> 16954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinline internal::PolymorphicMatcherWithParam1< internal::HasDeclarationMatcher, 1696e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Decl> > 1697e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper hasDeclaration(const internal::Matcher<Decl> &InnerMatcher) { 16984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return internal::PolymorphicMatcherWithParam1< 16994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek internal::HasDeclarationMatcher, 1700e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Decl> >(InnerMatcher); 17014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 17024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 17034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches on the implicit object argument of a member call expression. 17044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 17052dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y")))))) 170625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 17074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Y { public: void x(); }; 17084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void z() { Y y; y.x(); }", 170925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 17104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 17114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: Overload to allow directly matching types? 1712e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXMemberCallExpr, on, internal::Matcher<Expr>, 17134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher) { 1714f8c12146fa2153a6d97b7c92d27d2ece0cd26e79Dmitri Gribenko const Expr *ExprNode = Node.getImplicitObjectArgument() 1715f8c12146fa2153a6d97b7c92d27d2ece0cd26e79Dmitri Gribenko ->IgnoreParenImpCasts(); 17164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (ExprNode != NULL && 17174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*ExprNode, Finder, Builder)); 17184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 17194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 17204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the call expression's callee expression matches. 17214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 17224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 172325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 17244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Y { void x() { this->x(); x(); Y y; y.x(); } }; 17254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void f() { f(); } 172625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 17272dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// callExpr(callee(expr())) 17284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches this->x(), x(), y.x(), f() 17294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with callee(...) 17304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matching this->x, x, y.x, f respectively 17314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 1732e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Note: Callee cannot take the more general internal::Matcher<Expr> 17334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// because this introduces ambiguous overloads with calls to Callee taking a 1734e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// internal::Matcher<Decl>, as the matcher hierarchy is purely 17354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// implemented in terms of implicit casts. 1736e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CallExpr, callee, internal::Matcher<Stmt>, 17374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher) { 1738e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const Expr *ExprNode = Node.getCallee(); 17394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (ExprNode != NULL && 17404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*ExprNode, Finder, Builder)); 17414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 17424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 17434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the call expression's callee's declaration matches the 17444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// given matcher. 17454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 17462dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x"))))) 174725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 17484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Y { public: void x(); }; 17494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void z() { Y y; y.x(); 175025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1751e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<CallExpr> callee( 1752e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const internal::Matcher<Decl> &InnerMatcher) { 1753415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return callExpr(hasDeclaration(InnerMatcher)); 17544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 17554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 17564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the expression's or declaration's type matches a type 17574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matcher. 17584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 17592dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches x (matcher = expr(hasType(recordDecl(hasName("X"))))) 17602dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// and z (matcher = varDecl(hasType(recordDecl(hasName("X"))))) 176125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 17624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X {}; 17634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void y(X &x) { x; X z; } 176425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1765e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_POLYMORPHIC_MATCHER_P(hasType, internal::Matcher<QualType>, 17664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher) { 1767e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper TOOLING_COMPILE_ASSERT((llvm::is_base_of<Expr, NodeType>::value || 1768e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper llvm::is_base_of<ValueDecl, NodeType>::value), 17694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek instantiated_with_wrong_types); 17704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return InnerMatcher.matches(Node.getType(), Finder, Builder); 17714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 17724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 17734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Overloaded to match the declaration of the expression's or value 17744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// declaration's type. 17754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 17764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// In case of a value declaration (for example a variable declaration), 17774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// this resolves one layer of indirection. For example, in the value 17782dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declaration "X x;", recordDecl(hasName("X")) matches the declaration of X, 17792dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration 17804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// of x." 17814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 17822dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches x (matcher = expr(hasType(recordDecl(hasName("X"))))) 17832dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// and z (matcher = varDecl(hasType(recordDecl(hasName("X"))))) 178425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 17854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X {}; 17864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void y(X &x) { x; X z; } 178725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1788297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// 1789297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// Usable as: Matcher<Expr>, Matcher<ValueDecl> 17904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinline internal::PolymorphicMatcherWithParam1< 1791415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek internal::matcher_hasType0Matcher, 1792e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<QualType> > 1793e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperhasType(const internal::Matcher<Decl> &InnerMatcher) { 1794415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return hasType(qualType(hasDeclaration(InnerMatcher))); 17954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 17964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 1797e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches if the matched type is represented by the given string. 1798e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 1799e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 180025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1801e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// class Y { public: void x(); }; 1802e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// void z() { Y* y; y->x(); } 180325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 18042dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// callExpr(on(hasType(asString("class Y *")))) 1805e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches y->x() 1806e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(QualType, asString, std::string, Name) { 1807e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return Name == Node.getAsString(); 1808e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 1809e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 18104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the matched type is a pointer type and the pointee type 18114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches the specified matcher. 18124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 18134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches y->x() 18142dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher = callExpr(on(hasType(pointsTo(recordDecl(hasName("Y"))))))) 181525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 18164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Y { public: void x(); }; 18174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void z() { Y *y; y->x(); } 181825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 18194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekAST_MATCHER_P( 1820e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper QualType, pointsTo, internal::Matcher<QualType>, 18214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher) { 1822e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return (!Node.isNull() && Node->isPointerType() && 18234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(Node->getPointeeType(), Finder, Builder)); 18244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 18254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 18264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Overloaded to match the pointee type's declaration. 1827e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<QualType> pointsTo( 1828e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const internal::Matcher<Decl> &InnerMatcher) { 1829415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return pointsTo(qualType(hasDeclaration(InnerMatcher))); 18304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 18314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 18324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the matched type is a reference type and the referenced 18334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// type matches the specified matcher. 18344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 18354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X &x and const X &y 18362dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher = varDecl(hasType(references(recordDecl(hasName("X")))))) 183725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 18384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X { 18394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void a(X b) { 18404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// X &x = b; 18414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// const X &y = b; 18424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// }; 184325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1844e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(QualType, references, internal::Matcher<QualType>, 18454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher) { 1846e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return (!Node.isNull() && Node->isReferenceType() && 18474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(Node->getPointeeType(), Finder, Builder)); 18484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 18494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 18506a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \brief Matches QualTypes whose canonical type matches InnerMatcher. 18516a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// 18526a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// Given: 18536a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \code 18546a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// typedef int &int_ref; 18556a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// int a; 18566a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// int_ref b = a; 18576a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \code 18586a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// 18596a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// \c varDecl(hasType(qualType(referenceType()))))) will not match the 18606a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// declaration of b but \c 18616a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane/// varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 18626a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin VaneAST_MATCHER_P(QualType, hasCanonicalType, internal::Matcher<QualType>, 18636a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane InnerMatcher) { 186454eeac9cb538e4fc4eecd81f2eda8f6fa727ca76Edwin Vane if (Node.isNull()) 186554eeac9cb538e4fc4eecd81f2eda8f6fa727ca76Edwin Vane return false; 18666a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane return InnerMatcher.matches(Node.getCanonicalType(), Finder, Builder); 18676a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane} 18686a19a97e57c8678adb0505a07c97d7ccadc8fe4eEdwin Vane 18694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Overloaded to match the referenced type's declaration. 1870e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<QualType> references( 1871e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const internal::Matcher<Decl> &InnerMatcher) { 1872415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return references(qualType(hasDeclaration(InnerMatcher))); 18734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 18744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 1875e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXMemberCallExpr, onImplicitObjectArgument, 1876e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Expr>, InnerMatcher) { 1877f8c12146fa2153a6d97b7c92d27d2ece0cd26e79Dmitri Gribenko const Expr *ExprNode = Node.getImplicitObjectArgument(); 18784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (ExprNode != NULL && 18794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*ExprNode, Finder, Builder)); 18804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 18814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 18824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the expression's type either matches the specified 18834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matcher, or is a pointer to a type that matches the InnerMatcher. 18849f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimekinline internal::Matcher<CXXMemberCallExpr> thisPointerType( 1885e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const internal::Matcher<QualType> &InnerMatcher) { 18864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return onImplicitObjectArgument( 18874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher)))); 18884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 18894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 18904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Overloaded to match the type's declaration. 18919f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimekinline internal::Matcher<CXXMemberCallExpr> thisPointerType( 1892e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const internal::Matcher<Decl> &InnerMatcher) { 18934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return onImplicitObjectArgument( 18944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher)))); 18954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 18964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 18974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a DeclRefExpr that refers to a declaration that matches the 18984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// specified matcher. 18994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 19004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches x in if(x) 19012dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher = declRefExpr(to(varDecl(hasName("x"))))) 190225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 19034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// bool x; 19044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// if (x) {} 190525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1906e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(DeclRefExpr, to, internal::Matcher<Decl>, 19074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher) { 1908e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const Decl *DeclNode = Node.getDecl(); 19094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (DeclNode != NULL && 19104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*DeclNode, Finder, Builder)); 19114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 19124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 1913e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches a \c DeclRefExpr that refers to a declaration through a 1914e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// specific using shadow declaration. 1915e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 1916e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// FIXME: This currently only works for functions. Fix. 1917e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 1918e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 191925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1920e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// namespace a { void f() {} } 1921e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// using a::f; 1922e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// void g() { 1923e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// f(); // Matches this .. 1924e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// a::f(); // .. but not this. 1925e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// } 192625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 19272dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declRefExpr(throughUsingDeclaration(anything())) 1928e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches \c f() 1929e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(DeclRefExpr, throughUsingDecl, 193025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::Matcher<UsingShadowDecl>, InnerMatcher) { 1931e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const NamedDecl *FoundDecl = Node.getFoundDecl(); 1932cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko if (const UsingShadowDecl *UsingDecl = dyn_cast<UsingShadowDecl>(FoundDecl)) 193325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek return InnerMatcher.matches(*UsingDecl, Finder, Builder); 1934e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return false; 1935e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 1936e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 1937425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// \brief Matches the Decl of a DeclStmt which has a single declaration. 1938425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// 1939425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// Given 194025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1941425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// int a, b; 1942425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// int c; 194325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 19442dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declStmt(hasSingleDecl(anything())) 1945425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// matches 'int c;' but not 'int a, b;'. 1946425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam PanzerAST_MATCHER_P(DeclStmt, hasSingleDecl, internal::Matcher<Decl>, InnerMatcher) { 1947425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer if (Node.isSingleDecl()) { 1948425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer const Decl *FoundDecl = Node.getSingleDecl(); 1949425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer return InnerMatcher.matches(*FoundDecl, Finder, Builder); 1950425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer } 1951425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer return false; 1952425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer} 1953425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer 19544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a variable declaration that has an initializer expression 19554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// that matches the given matcher. 19564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 19572dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 195825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 19594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// bool y() { return true; } 19604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// bool x = y(); 196125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 19624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekAST_MATCHER_P( 1963e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper VarDecl, hasInitializer, internal::Matcher<Expr>, 19644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher) { 1965e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const Expr *Initializer = Node.getAnyInitializer(); 19664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (Initializer != NULL && 19674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*Initializer, Finder, Builder)); 19684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 19694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 19704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Checks that a call expression or a constructor call expression has 19714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// a specific number of arguments (including absent default arguments). 19724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 19732dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 197425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 19754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void f(int x, int y); 19764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// f(0, 0); 197725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 19784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekAST_POLYMORPHIC_MATCHER_P(argumentCountIs, unsigned, N) { 1979e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper TOOLING_COMPILE_ASSERT((llvm::is_base_of<CallExpr, NodeType>::value || 1980e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper llvm::is_base_of<CXXConstructExpr, 19814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek NodeType>::value), 19824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek instantiated_with_wrong_types); 19834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return Node.getNumArgs() == N; 19844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 19854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 19864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the n'th argument of a call expression or a constructor 19874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// call expression. 19884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 19894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches y in x(y) 19902dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher = callExpr(hasArgument(0, declRefExpr()))) 199125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 19924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void x(int) { int y; x(y); } 199325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 19944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekAST_POLYMORPHIC_MATCHER_P2( 1995e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper hasArgument, unsigned, N, internal::Matcher<Expr>, InnerMatcher) { 1996e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper TOOLING_COMPILE_ASSERT((llvm::is_base_of<CallExpr, NodeType>::value || 1997e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper llvm::is_base_of<CXXConstructExpr, 19984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek NodeType>::value), 19994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek instantiated_with_wrong_types); 20004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (N < Node.getNumArgs() && 20014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches( 20024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek *Node.getArg(N)->IgnoreParenImpCasts(), Finder, Builder)); 20034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 20044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 2005425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// \brief Matches declaration statements that contain a specific number of 2006425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// declarations. 2007425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// 2008425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// Example: Given 200925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 2010425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// int a, b; 2011425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// int c; 2012425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// int d = 2, e; 201325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2014425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// declCountIs(2) 2015425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 2016425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam PanzerAST_MATCHER_P(DeclStmt, declCountIs, unsigned, N) { 2017217c484522926f9fc664ec3bfaf3cffe456244b0Benjamin Kramer return std::distance(Node.decl_begin(), Node.decl_end()) == (ptrdiff_t)N; 2018425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer} 2019425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer 2020425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// \brief Matches the n'th declaration of a declaration statement. 2021425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// 2022425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// Note that this does not work for global declarations because the AST 2023425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// breaks up multiple-declaration DeclStmt's into multiple single-declaration 2024425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// DeclStmt's. 2025425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// Example: Given non-global declarations 202625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 2027425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// int a, b = 0; 2028425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// int c; 2029425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// int d = 2, e; 203025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 20312dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declStmt(containsDeclaration( 20322dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// 0, varDecl(hasInitializer(anything())))) 2033425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// matches only 'int d = 2, e;', and 20342dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declStmt(containsDeclaration(1, varDecl())) 203525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 2036425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// matches 'int a, b = 0' as well as 'int d = 2, e;' 2037425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// but 'int c;' is not matched. 203825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2039425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam PanzerAST_MATCHER_P2(DeclStmt, containsDeclaration, unsigned, N, 2040425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer internal::Matcher<Decl>, InnerMatcher) { 2041425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer const unsigned NumDecls = std::distance(Node.decl_begin(), Node.decl_end()); 2042425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer if (N >= NumDecls) 2043425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer return false; 2044425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer DeclStmt::const_decl_iterator Iterator = Node.decl_begin(); 2045425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer std::advance(Iterator, N); 2046425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer return InnerMatcher.matches(**Iterator, Finder, Builder); 2047425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer} 2048425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer 20494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a constructor initializer. 20504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 20514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 205225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 20534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// struct Foo { 20544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Foo() : foo_(1) { } 20554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int foo_; 20564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// }; 205725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 20582dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything())))) 2059e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// record matches Foo, hasAnyConstructorInitializer matches foo_(1) 2060e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXConstructorDecl, hasAnyConstructorInitializer, 2061e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<CXXCtorInitializer>, InnerMatcher) { 2062054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek return matchesFirstInPointerRange(InnerMatcher, Node.init_begin(), 2063054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek Node.init_end(), Finder, Builder); 20644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 20654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 20664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the field declaration of a constructor initializer. 20674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 20684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 206925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 20704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// struct Foo { 20714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Foo() : foo_(1) { } 20724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int foo_; 20734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// }; 207425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 20752dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(has(constructorDecl(hasAnyConstructorInitializer( 20764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// forField(hasName("foo_")))))) 20774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches Foo 20784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with forField matching foo_ 2079e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXCtorInitializer, forField, 2080e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<FieldDecl>, InnerMatcher) { 2081e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const FieldDecl *NodeAsDecl = Node.getMember(); 20824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (NodeAsDecl != NULL && 20834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*NodeAsDecl, Finder, Builder)); 20844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 20854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 20864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the initializer expression of a constructor initializer. 20874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 20884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 208925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 20904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// struct Foo { 20914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Foo() : foo_(1) { } 20924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int foo_; 20934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// }; 209425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 20952dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(has(constructorDecl(hasAnyConstructorInitializer( 20964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// withInitializer(integerLiteral(equals(1))))))) 20974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches Foo 20984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with withInitializer matching (1) 2099e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXCtorInitializer, withInitializer, 2100e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Expr>, InnerMatcher) { 2101e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const Expr* NodeAsExpr = Node.getInit(); 21024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (NodeAsExpr != NULL && 21034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*NodeAsExpr, Finder, Builder)); 21044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 21054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 21064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a contructor initializer if it is explicitly written in 21074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// code (as opposed to implicitly added by the compiler). 21084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 21094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 211025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 21114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// struct Foo { 21124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Foo() { } 21134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Foo(int) : foo_("A") { } 21144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// string foo_; 21154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// }; 211625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 21172dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// constructorDecl(hasAnyConstructorInitializer(isWritten())) 21184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// will match Foo(int), but not Foo() 2119e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER(CXXCtorInitializer, isWritten) { 21204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return Node.isWritten(); 21214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 21224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 21234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a constructor declaration that has been implicitly added 21244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// by the compiler (eg. implicit default/copy constructors). 2125e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER(CXXConstructorDecl, isImplicit) { 21264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return Node.isImplicit(); 21274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 21284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 21294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches any argument of a call expression or a constructor call 21304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// expression. 21314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 21324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 213325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 21344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void x(int, int, int) { int y; x(1, y, 42); } 213525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 21362dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// callExpr(hasAnyArgument(declRefExpr())) 21374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches x(1, y, 42) 21384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with hasAnyArgument(...) 21394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matching y 2140054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek/// 2141054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek/// FIXME: Currently this will ignore parentheses and implicit casts on 2142054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek/// the argument before applying the inner matcher. We'll want to remove 2143054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek/// this to allow for greater control by the user once \c ignoreImplicit() 2144054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek/// has been implemented. 2145e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_POLYMORPHIC_MATCHER_P(hasAnyArgument, internal::Matcher<Expr>, 21464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher) { 2147e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper TOOLING_COMPILE_ASSERT((llvm::is_base_of<CallExpr, NodeType>::value || 2148e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper llvm::is_base_of<CXXConstructExpr, 21494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek NodeType>::value), 21504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek instantiated_with_wrong_types); 21514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek for (unsigned I = 0; I < Node.getNumArgs(); ++I) { 2152054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek BoundNodesTreeBuilder Result(*Builder); 2153054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek if (InnerMatcher.matches(*Node.getArg(I)->IgnoreParenImpCasts(), Finder, 2154054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek &Result)) { 2155054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek *Builder = Result; 21564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return true; 21574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek } 21584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek } 21594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return false; 21604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 21614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 21624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the n'th parameter of a function declaration. 21634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 21644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 216525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 21664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X { void f(int x) {} }; 216725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 21682dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// methodDecl(hasParameter(0, hasType(varDecl()))) 21694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches f(int x) {} 21704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with hasParameter(...) 21714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matching int x 2172e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P2(FunctionDecl, hasParameter, 2173e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper unsigned, N, internal::Matcher<ParmVarDecl>, 21744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher) { 21754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (N < Node.getNumParams() && 21764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches( 21774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek *Node.getParamDecl(N), Finder, Builder)); 21784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 21794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 21804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches any parameter of a function declaration. 21814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 21824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Does not match the 'this' parameter of a method. 21834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 21844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 218525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 21864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X { void f(int x, int y, int z) {} }; 218725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 21882dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// methodDecl(hasAnyParameter(hasName("y"))) 21894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches f(int x, int y, int z) {} 21904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with hasAnyParameter(...) 21914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matching int y 2192e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(FunctionDecl, hasAnyParameter, 2193e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<ParmVarDecl>, InnerMatcher) { 2194054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek return matchesFirstInPointerRange(InnerMatcher, Node.param_begin(), 2195054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek Node.param_end(), Finder, Builder); 21964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 21974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 219836e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// \brief Matches \c FunctionDecls that have a specific parameter count. 219936e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// 220036e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// Given 220136e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// \code 220236e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// void f(int i) {} 220336e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// void g(int i, int j) {} 220436e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// \endcode 220536e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// functionDecl(parameterCountIs(2)) 220636e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// matches g(int i, int j) {} 220736e29d6732814e958aea4b2f403cec63d7ed3116Daniel JasperAST_MATCHER_P(FunctionDecl, parameterCountIs, unsigned, N) { 220836e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper return Node.getNumParams() == N; 220936e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper} 221036e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper 2211e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches the return type of a function declaration. 2212e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 2213e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given: 221425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 2215e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// class X { int f() { return 1; } }; 221625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 22172dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// methodDecl(returns(asString("int"))) 2218e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches int f() { return 1; } 221925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekAST_MATCHER_P(FunctionDecl, returns, 222025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::Matcher<QualType>, InnerMatcher) { 222125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek return InnerMatcher.matches(Node.getResultType(), Finder, Builder); 2222e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 2223e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 22248cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper/// \brief Matches extern "C" function declarations. 22258cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper/// 22268cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper/// Given: 222725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 22288cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper/// extern "C" void f() {} 22298cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper/// extern "C" { void g() {} } 22308cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper/// void h() {} 223125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 22322dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// functionDecl(isExternC()) 22338cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper/// matches the declaration of f and g, but not the declaration h 22348cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel JasperAST_MATCHER(FunctionDecl, isExternC) { 22358cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper return Node.isExternC(); 22368cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper} 22378cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper 22386a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches the condition expression of an if statement, for loop, 22396a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// or conditional operator. 22404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 22414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches true (matcher = hasCondition(boolLiteral(equals(true)))) 224225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 22434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// if (true) {} 224425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2245e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_POLYMORPHIC_MATCHER_P(hasCondition, internal::Matcher<Expr>, 22464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher) { 22474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek TOOLING_COMPILE_ASSERT( 2248e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper (llvm::is_base_of<IfStmt, NodeType>::value) || 22496a12449ec8862211856447d3df4c082a346339f2Daniel Jasper (llvm::is_base_of<ForStmt, NodeType>::value) || 22506a12449ec8862211856447d3df4c082a346339f2Daniel Jasper (llvm::is_base_of<WhileStmt, NodeType>::value) || 22516a12449ec8862211856447d3df4c082a346339f2Daniel Jasper (llvm::is_base_of<DoStmt, NodeType>::value) || 2252e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper (llvm::is_base_of<ConditionalOperator, NodeType>::value), 22536a12449ec8862211856447d3df4c082a346339f2Daniel Jasper has_condition_requires_if_statement_conditional_operator_or_loop); 2254e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const Expr *const Condition = Node.getCond(); 22554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (Condition != NULL && 22564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*Condition, Finder, Builder)); 22574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 22584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 22594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the condition variable statement in an if statement. 22604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 22614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 226225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 22634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// if (A* a = GetAPointer()) {} 226425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 22654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// hasConditionVariableStatment(...) 22664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches 'A* a = GetAPointer()'. 2267e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(IfStmt, hasConditionVariableStatement, 2268e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<DeclStmt>, InnerMatcher) { 2269e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const DeclStmt* const DeclarationStatement = 22704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek Node.getConditionVariableDeclStmt(); 22714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return DeclarationStatement != NULL && 22724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*DeclarationStatement, Finder, Builder); 22734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 22744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 2275e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches the index expression of an array subscript expression. 2276e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 2277e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 227825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 2279e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// int i[5]; 2280e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// void f() { i[1] = 42; } 228125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2282e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// arraySubscriptExpression(hasIndex(integerLiteral())) 2283e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches \c i[1] with the \c integerLiteral() matching \c 1 2284e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ArraySubscriptExpr, hasIndex, 228525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::Matcher<Expr>, InnerMatcher) { 2286e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper if (const Expr* Expression = Node.getIdx()) 228725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek return InnerMatcher.matches(*Expression, Finder, Builder); 2288e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return false; 2289e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 2290e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 2291e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches the base expression of an array subscript expression. 2292e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 2293e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 229425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 2295e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// int i[5]; 2296e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// void f() { i[1] = 42; } 229725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 22982dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// arraySubscriptExpression(hasBase(implicitCastExpr( 22992dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// hasSourceExpression(declRefExpr())))) 23002dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// matches \c i[1] with the \c declRefExpr() matching \c i 2301e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ArraySubscriptExpr, hasBase, 230225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::Matcher<Expr>, InnerMatcher) { 2303e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper if (const Expr* Expression = Node.getBase()) 230425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek return InnerMatcher.matches(*Expression, Finder, Builder); 2305e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return false; 2306e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 2307e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 23086a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches a 'for', 'while', or 'do while' statement that has 23096a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// a given body. 23104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 23114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 231225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 23134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// for (;;) {} 231425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 23152dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// hasBody(compoundStmt()) 23164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches 'for (;;) {}' 23172dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// with compoundStmt() 23184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matching '{}' 23196a12449ec8862211856447d3df4c082a346339f2Daniel JasperAST_POLYMORPHIC_MATCHER_P(hasBody, internal::Matcher<Stmt>, 23206a12449ec8862211856447d3df4c082a346339f2Daniel Jasper InnerMatcher) { 23216a12449ec8862211856447d3df4c082a346339f2Daniel Jasper TOOLING_COMPILE_ASSERT( 23226a12449ec8862211856447d3df4c082a346339f2Daniel Jasper (llvm::is_base_of<DoStmt, NodeType>::value) || 23236a12449ec8862211856447d3df4c082a346339f2Daniel Jasper (llvm::is_base_of<ForStmt, NodeType>::value) || 23246a12449ec8862211856447d3df4c082a346339f2Daniel Jasper (llvm::is_base_of<WhileStmt, NodeType>::value), 23256a12449ec8862211856447d3df4c082a346339f2Daniel Jasper has_body_requires_for_while_or_do_statement); 2326e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const Stmt *const Statement = Node.getBody(); 23274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (Statement != NULL && 23284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*Statement, Finder, Builder)); 23294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 23304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 23314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches compound statements where at least one substatement matches 23324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// a given matcher. 23334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 23344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 233525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 23364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// { {}; 1+2; } 233725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 23382dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// hasAnySubstatement(compoundStmt()) 23394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches '{ {}; 1+2; }' 23402dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// with compoundStmt() 23414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matching '{}' 2342e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CompoundStmt, hasAnySubstatement, 2343e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Stmt>, InnerMatcher) { 2344054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek return matchesFirstInPointerRange(InnerMatcher, Node.body_begin(), 2345054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek Node.body_end(), Finder, Builder); 23464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 23474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 23484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Checks that a compound statement contains a specific number of 23494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// child statements. 23504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 23514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: Given 235225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 23534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// { for (;;) {} } 235425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 23552dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// compoundStmt(statementCountIs(0))) 23564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches '{}' 23574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// but does not match the outer compound statement. 2358e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CompoundStmt, statementCountIs, unsigned, N) { 23594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return Node.size() == N; 23604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 23614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 23624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches literals that are equal to the given value. 23634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 23644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches true (matcher = boolLiteral(equals(true))) 236525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 23664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// true 236725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2368297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// 2369297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// Usable as: Matcher<CharacterLiteral>, Matcher<CXXBoolLiteral>, 2370297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// Matcher<FloatingLiteral>, Matcher<IntegerLiteral> 23714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename ValueT> 23724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinternal::PolymorphicMatcherWithParam1<internal::ValueEqualsMatcher, ValueT> 23734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekequals(const ValueT &Value) { 23744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return internal::PolymorphicMatcherWithParam1< 23754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek internal::ValueEqualsMatcher, 23764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek ValueT>(Value); 23774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 23784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 23794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the operator Name of operator expressions (binary or 23804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// unary). 23814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 23824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 238325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 23844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// !(a || b) 238525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 23864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekAST_POLYMORPHIC_MATCHER_P(hasOperatorName, std::string, Name) { 23874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek TOOLING_COMPILE_ASSERT( 2388e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper (llvm::is_base_of<BinaryOperator, NodeType>::value) || 2389e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper (llvm::is_base_of<UnaryOperator, NodeType>::value), 23904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek has_condition_requires_if_statement_or_conditional_operator); 23914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return Name == Node.getOpcodeStr(Node.getOpcode()); 23924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 23934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 23944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the left hand side of binary operator expressions. 23954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 23964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a (matcher = binaryOperator(hasLHS())) 239725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 23984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// a || b 239925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2400e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(BinaryOperator, hasLHS, 2401e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Expr>, InnerMatcher) { 2402e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Expr *LeftHandSide = Node.getLHS(); 24034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (LeftHandSide != NULL && 24044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*LeftHandSide, Finder, Builder)); 24054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 24064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 24074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the right hand side of binary operator expressions. 24084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 24094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches b (matcher = binaryOperator(hasRHS())) 241025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 24114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// a || b 241225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2413e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(BinaryOperator, hasRHS, 2414e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Expr>, InnerMatcher) { 2415e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Expr *RightHandSide = Node.getRHS(); 24164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (RightHandSide != NULL && 24174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*RightHandSide, Finder, Builder)); 24184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 24194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 24204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if either the left hand side or the right hand side of a 24214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// binary operator matches. 2422e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<BinaryOperator> hasEitherOperand( 2423e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const internal::Matcher<Expr> &InnerMatcher) { 24244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return anyOf(hasLHS(InnerMatcher), hasRHS(InnerMatcher)); 24254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 24264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 24274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the operand of a unary operator matches. 24284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 24299158a5624154bc43bbbf059c07a2f7b2cd45c1a1Alexander Kornienko/// Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true)))) 243025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 24314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// !true 243225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2433e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UnaryOperator, hasUnaryOperand, 2434e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Expr>, InnerMatcher) { 2435e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const Expr * const Operand = Node.getSubExpr(); 24364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (Operand != NULL && 24374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*Operand, Finder, Builder)); 24384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 24394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 2440715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek/// \brief Matches if the cast's source expression matches the given matcher. 24414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 24424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: matches "a string" (matcher = 24432dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// hasSourceExpression(constructExpr())) 244425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 24454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class URL { URL(string); }; 24464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// URL url = "a string"; 2447715c9568ee5d75f25dab98229c87bcec880daf5dManuel KlimekAST_MATCHER_P(CastExpr, hasSourceExpression, 2448e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Expr>, InnerMatcher) { 2449e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const Expr* const SubExpression = Node.getSubExpr(); 24504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (SubExpression != NULL && 24514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*SubExpression, Finder, Builder)); 24524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 24534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 24544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches casts whose destination type matches a given matcher. 24554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 24564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// (Note: Clang's AST refers to other conversions as "casts" too, and calls 24574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// actual casts "explicit" casts.) 2458e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ExplicitCastExpr, hasDestinationType, 2459e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<QualType>, InnerMatcher) { 2460e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const QualType NodeType = Node.getTypeAsWritten(); 24614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return InnerMatcher.matches(NodeType, Finder, Builder); 24624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 24634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 24644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches implicit casts whose destination type matches a given 24654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matcher. 24664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 24674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: Unit test this matcher 2468e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ImplicitCastExpr, hasImplicitDestinationType, 2469e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<QualType>, InnerMatcher) { 24704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return InnerMatcher.matches(Node.getType(), Finder, Builder); 24714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 24724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 24734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the true branch expression of a conditional operator. 24744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 24754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a 247625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 24774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// condition ? a : b 247825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2479e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ConditionalOperator, hasTrueExpression, 2480e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Expr>, InnerMatcher) { 2481e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Expr *Expression = Node.getTrueExpr(); 24824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (Expression != NULL && 24834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*Expression, Finder, Builder)); 24844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 24854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 24864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the false branch expression of a conditional operator. 24874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 24884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches b 248925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 24904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// condition ? a : b 249125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2492e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ConditionalOperator, hasFalseExpression, 2493e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Expr>, InnerMatcher) { 2494e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Expr *Expression = Node.getFalseExpr(); 24954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (Expression != NULL && 24964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*Expression, Finder, Builder)); 24974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 24984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 24994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if a declaration has a body attached. 25004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 25014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches A, va, fa 250225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 25034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class A {}; 25044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class B; // Doesn't match, as it has no body. 25054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int va; 25064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// extern int vb; // Doesn't match, as it doesn't define the variable. 25074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void fa() {} 25084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void fb(); // Doesn't match, as it has no body. 250925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2510297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// 2511297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// Usable as: Matcher<TagDecl>, Matcher<VarDecl>, Matcher<FunctionDecl> 2512415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_POLYMORPHIC_MATCHER(isDefinition) { 2513415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek TOOLING_COMPILE_ASSERT( 2514415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek (llvm::is_base_of<TagDecl, NodeType>::value) || 2515415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek (llvm::is_base_of<VarDecl, NodeType>::value) || 2516415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek (llvm::is_base_of<FunctionDecl, NodeType>::value), 2517415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek is_definition_requires_isThisDeclarationADefinition_method); 2518415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return Node.isThisDeclarationADefinition(); 25194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 25204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 25214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the class declaration that the given method declaration 25224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// belongs to. 25234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 25244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: Generalize this for other kinds of declarations. 25254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: What other kind of declarations would we need to generalize 25264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// this to? 25274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 25284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches A() in the last line 25292dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher = constructExpr(hasDeclaration(methodDecl( 25304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// ofClass(hasName("A")))))) 253125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 25324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class A { 25334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// public: 25344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// A(); 25354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// }; 25364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// A a = A(); 253725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2538e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXMethodDecl, ofClass, 2539e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<CXXRecordDecl>, InnerMatcher) { 2540e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const CXXRecordDecl *Parent = Node.getParent(); 25414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (Parent != NULL && 25424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*Parent, Finder, Builder)); 25434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 25444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 25455771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \brief Matches if the given method declaration is virtual. 25465771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// 25475771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// Given 25485771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \code 25495771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// class A { 25505771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// public: 25515771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// virtual void x(); 25525771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// }; 25535771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \endcode 25545771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// matches A::x 25555771a2f0830228ac50e3473740e24d9dca67b54fEdwin VaneAST_MATCHER(CXXMethodDecl, isVirtual) { 25565771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane return Node.isVirtual(); 25575771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane} 25585771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane 255932a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// \brief Matches if the given method declaration is const. 256032a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// 256132a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// Given 256232a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// \code 256332a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// struct A { 256432a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// void foo() const; 256532a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// void bar(); 256632a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// }; 256732a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// \endcode 256832a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// 256932a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane/// methodDecl(isConst()) matches A::foo() but not A::bar() 257032a6ebc63900b85780328c337787bb7adad2bcabEdwin VaneAST_MATCHER(CXXMethodDecl, isConst) { 257132a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane return Node.isConst(); 257232a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane} 257332a6ebc63900b85780328c337787bb7adad2bcabEdwin Vane 25745771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \brief Matches if the given method declaration overrides another method. 25755771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// 25765771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// Given 25775771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \code 25785771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// class A { 25795771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// public: 25805771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// virtual void x(); 25815771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// }; 25825771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// class B : public A { 25835771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// public: 25845771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// virtual void x(); 25855771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// }; 25865771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// \endcode 25875771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane/// matches B::x 25885771a2f0830228ac50e3473740e24d9dca67b54fEdwin VaneAST_MATCHER(CXXMethodDecl, isOverride) { 25895771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane return Node.size_overridden_methods() > 0; 25905771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane} 25915771a2f0830228ac50e3473740e24d9dca67b54fEdwin Vane 25924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches member expressions that are called with '->' as opposed 25934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// to '.'. 25944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 25954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Member calls on the implicit this pointer match as called with '->'. 25964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 25974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 259825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 25994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Y { 26004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 26014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int a; 26024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// static int b; 26034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// }; 260425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 26052dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// memberExpr(isArrow()) 26064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches this->x, x, y.x, a, this->b 2607415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_MATCHER(MemberExpr, isArrow) { 2608415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return Node.isArrow(); 26094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 26104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 26116a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches QualType nodes that are of integer type. 26126a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// 26136a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// Given 261425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 26156a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// void a(int); 26166a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// void b(long); 26176a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// void c(double); 261825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 26192dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// functionDecl(hasAnyParameter(hasType(isInteger()))) 26206a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// matches "a(int)", "b(long)", but not "c(double)". 26216a12449ec8862211856447d3df4c082a346339f2Daniel JasperAST_MATCHER(QualType, isInteger) { 26226a12449ec8862211856447d3df4c082a346339f2Daniel Jasper return Node->isIntegerType(); 26236a12449ec8862211856447d3df4c082a346339f2Daniel Jasper} 26246a12449ec8862211856447d3df4c082a346339f2Daniel Jasper 2625e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches QualType nodes that are const-qualified, i.e., that 26264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// include "top-level" const. 26274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 26284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 262925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 26304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void a(int); 26314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void b(int const); 26324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void c(const int); 26334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void d(const int*); 26344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void e(int const) {}; 263525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 26362dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// functionDecl(hasAnyParameter(hasType(isConstQualified()))) 26374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches "void b(int const)", "void c(const int)" and 26384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// "void e(int const) {}". It does not match d as there 26394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// is no top-level const on the parameter type "const int *". 2640415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_MATCHER(QualType, isConstQualified) { 2641415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return Node.isConstQualified(); 26424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 26434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 26447b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// \brief Matches QualType nodes that have local CV-qualifiers attached to 26457b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// the node, not hidden within a typedef. 26467b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// 26477b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// Given 26487b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// \code 26497b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// typedef const int const_int; 26507b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// const_int i; 26517b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// int *const j; 26527b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// int *volatile k; 26537b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// int m; 26547b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// \endcode 26557b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// \c varDecl(hasType(hasLocalQualifiers())) matches only \c j and \c k. 26567b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane/// \c i is const-qualified but the qualifier is not local. 26577b69cd09440976d6b93a0db661a770b2337be8d2Edwin VaneAST_MATCHER(QualType, hasLocalQualifiers) { 26587b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane return Node.hasLocalQualifiers(); 26597b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane} 26607b69cd09440976d6b93a0db661a770b2337be8d2Edwin Vane 26614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a member expression where the member is matched by a 26624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// given matcher. 26634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 26644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 266525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 26664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// struct { int first, second; } first, second; 26674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int i(second.first); 26684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int j(first.second); 266925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 26702dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// memberExpr(member(hasName("first"))) 26714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches second.first 26724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// but not first.second (because the member name there is "second"). 2673e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(MemberExpr, member, 2674e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<ValueDecl>, InnerMatcher) { 26754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return InnerMatcher.matches(*Node.getMemberDecl(), Finder, Builder); 26764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 26774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 26784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a member expression where the object expression is 26794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matched by a given matcher. 26804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 26814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 268225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 26834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// struct X { int m; }; 26844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void f(X x) { x.m; m; } 268525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 26862dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X"))))))) 26874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches "x.m" and "m" 26884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with hasObjectExpression(...) 26894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matching "x" and the implicit object expression of "m" which has type X*. 2690e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(MemberExpr, hasObjectExpression, 2691e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Expr>, InnerMatcher) { 26924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return InnerMatcher.matches(*Node.getBase(), Finder, Builder); 26934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 26944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 2695e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches any using shadow declaration. 2696e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 2697e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 269825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 2699e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// namespace X { void b(); } 2700e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// using X::b; 270125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2702e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 2703e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches \code using X::b \endcode 2704e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UsingDecl, hasAnyUsingShadowDecl, 270525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::Matcher<UsingShadowDecl>, InnerMatcher) { 2706054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek return matchesFirstInPointerRange(InnerMatcher, Node.shadow_begin(), 2707054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek Node.shadow_end(), Finder, Builder); 2708e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 2709e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 2710e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches a using shadow declaration where the target declaration is 2711e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matched by the given matcher. 2712e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 2713e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 271425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 2715e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// namespace X { int a; void b(); } 2716e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// using X::a; 2717e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// using X::b; 271825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 27192dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 2720e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches \code using X::b \endcode 2721e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// but not \code using X::a \endcode 2722e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UsingShadowDecl, hasTargetDecl, 272325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::Matcher<NamedDecl>, InnerMatcher) { 272425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek return InnerMatcher.matches(*Node.getTargetDecl(), Finder, Builder); 2725e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 2726e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 27274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches template instantiations of function, class, or static 27284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// member variable template instantiations. 27294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 27304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 273125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 27324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// template <typename T> class X {}; class A {}; X<A> x; 273325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 27344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// or 273525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 27364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// template <typename T> class X {}; class A {}; template class X<A>; 273725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 27382dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(hasName("::X"), isTemplateInstantiation()) 27394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches the template instantiation of X<A>. 27404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 27414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// But given 274225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 274325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// template <typename T> class X {}; class A {}; 27444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// template <> class X<A> {}; X<A> x; 274525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 27462dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(hasName("::X"), isTemplateInstantiation()) 27474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// does not match, as X<A> is an explicit template specialization. 2748297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// 2749297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// Usable as: Matcher<FunctionDecl>, Matcher<VarDecl>, Matcher<CXXRecordDecl> 2750415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_POLYMORPHIC_MATCHER(isTemplateInstantiation) { 2751415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek TOOLING_COMPILE_ASSERT((llvm::is_base_of<FunctionDecl, NodeType>::value) || 2752415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek (llvm::is_base_of<VarDecl, NodeType>::value) || 2753415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek (llvm::is_base_of<CXXRecordDecl, NodeType>::value), 2754415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek requires_getTemplateSpecializationKind_method); 2755415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return (Node.getTemplateSpecializationKind() == TSK_ImplicitInstantiation || 2756415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek Node.getTemplateSpecializationKind() == 2757415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek TSK_ExplicitInstantiationDefinition); 27584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 27594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 27608456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// \brief Matches explicit template specializations of function, class, or 27618456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// static member variable template instantiations. 27628456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// 27638456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// Given 276425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 27658456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// template<typename T> void A(T t) { } 27668456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// template<> void A(int N) { } 276725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 27682dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// functionDecl(isExplicitTemplateSpecialization()) 27698456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// matches the specialization A<int>(). 277025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// 277125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Matcher<FunctionDecl>, Matcher<VarDecl>, Matcher<CXXRecordDecl> 2772415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_POLYMORPHIC_MATCHER(isExplicitTemplateSpecialization) { 2773415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek TOOLING_COMPILE_ASSERT((llvm::is_base_of<FunctionDecl, NodeType>::value) || 2774415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek (llvm::is_base_of<VarDecl, NodeType>::value) || 2775415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek (llvm::is_base_of<CXXRecordDecl, NodeType>::value), 2776415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek requires_getTemplateSpecializationKind_method); 2777415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return (Node.getTemplateSpecializationKind() == TSK_ExplicitSpecialization); 27788456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko} 27798456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko 2780ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches \c TypeLocs for which the given inner 2781ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// QualType-matcher matches. 2782ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasperinline internal::BindableMatcher<TypeLoc> loc( 2783ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper const internal::Matcher<QualType> &InnerMatcher) { 2784ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper return internal::BindableMatcher<TypeLoc>( 2785ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper new internal::TypeLocTypeMatcher(InnerMatcher)); 2786ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper} 2787ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2788ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches builtin Types. 2789ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2790ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2791ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2792ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// struct A {}; 2793ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// A a; 2794ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int b; 2795ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// float c; 2796ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// bool d; 2797ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2798ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// builtinType() 2799ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "int b", "float c" and "bool d" 2800ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(BuiltinType, builtinType); 2801ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2802ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches all kinds of arrays. 2803ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2804ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2805ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2806ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int a[] = { 2, 3 }; 2807ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int b[4]; 2808ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// void f() { int c[a[0]]; } 2809ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2810ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// arrayType() 2811ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "int a[]", "int b[4]" and "int c[a[0]]"; 2812ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(ArrayType, arrayType); 2813ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2814ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C99 complex types. 2815ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2816ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2817ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2818ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// _Complex float f; 2819ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2820ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// complexType() 2821ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "_Complex float f" 2822ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(ComplexType, complexType); 2823ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2824ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches arrays and C99 complex types that have a specific element 2825ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// type. 2826ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2827ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2828ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2829ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// struct A {}; 2830ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// A a[7]; 2831ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int b[7]; 2832ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2833ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// arrayType(hasElementType(builtinType())) 2834ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "int b[7]" 2835ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2836ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Usable as: Matcher<ArrayType>, Matcher<ComplexType> 2837ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPELOC_TRAVERSE_MATCHER(hasElementType, getElement); 2838ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2839ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C arrays with a specified constant size. 2840ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2841ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2842ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2843ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// void() { 2844ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int a[2]; 2845ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int b[] = { 2, 3 }; 2846ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int c[b[0]]; 2847ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// } 2848ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2849ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// constantArrayType() 2850ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "int a[2]" 2851ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(ConstantArrayType, constantArrayType); 2852ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2853ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches \c ConstantArrayType nodes that have the specified size. 2854ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2855ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2856ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2857ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int a[42]; 2858ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int b[2 * 21]; 2859ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int c[41], d[43]; 2860ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2861ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// constantArrayType(hasSize(42)) 2862ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "int a[42]" and "int b[2 * 21]" 2863ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_MATCHER_P(ConstantArrayType, hasSize, unsigned, N) { 2864ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper return Node.getSize() == N; 2865ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper} 2866ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2867ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C++ arrays whose size is a value-dependent expression. 2868ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2869ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2870ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2871ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// template<typename T, int Size> 2872ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// class array { 2873ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// T data[Size]; 2874ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// }; 2875ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2876ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// dependentSizedArrayType 2877ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "T data[Size]" 2878ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(DependentSizedArrayType, dependentSizedArrayType); 2879ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2880ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C arrays with unspecified size. 2881ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2882ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2883ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2884ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int a[] = { 2, 3 }; 2885ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int b[42]; 2886ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// void f(int c[]) { int d[a[0]]; }; 2887ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2888ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// incompleteArrayType() 2889ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "int a[]" and "int c[]" 2890ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(IncompleteArrayType, incompleteArrayType); 2891ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2892ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C arrays with a specified size that is not an 2893ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// integer-constant-expression. 2894ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2895ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2896ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2897ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// void f() { 2898ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int a[] = { 2, 3 } 2899ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int b[42]; 2900ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int c[a[0]]; 2901ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2902ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// variableArrayType() 2903ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "int c[a[0]]" 2904ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(VariableArrayType, variableArrayType); 2905ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2906ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches \c VariableArrayType nodes that have a specific size 2907ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// expression. 2908ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2909ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2910ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2911ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// void f(int b) { 2912ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int a[b]; 2913ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// } 2914ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2915ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 2916ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// varDecl(hasName("b"))))))) 2917ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "int a[b]" 2918ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_MATCHER_P(VariableArrayType, hasSizeExpr, 2919ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper internal::Matcher<Expr>, InnerMatcher) { 2920ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper return InnerMatcher.matches(*Node.getSizeExpr(), Finder, Builder); 2921ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper} 2922ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2923ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches atomic types. 2924ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2925ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2926ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2927ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// _Atomic(int) i; 2928ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2929ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// atomicType() 2930ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "_Atomic(int) i" 2931ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(AtomicType, atomicType); 2932ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2933ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches atomic types with a specific value type. 2934ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2935ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2936ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2937ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// _Atomic(int) i; 2938ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// _Atomic(float) f; 2939ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2940ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// atomicType(hasValueType(isInteger())) 2941ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "_Atomic(int) i" 2942ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2943ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Usable as: Matcher<AtomicType> 2944ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPELOC_TRAVERSE_MATCHER(hasValueType, getValue); 2945ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2946ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches types nodes representing C++11 auto types. 2947ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2948ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given: 2949ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2950ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// auto n = 4; 2951ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int v[] = { 2, 3 } 2952ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// for (auto i : v) { } 2953ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2954ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// autoType() 2955ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "auto n" and "auto i" 2956ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(AutoType, autoType); 2957ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2958ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches \c AutoType nodes where the deduced type is a specific type. 2959ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2960ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Note: There is no \c TypeLoc for the deduced type and thus no 2961ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \c getDeducedLoc() matcher. 2962ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2963ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2964ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2965ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// auto a = 1; 2966ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// auto b = 2.0; 2967ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2968ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// autoType(hasDeducedType(isInteger())) 2969ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "auto a" 2970ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2971ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Usable as: Matcher<AutoType> 2972ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_TRAVERSE_MATCHER(hasDeducedType, getDeducedType); 2973ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2974a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \brief Matches \c FunctionType nodes. 2975a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// 2976a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// Given 2977a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \code 2978a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// int (*f)(int); 2979a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// void g(); 2980a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \endcode 2981a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// functionType() 2982a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// matches "int (*f)(int)" and the type of "g". 2983a267cf6f87dc695143d65fc61ec1744564f55932Daniel JasperAST_TYPE_MATCHER(FunctionType, functionType); 2984a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper 298588be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \brief Matches \c ParenType nodes. 298688be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// 298788be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// Given 298888be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \code 298988be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// int (*ptr_to_array)[4]; 299088be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// int *array_of_ptrs[4]; 299188be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \endcode 299288be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// 299388be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \c varDecl(hasType(pointsTo(parenType()))) matches \c ptr_to_array but not 299488be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \c array_of_ptrs. 299588be2fdec7a1375bc729a6499629532e7872f11aEdwin VaneAST_TYPE_MATCHER(ParenType, parenType); 299688be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane 299788be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \brief Matches \c ParenType nodes where the inner type is a specific type. 299888be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// 299988be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// Given 300088be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \code 300188be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// int (*ptr_to_array)[4]; 300288be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// int (*ptr_to_func)(int); 300388be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \endcode 300488be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// 300588be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \c varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 300688be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// \c ptr_to_func but not \c ptr_to_array. 300788be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// 300888be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane/// Usable as: Matcher<ParenType> 300988be2fdec7a1375bc729a6499629532e7872f11aEdwin VaneAST_TYPE_TRAVERSE_MATCHER(innerType, getInnerType); 301088be2fdec7a1375bc729a6499629532e7872f11aEdwin Vane 3011ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches block pointer types, i.e. types syntactically represented as 3012ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// "void (^)(int)". 3013ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 3014ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// The \c pointee is always required to be a \c FunctionType. 3015ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(BlockPointerType, blockPointerType); 3016ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 3017ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches member pointer types. 3018ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 3019ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 3020ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// struct A { int i; } 3021ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// A::* ptr = A::i; 3022ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 3023ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// memberPointerType() 3024ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "A::* ptr" 3025ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(MemberPointerType, memberPointerType); 3026ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 3027ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches pointer types. 3028ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 3029ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 3030ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 3031ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int *a; 3032ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int &b = *a; 3033ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int c = 5; 3034ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 3035ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// pointerType() 3036ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "int *a" 3037ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(PointerType, pointerType); 3038ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 3039f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \brief Matches both lvalue and rvalue reference types. 3040ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 3041ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 3042ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 3043ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int *a; 3044ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int &b = *a; 3045f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// int &&c = 1; 3046f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// auto &d = b; 3047f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// auto &&e = c; 3048f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// auto &&f = 2; 3049f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// int g = 5; 3050ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 3051f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// 3052f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \c referenceType() matches the types of \c b, \c c, \c d, \c e, and \c f. 3053ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(ReferenceType, referenceType); 3054ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 3055f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \brief Matches lvalue reference types. 3056f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// 3057f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// Given: 3058f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \code 3059f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// int *a; 3060f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// int &b = *a; 3061f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// int &&c = 1; 3062f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// auto &d = b; 3063f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// auto &&e = c; 3064f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// auto &&f = 2; 3065f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// int g = 5; 3066f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \endcode 3067f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// 3068f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \c lValueReferenceType() matches the types of \c b, \c d, and \c e. \c e is 3069f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// matched since the type is deduced as int& by reference collapsing rules. 3070f4b48042724d2253d0426cadcb93e24eeb47e264Edwin VaneAST_TYPE_MATCHER(LValueReferenceType, lValueReferenceType); 3071f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane 3072f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \brief Matches rvalue reference types. 3073f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// 3074f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// Given: 3075f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \code 3076f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// int *a; 3077f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// int &b = *a; 3078f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// int &&c = 1; 3079f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// auto &d = b; 3080f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// auto &&e = c; 3081f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// auto &&f = 2; 3082f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// int g = 5; 3083f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \endcode 3084f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// 3085f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// \c rValueReferenceType() matches the types of \c c and \c f. \c e is not 3086f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane/// matched as it is deduced to int& by reference collapsing rules. 3087f4b48042724d2253d0426cadcb93e24eeb47e264Edwin VaneAST_TYPE_MATCHER(RValueReferenceType, rValueReferenceType); 3088f4b48042724d2253d0426cadcb93e24eeb47e264Edwin Vane 3089ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Narrows PointerType (and similar) matchers to those where the 3090ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \c pointee matches a given matcher. 3091ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 3092ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 3093ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 3094ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int *a; 3095ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int const *b; 3096ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// float const *f; 3097ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 3098ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// pointerType(pointee(isConstQualified(), isInteger())) 3099ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "int const *b" 3100ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 3101ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Usable as: Matcher<BlockPointerType>, Matcher<MemberPointerType>, 3102ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Matcher<PointerType>, Matcher<ReferenceType> 3103ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPELOC_TRAVERSE_MATCHER(pointee, getPointee); 3104ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 3105ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches typedef types. 3106ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 3107ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 3108ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 3109ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// typedef int X; 3110ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 3111ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// typedefType() 3112ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "typedef int X" 3113ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(TypedefType, typedefType); 3114ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 31153abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// \brief Matches template specialization types. 31163abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// 31173abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// Given 31183abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// \code 31193abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// template <typename T> 31203abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// class C { }; 31213abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// 31223abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// template class C<int>; // A 31233abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// C<char> var; // B 31243abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// \code 31253abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// 31263abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// \c templateSpecializationType() matches the type of the explicit 31273abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane/// instantiation in \c A and the type of the variable declaration in \c B. 31283abf77872ca6c520903f9174cf6cd89a50df2714Edwin VaneAST_TYPE_MATCHER(TemplateSpecializationType, templateSpecializationType); 31293abf77872ca6c520903f9174cf6cd89a50df2714Edwin Vane 3130742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \brief Matches record types (e.g. structs, classes). 3131742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// 3132742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Given 3133742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code 3134742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// class C {}; 3135742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// struct S {}; 3136742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// 3137742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// C c; 3138742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// S s; 3139742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code 3140742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// 3141742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c recordType() matches the type of the variable declarations of both \c c 3142742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// and \c s. 3143742d9e77e32f014194679575c97c6bb4fd0998c4Edwin VaneAST_TYPE_MATCHER(RecordType, recordType); 3144742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane 3145742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \brief Matches types specified with an elaborated type keyword or with a 3146742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// qualified name. 3147742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// 3148742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Given 3149742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code 3150742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// namespace N { 3151742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// namespace M { 3152742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// class D {}; 3153742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// } 3154742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// } 3155742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// class C {}; 3156742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// 3157742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// class C c; 3158742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// N::M::D d; 3159742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code 3160742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// 3161742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c elaboratedType() matches the type of the variable declarations of both 3162742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c c and \c d. 3163742d9e77e32f014194679575c97c6bb4fd0998c4Edwin VaneAST_TYPE_MATCHER(ElaboratedType, elaboratedType); 3164742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane 3165742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \brief Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 3166aec89ac22e1876bb1cfff9062c882a622bc84510Edwin Vane/// matches \c InnerMatcher if the qualifier exists. 3167742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// 3168742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Given 3169742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code 3170742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// namespace N { 3171742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// namespace M { 3172742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// class D {}; 3173742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// } 3174742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// } 3175742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// N::M::D d; 3176742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code 3177742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// 3178742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 3179742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// matches the type of the variable declaration of \c d. 3180742d9e77e32f014194679575c97c6bb4fd0998c4Edwin VaneAST_MATCHER_P(ElaboratedType, hasQualifier, 3181742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane internal::Matcher<NestedNameSpecifier>, InnerMatcher) { 3182aec89ac22e1876bb1cfff9062c882a622bc84510Edwin Vane if (const NestedNameSpecifier *Qualifier = Node.getQualifier()) 3183aec89ac22e1876bb1cfff9062c882a622bc84510Edwin Vane return InnerMatcher.matches(*Qualifier, Finder, Builder); 3184aec89ac22e1876bb1cfff9062c882a622bc84510Edwin Vane 3185aec89ac22e1876bb1cfff9062c882a622bc84510Edwin Vane return false; 3186742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane} 3187742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane 3188742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \brief Matches ElaboratedTypes whose named type matches \c InnerMatcher. 3189742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// 3190742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Given 3191742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code 3192742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// namespace N { 3193742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// namespace M { 3194742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// class D {}; 3195742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// } 3196742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// } 3197742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// N::M::D d; 3198742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code 3199742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// 3200742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c elaboratedType(namesType(recordType( 3201742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 3202742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// declaration of \c d. 3203742d9e77e32f014194679575c97c6bb4fd0998c4Edwin VaneAST_MATCHER_P(ElaboratedType, namesType, internal::Matcher<QualType>, 3204742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane InnerMatcher) { 3205742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane return InnerMatcher.matches(Node.getNamedType(), Finder, Builder); 3206742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane} 3207742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane 3208742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \brief Matches declarations whose declaration context, interpreted as a 3209742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Decl, matches \c InnerMatcher. 3210742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// 3211742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// Given 3212742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code 3213742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// namespace N { 3214742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// namespace M { 3215742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// class D {}; 3216742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// } 3217742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// } 3218742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \code 3219742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// 3220742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// \c recordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 3221742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane/// declaration of \c class \c D. 3222742d9e77e32f014194679575c97c6bb4fd0998c4Edwin VaneAST_MATCHER_P(Decl, hasDeclContext, internal::Matcher<Decl>, InnerMatcher) { 3223742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane return InnerMatcher.matches(*Decl::castFromDeclContext(Node.getDeclContext()), 3224742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane Finder, Builder); 3225742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane} 3226742d9e77e32f014194679575c97c6bb4fd0998c4Edwin Vane 3227a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Matches nested name specifiers. 3228a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// 3229a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// Given 3230a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \code 3231a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// namespace ns { 3232a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// struct A { static void f(); }; 3233a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// void A::f() {} 3234a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// void g() { A::f(); } 3235a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// } 3236a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// ns::A a; 3237a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \endcode 3238a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifier() 3239a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// matches "ns::" and both "A::" 3240a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasperconst internal::VariadicAllOfMatcher<NestedNameSpecifier> nestedNameSpecifier; 3241a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper 3242a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Same as \c nestedNameSpecifier but matches \c NestedNameSpecifierLoc. 3243a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasperconst internal::VariadicAllOfMatcher< 3244a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper NestedNameSpecifierLoc> nestedNameSpecifierLoc; 3245a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper 3246a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Matches \c NestedNameSpecifierLocs for which the given inner 3247a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// NestedNameSpecifier-matcher matches. 3248a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasperinline internal::BindableMatcher<NestedNameSpecifierLoc> loc( 3249a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper const internal::Matcher<NestedNameSpecifier> &InnerMatcher) { 3250a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper return internal::BindableMatcher<NestedNameSpecifierLoc>( 3251a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper new internal::LocMatcher<NestedNameSpecifierLoc, NestedNameSpecifier>( 3252a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper InnerMatcher)); 3253a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper} 3254a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper 3255a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Matches nested name specifiers that specify a type matching the 3256a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// given \c QualType matcher without qualifiers. 3257a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// 3258a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// Given 3259a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \code 3260a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// struct A { struct B { struct C {}; }; }; 3261a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// A::B::C c; 3262a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \endcode 3263a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A"))))) 3264a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// matches "A::" 3265a7564433191601cb8851196b8dde39392c9c05eeDaniel JasperAST_MATCHER_P(NestedNameSpecifier, specifiesType, 3266a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper internal::Matcher<QualType>, InnerMatcher) { 3267a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper if (Node.getAsType() == NULL) 3268a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper return false; 3269a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper return InnerMatcher.matches(QualType(Node.getAsType(), 0), Finder, Builder); 3270a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper} 3271a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper 3272ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches nested name specifier locs that specify a type matching the 3273ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// given \c TypeLoc. 3274ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 3275ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 3276ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 3277ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// struct A { struct B { struct C {}; }; }; 3278ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// A::B::C c; 3279ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 3280ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 3281ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// hasDeclaration(recordDecl(hasName("A"))))))) 3282ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "A::" 3283ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_MATCHER_P(NestedNameSpecifierLoc, specifiesTypeLoc, 3284ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper internal::Matcher<TypeLoc>, InnerMatcher) { 3285ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper return InnerMatcher.matches(Node.getTypeLoc(), Finder, Builder); 3286ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper} 3287ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 3288ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches on the prefix of a \c NestedNameSpecifier. 3289a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// 3290a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// Given 3291a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \code 3292a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// struct A { struct B { struct C {}; }; }; 3293a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// A::B::C c; 3294a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \endcode 3295a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 3296ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "A::" 3297415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_MATCHER_P_OVERLOAD(NestedNameSpecifier, hasPrefix, 3298415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek internal::Matcher<NestedNameSpecifier>, InnerMatcher, 3299415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek 0) { 3300415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek NestedNameSpecifier *NextNode = Node.getPrefix(); 3301415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek if (NextNode == NULL) 3302415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return false; 3303415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return InnerMatcher.matches(*NextNode, Finder, Builder); 3304ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper} 3305ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 3306ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches on the prefix of a \c NestedNameSpecifierLoc. 3307ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 3308ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 3309ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 3310ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// struct A { struct B { struct C {}; }; }; 3311ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// A::B::C c; 3312ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 3313a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 3314ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "A::" 3315415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_MATCHER_P_OVERLOAD(NestedNameSpecifierLoc, hasPrefix, 3316415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek internal::Matcher<NestedNameSpecifierLoc>, InnerMatcher, 3317415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek 1) { 3318415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek NestedNameSpecifierLoc NextNode = Node.getPrefix(); 3319415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek if (!NextNode) 3320415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return false; 3321415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return InnerMatcher.matches(NextNode, Finder, Builder); 3322ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper} 3323a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper 3324a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Matches nested name specifiers that specify a namespace matching the 3325a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// given namespace matcher. 3326a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// 3327a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// Given 3328a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \code 3329a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// namespace ns { struct A {}; } 3330a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// ns::A a; 3331a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \endcode 3332a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 3333a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// matches "ns::" 3334a7564433191601cb8851196b8dde39392c9c05eeDaniel JasperAST_MATCHER_P(NestedNameSpecifier, specifiesNamespace, 3335a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper internal::Matcher<NamespaceDecl>, InnerMatcher) { 3336a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper if (Node.getAsNamespace() == NULL) 3337a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper return false; 3338a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper return InnerMatcher.matches(*Node.getAsNamespace(), Finder, Builder); 3339a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper} 3340a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper 3341fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \brief Overloads for the \c equalsNode matcher. 3342fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// FIXME: Implement for other node types. 3343fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// @{ 3344fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek 3345fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \brief Matches if a node equals another node. 3346fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// 3347fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \c Decl has pointer identity in the AST. 3348fa37c5ca61af275a329386407e58cf70f4d9f596Manuel KlimekAST_MATCHER_P_OVERLOAD(Decl, equalsNode, Decl*, Other, 0) { 3349fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek return &Node == Other; 3350fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek} 3351fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \brief Matches if a node equals another node. 3352fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// 3353fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \c Stmt has pointer identity in the AST. 3354fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// 3355fa37c5ca61af275a329386407e58cf70f4d9f596Manuel KlimekAST_MATCHER_P_OVERLOAD(Stmt, equalsNode, Stmt*, Other, 1) { 3356fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek return &Node == Other; 3357fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek} 3358fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek 3359fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// @} 3360fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek 3361acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \brief Matches each case or default statement belonging to the given switch 3362acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// statement. This matcher may produce multiple matches. 3363acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// 3364acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// Given 3365acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \code 3366acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 3367acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \endcode 3368acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 3369acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// matches four times, with "c" binding each of "case 1:", "case 2:", 3370acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// "case 3:" and "case 4:", and "s" respectively binding "switch (1)", 3371acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// "switch (1)", "switch (2)" and "switch (2)". 3372acf02715ab1aa1e5a791f20e0d1ca217af256823Peter CollingbourneAST_MATCHER_P(SwitchStmt, forEachSwitchCase, internal::Matcher<SwitchCase>, 3373acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne InnerMatcher) { 3374054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek BoundNodesTreeBuilder Result; 3375acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne // FIXME: getSwitchCaseList() does not necessarily guarantee a stable 3376acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne // iteration order. We should use the more general iterating matchers once 3377acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne // they are capable of expressing this matcher (for example, it should ignore 3378acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne // case statements belonging to nested switch statements). 3379acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne bool Matched = false; 3380acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne for (const SwitchCase *SC = Node.getSwitchCaseList(); SC; 3381acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne SC = SC->getNextSwitchCase()) { 3382054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek BoundNodesTreeBuilder CaseBuilder(*Builder); 3383acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne bool CaseMatched = InnerMatcher.matches(*SC, Finder, &CaseBuilder); 3384acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne if (CaseMatched) { 3385acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne Matched = true; 3386054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek Result.addMatch(CaseBuilder); 3387acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne } 3388acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne } 3389054d049174eb1ec8e93a4a0831c0d8caac00cb3aManuel Klimek *Builder = Result; 3390acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne return Matched; 3391acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne} 3392acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne 3393acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \brief If the given case statement does not use the GNU case range 3394acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// extension, matches the constant given in the statement. 3395acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// 3396acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// Given 3397acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \code 3398acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// switch (1) { case 1: case 1+1: case 3 ... 4: ; } 3399acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// \endcode 3400acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// caseStmt(hasCaseConstant(integerLiteral())) 3401acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne/// matches "case 1:" 3402acf02715ab1aa1e5a791f20e0d1ca217af256823Peter CollingbourneAST_MATCHER_P(CaseStmt, hasCaseConstant, internal::Matcher<Expr>, 3403acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne InnerMatcher) { 3404acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne if (Node.getRHS()) 3405acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne return false; 3406acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne 3407acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne return InnerMatcher.matches(*Node.getLHS(), Finder, Builder); 3408acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne} 3409acf02715ab1aa1e5a791f20e0d1ca217af256823Peter Collingbourne 34104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} // end namespace ast_matchers 34114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} // end namespace clang 34124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 34134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek#endif // LLVM_CLANG_AST_MATCHERS_AST_MATCHERS_H 3414