ASTMatchers.h revision 7f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7
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 954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek friend class internal::BoundNodesTree; 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 1324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinline internal::PolymorphicMatcherWithParam0<internal::TrueMatcher> anything() { 1334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return internal::PolymorphicMatcherWithParam0<internal::TrueMatcher>(); 1344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 1354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 136715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek/// \brief Matches declarations. 137715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek/// 138715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek/// Examples matches \c X, \c C, and the friend declaration inside \c C; 139715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek/// \code 140715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek/// void X(); 141715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek/// class C { 142715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek/// friend X; 143715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek/// }; 144715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek/// \endcode 14506b247f0ffb69854e32150c80f347a9376d3709bManuel Klimekconst internal::VariadicAllOfMatcher<Decl> decl; 146715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek 1474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a declaration of anything that could have a name. 1484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 14925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Example matches \c X, \c S, the anonymous union type, \c i, and \c U; 15025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// typedef int X; 1524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// struct S { 1534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// union { 1544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int i; 1554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// } U; 1564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// }; 15725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1582dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, NamedDecl> namedDecl; 1594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 1604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches C++ class declarations. 1614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 16225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Example matches \c X, \c Z 16325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X; 1654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// template<class T> class Z {}; 16625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 168e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Decl, 1692dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXRecordDecl> recordDecl; 170e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 1718456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// \brief Matches C++ class template declarations. 1728456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// 17325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Example matches \c Z 17425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1758456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// template<class T> class Z {}; 17625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1778456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenkoconst internal::VariadicDynCastAllOfMatcher< 1788456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko Decl, 1792dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper ClassTemplateDecl> classTemplateDecl; 1808456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko 181e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches C++ class template specializations. 182e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 183e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 18425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 185e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// template<typename T> class A {}; 186e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// template<> class A<double> {}; 187e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// A<int> a; 18825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1892dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// classTemplateSpecializationDecl() 190e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches the specializations \c A<int> and \c A<double> 191e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher< 192e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Decl, 1932dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper ClassTemplateSpecializationDecl> classTemplateSpecializationDecl; 194e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 195e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches classTemplateSpecializations that have at least one 19625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// TemplateArgument matching the given InnerMatcher. 197e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 198e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 19925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 200e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// template<typename T> class A {}; 201e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// template<> class A<double> {}; 202e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// A<int> a; 20325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2042dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// classTemplateSpecializationDecl(hasAnyTemplateArgument( 205e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// refersToType(asString("int")))) 206e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches the specialization \c A<int> 207e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ClassTemplateSpecializationDecl, hasAnyTemplateArgument, 20825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::Matcher<TemplateArgument>, InnerMatcher) { 209e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const TemplateArgumentList &List = Node.getTemplateArgs(); 210e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper for (unsigned i = 0; i < List.size(); ++i) { 21125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek if (InnerMatcher.matches(List.get(i), Finder, Builder)) 212e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return true; 213e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper } 214e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return false; 215e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 216e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 217089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// \brief Matches expressions that match InnerMatcher after any implicit casts 218089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// are stripped off. 219089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// 220089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Parentheses and explicit casts are not discarded. 221089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Given 22225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 223089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// int arr[5]; 224089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// int a = 0; 225089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// char b = 0; 226089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// const int c = a; 227089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// int *d = arr; 228089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// long e = (long) 0l; 22925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 230089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// The matchers 23125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 2322dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 2332dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 23425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 235089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// would match the declarations for a, b, c, and d, but not e. 23625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// While 23725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 2382dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// varDecl(hasInitializer(integerLiteral())) 2392dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// varDecl(hasInitializer(declRefExpr())) 24025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 241089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// only match the declarations for b, c, and d. 242089e5b3bf2e57da0173b170ad501867b43395385Sam PanzerAST_MATCHER_P(Expr, ignoringImpCasts, 243089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer internal::Matcher<Expr>, InnerMatcher) { 244089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer return InnerMatcher.matches(*Node.IgnoreImpCasts(), Finder, Builder); 245089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer} 246089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer 247089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// \brief Matches expressions that match InnerMatcher after parentheses and 248089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// casts are stripped off. 249089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// 250089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Implicit and non-C Style casts are also discarded. 251089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Given 25225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 253089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// int a = 0; 254089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// char b = (0); 255089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// void* c = reinterpret_cast<char*>(0); 256089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// char d = char(0); 25725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 258089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// The matcher 2592dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 260089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// would match the declarations for a, b, c, and d. 261089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// while 2622dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// varDecl(hasInitializer(integerLiteral())) 263089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// only match the declaration for a. 264089e5b3bf2e57da0173b170ad501867b43395385Sam PanzerAST_MATCHER_P(Expr, ignoringParenCasts, internal::Matcher<Expr>, InnerMatcher) { 265089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer return InnerMatcher.matches(*Node.IgnoreParenCasts(), Finder, Builder); 266089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer} 267089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer 268089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// \brief Matches expressions that match InnerMatcher after implicit casts and 269089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// parentheses are stripped off. 270089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// 271089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Explicit casts are not discarded. 272089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Given 27325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 274089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// int arr[5]; 275089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// int a = 0; 276089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// char b = (0); 277089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// const int c = a; 278089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// int *d = (arr); 279089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// long e = ((long) 0l); 28025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 281089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// The matchers 2822dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 2832dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 284089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// would match the declarations for a, b, c, and d, but not e. 285089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// while 2862dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// varDecl(hasInitializer(integerLiteral())) 2872dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// varDecl(hasInitializer(declRefExpr())) 288089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// would only match the declaration for a. 289089e5b3bf2e57da0173b170ad501867b43395385Sam PanzerAST_MATCHER_P(Expr, ignoringParenImpCasts, 290089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer internal::Matcher<Expr>, InnerMatcher) { 291089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer return InnerMatcher.matches(*Node.IgnoreParenImpCasts(), Finder, Builder); 292089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer} 293089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer 294e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches classTemplateSpecializations where the n'th TemplateArgument 29525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// matches the given InnerMatcher. 296e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 297e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 29825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 299e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// template<typename T, typename U> class A {}; 300e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// A<bool, int> b; 301e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// A<int, bool> c; 30225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 3032dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// classTemplateSpecializationDecl(hasTemplateArgument( 304e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 1, refersToType(asString("int")))) 305e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches the specialization \c A<bool, int> 306e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P2(ClassTemplateSpecializationDecl, hasTemplateArgument, 30725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek unsigned, N, internal::Matcher<TemplateArgument>, InnerMatcher) { 308e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const TemplateArgumentList &List = Node.getTemplateArgs(); 309e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper if (List.size() <= N) 310e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return false; 31125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek return InnerMatcher.matches(List.get(N), Finder, Builder); 312e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 313e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 314e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches a TemplateArgument that refers to a certain type. 315e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 316e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 31725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 318e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// struct X {}; 319e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// template<typename T> struct A {}; 320e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// A<X> a; 32125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 3222dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// classTemplateSpecializationDecl(hasAnyTemplateArgument( 323e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// refersToType(class(hasName("X"))))) 324e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches the specialization \c A<X> 325e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(TemplateArgument, refersToType, 32625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::Matcher<QualType>, InnerMatcher) { 327e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper if (Node.getKind() != TemplateArgument::Type) 328e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return false; 32925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek return InnerMatcher.matches(Node.getAsType(), Finder, Builder); 330e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 331e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 332e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches a TemplateArgument that refers to a certain declaration. 333e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 334e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 33525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 336e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// template<typename T> struct A {}; 337e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// struct B { B* next; }; 338e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// A<&B::next> a; 33925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 3402dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// classTemplateSpecializationDecl(hasAnyTemplateArgument( 3412dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// refersToDeclaration(fieldDecl(hasName("next")))) 3422dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// matches the specialization \c A<&B::next> with \c fieldDecl(...) matching 343e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \c B::next 344e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(TemplateArgument, refersToDeclaration, 34525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::Matcher<Decl>, InnerMatcher) { 346aaa8e45b8e392a1f1b7498e2f00c6ed66d41119aDaniel Jasper if (Node.getKind() == TemplateArgument::Declaration) 347aaa8e45b8e392a1f1b7498e2f00c6ed66d41119aDaniel Jasper return InnerMatcher.matches(*Node.getAsDecl(), Finder, Builder); 348e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return false; 349e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 3504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 3514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches C++ constructor declarations. 3524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 3534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches Foo::Foo() and Foo::Foo(int) 35425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 3554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Foo { 3564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// public: 3574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Foo(); 3584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Foo(int); 3594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int DoSomething(); 3604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// }; 36125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 3624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 363e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Decl, 3642dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXConstructorDecl> constructorDecl; 365e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 366e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches explicit C++ destructor declarations. 367e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 368e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Example matches Foo::~Foo() 36925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 370e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// class Foo { 371e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// public: 372e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// virtual ~Foo(); 373e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// }; 37425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 3752dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher< 3762dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper Decl, 3772dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXDestructorDecl> destructorDecl; 378e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 379e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches enum declarations. 380e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 381e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Example matches X 38225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 383e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// enum X { 384e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// A, B, C 385e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// }; 38625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 387e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, EnumDecl> enumDecl; 388e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 389e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches enum constants. 390e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 391e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Example matches A, B, C 39225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 393e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// enum X { 394e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// A, B, C 395e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// }; 39625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 397e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher< 398e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Decl, 3992dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper EnumConstantDecl> enumConstantDecl; 4004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 4014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches method declarations. 4024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 4034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches y 40425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 4054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X { void y() }; 40625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 4072dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, CXXMethodDecl> methodDecl; 4084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 4094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches variable declarations. 4104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 4114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Note: this does not match declarations of member variables, which are 4124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// "field" declarations in Clang parlance. 4134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 4144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a 41525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 4164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int a; 41725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 4182dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, VarDecl> varDecl; 4194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 4204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches field declarations. 4214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 4224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 42325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 4244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X { int m; }; 42525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 4262dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// fieldDecl() 4274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches 'm'. 4282dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, FieldDecl> fieldDecl; 4294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 4304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches function declarations. 4314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 4324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches f 43325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 4344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void f(); 43525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 4362dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, FunctionDecl> functionDecl; 4374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 4388456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// \brief Matches C++ function template declarations. 4398456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// 4408456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// Example matches f 44125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 4428456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// template<class T> void f(T t) {} 44325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 4448456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenkoconst internal::VariadicDynCastAllOfMatcher< 4458456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko Decl, 4462dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper FunctionTemplateDecl> functionTemplateDecl; 4474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 4484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches statements. 4494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 4504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 45125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 4524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// { ++a; } 45325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 4542dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// stmt() 4554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches both the compound statement '{ ++a; }' and '++a'. 45606b247f0ffb69854e32150c80f347a9376d3709bManuel Klimekconst internal::VariadicAllOfMatcher<Stmt> stmt; 4574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 4584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches declaration statements. 4594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 4604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 46125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 4624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int a; 46325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 4642dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declStmt() 4654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches 'int a'. 4664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 467e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Stmt, 4682dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper DeclStmt> declStmt; 4694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 4704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches member expressions. 4714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 4724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 47325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 4744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Y { 4754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 4764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int a; static int b; 4774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// }; 47825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 4792dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// memberExpr() 4804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches this->x, x, y.x, a, this->b 4812dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, MemberExpr> memberExpr; 4824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 4834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches call expressions. 4844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 4859f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek/// Example matches x.y() and y() 48625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 4874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// X x; 4884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// x.y(); 4899f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek/// y(); 49025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 4912dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CallExpr> callExpr; 492e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 49331f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \brief Matches lambda expressions. 49431f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// 49531f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// Example matches [&](){return 5;} 49631f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \code 49731f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// [&](){return 5;} 49831f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \endcode 49931f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, LambdaExpr> lambdaExpr; 50031f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper 5019f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek/// \brief Matches member call expressions. 5029f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek/// 5039f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek/// Example matches x.y() 50425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 5059f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek/// X x; 5069f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek/// x.y(); 50725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 5082dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher< 5092dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper Stmt, 5102dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXMemberCallExpr> memberCallExpr; 5119f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimek 512e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches init list expressions. 513e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 514e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 51525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 516e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// int a[] = { 1, 2 }; 517e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// struct B { int x, y; }; 518e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// B b = { 5, 6 }; 51925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 520e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// initList() 521e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches "{ 1, 2 }" and "{ 5, 6 }" 522e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, InitListExpr> initListExpr; 523e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 524e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches using declarations. 525e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 526e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 52725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 528e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// namespace X { int x; } 529e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// using X::x; 53025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 531e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// usingDecl() 532e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches \code using X::x \endcode 533e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Decl, UsingDecl> usingDecl; 5344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 5354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches constructor call expressions (including implicit ones). 5364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 5374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches string(ptr, n) and ptr within arguments of f 5382dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher = constructExpr()) 53925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 5404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void f(const string &a, const string &b); 5414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// char *ptr; 5424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int n; 5434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// f(string(ptr, n), ptr); 54425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 5454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 546e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Stmt, 5472dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXConstructExpr> constructExpr; 5484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 54970b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// \brief Matches implicit and explicit this expressions. 55070b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// 55170b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// Example matches the implicit this expression in "return i". 55270b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// (matcher = thisExpr()) 55370b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// \code 55470b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// struct foo { 55570b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// int i; 55670b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// int f() { return i; } 55770b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// }; 55870b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek/// \endcode 55970b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimekconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXThisExpr> thisExpr; 56070b9db9879c1cb8b8ca7d6c9809e35361cab83dcManuel Klimek 5614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches nodes where temporaries are created. 5624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 5634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches FunctionTakesString(GetStringByValue()) 5642dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher = bindTemporaryExpr()) 56525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 5664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FunctionTakesString(GetStringByValue()); 5674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FunctionTakesStringByPointer(GetStringPointer()); 56825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 5694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 570e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Stmt, 5712dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXBindTemporaryExpr> bindTemporaryExpr; 5724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 573e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \brief Matches nodes where temporaries are materialized. 574e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// 575e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// Example: Given 576e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \code 577e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// struct T {void func()}; 578e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// T f(); 579e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// void g(T); 580e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \endcode 581e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// materializeTemporaryExpr() matches 'f()' in these statements 582e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \code 583e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// T u(f()); 584e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// g(f()); 585e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \endcode 586e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// but does not match 587e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \code 588e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// f(); 589e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// f().func(); 590e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer/// \endcode 591e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzerconst internal::VariadicDynCastAllOfMatcher< 592e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer Stmt, 593e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer MaterializeTemporaryExpr> materializeTemporaryExpr; 594e16acd3817e501ee2bcf5f631b6911021fa88ba7Sam Panzer 5954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches new expressions. 5964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 5974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 59825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 5994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// new X; 60025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 6012dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// newExpr() 6024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches 'new X'. 6032dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXNewExpr> newExpr; 604e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 605e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches delete expressions. 606e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 607e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 60825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 609e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// delete X; 61025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 6112dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// deleteExpr() 612e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches 'delete X'. 6132dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXDeleteExpr> deleteExpr; 614e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 615e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches array subscript expressions. 616e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 617e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 61825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 619e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// int i = a[1]; 62025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 621e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// arraySubscriptExpr() 622e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches "a[1]" 623e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher< 624e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Stmt, 625e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper ArraySubscriptExpr> arraySubscriptExpr; 6264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 6274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the value of a default argument at the call site. 6284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 6294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches the CXXDefaultArgExpr placeholder inserted for the 6304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// default value of the second parameter in the call expression f(42) 6312dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher = defaultArgExpr()) 63225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 6334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void f(int x, int y = 0); 6344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// f(42); 63525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 6364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 637e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Stmt, 6382dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXDefaultArgExpr> defaultArgExpr; 6394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 6404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches overloaded operator calls. 6414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 6424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Note that if an operator isn't overloaded, it won't match. Instead, use 6434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// binaryOperator matcher. 6444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Currently it does not match operators such as new delete. 6454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: figure out why these do not match? 6464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 6474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches both operator<<((o << b), c) and operator<<(o, b) 6482dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher = operatorCallExpr()) 64925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 6504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// ostream &operator<< (ostream &out, int i) { }; 6514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// ostream &o; int b = 1, c = 1; 6524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// o << b << c; 65325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 6544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 655e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Stmt, 6562dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXOperatorCallExpr> operatorCallExpr; 6574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 6584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches expressions. 6594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 6604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches x() 66125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 6624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void f() { x(); } 66325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 6642dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, Expr> expr; 6654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 6664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches expressions that refer to declarations. 6674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 6684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches x in if (x) 66925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 6704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// bool x; 6714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// if (x) {} 67225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 6732dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, DeclRefExpr> declRefExpr; 6744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 6754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if statements. 6764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 6774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches 'if (x) {}' 67825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 6794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// if (x) {} 68025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 681e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, IfStmt> ifStmt; 6824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 6834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches for statements. 6844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 6854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches 'for (;;) {}' 68625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 6874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// for (;;) {} 68831f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// int i[] = {1, 2, 3}; for (auto a : i); 68925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 6902dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, ForStmt> forStmt; 6914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 69231f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \brief Matches range-based for statements. 69331f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// 69431f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// forRangeStmt() matches 'for (auto a : i)' 69531f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \code 69631f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// int i[] = {1, 2, 3}; for (auto a : i); 69731f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// for(int j = 0; j < 5; ++j); 69831f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \endcode 69931f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXForRangeStmt> forRangeStmt; 70031f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper 7016a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches the increment statement of a for loop. 7026a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// 7036a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// Example: 7046a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 7056a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// matches '++x' in 70625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 7076a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// for (x; x < N; ++x) { } 70825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 7096a12449ec8862211856447d3df4c082a346339f2Daniel JasperAST_MATCHER_P(ForStmt, hasIncrement, internal::Matcher<Stmt>, 7106a12449ec8862211856447d3df4c082a346339f2Daniel Jasper InnerMatcher) { 7116a12449ec8862211856447d3df4c082a346339f2Daniel Jasper const Stmt *const Increment = Node.getInc(); 7126a12449ec8862211856447d3df4c082a346339f2Daniel Jasper return (Increment != NULL && 7136a12449ec8862211856447d3df4c082a346339f2Daniel Jasper InnerMatcher.matches(*Increment, Finder, Builder)); 7146a12449ec8862211856447d3df4c082a346339f2Daniel Jasper} 7156a12449ec8862211856447d3df4c082a346339f2Daniel Jasper 7166a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches the initialization statement of a for loop. 7176a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// 7186a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// Example: 7192dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// forStmt(hasLoopInit(declStmt())) 7206a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// matches 'int x = 0' in 72125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 7226a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// for (int x = 0; x < N; ++x) { } 72325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 7246a12449ec8862211856447d3df4c082a346339f2Daniel JasperAST_MATCHER_P(ForStmt, hasLoopInit, internal::Matcher<Stmt>, 7256a12449ec8862211856447d3df4c082a346339f2Daniel Jasper InnerMatcher) { 7266a12449ec8862211856447d3df4c082a346339f2Daniel Jasper const Stmt *const Init = Node.getInit(); 7276a12449ec8862211856447d3df4c082a346339f2Daniel Jasper return (Init != NULL && InnerMatcher.matches(*Init, Finder, Builder)); 7286a12449ec8862211856447d3df4c082a346339f2Daniel Jasper} 7296a12449ec8862211856447d3df4c082a346339f2Daniel Jasper 7304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches while statements. 7314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 7324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 73325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 7344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// while (true) {} 73525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 7364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// whileStmt() 7374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches 'while (true) {}'. 7382dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, WhileStmt> whileStmt; 7394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 7404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches do statements. 7414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 7424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 74325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 7444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// do {} while (true); 74525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 7464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// doStmt() 7474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches 'do {} while(true)' 748e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, DoStmt> doStmt; 7494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 750b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches break statements. 751b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// 752b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given 753b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code 754b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// while (true) { break; } 755b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode 756b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// breakStmt() 757b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// matches 'break' 758b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, BreakStmt> breakStmt; 759b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper 760b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches continue statements. 761b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// 762b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given 763b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code 764b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// while (true) { continue; } 765b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode 766b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// continueStmt() 767b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// matches 'continue' 768b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, ContinueStmt> continueStmt; 769b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper 770b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches return statements. 771b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// 772b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given 773b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code 774b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// return 1; 775b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode 776b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// returnStmt() 777b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// matches 'return 1' 778b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, ReturnStmt> returnStmt; 779b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper 780b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches goto statements. 781b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// 782b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given 783b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code 784b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// goto FOO; 785b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// FOO: bar(); 786b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode 787b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// gotoStmt() 788b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// matches 'goto FOO' 789b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, GotoStmt> gotoStmt; 790b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper 791b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches label statements. 792b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// 793b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given 794b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code 795b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// goto FOO; 796b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// FOO: bar(); 797b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode 798b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// labelStmt() 799b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// matches 'FOO:' 800b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, LabelStmt> labelStmt; 801b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper 802b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches switch statements. 803b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// 804b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// Given 805b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code 806b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// switch(a) { case 42: break; default: break; } 807b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode 808b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// switchStmt() 809b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// matches 'switch(a)'. 810b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, SwitchStmt> switchStmt; 811b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper 8124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches case and default statements inside switch statements. 8134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 8144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 81525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 8164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// switch(a) { case 42: break; default: break; } 81725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 8184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// switchCase() 8194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches 'case 42: break;' and 'default: break;'. 8202dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, SwitchCase> switchCase; 8214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 8224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches compound statements. 8234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 8244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches '{}' and '{{}}'in 'for (;;) {{}}' 82525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 8264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// for (;;) {{}} 82725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 8282dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CompoundStmt> compoundStmt; 8294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 830b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches catch statements. 831b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// 832b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code 833b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// try {} catch(int i) {} 834b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode 835b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// catchStmt() 836b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// matches 'catch(int i)' 837b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXCatchStmt> catchStmt; 838b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper 839b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches try statements. 840b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// 841b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code 842b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// try {} catch(int i) {} 843b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode 844b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// tryStmt() 845b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// matches 'try {}' 846b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXTryStmt> tryStmt; 847b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper 848b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches throw expressions. 849b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// 850b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code 851b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// try { throw 5; } catch(int i) {} 852b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode 853b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// throwExpr() 854b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// matches 'throw 5' 855b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CXXThrowExpr> throwExpr; 856b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper 857b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches null statements. 858b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// 859b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code 860b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// foo();; 861b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode 862b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// nullStmt() 863b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// matches the second ';' 864b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, NullStmt> nullStmt; 865b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper 866b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \brief Matches asm statements. 867b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// 868b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \code 869b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// int i = 100; 870b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// __asm("mov al, 2"); 871b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// \endcode 872b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// asmStmt() 873b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper/// matches '__asm("mov al, 2")' 874b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, AsmStmt> asmStmt; 875b54b7646b2d00a85d80e40adf7c49553f150c736Daniel Jasper 8764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches bool literals. 8774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 8784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches true 87925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 8804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// true 88125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 8824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 8833680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper Stmt, 884e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper CXXBoolLiteralExpr> boolLiteral; 8854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 8864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches string literals (also matches wide string literals). 8874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 8884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches "abcd", L"abcd" 88925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 8904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// char *s = "abcd"; wchar_t *ws = L"abcd" 89125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 8924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 8933680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper Stmt, 894e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper StringLiteral> stringLiteral; 8954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 8964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches character literals (also matches wchar_t). 8974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 8984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), 8994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// though. 9004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 9014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches 'a', L'a' 90225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 9034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// char ch = 'a'; wchar_t chw = L'a'; 90425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 9054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 9063680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper Stmt, 907e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper CharacterLiteral> characterLiteral; 9084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 9094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches integer literals of all sizes / encodings. 9104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 9114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Not matching character-encoded integers such as L'a'. 9124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 9134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches 1, 1L, 0x1, 1U 9144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 9153680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper Stmt, 916e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper IntegerLiteral> integerLiteral; 9174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 91831f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \brief Matches user defined literal operator call. 91931f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// 92031f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// Example match: "foo"_suffix 92131f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasperconst internal::VariadicDynCastAllOfMatcher< 92231f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper Stmt, 92331f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper UserDefinedLiteral> userDefinedLiteral; 92431f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper 925afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith/// \brief Matches compound (i.e. non-scalar) literals 926afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith/// 927afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith/// Example match: {1}, (1, 2) 928afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith/// \code 929afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith/// int array[4] = {1}; vector int myvec = (vector int)(1, 2); 930afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith/// \endcode 931afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smithconst internal::VariadicDynCastAllOfMatcher< 932afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith Stmt, 933afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith CompoundLiteralExpr> compoundLiteralExpr; 934afbcab8d10d4208c7ad8da79e948432117d4a326Richard Smith 93531f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper/// \brief Matches nullptr literal. 93631f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasperconst internal::VariadicDynCastAllOfMatcher< 93731f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper Stmt, 93831f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper CXXNullPtrLiteralExpr> nullPtrLiteralExpr; 93931f7c08a0d2b140bf31a08894d1948649de53c15Daniel Jasper 9404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches binary operator expressions. 9414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 9424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a || b 94325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 9444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// !(a || b) 94525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 9464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 947e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Stmt, 948e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper BinaryOperator> binaryOperator; 9494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 9504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches unary operator expressions. 9514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 9524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches !a 95325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 9544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// !a || b 95525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 9564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 957e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Stmt, 958e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper UnaryOperator> unaryOperator; 9594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 9604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches conditional operator expressions. 9614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 9624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a ? b : c 96325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 9644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// (a ? b : c) + 42 96525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 9664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 967e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Stmt, 968e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper ConditionalOperator> conditionalOperator; 9694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 9704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a reinterpret_cast expression. 9714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 9724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Either the source expression or the destination type can be matched 9734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// using has(), but hasDestinationType() is more specific and can be 9744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// more readable. 9754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 9764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches reinterpret_cast<char*>(&p) in 97725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 9784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void* p = reinterpret_cast<char*>(&p); 97925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 9804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 9813680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper Stmt, 9822dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXReinterpretCastExpr> reinterpretCastExpr; 9834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 9844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a C++ static_cast expression. 9854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 9864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \see hasDestinationType 9874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \see reinterpretCast 9884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 9894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: 9902dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// staticCastExpr() 9914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches 9924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// static_cast<long>(8) 9934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// in 99425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 9954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// long eight(static_cast<long>(8)); 99625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 9974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 9983680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper Stmt, 9992dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXStaticCastExpr> staticCastExpr; 10004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 10014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a dynamic_cast expression. 10024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 10034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: 10042dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// dynamicCastExpr() 10054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches 10064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// dynamic_cast<D*>(&b); 10074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// in 100825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 10094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// struct B { virtual ~B() {} }; struct D : B {}; 10104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// B b; 10114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// D* p = dynamic_cast<D*>(&b); 101225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 10134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 10143680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper Stmt, 10152dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXDynamicCastExpr> dynamicCastExpr; 10164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 10174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a const_cast expression. 10184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 10194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: Matches const_cast<int*>(&r) in 102025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 10214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int n = 42; 102225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// const int &r(n); 10234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int* p = const_cast<int*>(&r); 102425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 10254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 10263680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper Stmt, 10272dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXConstCastExpr> constCastExpr; 10284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 1029e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper/// \brief Matches a C-style cast expression. 1030e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper/// 1031e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper/// Example: Matches (int*) 2.2f in 1032e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper/// \code 1033e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper/// int i = (int) 2.2f; 1034e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper/// \endcode 1035e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasperconst internal::VariadicDynCastAllOfMatcher< 1036e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper Stmt, 1037e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper CStyleCastExpr> cStyleCastExpr; 1038e6d2a96cc9689be584c3bfc09ac527a03a25b3bcDaniel Jasper 10394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches explicit cast expressions. 10404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 10414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Matches any cast expression written in user code, whether it be a 10424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// C-style cast, a functional-style cast, or a keyword cast. 10434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 10444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Does not match implicit conversions. 10454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 10464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Note: the name "explicitCast" is chosen to match Clang's terminology, as 10474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Clang uses the term "cast" to apply to implicit conversions as well as to 10484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// actual cast expressions. 10494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 10504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \see hasDestinationType. 10514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 10524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: matches all five of the casts in 105325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 10544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) 105525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 10564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// but does not match the implicit conversion in 105725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 10584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// long ell = 42; 105925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 10604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 10613680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper Stmt, 10622dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper ExplicitCastExpr> explicitCastExpr; 10634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 10644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the implicit cast nodes of Clang's AST. 10654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 10664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// This matches many different places, including function call return value 10674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// eliding, as well as any type conversions. 10684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 10693680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper Stmt, 10702dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper ImplicitCastExpr> implicitCastExpr; 10714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 1072089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// \brief Matches any cast nodes of Clang's AST. 1073089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// 1074089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// Example: castExpr() matches each of the following: 107525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1076089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// (int) 3; 1077089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// const_cast<Expr *>(SubExpr); 1078089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// char c = 0; 107925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1080089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// but does not match 108125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1082089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// int i = (0); 1083089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer/// int k = 0; 108425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 10853680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasperconst internal::VariadicDynCastAllOfMatcher<Stmt, CastExpr> castExpr; 1086089e5b3bf2e57da0173b170ad501867b43395385Sam Panzer 10874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches functional cast expressions 10884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 10894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: Matches Foo(bar); 109025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 10914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Foo f = bar; 10924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Foo g = (Foo) bar; 10934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Foo h = Foo(bar); 109425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 10954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekconst internal::VariadicDynCastAllOfMatcher< 10963680b4f7494b6744b9c5a25f83b63cd8b7e434fcDaniel Jasper Stmt, 10972dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper CXXFunctionalCastExpr> functionalCastExpr; 10984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 1099a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \brief Matches \c QualTypes in the clang AST. 1100a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasperconst internal::VariadicAllOfMatcher<QualType> qualType; 1101a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper 1102a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \brief Matches \c Types in the clang AST. 110306b247f0ffb69854e32150c80f347a9376d3709bManuel Klimekconst internal::VariadicAllOfMatcher<Type> type; 1104a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper 1105a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \brief Matches \c TypeLocs in the clang AST. 110606b247f0ffb69854e32150c80f347a9376d3709bManuel Klimekconst internal::VariadicAllOfMatcher<TypeLoc> typeLoc; 1107a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper 11087387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \brief Matches if any of the given matchers matches. 11097387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// 11107387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// Unlike \c anyOf, \c eachOf will generate a match result for each 11117387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// matching submatcher. 11127387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// 11137387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// For example, in: 11147387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \code 11157387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// class A { int a; int b; }; 11167387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \endcode 11177387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// The matcher: 11187387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \code 11197387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 11207387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// has(fieldDecl(hasName("b")).bind("v")))) 11217387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \endcode 11227387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// will generate two results binding "v", the first of which binds 11237387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// the field declaration of \c a, the second the field declaration of 11247387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// \c b. 11257387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// 11267387673f83b8b37f660422947c9990778ba88193Manuel Klimek/// Usable as: Any Matcher 11277387673f83b8b37f660422947c9990778ba88193Manuel Klimektemplate <typename M1, typename M2> 11287387673f83b8b37f660422947c9990778ba88193Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::EachOfMatcher, M1, M2> 11297387673f83b8b37f660422947c9990778ba88193Manuel KlimekeachOf(const M1 &P1, const M2 &P2) { 11307387673f83b8b37f660422947c9990778ba88193Manuel Klimek return internal::PolymorphicMatcherWithParam2<internal::EachOfMatcher, M1, 11317387673f83b8b37f660422947c9990778ba88193Manuel Klimek M2>(P1, P2); 11327387673f83b8b37f660422947c9990778ba88193Manuel Klimek} 11337387673f83b8b37f660422947c9990778ba88193Manuel Klimek 11344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Various overloads for the anyOf matcher. 11354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// @{ 113625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek 113725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \brief Matches if any of the given matchers matches. 113825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// 113925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher 114025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimektemplate<typename M1, typename M2> 114125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M1, M2> 114225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekanyOf(const M1 &P1, const M2 &P2) { 11434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, 114425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek M1, M2 >(P1, P2); 11454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 114625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimektemplate<typename M1, typename M2, typename M3> 114725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M1, 114825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M2, M3> > 114925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekanyOf(const M1 &P1, const M2 &P2, const M3 &P3) { 11504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return anyOf(P1, anyOf(P2, P3)); 11514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 115225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimektemplate<typename M1, typename M2, typename M3, typename M4> 115325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M1, 115425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M2, 11554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, 115625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek M3, M4> > > 115725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekanyOf(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4) { 1158ff2fcb8db242a54f72bbb4e5595261e12672ed66Daniel Jasper return anyOf(P1, anyOf(P2, anyOf(P3, P4))); 11594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 116025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimektemplate<typename M1, typename M2, typename M3, typename M4, typename M5> 116125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M1, 116225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M2, 116325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, M3, 11644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek internal::PolymorphicMatcherWithParam2<internal::AnyOfMatcher, 116525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek M4, M5> > > > 116625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekanyOf(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4, const M5 &P5) { 11674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return anyOf(P1, anyOf(P2, anyOf(P3, anyOf(P4, P5)))); 11684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 116925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek 11704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// @} 11714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 11724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Various overloads for the allOf matcher. 11734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// @{ 117425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek 117525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \brief Matches if all given matchers match. 117625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// 117725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher 11787f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vanetemplate <typename M1, typename M2> 117925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam2<internal::AllOfMatcher, M1, M2> 118025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekallOf(const M1 &P1, const M2 &P2) { 11817f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane return internal::PolymorphicMatcherWithParam2<internal::AllOfMatcher, M1, M2>( 11827f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane P1, P2); 11834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 11847f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vanetemplate <typename M1, typename M2, typename M3> 11857f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vaneinternal::PolymorphicMatcherWithParam2< 11867f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane internal::AllOfMatcher, M1, 118725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::PolymorphicMatcherWithParam2<internal::AllOfMatcher, M2, M3> > 118825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekallOf(const M1 &P1, const M2 &P2, const M3 &P3) { 11896a12449ec8862211856447d3df4c082a346339f2Daniel Jasper return allOf(P1, allOf(P2, P3)); 11904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 11917f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vanetemplate <typename M1, typename M2, typename M3, typename M4> 11927f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vaneinternal::PolymorphicMatcherWithParam2< 11937f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane internal::AllOfMatcher, M1, 11947f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane internal::PolymorphicMatcherWithParam2< 11957f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane internal::AllOfMatcher, M2, internal::PolymorphicMatcherWithParam2< 11967f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane internal::AllOfMatcher, M3, M4> > > 11977f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin VaneallOf(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4) { 11987f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane return allOf(P1, allOf(P2, P3, P4)); 11997f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane} 12007f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vanetemplate <typename M1, typename M2, typename M3, typename M4, typename M5> 12017f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vaneinternal::PolymorphicMatcherWithParam2< 12027f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane internal::AllOfMatcher, M1, 12037f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane internal::PolymorphicMatcherWithParam2< 12047f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane internal::AllOfMatcher, M2, 12057f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane internal::PolymorphicMatcherWithParam2< 12067f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane internal::AllOfMatcher, M3, 12077f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane internal::PolymorphicMatcherWithParam2<internal::AllOfMatcher, M4, 12087f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane M5> > > > 12097f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin VaneallOf(const M1 &P1, const M2 &P2, const M3 &P3, const M4 &P4, const M5 &P5) { 12107f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane return allOf(P1, allOf(P2, P3, P4, P5)); 12117f43fcf5d9406788ce95c9f3b785e0a6bc75a7f7Edwin Vane} 121225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek 12134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// @} 12144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 1215e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) 1216e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 1217e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 121825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1219e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Foo x = bar; 1220e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// int y = sizeof(x) + alignof(x); 122125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1222e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// unaryExprOrTypeTraitExpr() 1223e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches \c sizeof(x) and \c alignof(x) 1224e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperconst internal::VariadicDynCastAllOfMatcher< 1225e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Stmt, 1226e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper UnaryExprOrTypeTraitExpr> unaryExprOrTypeTraitExpr; 1227e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 1228e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches unary expressions that have a specific type of argument. 1229e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 1230e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 123125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1232e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 123325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1234e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 1235e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches \c sizeof(a) and \c alignof(c) 1236e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UnaryExprOrTypeTraitExpr, hasArgumentOfType, 123725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::Matcher<QualType>, InnerMatcher) { 1238e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const QualType ArgumentType = Node.getTypeOfArgument(); 123925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek return InnerMatcher.matches(ArgumentType, Finder, Builder); 1240e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 1241e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 1242e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches unary expressions of a certain kind. 1243e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 1244e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 124525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1246e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// int x; 1247e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// int s = sizeof(x) + alignof(x) 124825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1249e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 1250e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches \c sizeof(x) 1251e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UnaryExprOrTypeTraitExpr, ofKind, UnaryExprOrTypeTrait, Kind) { 1252e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return Node.getKind() == Kind; 1253e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 1254e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 1255e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Same as unaryExprOrTypeTraitExpr, but only matching 1256e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// alignof. 1257e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<Stmt> alignOfExpr( 125825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) { 1259415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return stmt(unaryExprOrTypeTraitExpr(allOf( 126025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek ofKind(UETT_AlignOf), InnerMatcher))); 1261e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 1262e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 1263e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Same as unaryExprOrTypeTraitExpr, but only matching 1264e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// sizeof. 1265e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<Stmt> sizeOfExpr( 126625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) { 1267415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return stmt(unaryExprOrTypeTraitExpr( 1268415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek allOf(ofKind(UETT_SizeOf), InnerMatcher))); 1269e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 1270e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 12714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches NamedDecl nodes that have the specified name. 12724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 12734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Supports specifying enclosing namespaces or classes by prefixing the name 12744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with '<enclosing>::'. 12754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Does not match typedefs of an underlying type with the given name. 12764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 12774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X (Name == "X") 127825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 12794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X; 128025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 12814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 12824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 128325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 128425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// namespace a { namespace b { class X; } } 128525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1286e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(NamedDecl, hasName, std::string, Name) { 12874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek assert(!Name.empty()); 12884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek const std::string FullNameString = "::" + Node.getQualifiedNameAsString(); 1289cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko const StringRef FullName = FullNameString; 1290cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko const StringRef Pattern = Name; 12914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek if (Pattern.startswith("::")) { 12924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return FullName == Pattern; 12934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek } else { 12944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return FullName.endswith(("::" + Pattern).str()); 12954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek } 12964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 12974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 129831bdf071afc18bb9551e4f4254be297333200c4aManuel Klimek/// \brief Matches NamedDecl nodes whose fully qualified names contain 129931bdf071afc18bb9551e4f4254be297333200c4aManuel Klimek/// a substring matched by the given RegExp. 1300e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 1301e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Supports specifying enclosing namespaces or classes by 1302e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// prefixing the name with '<enclosing>::'. Does not match typedefs 1303e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// of an underlying type with the given name. 1304e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 1305e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Example matches X (regexp == "::X") 130625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1307e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// class X; 130825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1309e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 1310e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Example matches X (regexp is one of "::X", "^foo::.*X", among others) 131125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 131225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// namespace foo { namespace bar { class X; } } 131325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1314e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(NamedDecl, matchesName, std::string, RegExp) { 1315e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper assert(!RegExp.empty()); 1316e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper std::string FullNameString = "::" + Node.getQualifiedNameAsString(); 1317e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper llvm::Regex RE(RegExp); 1318e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return RE.match(FullNameString); 1319e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 1320e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 13214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches overloaded operator names. 13224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 13234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Matches overloaded operator names specified in strings without the 13244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// "operator" prefix, such as "<<", for OverloadedOperatorCall's. 13254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 13264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a << b 13272dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher == operatorCallExpr(hasOverloadedOperatorName("<<"))) 132825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 13294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// a << b; 13304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// c && d; // assuming both operator<< 13314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// // and operator&& are overloaded somewhere. 133225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1333e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXOperatorCallExpr, 13344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek hasOverloadedOperatorName, std::string, Name) { 1335e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return getOperatorSpelling(Node.getOperator()) == Name; 13364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 13374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 13384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches C++ classes that are directly or indirectly derived from 133920b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper/// a class matching \c Base. 13404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 134176dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper/// Note that a class is not considered to be derived from itself. 13424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 134376dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper/// Example matches Y, Z, C (Base == hasName("X")) 134425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 134576dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper/// class X; 13464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Y : public X {}; // directly derived 13474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Z : public Y {}; // indirectly derived 13484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// typedef X A; 13494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// typedef A B; 13504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class C : public B {}; // derived from a typedef of X 135125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 13524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 135320b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper/// In the following example, Bar matches isDerivedFrom(hasName("X")): 135425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 13554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Foo; 13564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// typedef Foo X; 13574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Bar : public Foo {}; // derived from a type that X is a typedef of 135825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 135920b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel JasperAST_MATCHER_P(CXXRecordDecl, isDerivedFrom, 136020b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper internal::Matcher<NamedDecl>, Base) { 136120b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper return Finder->classIsDerivedFrom(&Node, Base, Builder); 136220b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper} 136320b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper 136420b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper/// \brief Overloaded method as shortcut for \c isDerivedFrom(hasName(...)). 136520b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasperinline internal::Matcher<CXXRecordDecl> isDerivedFrom(StringRef BaseName) { 136620b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper assert(!BaseName.empty()); 136720b802d186dfc5db9b4a9ce83e9f31fa5aa4efccDaniel Jasper return isDerivedFrom(hasName(BaseName)); 13684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 13694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 137076dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper/// \brief Similar to \c isDerivedFrom(), but also matches classes that directly 137176dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper/// match \c Base. 137263d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasperinline internal::Matcher<CXXRecordDecl> isSameOrDerivedFrom( 137363d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper internal::Matcher<NamedDecl> Base) { 137476dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper return anyOf(Base, isDerivedFrom(Base)); 137576dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper} 137676dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper 137763d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper/// \brief Overloaded method as shortcut for 137863d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper/// \c isSameOrDerivedFrom(hasName(...)). 137963d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasperinline internal::Matcher<CXXRecordDecl> isSameOrDerivedFrom( 138063d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper StringRef BaseName) { 138176dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper assert(!BaseName.empty()); 138263d88728d862f8a69b3291e533d193d1d8513f5aDaniel Jasper return isSameOrDerivedFrom(hasName(BaseName)); 138376dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper} 138476dafa7e6487c0b51fadebd16bdefe0e0e23d595Daniel Jasper 13854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches AST nodes that have child AST nodes that match the 13864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// provided matcher. 13874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 13882dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X"))) 138925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 13904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X {}; // Matches X, because X::X is a class of name X inside X. 13914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Y { class X {}; }; 13924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Z { class Y { class X {}; }; }; // Does not match Z. 139325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 13944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 13954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// ChildT must be an AST base type. 139625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// 139725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher 13984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename ChildT> 13994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinternal::ArgumentAdaptingMatcher<internal::HasMatcher, ChildT> has( 14004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek const internal::Matcher<ChildT> &ChildMatcher) { 14014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return internal::ArgumentAdaptingMatcher<internal::HasMatcher, 14024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek ChildT>(ChildMatcher); 14034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 14044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 14054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches AST nodes that have descendant AST nodes that match the 14064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// provided matcher. 14074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 14084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X, Y, Z 14092dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher = recordDecl(hasDescendant(recordDecl(hasName("X"))))) 141025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 14114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X {}; // Matches X, because X::X is a class of name X inside X. 14124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Y { class X {}; }; 14134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Z { class Y { class X {}; }; }; 141425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 14154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 14164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// DescendantT must be an AST base type. 141725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// 141825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher 14194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename DescendantT> 14204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinternal::ArgumentAdaptingMatcher<internal::HasDescendantMatcher, DescendantT> 14214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekhasDescendant(const internal::Matcher<DescendantT> &DescendantMatcher) { 14224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return internal::ArgumentAdaptingMatcher< 14234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek internal::HasDescendantMatcher, 14244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek DescendantT>(DescendantMatcher); 14254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 14264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 14274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches AST nodes that have child AST nodes that match the 14284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// provided matcher. 14294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 14302dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X"))) 143125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 14324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X {}; // Matches X, because X::X is a class of name X inside X. 14334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Y { class X {}; }; 14344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Z { class Y { class X {}; }; }; // Does not match Z. 143525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 14364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 14374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// ChildT must be an AST base type. 14384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 14394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// As opposed to 'has', 'forEach' will cause a match for each result that 14404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches instead of only on the first one. 144125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// 144225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher 14434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename ChildT> 14444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinternal::ArgumentAdaptingMatcher<internal::ForEachMatcher, ChildT> forEach( 144525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek const internal::Matcher<ChildT> &ChildMatcher) { 14464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return internal::ArgumentAdaptingMatcher< 14474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek internal::ForEachMatcher, 14484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek ChildT>(ChildMatcher); 14494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 14504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 14514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches AST nodes that have descendant AST nodes that match the 14524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// provided matcher. 14534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 14544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X, A, B, C 14552dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X"))))) 145625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 14574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X {}; // Matches X, because X::X is a class of name X inside X. 14584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class A { class X {}; }; 14594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class B { class C { class X {}; }; }; 146025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 14614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 14624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// DescendantT must be an AST base type. 14634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 14644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 14654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// each result that matches instead of only on the first one. 14664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 14674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Note: Recursively combined ForEachDescendant can cause many matches: 14682dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl())))) 14694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// will match 10 times (plus injected class name matches) on: 147025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 14714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class A { class B { class C { class D { class E {}; }; }; }; }; 147225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 147325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// 147425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher 14754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename DescendantT> 1476a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasperinternal::ArgumentAdaptingMatcher<internal::ForEachDescendantMatcher, 1477a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper DescendantT> 14784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekforEachDescendant( 147925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek const internal::Matcher<DescendantT> &DescendantMatcher) { 14804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return internal::ArgumentAdaptingMatcher< 14814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek internal::ForEachDescendantMatcher, 14824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek DescendantT>(DescendantMatcher); 14834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 14844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 1485152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \brief Matches if the node or any descendant matches. 1486152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// 1487152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// Generates results for each match. 1488152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// 1489152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// For example, in: 1490152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \code 1491152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// class A { class B {}; class C {}; }; 1492152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \endcode 1493152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// The matcher: 1494152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \code 1495152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m"))) 1496152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// \endcode 1497152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// will generate results for \c A, \c B and \c C. 1498152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// 1499152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek/// Usable as: Any Matcher 1500152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimektemplate <typename T> 1501152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimekinternal::PolymorphicMatcherWithParam2< 1502152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek internal::EachOfMatcher, internal::Matcher<T>, 1503152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek internal::ArgumentAdaptingMatcher<internal::ForEachDescendantMatcher, T> > 1504152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel KlimekfindAll(const internal::Matcher<T> &Matcher) { 1505152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek return eachOf(Matcher, forEachDescendant(Matcher)); 1506152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek} 1507152ea0e4711f7aed75f6a1d1995b0bd94eb31c98Manuel Klimek 1508c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// \brief Matches AST nodes that have a parent that matches the provided 1509c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// matcher. 1510c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// 1511c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// Given 1512c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// \code 1513c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 1514c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// \endcode 1515c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// \c compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 1516c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// 1517c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper/// Usable as: Any Matcher 1518c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jaspertemplate <typename ParentT> 1519c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasperinternal::ArgumentAdaptingMatcher<internal::HasParentMatcher, ParentT> 1520c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel JasperhasParent(const internal::Matcher<ParentT> &ParentMatcher) { 1521c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper return internal::ArgumentAdaptingMatcher< 1522c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper internal::HasParentMatcher, 1523c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper ParentT>(ParentMatcher); 1524c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper} 1525c99a3ad8c2bf29da45a0c64b88d58bfbd2f78ef2Daniel Jasper 1526579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// \brief Matches AST nodes that have an ancestor that matches the provided 1527579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// matcher. 1528579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// 1529579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// Given 1530579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// \code 1531579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// void f() { if (true) { int x = 42; } } 1532579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// void g() { for (;;) { int x = 43; } } 1533579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// \endcode 1534a1a4c0385a0fd458243d9e357e1eceb137f29abfNick Lewycky/// \c expr(integerLiteral(hasAncestor(ifStmt()))) matches \c 42, but not 43. 1535579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// 1536579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek/// Usable as: Any Matcher 1537579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimektemplate <typename AncestorT> 1538579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimekinternal::ArgumentAdaptingMatcher<internal::HasAncestorMatcher, AncestorT> 1539579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel KlimekhasAncestor(const internal::Matcher<AncestorT> &AncestorMatcher) { 1540579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek return internal::ArgumentAdaptingMatcher< 1541579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek internal::HasAncestorMatcher, 1542579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek AncestorT>(AncestorMatcher); 1543579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek} 1544579b120038ca817e0ce423303ebc1b4e0c6cbbe1Manuel Klimek 15454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the provided matcher does not match. 15464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 15472dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches Y (matcher = recordDecl(unless(hasName("X")))) 154825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 15494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X {}; 15504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Y {}; 155125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 155225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// 155325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Any Matcher 15544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename M> 155525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekinternal::PolymorphicMatcherWithParam1<internal::NotMatcher, M> 155625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimekunless(const M &InnerMatcher) { 15574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return internal::PolymorphicMatcherWithParam1< 15584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek internal::NotMatcher, M>(InnerMatcher); 15594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 15604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 15614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a type if the declaration of the type matches the given 15624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matcher. 1563297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// 1564c711af2ddbbb1d46223cc9379d32a203fb5bc7f4Daniel Jasper/// Usable as: Matcher<QualType>, Matcher<CallExpr>, Matcher<CXXConstructExpr>, 1565c711af2ddbbb1d46223cc9379d32a203fb5bc7f4Daniel Jasper/// Matcher<MemberExpr> 15664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinline internal::PolymorphicMatcherWithParam1< internal::HasDeclarationMatcher, 1567e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Decl> > 1568e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper hasDeclaration(const internal::Matcher<Decl> &InnerMatcher) { 15694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return internal::PolymorphicMatcherWithParam1< 15704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek internal::HasDeclarationMatcher, 1571e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Decl> >(InnerMatcher); 15724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 15734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 15744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches on the implicit object argument of a member call expression. 15754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 15762dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y")))))) 157725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 15784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Y { public: void x(); }; 15794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void z() { Y y; y.x(); }", 158025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 15814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 15824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: Overload to allow directly matching types? 1583e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXMemberCallExpr, on, internal::Matcher<Expr>, 15844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher) { 1585f8c12146fa2153a6d97b7c92d27d2ece0cd26e79Dmitri Gribenko const Expr *ExprNode = Node.getImplicitObjectArgument() 1586f8c12146fa2153a6d97b7c92d27d2ece0cd26e79Dmitri Gribenko ->IgnoreParenImpCasts(); 15874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (ExprNode != NULL && 15884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*ExprNode, Finder, Builder)); 15894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 15904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 15914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the call expression's callee expression matches. 15924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 15934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 159425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 15954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Y { void x() { this->x(); x(); Y y; y.x(); } }; 15964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void f() { f(); } 159725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 15982dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// callExpr(callee(expr())) 15994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches this->x(), x(), y.x(), f() 16004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with callee(...) 16014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matching this->x, x, y.x, f respectively 16024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 1603e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Note: Callee cannot take the more general internal::Matcher<Expr> 16044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// because this introduces ambiguous overloads with calls to Callee taking a 1605e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// internal::Matcher<Decl>, as the matcher hierarchy is purely 16064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// implemented in terms of implicit casts. 1607e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CallExpr, callee, internal::Matcher<Stmt>, 16084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher) { 1609e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const Expr *ExprNode = Node.getCallee(); 16104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (ExprNode != NULL && 16114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*ExprNode, Finder, Builder)); 16124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 16134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 16144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the call expression's callee's declaration matches the 16154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// given matcher. 16164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 16172dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x"))))) 161825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 16194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Y { public: void x(); }; 16204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void z() { Y y; y.x(); 162125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1622e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<CallExpr> callee( 1623e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const internal::Matcher<Decl> &InnerMatcher) { 1624415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return callExpr(hasDeclaration(InnerMatcher)); 16254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 16264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 16274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the expression's or declaration's type matches a type 16284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matcher. 16294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 16302dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches x (matcher = expr(hasType(recordDecl(hasName("X"))))) 16312dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// and z (matcher = varDecl(hasType(recordDecl(hasName("X"))))) 163225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 16334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X {}; 16344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void y(X &x) { x; X z; } 163525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1636e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_POLYMORPHIC_MATCHER_P(hasType, internal::Matcher<QualType>, 16374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher) { 1638e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper TOOLING_COMPILE_ASSERT((llvm::is_base_of<Expr, NodeType>::value || 1639e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper llvm::is_base_of<ValueDecl, NodeType>::value), 16404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek instantiated_with_wrong_types); 16414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return InnerMatcher.matches(Node.getType(), Finder, Builder); 16424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 16434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 16444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Overloaded to match the declaration of the expression's or value 16454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// declaration's type. 16464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 16474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// In case of a value declaration (for example a variable declaration), 16484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// this resolves one layer of indirection. For example, in the value 16492dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declaration "X x;", recordDecl(hasName("X")) matches the declaration of X, 16502dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration 16514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// of x." 16524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 16532dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches x (matcher = expr(hasType(recordDecl(hasName("X"))))) 16542dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// and z (matcher = varDecl(hasType(recordDecl(hasName("X"))))) 165525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 16564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X {}; 16574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void y(X &x) { x; X z; } 165825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1659297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// 1660297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// Usable as: Matcher<Expr>, Matcher<ValueDecl> 16614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinline internal::PolymorphicMatcherWithParam1< 1662415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek internal::matcher_hasType0Matcher, 1663e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<QualType> > 1664e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperhasType(const internal::Matcher<Decl> &InnerMatcher) { 1665415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return hasType(qualType(hasDeclaration(InnerMatcher))); 16664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 16674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 1668e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches if the matched type is represented by the given string. 1669e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 1670e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 167125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1672e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// class Y { public: void x(); }; 1673e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// void z() { Y* y; y->x(); } 167425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 16752dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// callExpr(on(hasType(asString("class Y *")))) 1676e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches y->x() 1677e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(QualType, asString, std::string, Name) { 1678e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return Name == Node.getAsString(); 1679e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 1680e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 16814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the matched type is a pointer type and the pointee type 16824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches the specified matcher. 16834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 16844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches y->x() 16852dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher = callExpr(on(hasType(pointsTo(recordDecl(hasName("Y"))))))) 168625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 16874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Y { public: void x(); }; 16884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void z() { Y *y; y->x(); } 168925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 16904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekAST_MATCHER_P( 1691e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper QualType, pointsTo, internal::Matcher<QualType>, 16924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher) { 1693e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return (!Node.isNull() && Node->isPointerType() && 16944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(Node->getPointeeType(), Finder, Builder)); 16954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 16964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 16974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Overloaded to match the pointee type's declaration. 1698e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<QualType> pointsTo( 1699e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const internal::Matcher<Decl> &InnerMatcher) { 1700415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return pointsTo(qualType(hasDeclaration(InnerMatcher))); 17014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 17024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 17034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the matched type is a reference type and the referenced 17044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// type matches the specified matcher. 17054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 17064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches X &x and const X &y 17072dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher = varDecl(hasType(references(recordDecl(hasName("X")))))) 170825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 17094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X { 17104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void a(X b) { 17114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// X &x = b; 17124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// const X &y = b; 17134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// }; 171425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1715e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(QualType, references, internal::Matcher<QualType>, 17164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher) { 1717e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return (!Node.isNull() && Node->isReferenceType() && 17184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(Node->getPointeeType(), Finder, Builder)); 17194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 17204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 17214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Overloaded to match the referenced type's declaration. 1722e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<QualType> references( 1723e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const internal::Matcher<Decl> &InnerMatcher) { 1724415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return references(qualType(hasDeclaration(InnerMatcher))); 17254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 17264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 1727e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXMemberCallExpr, onImplicitObjectArgument, 1728e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Expr>, InnerMatcher) { 1729f8c12146fa2153a6d97b7c92d27d2ece0cd26e79Dmitri Gribenko const Expr *ExprNode = Node.getImplicitObjectArgument(); 17304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (ExprNode != NULL && 17314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*ExprNode, Finder, Builder)); 17324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 17334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 17344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the expression's type either matches the specified 17354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matcher, or is a pointer to a type that matches the InnerMatcher. 17369f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimekinline internal::Matcher<CXXMemberCallExpr> thisPointerType( 1737e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const internal::Matcher<QualType> &InnerMatcher) { 17384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return onImplicitObjectArgument( 17394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher)))); 17404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 17414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 17424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Overloaded to match the type's declaration. 17439f17408d50c1d76c5eab435e4ceb924cc10757abManuel Klimekinline internal::Matcher<CXXMemberCallExpr> thisPointerType( 1744e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const internal::Matcher<Decl> &InnerMatcher) { 17454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return onImplicitObjectArgument( 17464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher)))); 17474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 17484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 17494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a DeclRefExpr that refers to a declaration that matches the 17504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// specified matcher. 17514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 17524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches x in if(x) 17532dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher = declRefExpr(to(varDecl(hasName("x"))))) 175425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 17554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// bool x; 17564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// if (x) {} 175725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1758e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(DeclRefExpr, to, internal::Matcher<Decl>, 17594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher) { 1760e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const Decl *DeclNode = Node.getDecl(); 17614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (DeclNode != NULL && 17624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*DeclNode, Finder, Builder)); 17634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 17644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 1765e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches a \c DeclRefExpr that refers to a declaration through a 1766e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// specific using shadow declaration. 1767e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 1768e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// FIXME: This currently only works for functions. Fix. 1769e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 1770e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 177125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1772e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// namespace a { void f() {} } 1773e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// using a::f; 1774e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// void g() { 1775e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// f(); // Matches this .. 1776e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// a::f(); // .. but not this. 1777e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// } 177825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 17792dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declRefExpr(throughUsingDeclaration(anything())) 1780e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches \c f() 1781e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(DeclRefExpr, throughUsingDecl, 178225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::Matcher<UsingShadowDecl>, InnerMatcher) { 1783e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const NamedDecl *FoundDecl = Node.getFoundDecl(); 1784cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko if (const UsingShadowDecl *UsingDecl = dyn_cast<UsingShadowDecl>(FoundDecl)) 178525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek return InnerMatcher.matches(*UsingDecl, Finder, Builder); 1786e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return false; 1787e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 1788e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 1789425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// \brief Matches the Decl of a DeclStmt which has a single declaration. 1790425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// 1791425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// Given 179225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1793425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// int a, b; 1794425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// int c; 179525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 17962dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declStmt(hasSingleDecl(anything())) 1797425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// matches 'int c;' but not 'int a, b;'. 1798425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam PanzerAST_MATCHER_P(DeclStmt, hasSingleDecl, internal::Matcher<Decl>, InnerMatcher) { 1799425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer if (Node.isSingleDecl()) { 1800425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer const Decl *FoundDecl = Node.getSingleDecl(); 1801425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer return InnerMatcher.matches(*FoundDecl, Finder, Builder); 1802425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer } 1803425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer return false; 1804425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer} 1805425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer 18064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a variable declaration that has an initializer expression 18074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// that matches the given matcher. 18084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 18092dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 181025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 18114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// bool y() { return true; } 18124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// bool x = y(); 181325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 18144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekAST_MATCHER_P( 1815e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper VarDecl, hasInitializer, internal::Matcher<Expr>, 18164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher) { 1817e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const Expr *Initializer = Node.getAnyInitializer(); 18184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (Initializer != NULL && 18194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*Initializer, Finder, Builder)); 18204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 18214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 18224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Checks that a call expression or a constructor call expression has 18234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// a specific number of arguments (including absent default arguments). 18244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 18252dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 182625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 18274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void f(int x, int y); 18284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// f(0, 0); 182925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 18304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekAST_POLYMORPHIC_MATCHER_P(argumentCountIs, unsigned, N) { 1831e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper TOOLING_COMPILE_ASSERT((llvm::is_base_of<CallExpr, NodeType>::value || 1832e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper llvm::is_base_of<CXXConstructExpr, 18334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek NodeType>::value), 18344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek instantiated_with_wrong_types); 18354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return Node.getNumArgs() == N; 18364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 18374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 18384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the n'th argument of a call expression or a constructor 18394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// call expression. 18404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 18414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches y in x(y) 18422dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher = callExpr(hasArgument(0, declRefExpr()))) 184325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 18444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void x(int) { int y; x(y); } 184525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 18464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekAST_POLYMORPHIC_MATCHER_P2( 1847e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper hasArgument, unsigned, N, internal::Matcher<Expr>, InnerMatcher) { 1848e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper TOOLING_COMPILE_ASSERT((llvm::is_base_of<CallExpr, NodeType>::value || 1849e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper llvm::is_base_of<CXXConstructExpr, 18504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek NodeType>::value), 18514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek instantiated_with_wrong_types); 18524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (N < Node.getNumArgs() && 18534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches( 18544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek *Node.getArg(N)->IgnoreParenImpCasts(), Finder, Builder)); 18554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 18564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 1857425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// \brief Matches declaration statements that contain a specific number of 1858425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// declarations. 1859425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// 1860425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// Example: Given 186125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1862425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// int a, b; 1863425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// int c; 1864425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// int d = 2, e; 186525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1866425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// declCountIs(2) 1867425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 1868425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam PanzerAST_MATCHER_P(DeclStmt, declCountIs, unsigned, N) { 1869217c484522926f9fc664ec3bfaf3cffe456244b0Benjamin Kramer return std::distance(Node.decl_begin(), Node.decl_end()) == (ptrdiff_t)N; 1870425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer} 1871425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer 1872425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// \brief Matches the n'th declaration of a declaration statement. 1873425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// 1874425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// Note that this does not work for global declarations because the AST 1875425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// breaks up multiple-declaration DeclStmt's into multiple single-declaration 1876425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// DeclStmt's. 1877425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// Example: Given non-global declarations 187825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1879425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// int a, b = 0; 1880425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// int c; 1881425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// int d = 2, e; 188225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 18832dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declStmt(containsDeclaration( 18842dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// 0, varDecl(hasInitializer(anything())))) 1885425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// matches only 'int d = 2, e;', and 18862dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// declStmt(containsDeclaration(1, varDecl())) 188725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 1888425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// matches 'int a, b = 0' as well as 'int d = 2, e;' 1889425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer/// but 'int c;' is not matched. 189025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 1891425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam PanzerAST_MATCHER_P2(DeclStmt, containsDeclaration, unsigned, N, 1892425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer internal::Matcher<Decl>, InnerMatcher) { 1893425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer const unsigned NumDecls = std::distance(Node.decl_begin(), Node.decl_end()); 1894425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer if (N >= NumDecls) 1895425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer return false; 1896425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer DeclStmt::const_decl_iterator Iterator = Node.decl_begin(); 1897425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer std::advance(Iterator, N); 1898425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer return InnerMatcher.matches(**Iterator, Finder, Builder); 1899425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer} 1900425f41b370a8795fbca9ffc3b35e9b0ccbb15d97Sam Panzer 19014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a constructor initializer. 19024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 19034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 190425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 19054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// struct Foo { 19064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Foo() : foo_(1) { } 19074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int foo_; 19084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// }; 190925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 19102dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything())))) 1911e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// record matches Foo, hasAnyConstructorInitializer matches foo_(1) 1912e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXConstructorDecl, hasAnyConstructorInitializer, 1913e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<CXXCtorInitializer>, InnerMatcher) { 1914e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper for (CXXConstructorDecl::init_const_iterator I = Node.init_begin(); 19154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek I != Node.init_end(); ++I) { 19164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek if (InnerMatcher.matches(**I, Finder, Builder)) { 19174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return true; 19184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek } 19194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek } 19204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return false; 19214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 19224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 19234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the field declaration of a constructor initializer. 19244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 19254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 192625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 19274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// struct Foo { 19284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Foo() : foo_(1) { } 19294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int foo_; 19304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// }; 193125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 19322dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(has(constructorDecl(hasAnyConstructorInitializer( 19334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// forField(hasName("foo_")))))) 19344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches Foo 19354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with forField matching foo_ 1936e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXCtorInitializer, forField, 1937e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<FieldDecl>, InnerMatcher) { 1938e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const FieldDecl *NodeAsDecl = Node.getMember(); 19394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (NodeAsDecl != NULL && 19404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*NodeAsDecl, Finder, Builder)); 19414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 19424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 19434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the initializer expression of a constructor initializer. 19444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 19454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 194625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 19474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// struct Foo { 19484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Foo() : foo_(1) { } 19494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int foo_; 19504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// }; 195125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 19522dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(has(constructorDecl(hasAnyConstructorInitializer( 19534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// withInitializer(integerLiteral(equals(1))))))) 19544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches Foo 19554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with withInitializer matching (1) 1956e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXCtorInitializer, withInitializer, 1957e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Expr>, InnerMatcher) { 1958e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const Expr* NodeAsExpr = Node.getInit(); 19594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (NodeAsExpr != NULL && 19604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*NodeAsExpr, Finder, Builder)); 19614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 19624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 19634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a contructor initializer if it is explicitly written in 19644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// code (as opposed to implicitly added by the compiler). 19654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 19664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 196725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 19684da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// struct Foo { 19694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Foo() { } 19704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Foo(int) : foo_("A") { } 19714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// string foo_; 19724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// }; 197325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 19742dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// constructorDecl(hasAnyConstructorInitializer(isWritten())) 19754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// will match Foo(int), but not Foo() 1976e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER(CXXCtorInitializer, isWritten) { 19774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return Node.isWritten(); 19784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 19794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 19804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a constructor declaration that has been implicitly added 19814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// by the compiler (eg. implicit default/copy constructors). 1982e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER(CXXConstructorDecl, isImplicit) { 19834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return Node.isImplicit(); 19844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 19854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 19864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches any argument of a call expression or a constructor call 19874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// expression. 19884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 19894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 199025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 19914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void x(int, int, int) { int y; x(1, y, 42); } 199225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 19932dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// callExpr(hasAnyArgument(declRefExpr())) 19944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches x(1, y, 42) 19954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with hasAnyArgument(...) 19964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matching y 1997e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_POLYMORPHIC_MATCHER_P(hasAnyArgument, internal::Matcher<Expr>, 19984da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher) { 1999e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper TOOLING_COMPILE_ASSERT((llvm::is_base_of<CallExpr, NodeType>::value || 2000e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper llvm::is_base_of<CXXConstructExpr, 20014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek NodeType>::value), 20024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek instantiated_with_wrong_types); 20034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek for (unsigned I = 0; I < Node.getNumArgs(); ++I) { 20044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek if (InnerMatcher.matches(*Node.getArg(I)->IgnoreParenImpCasts(), 20054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek Finder, Builder)) { 20064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return true; 20074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek } 20084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek } 20094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return false; 20104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 20114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 20124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the n'th parameter of a function declaration. 20134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 20144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 201525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 20164da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X { void f(int x) {} }; 201725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 20182dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// methodDecl(hasParameter(0, hasType(varDecl()))) 20194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches f(int x) {} 20204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with hasParameter(...) 20214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matching int x 2022e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P2(FunctionDecl, hasParameter, 2023e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper unsigned, N, internal::Matcher<ParmVarDecl>, 20244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher) { 20254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (N < Node.getNumParams() && 20264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches( 20274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek *Node.getParamDecl(N), Finder, Builder)); 20284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 20294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 20304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches any parameter of a function declaration. 20314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 20324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Does not match the 'this' parameter of a method. 20334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 20344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 203525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 20364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class X { void f(int x, int y, int z) {} }; 203725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 20382dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// methodDecl(hasAnyParameter(hasName("y"))) 20394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches f(int x, int y, int z) {} 20404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with hasAnyParameter(...) 20414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matching int y 2042e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(FunctionDecl, hasAnyParameter, 2043e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<ParmVarDecl>, InnerMatcher) { 20444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek for (unsigned I = 0; I < Node.getNumParams(); ++I) { 20454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek if (InnerMatcher.matches(*Node.getParamDecl(I), Finder, Builder)) { 20464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return true; 20474da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek } 20484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek } 20494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return false; 20504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 20514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 205236e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// \brief Matches \c FunctionDecls that have a specific parameter count. 205336e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// 205436e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// Given 205536e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// \code 205636e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// void f(int i) {} 205736e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// void g(int i, int j) {} 205836e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// \endcode 205936e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// functionDecl(parameterCountIs(2)) 206036e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper/// matches g(int i, int j) {} 206136e29d6732814e958aea4b2f403cec63d7ed3116Daniel JasperAST_MATCHER_P(FunctionDecl, parameterCountIs, unsigned, N) { 206236e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper return Node.getNumParams() == N; 206336e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper} 206436e29d6732814e958aea4b2f403cec63d7ed3116Daniel Jasper 2065e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches the return type of a function declaration. 2066e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 2067e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given: 206825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 2069e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// class X { int f() { return 1; } }; 207025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 20712dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// methodDecl(returns(asString("int"))) 2072e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches int f() { return 1; } 207325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel KlimekAST_MATCHER_P(FunctionDecl, returns, 207425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::Matcher<QualType>, InnerMatcher) { 207525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek return InnerMatcher.matches(Node.getResultType(), Finder, Builder); 2076e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 2077e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 20788cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper/// \brief Matches extern "C" function declarations. 20798cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper/// 20808cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper/// Given: 208125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 20828cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper/// extern "C" void f() {} 20838cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper/// extern "C" { void g() {} } 20848cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper/// void h() {} 208525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 20862dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// functionDecl(isExternC()) 20878cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper/// matches the declaration of f and g, but not the declaration h 20888cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel JasperAST_MATCHER(FunctionDecl, isExternC) { 20898cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper return Node.isExternC(); 20908cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper} 20918cc7efa2da2c6be43cbd3d09a9ae01353bb921d2Daniel Jasper 20926a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches the condition expression of an if statement, for loop, 20936a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// or conditional operator. 20944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 20954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches true (matcher = hasCondition(boolLiteral(equals(true)))) 209625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 20974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// if (true) {} 209825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2099e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_POLYMORPHIC_MATCHER_P(hasCondition, internal::Matcher<Expr>, 21004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher) { 21014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek TOOLING_COMPILE_ASSERT( 2102e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper (llvm::is_base_of<IfStmt, NodeType>::value) || 21036a12449ec8862211856447d3df4c082a346339f2Daniel Jasper (llvm::is_base_of<ForStmt, NodeType>::value) || 21046a12449ec8862211856447d3df4c082a346339f2Daniel Jasper (llvm::is_base_of<WhileStmt, NodeType>::value) || 21056a12449ec8862211856447d3df4c082a346339f2Daniel Jasper (llvm::is_base_of<DoStmt, NodeType>::value) || 2106e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper (llvm::is_base_of<ConditionalOperator, NodeType>::value), 21076a12449ec8862211856447d3df4c082a346339f2Daniel Jasper has_condition_requires_if_statement_conditional_operator_or_loop); 2108e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const Expr *const Condition = Node.getCond(); 21094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (Condition != NULL && 21104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*Condition, Finder, Builder)); 21114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 21124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 21134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the condition variable statement in an if statement. 21144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 21154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 211625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 21174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// if (A* a = GetAPointer()) {} 211825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 21194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// hasConditionVariableStatment(...) 21204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches 'A* a = GetAPointer()'. 2121e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(IfStmt, hasConditionVariableStatement, 2122e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<DeclStmt>, InnerMatcher) { 2123e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const DeclStmt* const DeclarationStatement = 21244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek Node.getConditionVariableDeclStmt(); 21254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return DeclarationStatement != NULL && 21264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*DeclarationStatement, Finder, Builder); 21274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 21284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 2129e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches the index expression of an array subscript expression. 2130e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 2131e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 213225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 2133e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// int i[5]; 2134e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// void f() { i[1] = 42; } 213525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2136e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// arraySubscriptExpression(hasIndex(integerLiteral())) 2137e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches \c i[1] with the \c integerLiteral() matching \c 1 2138e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ArraySubscriptExpr, hasIndex, 213925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::Matcher<Expr>, InnerMatcher) { 2140e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper if (const Expr* Expression = Node.getIdx()) 214125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek return InnerMatcher.matches(*Expression, Finder, Builder); 2142e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return false; 2143e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 2144e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 2145e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches the base expression of an array subscript expression. 2146e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 2147e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 214825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 2149e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// int i[5]; 2150e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// void f() { i[1] = 42; } 215125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 21522dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// arraySubscriptExpression(hasBase(implicitCastExpr( 21532dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// hasSourceExpression(declRefExpr())))) 21542dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// matches \c i[1] with the \c declRefExpr() matching \c i 2155e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ArraySubscriptExpr, hasBase, 215625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::Matcher<Expr>, InnerMatcher) { 2157e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper if (const Expr* Expression = Node.getBase()) 215825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek return InnerMatcher.matches(*Expression, Finder, Builder); 2159e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return false; 2160e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 2161e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 21626a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches a 'for', 'while', or 'do while' statement that has 21636a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// a given body. 21644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 21654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 216625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 21674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// for (;;) {} 216825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 21692dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// hasBody(compoundStmt()) 21704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches 'for (;;) {}' 21712dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// with compoundStmt() 21724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matching '{}' 21736a12449ec8862211856447d3df4c082a346339f2Daniel JasperAST_POLYMORPHIC_MATCHER_P(hasBody, internal::Matcher<Stmt>, 21746a12449ec8862211856447d3df4c082a346339f2Daniel Jasper InnerMatcher) { 21756a12449ec8862211856447d3df4c082a346339f2Daniel Jasper TOOLING_COMPILE_ASSERT( 21766a12449ec8862211856447d3df4c082a346339f2Daniel Jasper (llvm::is_base_of<DoStmt, NodeType>::value) || 21776a12449ec8862211856447d3df4c082a346339f2Daniel Jasper (llvm::is_base_of<ForStmt, NodeType>::value) || 21786a12449ec8862211856447d3df4c082a346339f2Daniel Jasper (llvm::is_base_of<WhileStmt, NodeType>::value), 21796a12449ec8862211856447d3df4c082a346339f2Daniel Jasper has_body_requires_for_while_or_do_statement); 2180e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const Stmt *const Statement = Node.getBody(); 21814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (Statement != NULL && 21824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*Statement, Finder, Builder)); 21834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 21844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 21854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches compound statements where at least one substatement matches 21864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// a given matcher. 21874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 21884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 218925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 21904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// { {}; 1+2; } 219125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 21922dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// hasAnySubstatement(compoundStmt()) 21934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches '{ {}; 1+2; }' 21942dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// with compoundStmt() 21954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matching '{}' 2196e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CompoundStmt, hasAnySubstatement, 2197e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Stmt>, InnerMatcher) { 2198e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper for (CompoundStmt::const_body_iterator It = Node.body_begin(); 21994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek It != Node.body_end(); 22004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek ++It) { 22014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek if (InnerMatcher.matches(**It, Finder, Builder)) return true; 22024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek } 22034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return false; 22044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 22054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 22064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Checks that a compound statement contains a specific number of 22074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// child statements. 22084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 22094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: Given 221025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 22114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// { for (;;) {} } 221225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 22132dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// compoundStmt(statementCountIs(0))) 22144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches '{}' 22154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// but does not match the outer compound statement. 2216e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CompoundStmt, statementCountIs, unsigned, N) { 22174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return Node.size() == N; 22184da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 22194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 22204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches literals that are equal to the given value. 22214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 22224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches true (matcher = boolLiteral(equals(true))) 222325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 22244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// true 222525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2226297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// 2227297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// Usable as: Matcher<CharacterLiteral>, Matcher<CXXBoolLiteral>, 2228297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// Matcher<FloatingLiteral>, Matcher<IntegerLiteral> 22294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimektemplate <typename ValueT> 22304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekinternal::PolymorphicMatcherWithParam1<internal::ValueEqualsMatcher, ValueT> 22314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimekequals(const ValueT &Value) { 22324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return internal::PolymorphicMatcherWithParam1< 22334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek internal::ValueEqualsMatcher, 22344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek ValueT>(Value); 22354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 22364da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 22374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the operator Name of operator expressions (binary or 22384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// unary). 22394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 22404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 224125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 22424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// !(a || b) 224325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 22444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel KlimekAST_POLYMORPHIC_MATCHER_P(hasOperatorName, std::string, Name) { 22454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek TOOLING_COMPILE_ASSERT( 2246e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper (llvm::is_base_of<BinaryOperator, NodeType>::value) || 2247e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper (llvm::is_base_of<UnaryOperator, NodeType>::value), 22484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek has_condition_requires_if_statement_or_conditional_operator); 22494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return Name == Node.getOpcodeStr(Node.getOpcode()); 22504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 22514da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 22524da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the left hand side of binary operator expressions. 22534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 22544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a (matcher = binaryOperator(hasLHS())) 225525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 22564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// a || b 225725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2258e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(BinaryOperator, hasLHS, 2259e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Expr>, InnerMatcher) { 2260e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Expr *LeftHandSide = Node.getLHS(); 22614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (LeftHandSide != NULL && 22624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*LeftHandSide, Finder, Builder)); 22634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 22644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 22654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the right hand side of binary operator expressions. 22664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 22674da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches b (matcher = binaryOperator(hasRHS())) 226825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 22694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// a || b 227025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2271e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(BinaryOperator, hasRHS, 2272e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Expr>, InnerMatcher) { 2273e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Expr *RightHandSide = Node.getRHS(); 22744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (RightHandSide != NULL && 22754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*RightHandSide, Finder, Builder)); 22764da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 22774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 22784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if either the left hand side or the right hand side of a 22794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// binary operator matches. 2280e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasperinline internal::Matcher<BinaryOperator> hasEitherOperand( 2281e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const internal::Matcher<Expr> &InnerMatcher) { 22824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return anyOf(hasLHS(InnerMatcher), hasRHS(InnerMatcher)); 22834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 22844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 22854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if the operand of a unary operator matches. 22864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 22879158a5624154bc43bbbf059c07a2f7b2cd45c1a1Alexander Kornienko/// Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true)))) 228825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 22894da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// !true 229025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2291e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UnaryOperator, hasUnaryOperand, 2292e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Expr>, InnerMatcher) { 2293e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const Expr * const Operand = Node.getSubExpr(); 22944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (Operand != NULL && 22954da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*Operand, Finder, Builder)); 22964da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 22974da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 2298715c9568ee5d75f25dab98229c87bcec880daf5dManuel Klimek/// \brief Matches if the cast's source expression matches the given matcher. 22994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 23004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example: matches "a string" (matcher = 23012dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// hasSourceExpression(constructExpr())) 230225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 23034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class URL { URL(string); }; 23044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// URL url = "a string"; 2305715c9568ee5d75f25dab98229c87bcec880daf5dManuel KlimekAST_MATCHER_P(CastExpr, hasSourceExpression, 2306e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Expr>, InnerMatcher) { 2307e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const Expr* const SubExpression = Node.getSubExpr(); 23084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (SubExpression != NULL && 23094da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*SubExpression, Finder, Builder)); 23104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 23114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 23124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches casts whose destination type matches a given matcher. 23134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 23144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// (Note: Clang's AST refers to other conversions as "casts" too, and calls 23154da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// actual casts "explicit" casts.) 2316e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ExplicitCastExpr, hasDestinationType, 2317e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<QualType>, InnerMatcher) { 2318e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const QualType NodeType = Node.getTypeAsWritten(); 23194da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return InnerMatcher.matches(NodeType, Finder, Builder); 23204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 23214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 23224da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches implicit casts whose destination type matches a given 23234da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matcher. 23244da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 23254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: Unit test this matcher 2326e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ImplicitCastExpr, hasImplicitDestinationType, 2327e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<QualType>, InnerMatcher) { 23284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return InnerMatcher.matches(Node.getType(), Finder, Builder); 23294da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 23304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 23314da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the true branch expression of a conditional operator. 23324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 23334da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches a 233425466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 23354da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// condition ? a : b 233625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2337e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ConditionalOperator, hasTrueExpression, 2338e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Expr>, InnerMatcher) { 2339e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Expr *Expression = Node.getTrueExpr(); 23404da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (Expression != NULL && 23414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*Expression, Finder, Builder)); 23424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 23434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 23444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the false branch expression of a conditional operator. 23454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 23464da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches b 234725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 23484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// condition ? a : b 234925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2350e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(ConditionalOperator, hasFalseExpression, 2351e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Expr>, InnerMatcher) { 2352e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper Expr *Expression = Node.getFalseExpr(); 23534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (Expression != NULL && 23544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*Expression, Finder, Builder)); 23554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 23564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 23574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches if a declaration has a body attached. 23584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 23594da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches A, va, fa 236025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 23614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class A {}; 23624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class B; // Doesn't match, as it has no body. 23634da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int va; 23644da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// extern int vb; // Doesn't match, as it doesn't define the variable. 23654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void fa() {} 23664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void fb(); // Doesn't match, as it has no body. 236725466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2368297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// 2369297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// Usable as: Matcher<TagDecl>, Matcher<VarDecl>, Matcher<FunctionDecl> 2370415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_POLYMORPHIC_MATCHER(isDefinition) { 2371415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek TOOLING_COMPILE_ASSERT( 2372415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek (llvm::is_base_of<TagDecl, NodeType>::value) || 2373415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek (llvm::is_base_of<VarDecl, NodeType>::value) || 2374415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek (llvm::is_base_of<FunctionDecl, NodeType>::value), 2375415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek is_definition_requires_isThisDeclarationADefinition_method); 2376415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return Node.isThisDeclarationADefinition(); 23774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 23784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 23794da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches the class declaration that the given method declaration 23804da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// belongs to. 23814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 23824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: Generalize this for other kinds of declarations. 23834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// FIXME: What other kind of declarations would we need to generalize 23844da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// this to? 23854da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 23864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Example matches A() in the last line 23872dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// (matcher = constructExpr(hasDeclaration(methodDecl( 23884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// ofClass(hasName("A")))))) 238925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 23904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class A { 23914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// public: 23924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// A(); 23934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// }; 23944da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// A a = A(); 239525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2396e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(CXXMethodDecl, ofClass, 2397e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<CXXRecordDecl>, InnerMatcher) { 2398e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper const CXXRecordDecl *Parent = Node.getParent(); 23994da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return (Parent != NULL && 24004da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek InnerMatcher.matches(*Parent, Finder, Builder)); 24014da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 24024da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 24034da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches member expressions that are called with '->' as opposed 24044da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// to '.'. 24054da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 24064da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Member calls on the implicit this pointer match as called with '->'. 24074da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 24084da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 240925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 24104da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// class Y { 24114da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 24124da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int a; 24134da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// static int b; 24144da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// }; 241525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 24162dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// memberExpr(isArrow()) 24174da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches this->x, x, y.x, a, this->b 2418415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_MATCHER(MemberExpr, isArrow) { 2419415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return Node.isArrow(); 24204da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 24214da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 24226a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// \brief Matches QualType nodes that are of integer type. 24236a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// 24246a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// Given 242525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 24266a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// void a(int); 24276a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// void b(long); 24286a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// void c(double); 242925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 24302dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// functionDecl(hasAnyParameter(hasType(isInteger()))) 24316a12449ec8862211856447d3df4c082a346339f2Daniel Jasper/// matches "a(int)", "b(long)", but not "c(double)". 24326a12449ec8862211856447d3df4c082a346339f2Daniel JasperAST_MATCHER(QualType, isInteger) { 24336a12449ec8862211856447d3df4c082a346339f2Daniel Jasper return Node->isIntegerType(); 24346a12449ec8862211856447d3df4c082a346339f2Daniel Jasper} 24356a12449ec8862211856447d3df4c082a346339f2Daniel Jasper 2436e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches QualType nodes that are const-qualified, i.e., that 24374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// include "top-level" const. 24384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 24394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 244025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 24414da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void a(int); 24424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void b(int const); 24434da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void c(const int); 24444da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void d(const int*); 24454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void e(int const) {}; 244625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 24472dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// functionDecl(hasAnyParameter(hasType(isConstQualified()))) 24484da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches "void b(int const)", "void c(const int)" and 24494da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// "void e(int const) {}". It does not match d as there 24504da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// is no top-level const on the parameter type "const int *". 2451415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_MATCHER(QualType, isConstQualified) { 2452415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return Node.isConstQualified(); 24534da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 24544da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 24554da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a member expression where the member is matched by a 24564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// given matcher. 24574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 24584da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 245925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 24604da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// struct { int first, second; } first, second; 24614da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int i(second.first); 24624da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// int j(first.second); 246325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 24642dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// memberExpr(member(hasName("first"))) 24654da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches second.first 24664da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// but not first.second (because the member name there is "second"). 2467e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(MemberExpr, member, 2468e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<ValueDecl>, InnerMatcher) { 24694da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return InnerMatcher.matches(*Node.getMemberDecl(), Finder, Builder); 24704da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 24714da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 24724da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches a member expression where the object expression is 24734da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matched by a given matcher. 24744da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 24754da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 247625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 24774da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// struct X { int m; }; 24784da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// void f(X x) { x.m; m; } 247925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 24802dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X"))))))) 24814da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches "x.m" and "m" 24824da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// with hasObjectExpression(...) 24834da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matching "x" and the implicit object expression of "m" which has type X*. 2484e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(MemberExpr, hasObjectExpression, 2485e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper internal::Matcher<Expr>, InnerMatcher) { 24864da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek return InnerMatcher.matches(*Node.getBase(), Finder, Builder); 24874da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 24884da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 2489e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches any using shadow declaration. 2490e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 2491e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 249225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 2493e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// namespace X { void b(); } 2494e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// using X::b; 249525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 2496e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 2497e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches \code using X::b \endcode 2498e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UsingDecl, hasAnyUsingShadowDecl, 249925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::Matcher<UsingShadowDecl>, InnerMatcher) { 2500e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper for (UsingDecl::shadow_iterator II = Node.shadow_begin(); 2501e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper II != Node.shadow_end(); ++II) { 250225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek if (InnerMatcher.matches(**II, Finder, Builder)) 2503e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return true; 2504e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper } 2505e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper return false; 2506e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 2507e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 2508e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// \brief Matches a using shadow declaration where the target declaration is 2509e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matched by the given matcher. 2510e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// 2511e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// Given 251225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 2513e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// namespace X { int a; void b(); } 2514e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// using X::a; 2515e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// using X::b; 251625466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 25172dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 2518e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// matches \code using X::b \endcode 2519e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper/// but not \code using X::a \endcode 2520e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel JasperAST_MATCHER_P(UsingShadowDecl, hasTargetDecl, 252125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek internal::Matcher<NamedDecl>, InnerMatcher) { 252225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek return InnerMatcher.matches(*Node.getTargetDecl(), Finder, Builder); 2523e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper} 2524e0e6b9e79a0c4edae92abd3928263875c78e23aaDaniel Jasper 25254da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// \brief Matches template instantiations of function, class, or static 25264da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// member variable template instantiations. 25274da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 25284da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// Given 252925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 25304da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// template <typename T> class X {}; class A {}; X<A> x; 253125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 25324da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// or 253325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 25344da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// template <typename T> class X {}; class A {}; template class X<A>; 253525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 25362dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(hasName("::X"), isTemplateInstantiation()) 25374da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// matches the template instantiation of X<A>. 25384da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// 25394da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// But given 254025466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 254125466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// template <typename T> class X {}; class A {}; 25424da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// template <> class X<A> {}; X<A> x; 254325466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 25442dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// recordDecl(hasName("::X"), isTemplateInstantiation()) 25454da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek/// does not match, as X<A> is an explicit template specialization. 2546297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// 2547297f71daa4eec8beb2eb29573e0892539f8e7172Manuel Klimek/// Usable as: Matcher<FunctionDecl>, Matcher<VarDecl>, Matcher<CXXRecordDecl> 2548415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_POLYMORPHIC_MATCHER(isTemplateInstantiation) { 2549415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek TOOLING_COMPILE_ASSERT((llvm::is_base_of<FunctionDecl, NodeType>::value) || 2550415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek (llvm::is_base_of<VarDecl, NodeType>::value) || 2551415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek (llvm::is_base_of<CXXRecordDecl, NodeType>::value), 2552415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek requires_getTemplateSpecializationKind_method); 2553415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return (Node.getTemplateSpecializationKind() == TSK_ImplicitInstantiation || 2554415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek Node.getTemplateSpecializationKind() == 2555415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek TSK_ExplicitInstantiationDefinition); 25564da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} 25574da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 25588456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// \brief Matches explicit template specializations of function, class, or 25598456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// static member variable template instantiations. 25608456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// 25618456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// Given 256225466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \code 25638456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// template<typename T> void A(T t) { } 25648456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// template<> void A(int N) { } 256525466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// \endcode 25662dc75ed2ef2fa3cbfd8b2ed88eb2369f3fcd98a9Daniel Jasper/// functionDecl(isExplicitTemplateSpecialization()) 25678456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko/// matches the specialization A<int>(). 256825466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// 256925466496a2ace2aa533abc7bac1e92a4f425e2b1Manuel Klimek/// Usable as: Matcher<FunctionDecl>, Matcher<VarDecl>, Matcher<CXXRecordDecl> 2570415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_POLYMORPHIC_MATCHER(isExplicitTemplateSpecialization) { 2571415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek TOOLING_COMPILE_ASSERT((llvm::is_base_of<FunctionDecl, NodeType>::value) || 2572415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek (llvm::is_base_of<VarDecl, NodeType>::value) || 2573415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek (llvm::is_base_of<CXXRecordDecl, NodeType>::value), 2574415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek requires_getTemplateSpecializationKind_method); 2575415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return (Node.getTemplateSpecializationKind() == TSK_ExplicitSpecialization); 25768456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko} 25778456ae602783b615019a42f7d5c6f0e71639b11bDmitri Gribenko 2578ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches \c TypeLocs for which the given inner 2579ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// QualType-matcher matches. 2580ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasperinline internal::BindableMatcher<TypeLoc> loc( 2581ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper const internal::Matcher<QualType> &InnerMatcher) { 2582ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper return internal::BindableMatcher<TypeLoc>( 2583ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper new internal::TypeLocTypeMatcher(InnerMatcher)); 2584ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper} 2585ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2586ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches builtin Types. 2587ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2588ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2589ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2590ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// struct A {}; 2591ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// A a; 2592ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int b; 2593ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// float c; 2594ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// bool d; 2595ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2596ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// builtinType() 2597ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "int b", "float c" and "bool d" 2598ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(BuiltinType, builtinType); 2599ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2600ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches all kinds of arrays. 2601ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2602ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2603ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2604ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int a[] = { 2, 3 }; 2605ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int b[4]; 2606ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// void f() { int c[a[0]]; } 2607ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2608ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// arrayType() 2609ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "int a[]", "int b[4]" and "int c[a[0]]"; 2610ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(ArrayType, arrayType); 2611ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2612ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C99 complex types. 2613ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2614ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2615ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2616ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// _Complex float f; 2617ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2618ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// complexType() 2619ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "_Complex float f" 2620ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(ComplexType, complexType); 2621ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2622ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches arrays and C99 complex types that have a specific element 2623ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// type. 2624ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2625ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2626ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2627ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// struct A {}; 2628ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// A a[7]; 2629ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int b[7]; 2630ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2631ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// arrayType(hasElementType(builtinType())) 2632ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "int b[7]" 2633ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2634ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Usable as: Matcher<ArrayType>, Matcher<ComplexType> 2635ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPELOC_TRAVERSE_MATCHER(hasElementType, getElement); 2636ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2637ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C arrays with a specified constant size. 2638ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2639ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2640ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2641ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// void() { 2642ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int a[2]; 2643ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int b[] = { 2, 3 }; 2644ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int c[b[0]]; 2645ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// } 2646ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2647ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// constantArrayType() 2648ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "int a[2]" 2649ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(ConstantArrayType, constantArrayType); 2650ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2651ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches \c ConstantArrayType nodes that have the specified size. 2652ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2653ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2654ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2655ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int a[42]; 2656ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int b[2 * 21]; 2657ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int c[41], d[43]; 2658ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2659ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// constantArrayType(hasSize(42)) 2660ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "int a[42]" and "int b[2 * 21]" 2661ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_MATCHER_P(ConstantArrayType, hasSize, unsigned, N) { 2662ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper return Node.getSize() == N; 2663ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper} 2664ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2665ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C++ arrays whose size is a value-dependent expression. 2666ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2667ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2668ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2669ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// template<typename T, int Size> 2670ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// class array { 2671ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// T data[Size]; 2672ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// }; 2673ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2674ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// dependentSizedArrayType 2675ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "T data[Size]" 2676ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(DependentSizedArrayType, dependentSizedArrayType); 2677ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2678ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C arrays with unspecified size. 2679ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2680ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2681ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2682ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int a[] = { 2, 3 }; 2683ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int b[42]; 2684ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// void f(int c[]) { int d[a[0]]; }; 2685ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2686ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// incompleteArrayType() 2687ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "int a[]" and "int c[]" 2688ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(IncompleteArrayType, incompleteArrayType); 2689ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2690ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches C arrays with a specified size that is not an 2691ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// integer-constant-expression. 2692ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2693ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2694ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2695ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// void f() { 2696ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int a[] = { 2, 3 } 2697ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int b[42]; 2698ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int c[a[0]]; 2699ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2700ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// variableArrayType() 2701ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "int c[a[0]]" 2702ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(VariableArrayType, variableArrayType); 2703ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2704ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches \c VariableArrayType nodes that have a specific size 2705ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// expression. 2706ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2707ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2708ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2709ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// void f(int b) { 2710ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int a[b]; 2711ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// } 2712ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2713ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 2714ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// varDecl(hasName("b"))))))) 2715ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "int a[b]" 2716ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_MATCHER_P(VariableArrayType, hasSizeExpr, 2717ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper internal::Matcher<Expr>, InnerMatcher) { 2718ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper return InnerMatcher.matches(*Node.getSizeExpr(), Finder, Builder); 2719ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper} 2720ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2721ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches atomic types. 2722ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2723ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2724ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2725ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// _Atomic(int) i; 2726ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2727ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// atomicType() 2728ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "_Atomic(int) i" 2729ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(AtomicType, atomicType); 2730ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2731ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches atomic types with a specific value type. 2732ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2733ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2734ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2735ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// _Atomic(int) i; 2736ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// _Atomic(float) f; 2737ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2738ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// atomicType(hasValueType(isInteger())) 2739ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "_Atomic(int) i" 2740ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2741ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Usable as: Matcher<AtomicType> 2742ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPELOC_TRAVERSE_MATCHER(hasValueType, getValue); 2743ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2744ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches types nodes representing C++11 auto types. 2745ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2746ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given: 2747ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2748ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// auto n = 4; 2749ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int v[] = { 2, 3 } 2750ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// for (auto i : v) { } 2751ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2752ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// autoType() 2753ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "auto n" and "auto i" 2754ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(AutoType, autoType); 2755ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2756ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches \c AutoType nodes where the deduced type is a specific type. 2757ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2758ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Note: There is no \c TypeLoc for the deduced type and thus no 2759ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \c getDeducedLoc() matcher. 2760ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2761ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2762ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2763ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// auto a = 1; 2764ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// auto b = 2.0; 2765ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2766ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// autoType(hasDeducedType(isInteger())) 2767ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "auto a" 2768ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2769ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Usable as: Matcher<AutoType> 2770ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_TRAVERSE_MATCHER(hasDeducedType, getDeducedType); 2771ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2772a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \brief Matches \c FunctionType nodes. 2773a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// 2774a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// Given 2775a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \code 2776a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// int (*f)(int); 2777a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// void g(); 2778a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// \endcode 2779a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// functionType() 2780a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper/// matches "int (*f)(int)" and the type of "g". 2781a267cf6f87dc695143d65fc61ec1744564f55932Daniel JasperAST_TYPE_MATCHER(FunctionType, functionType); 2782a267cf6f87dc695143d65fc61ec1744564f55932Daniel Jasper 2783ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches block pointer types, i.e. types syntactically represented as 2784ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// "void (^)(int)". 2785ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2786ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// The \c pointee is always required to be a \c FunctionType. 2787ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(BlockPointerType, blockPointerType); 2788ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2789ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches member pointer types. 2790ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2791ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2792ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// struct A { int i; } 2793ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// A::* ptr = A::i; 2794ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2795ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// memberPointerType() 2796ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "A::* ptr" 2797ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(MemberPointerType, memberPointerType); 2798ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2799ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches pointer types. 2800ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2801ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2802ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2803ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int *a; 2804ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int &b = *a; 2805ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int c = 5; 2806ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2807ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// pointerType() 2808ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "int *a" 2809ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(PointerType, pointerType); 2810ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2811ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches reference types. 2812ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2813ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2814ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2815ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int *a; 2816ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int &b = *a; 2817ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int c = 5; 2818ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2819ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// pointerType() 2820ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "int &b" 2821ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(ReferenceType, referenceType); 2822ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2823ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Narrows PointerType (and similar) matchers to those where the 2824ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \c pointee matches a given matcher. 2825ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2826ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2827ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2828ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int *a; 2829ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// int const *b; 2830ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// float const *f; 2831ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2832ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// pointerType(pointee(isConstQualified(), isInteger())) 2833ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "int const *b" 2834ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2835ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Usable as: Matcher<BlockPointerType>, Matcher<MemberPointerType>, 2836ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Matcher<PointerType>, Matcher<ReferenceType> 2837ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPELOC_TRAVERSE_MATCHER(pointee, getPointee); 2838ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2839ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches typedef types. 2840ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2841ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2842ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2843ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// typedef int X; 2844ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2845ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// typedefType() 2846ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "typedef int X" 2847ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_TYPE_MATCHER(TypedefType, typedefType); 2848ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2849ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches \c TypedefTypes referring to a specific 2850ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \c TypedefNameDecl. 2851ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_MATCHER_P(TypedefType, hasDecl, 2852ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper internal::Matcher<TypedefNameDecl>, InnerMatcher) { 2853ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper return InnerMatcher.matches(*Node.getDecl(), Finder, Builder); 2854ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper} 2855ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2856a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Matches nested name specifiers. 2857a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// 2858a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// Given 2859a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \code 2860a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// namespace ns { 2861a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// struct A { static void f(); }; 2862a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// void A::f() {} 2863a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// void g() { A::f(); } 2864a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// } 2865a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// ns::A a; 2866a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \endcode 2867a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifier() 2868a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// matches "ns::" and both "A::" 2869a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasperconst internal::VariadicAllOfMatcher<NestedNameSpecifier> nestedNameSpecifier; 2870a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper 2871a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Same as \c nestedNameSpecifier but matches \c NestedNameSpecifierLoc. 2872a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasperconst internal::VariadicAllOfMatcher< 2873a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper NestedNameSpecifierLoc> nestedNameSpecifierLoc; 2874a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper 2875a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Matches \c NestedNameSpecifierLocs for which the given inner 2876a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// NestedNameSpecifier-matcher matches. 2877a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasperinline internal::BindableMatcher<NestedNameSpecifierLoc> loc( 2878a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper const internal::Matcher<NestedNameSpecifier> &InnerMatcher) { 2879a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper return internal::BindableMatcher<NestedNameSpecifierLoc>( 2880a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper new internal::LocMatcher<NestedNameSpecifierLoc, NestedNameSpecifier>( 2881a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper InnerMatcher)); 2882a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper} 2883a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper 2884a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Matches nested name specifiers that specify a type matching the 2885a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// given \c QualType matcher without qualifiers. 2886a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// 2887a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// Given 2888a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \code 2889a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// struct A { struct B { struct C {}; }; }; 2890a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// A::B::C c; 2891a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \endcode 2892a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A"))))) 2893a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// matches "A::" 2894a7564433191601cb8851196b8dde39392c9c05eeDaniel JasperAST_MATCHER_P(NestedNameSpecifier, specifiesType, 2895a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper internal::Matcher<QualType>, InnerMatcher) { 2896a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper if (Node.getAsType() == NULL) 2897a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper return false; 2898a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper return InnerMatcher.matches(QualType(Node.getAsType(), 0), Finder, Builder); 2899a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper} 2900a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper 2901ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches nested name specifier locs that specify a type matching the 2902ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// given \c TypeLoc. 2903ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2904ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2905ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2906ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// struct A { struct B { struct C {}; }; }; 2907ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// A::B::C c; 2908ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2909ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 2910ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// hasDeclaration(recordDecl(hasName("A"))))))) 2911ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "A::" 2912ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel JasperAST_MATCHER_P(NestedNameSpecifierLoc, specifiesTypeLoc, 2913ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper internal::Matcher<TypeLoc>, InnerMatcher) { 2914ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper return InnerMatcher.matches(Node.getTypeLoc(), Finder, Builder); 2915ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper} 2916ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2917ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches on the prefix of a \c NestedNameSpecifier. 2918a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// 2919a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// Given 2920a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \code 2921a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// struct A { struct B { struct C {}; }; }; 2922a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// A::B::C c; 2923a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \endcode 2924a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 2925ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "A::" 2926415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_MATCHER_P_OVERLOAD(NestedNameSpecifier, hasPrefix, 2927415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek internal::Matcher<NestedNameSpecifier>, InnerMatcher, 2928415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek 0) { 2929415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek NestedNameSpecifier *NextNode = Node.getPrefix(); 2930415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek if (NextNode == NULL) 2931415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return false; 2932415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return InnerMatcher.matches(*NextNode, Finder, Builder); 2933ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper} 2934ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper 2935ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \brief Matches on the prefix of a \c NestedNameSpecifierLoc. 2936ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// 2937ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// Given 2938ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \code 2939ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// struct A { struct B { struct C {}; }; }; 2940ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// A::B::C c; 2941ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// \endcode 2942a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 2943ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper/// matches "A::" 2944415514d5fbc2761b7f2938aa9112b079249820d6Manuel KlimekAST_MATCHER_P_OVERLOAD(NestedNameSpecifierLoc, hasPrefix, 2945415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek internal::Matcher<NestedNameSpecifierLoc>, InnerMatcher, 2946415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek 1) { 2947415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek NestedNameSpecifierLoc NextNode = Node.getPrefix(); 2948415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek if (!NextNode) 2949415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return false; 2950415514d5fbc2761b7f2938aa9112b079249820d6Manuel Klimek return InnerMatcher.matches(NextNode, Finder, Builder); 2951ce62007526cdf718faed10df5e9fc7c3cd160cdeDaniel Jasper} 2952a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper 2953a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \brief Matches nested name specifiers that specify a namespace matching the 2954a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// given namespace matcher. 2955a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// 2956a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// Given 2957a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \code 2958a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// namespace ns { struct A {}; } 2959a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// ns::A a; 2960a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// \endcode 2961a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 2962a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper/// matches "ns::" 2963a7564433191601cb8851196b8dde39392c9c05eeDaniel JasperAST_MATCHER_P(NestedNameSpecifier, specifiesNamespace, 2964a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper internal::Matcher<NamespaceDecl>, InnerMatcher) { 2965a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper if (Node.getAsNamespace() == NULL) 2966a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper return false; 2967a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper return InnerMatcher.matches(*Node.getAsNamespace(), Finder, Builder); 2968a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper} 2969a7564433191601cb8851196b8dde39392c9c05eeDaniel Jasper 2970fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \brief Overloads for the \c equalsNode matcher. 2971fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// FIXME: Implement for other node types. 2972fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// @{ 2973fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek 2974fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \brief Matches if a node equals another node. 2975fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// 2976fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \c Decl has pointer identity in the AST. 2977fa37c5ca61af275a329386407e58cf70f4d9f596Manuel KlimekAST_MATCHER_P_OVERLOAD(Decl, equalsNode, Decl*, Other, 0) { 2978fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek return &Node == Other; 2979fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek} 2980fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \brief Matches if a node equals another node. 2981fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// 2982fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// \c Stmt has pointer identity in the AST. 2983fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// 2984fa37c5ca61af275a329386407e58cf70f4d9f596Manuel KlimekAST_MATCHER_P_OVERLOAD(Stmt, equalsNode, Stmt*, Other, 1) { 2985fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek return &Node == Other; 2986fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek} 2987fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek 2988fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek/// @} 2989fa37c5ca61af275a329386407e58cf70f4d9f596Manuel Klimek 29904da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} // end namespace ast_matchers 29914da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek} // end namespace clang 29924da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek 29934da216637fa1ad4bdfd31bc265edb57ca35c2c12Manuel Klimek#endif // LLVM_CLANG_AST_MATCHERS_AST_MATCHERS_H 2994