44#ifndef LLVM_CLANG_ASTMATCHERS_ASTMATCHERS_H
45#define LLVM_CLANG_ASTMATCHERS_ASTMATCHERS_H
82#include "llvm/ADT/ArrayRef.h"
83#include "llvm/ADT/SmallVector.h"
84#include "llvm/ADT/StringExtras.h"
85#include "llvm/ADT/StringRef.h"
86#include "llvm/Support/Casting.h"
87#include "llvm/Support/Compiler.h"
88#include "llvm/Support/ErrorHandling.h"
89#include "llvm/Support/Regex.h"
100namespace ast_matchers {
115 template <
typename T>
117 return MyBoundNodes.getNodeAs<
T>(
ID);
127 return MyBoundNodes.getMap();
134 BoundNodes(internal::BoundNodesMap &MyBoundNodes)
135 : MyBoundNodes(MyBoundNodes) {}
137 internal::BoundNodesMap MyBoundNodes;
171inline internal::TrueMatcher
anything() {
return internal::TrueMatcher(); }
184extern const internal::VariadicDynCastAllOfMatcher<Decl, TranslationUnitDecl>
196extern const internal::VariadicDynCastAllOfMatcher<Decl, TypedefDecl>
208extern const internal::VariadicDynCastAllOfMatcher<Decl, TypedefNameDecl>
220extern const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasDecl>
230extern const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasTemplateDecl>
249 auto &
SourceManager = Finder->getASTContext().getSourceManager();
270 auto &
SourceManager = Finder->getASTContext().getSourceManager();
272 if (ExpansionLoc.isInvalid()) {
297 auto &
SourceManager = Finder->getASTContext().getSourceManager();
299 if (ExpansionLoc.isInvalid()) {
318 std::string, MacroName) {
321 auto& Context = Finder->getASTContext();
322 std::optional<SourceLocation> B =
324 if (!B)
return false;
325 std::optional<SourceLocation>
E =
327 if (!
E)
return false;
340extern const internal::VariadicAllOfMatcher<Decl>
decl;
352extern const internal::VariadicDynCastAllOfMatcher<Decl, DecompositionDecl>
362extern const internal::VariadicDynCastAllOfMatcher<Decl, BindingDecl>
373extern const internal::VariadicDynCastAllOfMatcher<Decl, LinkageSpecDecl>
387extern const internal::VariadicDynCastAllOfMatcher<Decl, NamedDecl>
namedDecl;
398extern const internal::VariadicDynCastAllOfMatcher<Decl, LabelDecl>
labelDecl;
409extern const internal::VariadicDynCastAllOfMatcher<Decl, NamespaceDecl>
421extern const internal::VariadicDynCastAllOfMatcher<Decl, NamespaceAliasDecl>
433extern const internal::VariadicDynCastAllOfMatcher<Decl, RecordDecl>
recordDecl;
442extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXRecordDecl>
451extern const internal::VariadicDynCastAllOfMatcher<Decl, ClassTemplateDecl>
464extern const internal::VariadicDynCastAllOfMatcher<
483extern const internal::VariadicDynCastAllOfMatcher<
496extern const internal::VariadicDynCastAllOfMatcher<Decl, DeclaratorDecl>
507extern const internal::VariadicDynCastAllOfMatcher<Decl, ParmVarDecl>
521extern const internal::VariadicDynCastAllOfMatcher<Decl, AccessSpecDecl>
531extern const internal::VariadicAllOfMatcher<CXXBaseSpecifier>
cxxBaseSpecifier;
542extern const internal::VariadicAllOfMatcher<CXXCtorInitializer>
554extern const internal::VariadicAllOfMatcher<TemplateArgument>
templateArgument;
565extern const internal::VariadicAllOfMatcher<TemplateArgumentLoc>
577extern const internal::VariadicAllOfMatcher<TemplateName>
templateName;
587extern const internal::VariadicDynCastAllOfMatcher<
Decl,
599extern const internal::VariadicDynCastAllOfMatcher<Decl, TemplateTypeParmDecl>
610extern const internal::VariadicDynCastAllOfMatcher<
Decl,
694 return Node.isBitField();
711 return Node.isBitField() &&
Node.getBitWidthValue() == Width;
732 InnerMatcher.matches(*
Initializer, Finder, Builder));
738 return Node.isMain();
752 internal::Matcher<ClassTemplateDecl>, InnerMatcher) {
754 return (
Decl !=
nullptr &&
755 InnerMatcher.matches(*
Decl, Finder, Builder));
763 return Node.isImplicit();
788 hasAnyTemplateArgument,
792 internal::Matcher<TemplateArgument>, InnerMatcher) {
794 internal::getTemplateSpecializationArgs(
Node);
795 return matchesFirstInRange(InnerMatcher, List.begin(), List.end(), Finder,
796 Builder) != List.end();
817 const internal::Matcher<T> &InnerMatcher) {
818 return internal::DynTypedMatcher::constructRestrictedWrapper(
819 new internal::TraversalMatcher<T>(TK, InnerMatcher),
820 InnerMatcher.getID().first)
821 .template unconditionalConvertTo<T>();
825internal::BindableMatcher<T>
827 return internal::BindableMatcher<T>(
828 internal::DynTypedMatcher::constructRestrictedWrapper(
829 new internal::TraversalMatcher<T>(TK, InnerMatcher),
830 InnerMatcher.getID().first)
831 .template unconditionalConvertTo<T>());
834template <
typename...
T>
835internal::TraversalWrapper<internal::VariadicOperatorMatcher<
T...>>
837 const internal::VariadicOperatorMatcher<T...> &InnerMatcher) {
838 return internal::TraversalWrapper<internal::VariadicOperatorMatcher<
T...>>(
842template <
template <
typename ToArg,
typename FromArg>
class ArgumentAdapterT,
843 typename T,
typename ToTypes>
844internal::TraversalWrapper<
845 internal::ArgumentAdaptingMatcherFuncAdaptor<ArgumentAdapterT, T, ToTypes>>
847 ArgumentAdapterT,
T, ToTypes> &InnerMatcher) {
848 return internal::TraversalWrapper<
849 internal::ArgumentAdaptingMatcherFuncAdaptor<ArgumentAdapterT,
T,
850 ToTypes>>(TK, InnerMatcher);
853template <
template <
typename T,
typename...
P>
class MatcherT, typename...
P,
854 typename ReturnTypesF>
855internal::TraversalWrapper<
856 internal::PolymorphicMatcher<MatcherT, ReturnTypesF, P...>>
858 const internal::PolymorphicMatcher<MatcherT, ReturnTypesF, P...>
860 return internal::TraversalWrapper<
861 internal::PolymorphicMatcher<MatcherT, ReturnTypesF,
P...>>(TK,
865template <
typename...
T>
866internal::Matcher<
typename internal::GetClade<
T...>::Type>
868 return traverse(TK, InnerMatcher.with());
894 return InnerMatcher.matches(*
Node.IgnoreImplicit(), Finder, Builder);
923 internal::Matcher<Expr>, InnerMatcher) {
924 return InnerMatcher.matches(*
Node.IgnoreImpCasts(), Finder, Builder);
945 return InnerMatcher.matches(*
Node.IgnoreParenCasts(), Finder, Builder);
970 internal::Matcher<Expr>, InnerMatcher) {
971 return InnerMatcher.matches(*
Node.IgnoreParenImpCasts(), Finder, Builder);
987 return InnerMatcher.matches(
Node.IgnoreParens(), Finder, Builder);
1004 return InnerMatcher.matches(*
E, Finder, Builder);
1021 return Node.isInstantiationDependent();
1069 hasTemplateArgument,
1073 unsigned, N, internal::Matcher<TemplateArgument>, InnerMatcher) {
1075 internal::getTemplateSpecializationArgs(
Node);
1076 if (List.size() <= N)
1078 return InnerMatcher.matches(List[N], Finder, Builder);
1091 templateArgumentCountIs,
1095 return internal::getTemplateSpecializationArgs(
Node).size() == N;
1110 internal::Matcher<QualType>, InnerMatcher) {
1113 return InnerMatcher.matches(
Node.getAsType(), Finder, Builder);
1128 internal::Matcher<TemplateName>, InnerMatcher) {
1131 return InnerMatcher.matches(
Node.getAsTemplate(), Finder, Builder);
1148 internal::Matcher<Decl>, InnerMatcher) {
1150 return InnerMatcher.matches(*
Node.getAsDecl(), Finder, Builder);
1168 return InnerMatcher.matches(*
Node.getAsExpr(), Finder, Builder);
1198 internal::Matcher<QualType>, InnerMatcher) {
1201 return InnerMatcher.matches(
Node.getIntegralType(), Finder, Builder);
1219 std::string,
Value) {
1235extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1247extern const internal::VariadicDynCastAllOfMatcher<Decl, ExportDecl>
exportDecl;
1256extern const internal::VariadicDynCastAllOfMatcher<Decl, ValueDecl>
valueDecl;
1269extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXConstructorDecl>
1281extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXDestructorDecl>
1292extern const internal::VariadicDynCastAllOfMatcher<Decl, EnumDecl>
enumDecl;
1302extern const internal::VariadicDynCastAllOfMatcher<Decl, EnumConstantDecl>
1317extern const internal::VariadicDynCastAllOfMatcher<Decl, TagDecl>
tagDecl;
1325extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXMethodDecl>
1334extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXConversionDecl>
1345extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXDeductionGuideDecl>
1355extern const internal::VariadicDynCastAllOfMatcher<Decl, ConceptDecl>
1367extern const internal::VariadicDynCastAllOfMatcher<Decl, VarDecl>
varDecl;
1377extern const internal::VariadicDynCastAllOfMatcher<Decl, FieldDecl>
fieldDecl;
1387extern const internal::VariadicDynCastAllOfMatcher<Decl, IndirectFieldDecl>
1396extern const internal::VariadicDynCastAllOfMatcher<Decl, FunctionDecl>
1405extern const internal::VariadicDynCastAllOfMatcher<Decl, FunctionTemplateDecl>
1416extern const internal::VariadicDynCastAllOfMatcher<Decl, FriendDecl>
friendDecl;
1426extern const internal::VariadicAllOfMatcher<Stmt>
stmt;
1436extern const internal::VariadicDynCastAllOfMatcher<Stmt, DeclStmt>
declStmt;
1449extern const internal::VariadicDynCastAllOfMatcher<Stmt, MemberExpr>
memberExpr;
1463extern const internal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedMemberExpr>
1475extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1487extern const internal::VariadicDynCastAllOfMatcher<Stmt, CallExpr>
callExpr;
1517extern const internal::VariadicDynCastAllOfMatcher<Stmt, LambdaExpr>
lambdaExpr;
1526extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXMemberCallExpr>
1538extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCMessageExpr>
1547extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCStringLiteral>
1557extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCInterfaceDecl>
1567extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCImplementationDecl>
1577extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCProtocolDecl>
1587extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryDecl>
1597extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryImplDecl>
1612extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCMethodDecl>
1625extern const internal::VariadicDynCastAllOfMatcher<Decl, BlockDecl>
1637extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCIvarDecl>
1648extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCPropertyDecl>
1657extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtThrowStmt>
1667extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtTryStmt>
1677extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtCatchStmt>
1687extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtFinallyStmt>
1697extern const internal::VariadicDynCastAllOfMatcher<Stmt, ExprWithCleanups>
1710extern const internal::VariadicDynCastAllOfMatcher<Stmt, InitListExpr>
1716 internal::Matcher<Expr>, InnerMatcher) {
1717 const Expr *SyntForm =
Node.getSyntacticForm();
1718 return (SyntForm !=
nullptr &&
1719 InnerMatcher.matches(*SyntForm, Finder, Builder));
1733extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1745extern const internal::VariadicDynCastAllOfMatcher<Stmt, ImplicitValueInitExpr>
1763extern const internal::VariadicDynCastAllOfMatcher<Stmt, ParenListExpr>
1776extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1789extern const internal::VariadicDynCastAllOfMatcher<Decl, UsingDecl>
usingDecl;
1800extern const internal::VariadicDynCastAllOfMatcher<Decl, UsingEnumDecl>
1812extern const internal::VariadicDynCastAllOfMatcher<Decl, UsingDirectiveDecl>
1829extern const internal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedLookupExpr>
1843extern const internal::VariadicDynCastAllOfMatcher<
Decl,
1862extern const internal::VariadicDynCastAllOfMatcher<
Decl,
1875extern const internal::VariadicDynCastAllOfMatcher<Stmt, ConstantExpr>
1885extern const internal::VariadicDynCastAllOfMatcher<Stmt, ParenExpr>
parenExpr;
1897extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXConstructExpr>
1908extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1922extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThisExpr>
1933extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBindTemporaryExpr>
1954extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1966extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNewExpr>
cxxNewExpr;
1976extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDeleteExpr>
1992extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNoexceptExpr>
2012extern const internal::VariadicDynCastAllOfMatcher<Stmt, ArrayInitLoopExpr>
2031extern const internal::VariadicDynCastAllOfMatcher<Stmt, ArrayInitIndexExpr>
2042extern const internal::VariadicDynCastAllOfMatcher<Stmt, ArraySubscriptExpr>
2054extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDefaultArgExpr>
2073extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXOperatorCallExpr>
2085extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXFoldExpr>
2105extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
2115extern const internal::VariadicDynCastAllOfMatcher<Stmt, Expr>
expr;
2124extern const internal::VariadicDynCastAllOfMatcher<Stmt, DeclRefExpr>
2133extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
2148extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCIvarRefExpr>
2157extern const internal::VariadicDynCastAllOfMatcher<Stmt, BlockExpr>
blockExpr;
2165extern const internal::VariadicDynCastAllOfMatcher<Stmt, IfStmt>
ifStmt;
2174extern const internal::VariadicDynCastAllOfMatcher<Stmt, ForStmt>
forStmt;
2186 const Stmt *
const Increment =
Node.getInc();
2187 return (Increment !=
nullptr &&
2188 InnerMatcher.matches(*Increment, Finder, Builder));
2202 return (
Init !=
nullptr && InnerMatcher.matches(*
Init, Finder, Builder));
2212extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXForRangeStmt>
2225 const VarDecl *
const Var =
Node.getLoopVariable();
2226 return (Var !=
nullptr && InnerMatcher.matches(*Var, Finder, Builder));
2240 return (
Init !=
nullptr && InnerMatcher.matches(*
Init, Finder, Builder));
2251extern const internal::VariadicDynCastAllOfMatcher<Stmt, WhileStmt>
whileStmt;
2261extern const internal::VariadicDynCastAllOfMatcher<Stmt, DoStmt>
doStmt;
2271extern const internal::VariadicDynCastAllOfMatcher<Stmt, BreakStmt>
breakStmt;
2281extern const internal::VariadicDynCastAllOfMatcher<Stmt, ContinueStmt>
2292extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoreturnStmt>
2303extern const internal::VariadicDynCastAllOfMatcher<Stmt, ReturnStmt>
returnStmt;
2314extern const internal::VariadicDynCastAllOfMatcher<Stmt, GotoStmt>
gotoStmt;
2325extern const internal::VariadicDynCastAllOfMatcher<Stmt, LabelStmt>
labelStmt;
2337extern const internal::VariadicDynCastAllOfMatcher<Stmt, AddrLabelExpr>
2348extern const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchStmt>
switchStmt;
2358extern const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchCase>
switchCase;
2368extern const internal::VariadicDynCastAllOfMatcher<Stmt, CaseStmt>
caseStmt;
2378extern const internal::VariadicDynCastAllOfMatcher<Stmt, DefaultStmt>
2387extern const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundStmt>
2397extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXCatchStmt>
2407extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTryStmt>
cxxTryStmt;
2416extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThrowExpr>
2426extern const internal::VariadicDynCastAllOfMatcher<Stmt, NullStmt>
nullStmt;
2436extern const internal::VariadicDynCastAllOfMatcher<Stmt, AsmStmt>
asmStmt;
2444extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBoolLiteralExpr>
2454extern const internal::VariadicDynCastAllOfMatcher<Stmt, StringLiteral>
2467extern const internal::VariadicDynCastAllOfMatcher<Stmt, CharacterLiteral>
2474extern const internal::VariadicDynCastAllOfMatcher<Stmt, IntegerLiteral>
2484extern const internal::VariadicDynCastAllOfMatcher<Stmt, FloatingLiteral>
2489extern const internal::VariadicDynCastAllOfMatcher<Stmt, ImaginaryLiteral>
2493extern const internal::VariadicDynCastAllOfMatcher<Stmt, FixedPointLiteral>
2499extern const internal::VariadicDynCastAllOfMatcher<Stmt, UserDefinedLiteral>
2509extern const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundLiteralExpr>
2520extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoawaitExpr>
2523extern const internal::VariadicDynCastAllOfMatcher<Stmt, DependentCoawaitExpr>
2533extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoyieldExpr>
2544extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoroutineBodyStmt>
2548extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNullPtrLiteralExpr>
2552extern const internal::VariadicDynCastAllOfMatcher<Stmt, ChooseExpr>
2556extern const internal::VariadicDynCastAllOfMatcher<Stmt, ConvertVectorExpr>
2560extern const internal::VariadicDynCastAllOfMatcher<Stmt, GNUNullExpr>
2564extern const internal::VariadicDynCastAllOfMatcher<Stmt, GenericSelectionExpr>
2572extern const internal::VariadicDynCastAllOfMatcher<Stmt, AtomicExpr>
atomicExpr;
2580extern const internal::VariadicDynCastAllOfMatcher<Stmt, StmtExpr>
stmtExpr;
2589extern const internal::VariadicDynCastAllOfMatcher<Stmt, BinaryOperator>
2598extern const internal::VariadicDynCastAllOfMatcher<Stmt, UnaryOperator>
2607extern const internal::VariadicDynCastAllOfMatcher<Stmt, ConditionalOperator>
2616extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
2628extern const internal::VariadicDynCastAllOfMatcher<Stmt, OpaqueValueExpr>
2644extern const internal::VariadicDynCastAllOfMatcher<Decl, StaticAssertDecl>
2657extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXReinterpretCastExpr>
2673extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXStaticCastExpr>
2688extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDynamicCastExpr>
2699extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXConstCastExpr>
2708extern const internal::VariadicDynCastAllOfMatcher<Stmt, CStyleCastExpr>
2732extern const internal::VariadicDynCastAllOfMatcher<Stmt, ExplicitCastExpr>
2739extern const internal::VariadicDynCastAllOfMatcher<Stmt, ImplicitCastExpr>
2755extern const internal::VariadicDynCastAllOfMatcher<Stmt, CastExpr>
castExpr;
2765extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXFunctionalCastExpr>
2774extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTemporaryObjectExpr>
2783extern const internal::VariadicDynCastAllOfMatcher<Stmt, PredefinedExpr>
2792extern const internal::VariadicDynCastAllOfMatcher<Stmt, DesignatedInitExpr>
2807 return Node.size() == N;
2811extern const internal::VariadicAllOfMatcher<QualType>
qualType;
2814extern const internal::VariadicAllOfMatcher<Type>
type;
2817extern const internal::VariadicAllOfMatcher<TypeLoc>
typeLoc;
2838extern const internal::VariadicOperatorMatcherFunc<
2839 2, std::numeric_limits<unsigned>::max()>
2845extern const internal::VariadicOperatorMatcherFunc<
2846 2, std::numeric_limits<unsigned>::max()>
2852extern const internal::VariadicOperatorMatcherFunc<
2853 2, std::numeric_limits<unsigned>::max()>
2880extern const internal::VariadicOperatorMatcherFunc<1, 1>
optionally;
2891extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
2920template <
typename T,
typename...
U>
2921auto mapAnyOf(internal::VariadicDynCastAllOfMatcher<T, U>
const &...) {
2922 return internal::MapAnyOfHelper<
U...>();
3035extern const internal::MapAnyOfMatcher<CallExpr, CXXConstructExpr>
invocation;
3046 internal::Matcher<QualType>, InnerMatcher) {
3047 const QualType ArgumentType =
Node.getTypeOfArgument();
3048 return InnerMatcher.matches(ArgumentType, Finder, Builder);
3070 const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
3072 allOf(
anyOf(ofKind(UETT_AlignOf), ofKind(UETT_PreferredAlignOf)),
3079 const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
3081 allOf(ofKind(UETT_SizeOf), InnerMatcher)));
3099inline internal::Matcher<NamedDecl>
hasName(StringRef Name) {
3100 return internal::Matcher<NamedDecl>(
3101 new internal::HasNameMatcher({std::string(Name)}));
3114extern const internal::VariadicFunction<internal::Matcher<NamedDecl>, StringRef,
3135 std::string FullNameString =
"::" +
Node.getQualifiedNameAsString();
3136 return RegExp->match(FullNameString);
3158inline internal::PolymorphicMatcher<
3159 internal::HasOverloadedOperatorNameMatcher,
3161 std::vector<std::string>>
3163 return internal::PolymorphicMatcher<
3164 internal::HasOverloadedOperatorNameMatcher,
3166 std::vector<std::string>>({std::string(Name)});
3177extern const internal::VariadicFunction<
3178 internal::PolymorphicMatcher<internal::HasOverloadedOperatorNameMatcher,
3181 std::vector<std::string>>,
3206 return Node.getMember().getAsString() == N;
3244 std::string, BindingID) {
3245 auto MemberName =
Node.getMember().getAsString();
3247 return Builder->removeBindings(
3248 [
this, MemberName](
const BoundNodesMap &
Nodes) {
3251 if (!isa<FieldDecl, CXXMethodDecl, VarDecl>(ND))
3253 return ND->getName() != MemberName;
3279 return internal::getDependentName(
Node) == N;
3315 internal::Matcher<NamedDecl>,
Base) {
3317 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
3318 return Finder->classIsDerivedFrom(RD,
Base, Builder,
false);
3321 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
3322 return Finder->objcClassIsDerivedFrom(InterfaceDecl,
Base, Builder,
3330 std::string, BaseName, 1) {
3331 if (BaseName.empty())
3334 const auto M = isDerivedFrom(
hasName(BaseName));
3336 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
3337 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3339 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
3340 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3377 return Node.hasDefinition() &&
3379 return BaseSpecMatcher.matches(Base, Finder, Builder);
3386 isSameOrDerivedFrom,
3388 internal::Matcher<NamedDecl>,
Base, 0) {
3391 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
3392 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3394 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
3395 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3401 isSameOrDerivedFrom,
3403 std::string, BaseName, 1) {
3404 if (BaseName.empty())
3407 const auto M = isSameOrDerivedFrom(
hasName(BaseName));
3409 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
3410 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3412 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
3413 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3438 isDirectlyDerivedFrom,
3440 internal::Matcher<NamedDecl>,
Base, 0) {
3442 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
3443 return Finder->classIsDerivedFrom(RD,
Base, Builder,
true);
3446 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
3447 return Finder->objcClassIsDerivedFrom(InterfaceDecl,
Base, Builder,
3453 isDirectlyDerivedFrom,
3455 std::string, BaseName, 1) {
3456 if (BaseName.empty())
3458 const auto M = isDirectlyDerivedFrom(
hasName(BaseName));
3460 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
3461 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3463 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
3464 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3479 BoundNodesTreeBuilder
Result(*Builder);
3480 auto MatchIt = matchesFirstInPointerRange(InnerMatcher,
Node.method_begin(),
3482 if (MatchIt ==
Node.method_end())
3485 if (Finder->isTraversalIgnoringImplicitNodes() && (*MatchIt)->isImplicit())
3487 *Builder = std::move(
Result);
3501 return Node.isLambda();
3522extern const internal::ArgumentAdaptingMatcherFunc<internal::HasMatcher>
has;
3538extern const internal::ArgumentAdaptingMatcherFunc<
3539 internal::HasDescendantMatcher>
3560extern const internal::ArgumentAdaptingMatcherFunc<internal::ForEachMatcher>
3590extern const internal::ArgumentAdaptingMatcherFunc<
3591 internal::ForEachDescendantMatcher>
3610template <
typename T>
3611internal::Matcher<T>
findAll(
const internal::Matcher<T> &Matcher) {
3625extern const internal::ArgumentAdaptingMatcherFunc<
3626 internal::HasParentMatcher,
3627 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>,
3628 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>>
3642extern const internal::ArgumentAdaptingMatcherFunc<
3643 internal::HasAncestorMatcher,
3644 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>,
3645 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>>
3657extern const internal::VariadicOperatorMatcherFunc<1, 1>
unless;
3693inline internal::PolymorphicMatcher<
3694 internal::HasDeclarationMatcher,
3695 void(internal::HasDeclarationSupportedTypes), internal::Matcher<Decl>>
3697 return internal::PolymorphicMatcher<
3698 internal::HasDeclarationMatcher,
3699 void(internal::HasDeclarationSupportedTypes), internal::Matcher<Decl>>(
3718 return UnderlyingDecl !=
nullptr &&
3719 InnerMatcher.matches(*UnderlyingDecl, Finder, Builder);
3742 const Expr *ExprNode =
Node.getImplicitObjectArgument()
3743 ->IgnoreParenImpCasts();
3744 return (ExprNode !=
nullptr &&
3745 InnerMatcher.matches(*ExprNode, Finder, Builder));
3762 return InnerMatcher.matches(
TypeDecl, Finder, Builder);
3778 return Node.isClassMethod();
3794 return Node.isInstanceMethod();
3811 return Node.isClassMessage();
3828 return Node.isInstanceMessage();
3843 const Expr *ReceiverNode =
Node.getInstanceReceiver();
3844 return (ReceiverNode !=
nullptr &&
3871extern const internal::VariadicFunction<internal::Matcher<ObjCMessageExpr>,
3885 std::string SelectorString =
Node.getSelector().getAsString();
3886 return RegExp->match(SelectorString);
3894 return Node.getSelector().isNull();
3906 return Node.getSelector().isUnarySelector();
3922 return Node.getSelector().isKeywordSelector();
3937 return Node.getSelector().getNumArgs() == N;
3976 internal::Matcher<Stmt>, InnerMatcher, 0) {
3977 const auto *ExprNode =
Node.getCallee();
3978 return (ExprNode !=
nullptr &&
3979 InnerMatcher.matches(*ExprNode, Finder, Builder));
4005 internal::Matcher<Decl>, InnerMatcher, 1) {
4006 if (isa<CallExpr>(&
Node))
4008 .matches(
Node, Finder, Builder);
4012 const auto *MsgNode = cast<ObjCMessageExpr>(&
Node);
4013 const Decl *DeclNode = MsgNode->getMethodDecl();
4014 return (DeclNode !=
nullptr &&
4015 InnerMatcher.matches(*DeclNode, Finder, Builder));
4039 internal::Matcher<QualType>, InnerMatcher, 0) {
4042 return InnerMatcher.matches(QT, Finder, Builder);
4080 internal::Matcher<Decl>, InnerMatcher, 1) {
4124 internal::Matcher<TypeLoc>, Inner) {
4126 if (source ==
nullptr) {
4130 return Inner.matches(source->
getTypeLoc(), Finder, Builder);
4143 return Name ==
Node.getAsString();
4157 QualType, pointsTo, internal::Matcher<QualType>,
4159 return (!
Node.isNull() &&
Node->isAnyPointerType() &&
4160 InnerMatcher.matches(
Node->getPointeeType(), Finder, Builder));
4167 .matches(
Node, Finder, Builder);
4182 return InnerMatcher.matches(*
Node.getUnqualifiedDesugaredType(), Finder,
4201 return (!
Node.isNull() &&
Node->isReferenceType() &&
4202 InnerMatcher.matches(
Node->getPointeeType(), Finder, Builder));
4221 return InnerMatcher.matches(
Node.getCanonicalType(), Finder, Builder);
4228 .matches(
Node, Finder, Builder);
4249 internal::Matcher<Expr>, InnerMatcher) {
4250 const Expr *ExprNode =
Node.getImplicitObjectArgument();
4251 return (ExprNode !=
nullptr &&
4252 InnerMatcher.matches(*ExprNode, Finder, Builder));
4272 internal::Matcher<QualType>, InnerMatcher, 0) {
4273 return onImplicitObjectArgument(
4274 anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))))
4275 .matches(
Node, Finder, Builder);
4280 internal::Matcher<Decl>, InnerMatcher, 1) {
4281 return onImplicitObjectArgument(
4282 anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))))
4283 .matches(
Node, Finder, Builder);
4297 const Decl *DeclNode =
Node.getDecl();
4298 return (DeclNode !=
nullptr &&
4299 InnerMatcher.matches(*DeclNode, Finder, Builder));
4326 internal::Matcher<UsingShadowDecl>, Inner) {
4329 return Inner.matches(*
UsingDecl, Finder, Builder);
4350 return matchesFirstInPointerRange(InnerMatcher,
Node.decls_begin(),
4351 Node.decls_end(), Finder,
4352 Builder) !=
Node.decls_end();
4365 if (
Node.isSingleDecl()) {
4366 const Decl *FoundDecl =
Node.getSingleDecl();
4367 return InnerMatcher.matches(*FoundDecl, Finder, Builder);
4381 VarDecl, hasInitializer, internal::Matcher<Expr>,
4385 InnerMatcher.matches(*
Initializer, Finder, Builder));
4411 internal::Matcher<LambdaCapture>, InnerMatcher) {
4412 BoundNodesTreeBuilder
Result;
4413 bool Matched =
false;
4415 if (Finder->isTraversalIgnoringImplicitNodes() &&
Capture.isImplicit())
4417 BoundNodesTreeBuilder CaptureBuilder(*Builder);
4418 if (InnerMatcher.matches(
Capture, Finder, &CaptureBuilder)) {
4420 Result.addMatch(CaptureBuilder);
4423 *Builder = std::move(
Result);
4438 return Node.isStaticLocal();
4453 return Node.hasLocalStorage();
4467 return Node.hasGlobalStorage();
4534 return Node.isExceptionVariable();
4550 unsigned NumArgs =
Node.getNumArgs();
4551 if (!Finder->isTraversalIgnoringImplicitNodes())
4552 return NumArgs == N;
4554 if (!isa<CXXDefaultArgExpr>(
Node.getArg(NumArgs - 1)))
4558 return NumArgs == N;
4577 unsigned NumArgs =
Node.getNumArgs();
4578 if (!Finder->isTraversalIgnoringImplicitNodes())
4579 return NumArgs >= N;
4581 if (!isa<CXXDefaultArgExpr>(
Node.getArg(NumArgs - 1)))
4585 return NumArgs >= N;
4600 unsigned, N, internal::Matcher<Expr>, InnerMatcher) {
4601 if (N >=
Node.getNumArgs())
4604 if (Finder->isTraversalIgnoringImplicitNodes() && isa<CXXDefaultArgExpr>(Arg))
4627 const auto *
const Init =
Node.getInit();
4628 return Init && InnerMacher.matches(*
Init, Finder, Builder);
4649 const Expr *
const Pattern =
Node.getPattern();
4650 return Pattern && InnerMacher.matches(*Pattern, Finder, Builder);
4731 return N <
Node.getNumInits() &&
4732 InnerMatcher.matches(*
Node.getInit(N), Finder, Builder);
4770 internal::Matcher<Decl>, InnerMatcher) {
4771 const unsigned NumDecls = std::distance(
Node.decl_begin(),
Node.decl_end());
4775 std::advance(Iterator, N);
4776 return InnerMatcher.matches(**Iterator, Finder, Builder);
4793 return Node.getExceptionDecl() ==
nullptr;
4810 internal::Matcher<CXXCtorInitializer>, InnerMatcher) {
4811 auto MatchIt = matchesFirstInPointerRange(InnerMatcher,
Node.init_begin(),
4812 Node.init_end(), Finder, Builder);
4813 if (MatchIt ==
Node.init_end())
4815 return (*MatchIt)->isWritten() || !Finder->isTraversalIgnoringImplicitNodes();
4832 internal::Matcher<FieldDecl>, InnerMatcher) {
4834 return (NodeAsDecl !=
nullptr &&
4835 InnerMatcher.matches(*NodeAsDecl, Finder, Builder));
4852 internal::Matcher<Expr>, InnerMatcher) {
4853 const Expr* NodeAsExpr =
Node.getInit();
4854 return (NodeAsExpr !=
nullptr &&
4855 InnerMatcher.matches(*NodeAsExpr, Finder, Builder));
4872 return Node.isWritten();
4892 return Node.isBaseInitializer();
4912 return Node.isMemberInitializer();
4938 internal::Matcher<Expr>, InnerMatcher) {
4939 for (
const Expr *Arg :
Node.arguments()) {
4940 if (Finder->isTraversalIgnoringImplicitNodes() &&
4941 isa<CXXDefaultArgExpr>(Arg))
4943 BoundNodesTreeBuilder
Result(*Builder);
4944 if (InnerMatcher.matches(*Arg, Finder, &
Result)) {
4945 *Builder = std::move(
Result);
4964extern const internal::VariadicAllOfMatcher<LambdaCapture>
lambdaCapture;
4981 clang::ast_matchers::internal::BoundNodesTreeBuilder
Result(*Builder);
4983 *Builder = std::move(
Result);
5007 if (!
Node.capturesVariable())
5009 auto *capturedVar =
Node.getCapturedVar();
5010 return capturedVar && InnerMatcher.matches(*capturedVar, Finder, Builder);
5031 return Node.isListInitialization();
5047 return Node.requiresZeroInitialization();
5074 unsigned, N, internal::Matcher<ParmVarDecl>,
5076 return (N <
Node.parameters().size()
5077 && InnerMatcher.matches(*
Node.parameters()[N], Finder, Builder));
5096 return Node.isExplicitObjectMemberFunction();
5120 internal::Matcher<Expr>, ArgMatcher,
5121 internal::Matcher<ParmVarDecl>, ParamMatcher) {
5122 BoundNodesTreeBuilder
Result;
5126 BoundNodesTreeBuilder Matches;
5130 .matches(
Node, Finder, &Matches)
5134 bool Matched =
false;
5135 for (; ArgIndex <
Node.getNumArgs(); ++ArgIndex) {
5136 BoundNodesTreeBuilder ArgMatches(*Builder);
5137 if (ArgMatcher.matches(*(
Node.getArg(ArgIndex)->IgnoreParenCasts()),
5138 Finder, &ArgMatches)) {
5139 BoundNodesTreeBuilder ParamMatches(ArgMatches);
5141 hasParameter(ParamIndex, ParamMatcher)))),
5143 hasParameter(ParamIndex, ParamMatcher))))))
5144 .matches(
Node, Finder, &ParamMatches)) {
5145 Result.addMatch(ParamMatches);
5151 *Builder = std::move(
Result);
5183 internal::Matcher<Expr>, ArgMatcher,
5184 internal::Matcher<QualType>, ParamMatcher) {
5185 BoundNodesTreeBuilder
Result;
5189 BoundNodesTreeBuilder Matches;
5193 .matches(
Node, Finder, &Matches)
5198 if (
const auto *
Call = dyn_cast<CallExpr>(&
Node)) {
5199 if (
const auto *
Value =
5200 dyn_cast_or_null<ValueDecl>(
Call->getCalleeDecl())) {
5210 assert(MP &&
"Must be member-pointer if its a memberfunctionpointer");
5213 "The call must have happened through a member function "
5219 unsigned ParamIndex = 0;
5220 bool Matched =
false;
5221 unsigned NumArgs =
Node.getNumArgs();
5225 for (; ArgIndex < NumArgs; ++ArgIndex, ++ParamIndex) {
5226 BoundNodesTreeBuilder ArgMatches(*Builder);
5227 if (ArgMatcher.matches(*(
Node.getArg(ArgIndex)->IgnoreParenCasts()), Finder,
5229 BoundNodesTreeBuilder ParamMatches(ArgMatches);
5235 if (ParamMatcher.matches(ParamType, Finder, &ParamMatches)) {
5236 Result.addMatch(ParamMatches);
5242 hasParameter(ParamIndex, hasType(ParamMatcher))))),
5244 hasParameter(ParamIndex, hasType(ParamMatcher)))))))
5245 .matches(
Node, Finder, &ParamMatches)) {
5246 Result.addMatch(ParamMatches);
5252 *Builder = std::move(
Result);
5274 if (
const auto *
Decl = dyn_cast_or_null<FunctionDecl>(Context))
5275 return N <
Decl->param_size() &&
Decl->getParamDecl(N) == &
Node;
5276 if (
const auto *
Decl = dyn_cast_or_null<BlockDecl>(Context))
5277 return N <
Decl->param_size() &&
Decl->getParamDecl(N) == &
Node;
5278 if (
const auto *
Decl = dyn_cast_or_null<ObjCMethodDecl>(Context))
5279 return N <
Decl->param_size() &&
Decl->getParamDecl(N) == &
Node;
5319 internal::Matcher<ParmVarDecl>,
5321 return matchesFirstInPointerRange(InnerMatcher,
Node.param_begin(),
5322 Node.param_end(), Finder,
5323 Builder) !=
Node.param_end();
5347 return Node.getNumParams() == N;
5375 forEachTemplateArgument,
5379 internal::Matcher<TemplateArgument>, InnerMatcher) {
5381 clang::ast_matchers::internal::getTemplateSpecializationArgs(
Node);
5382 clang::ast_matchers::internal::BoundNodesTreeBuilder
Result;
5383 bool Matched =
false;
5384 for (
const auto &Arg : TemplateArgs) {
5385 clang::ast_matchers::internal::BoundNodesTreeBuilder ArgBuilder(*Builder);
5386 if (InnerMatcher.matches(Arg, Finder, &ArgBuilder)) {
5388 Result.addMatch(ArgBuilder);
5391 *Builder = std::move(
Result);
5420 internal::Matcher<QualType>, InnerMatcher) {
5421 return InnerMatcher.matches(
Node.getReturnType(), Finder, Builder);
5441 return Node.isExternC();
5474 return Node.isDeleted();
5487 return Node.isDefaulted();
5520 return FnTy->hasDynamicExceptionSpec();
5570 return Node.isConsteval();
5592 return Node.isConstexpr();
5607 if (
const auto *CIA =
Node.getAttr<ConstInitAttr>())
5608 return CIA->isConstinit();
5636 internal::Matcher<Stmt>, InnerMatcher) {
5638 return Init !=
nullptr && InnerMatcher.matches(*
Init, Finder, Builder);
5652 internal::Matcher<Expr>, InnerMatcher) {
5655 InnerMatcher.matches(*
Condition, Finder, Builder));
5666 const Stmt *
const Then =
Node.getThen();
5667 return (Then !=
nullptr && InnerMatcher.matches(*Then, Finder, Builder));
5678 const Stmt *
const Else =
Node.getElse();
5679 return (Else !=
nullptr && InnerMatcher.matches(*Else, Finder, Builder));
5713 internal::NotEqualsBoundNodePredicate Predicate;
5716 return Builder->removeBindings(Predicate);
5728 internal::Matcher<DeclStmt>, InnerMatcher) {
5729 const DeclStmt*
const DeclarationStatement =
5730 Node.getConditionVariableDeclStmt();
5731 return DeclarationStatement !=
nullptr &&
5732 InnerMatcher.matches(*DeclarationStatement, Finder, Builder);
5745 internal::Matcher<Expr>, InnerMatcher) {
5747 return InnerMatcher.matches(*
Expression, Finder, Builder);
5762 internal::Matcher<Expr>, InnerMatcher) {
5764 return InnerMatcher.matches(*
Expression, Finder, Builder);
5796 internal::Matcher<Stmt>, InnerMatcher) {
5797 if (Finder->isTraversalIgnoringImplicitNodes() && isDefaultedHelper(&
Node))
5799 const Stmt *
const Statement = internal::GetBodyMatcher<NodeType>::get(
Node);
5800 return (Statement !=
nullptr &&
5801 InnerMatcher.matches(*Statement, Finder, Builder));
5821 internal::Matcher<Stmt>, InnerMatcher) {
5822 const Stmt *
const Statement =
Node.getBody();
5823 return (Statement !=
nullptr &&
5824 InnerMatcher.matches(*Statement, Finder, Builder));
5842 internal::Matcher<Stmt>, InnerMatcher) {
5844 return CS && matchesFirstInPointerRange(InnerMatcher, CS->
body_begin(),
5860 return Node.size() == N;
5888template <
typename ValueT>
5889internal::PolymorphicMatcher<internal::ValueEqualsMatcher,
5890 void(internal::AllNodeBaseTypes), ValueT>
5892 return internal::PolymorphicMatcher<internal::ValueEqualsMatcher,
5893 void(internal::AllNodeBaseTypes), ValueT>(
5902 return internal::ValueEqualsMatcher<NodeType, ParamT>(
Value)
5910 unsigned,
Value, 1) {
5911 return internal::ValueEqualsMatcher<NodeType, ParamT>(
Value)
5921 return internal::ValueEqualsMatcher<NodeType, ParamT>(
Value)
5946 std::string, Name) {
5947 if (std::optional<StringRef> OpName = internal::getOpName(
Node))
5948 return *OpName == Name;
5958extern const internal::VariadicFunction<
5959 internal::PolymorphicMatcher<internal::HasAnyOperatorNameMatcher,
5963 std::vector<std::string>>,
5982 isAssignmentOperator,
5985 return Node.isAssignmentOp();
6003 isComparisonOperator,
6006 return Node.isComparisonOp();
6020 internal::Matcher<Expr>, InnerMatcher) {
6021 const Expr *LeftHandSide = internal::getLHS(
Node);
6022 return (LeftHandSide !=
nullptr &&
6023 InnerMatcher.matches(*LeftHandSide, Finder, Builder));
6037 internal::Matcher<Expr>, InnerMatcher) {
6038 const Expr *RightHandSide = internal::getRHS(
Node);
6039 return (RightHandSide !=
nullptr &&
6040 InnerMatcher.matches(*RightHandSide, Finder, Builder));
6049 internal::Matcher<Expr>, InnerMatcher) {
6050 return internal::VariadicDynCastAllOfMatcher<Stmt, NodeType>()(
6051 anyOf(hasLHS(InnerMatcher), hasRHS(InnerMatcher)))
6052 .matches(
Node, Finder, Builder);
6070 internal::Matcher<Expr>, Matcher1, internal::Matcher<Expr>, Matcher2) {
6071 return internal::VariadicDynCastAllOfMatcher<Stmt, NodeType>()(
6072 anyOf(
allOf(hasLHS(Matcher1), hasRHS(Matcher2)),
6073 allOf(hasRHS(Matcher1), hasLHS(Matcher2))))
6074 .matches(
Node, Finder, Builder);
6087 internal::Matcher<Expr>, InnerMatcher) {
6088 const Expr *
const Operand = internal::getSubExpr(
Node);
6089 return (Operand !=
nullptr &&
6090 InnerMatcher.matches(*Operand, Finder, Builder));
6111 internal::Matcher<Expr>, InnerMatcher) {
6112 const Expr *
const SubExpression =
6113 internal::GetSourceExpressionMatcher<NodeType>::get(
Node);
6114 return (SubExpression !=
nullptr &&
6115 InnerMatcher.matches(*SubExpression, Finder, Builder));
6137 internal::Matcher<QualType>, InnerMatcher) {
6139 return InnerMatcher.matches(NodeType, Finder, Builder);
6145 internal::Matcher<QualType>, InnerMatcher) {
6146 return InnerMatcher.matches(
Node.getType(), Finder, Builder);
6159 return Node.isStruct();
6172 return Node.isUnion();
6185 return Node.isClass();
6198 return Node.isEnum();
6213 internal::Matcher<Expr>, InnerMatcher) {
6216 InnerMatcher.matches(*
Expression, Finder, Builder));
6228 internal::Matcher<Expr>, InnerMatcher) {
6231 InnerMatcher.matches(*
Expression, Finder, Builder));
6258 return Node.isThisDeclarationADefinition();
6272 return Node.isVariadic();
6293 internal::Matcher<CXXRecordDecl>, InnerMatcher) {
6295 ASTChildrenNotSpelledInSourceScope RAII(Finder,
false);
6298 return (
Parent !=
nullptr &&
6299 InnerMatcher.matches(*
Parent, Finder, Builder));
6327 internal::Matcher<CXXMethodDecl>, InnerMatcher) {
6328 BoundNodesTreeBuilder
Result;
6329 bool Matched =
false;
6330 for (
const auto *Overridden :
Node.overridden_methods()) {
6331 BoundNodesTreeBuilder OverriddenBuilder(*Builder);
6332 const bool OverriddenMatched =
6333 InnerMatcher.matches(*Overridden, Finder, &OverriddenBuilder);
6334 if (OverriddenMatched) {
6336 Result.addMatch(OverriddenBuilder);
6339 *Builder = std::move(
Result);
6365 return Node.isVirtual();
6383 return Node.isVirtualAsWritten();
6387 return Node.isInheritingConstructor();
6408 return Node.template hasAttr<FinalAttr>();
6435 return Node.isConst();
6452 return Node.isCopyAssignmentOperator();
6469 return Node.isMoveAssignmentOperator();
6487 return Node.size_overridden_methods() > 0 ||
Node.hasAttr<OverrideAttr>();
6502 return Node.isUserProvided();
6532 return Node.isArrow();
6546 return Node->isIntegerType();
6560 return Node->isUnsignedIntegerType();
6574 return Node->isSignedIntegerType();
6588 return Node->isAnyCharacterType();
6608 return Node->isAnyPointerType();
6627 return Node.isConstQualified();
6646 return Node.isVolatileQualified();
6663 return Node.hasLocalQualifiers();
6679 internal::Matcher<ValueDecl>, InnerMatcher) {
6680 return InnerMatcher.matches(*
Node.getMemberDecl(), Finder, Builder);
6700 hasObjectExpression,
6703 internal::Matcher<Expr>, InnerMatcher) {
6704 if (
const auto *
E = dyn_cast<UnresolvedMemberExpr>(&
Node))
6705 if (
E->isImplicitAccess())
6707 if (
const auto *
E = dyn_cast<CXXDependentScopeMemberExpr>(&
Node))
6708 if (
E->isImplicitAccess())
6710 return InnerMatcher.matches(*
Node.getBase(), Finder, Builder);
6723 internal::Matcher<UsingShadowDecl>, InnerMatcher) {
6724 return matchesFirstInPointerRange(InnerMatcher,
Node.shadow_begin(),
6725 Node.shadow_end(), Finder,
6726 Builder) !=
Node.shadow_end();
6742 internal::Matcher<NamedDecl>, InnerMatcher) {
6743 return InnerMatcher.matches(*
Node.getTargetDecl(), Finder, Builder);
6777 Node.getTemplateSpecializationKind() ==
6779 Node.getTemplateSpecializationKind() ==
6842 internal::Matcher<QualType>, InnerMatcher, 0) {
6843 return internal::BindableMatcher<TypeLoc>(
6844 new internal::TypeLocTypeMatcher(InnerMatcher));
6855extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, QualifiedTypeLoc>
6870 return InnerMatcher.matches(
Node.getUnqualifiedLoc(), Finder, Builder);
6884 auto Loc =
Node.getFunctionTypeLoc();
6885 return Loc && ReturnMatcher.matches(
Loc.getReturnLoc(), Finder, Builder);
6896extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, PointerTypeLoc>
6910 return PointeeMatcher.matches(
Node.getPointeeLoc(), Finder, Builder);
6923extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, ReferenceTypeLoc>
6938 return ReferentMatcher.matches(
Node.getPointeeLoc(), Finder, Builder);
6950extern const internal::VariadicDynCastAllOfMatcher<
6968 hasAnyTemplateArgumentLoc,
6972 internal::Matcher<TemplateArgumentLoc>, InnerMatcher) {
6973 auto Args = internal::getTemplateArgsWritten(
Node);
6974 return matchesFirstInRange(InnerMatcher, Args.begin(), Args.end(), Finder,
6975 Builder) != Args.end();
6993 hasTemplateArgumentLoc,
6997 unsigned, Index, internal::Matcher<TemplateArgumentLoc>, InnerMatcher) {
6998 auto Args = internal::getTemplateArgsWritten(
Node);
6999 return Index < Args.size() &&
7000 InnerMatcher.matches(Args[Index], Finder, Builder);
7012extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, ElaboratedTypeLoc>
7031 return InnerMatcher.matches(
Node.getNamedTypeLoc(), Finder, Builder);
7043 return Node.isBooleanType();
7055 return Node.isVoidType();
7058template <
typename NodeType>
7107 return Node.isRealFloatingType();
7160 return internal::HasSizeMatcher<NodeType>::hasSize(
Node, N);
7231 internal::Matcher<Expr>, InnerMatcher) {
7232 return InnerMatcher.matches(*
Node.getSizeExpr(), Finder, Builder);
7478 pointee, getPointee,
7627 internal::Matcher<NestedNameSpecifier>, InnerMatcher) {
7629 return InnerMatcher.matches(*Qualifier, Finder, Builder);
7651 return InnerMatcher.matches(
Node.getNamedType(), Finder, Builder);
7694 hasReplacementType, getReplacementType,
7733 return InnerType.matches(
Node.getDecayedType(), Finder, Builder);
7774 if (!DC)
return false;
7791extern const internal::VariadicAllOfMatcher<NestedNameSpecifier>
7795extern const internal::VariadicAllOfMatcher<NestedNameSpecifierLoc>
7801 internal::BindableMatcher<NestedNameSpecifierLoc>, loc,
7802 internal::Matcher<NestedNameSpecifier>, InnerMatcher, 1) {
7803 return internal::BindableMatcher<NestedNameSpecifierLoc>(
7804 new internal::LocMatcher<NestedNameSpecifierLoc, NestedNameSpecifier>(
7821 internal::Matcher<QualType>, InnerMatcher) {
7822 if (!
Node.getAsType())
7824 return InnerMatcher.matches(
QualType(
Node.getAsType(), 0), Finder, Builder);
7839 internal::Matcher<TypeLoc>, InnerMatcher) {
7840 return Node &&
Node.getNestedNameSpecifier()->getAsType() &&
7841 InnerMatcher.matches(
Node.getTypeLoc(), Finder, Builder);
7854 internal::Matcher<NestedNameSpecifier>, InnerMatcher,
7859 return InnerMatcher.matches(*NextNode, Finder, Builder);
7872 internal::Matcher<NestedNameSpecifierLoc>, InnerMatcher,
7877 return InnerMatcher.matches(NextNode, Finder, Builder);
7891 internal::Matcher<NamespaceDecl>, InnerMatcher) {
7892 if (!
Node.getAsNamespace())
7894 return InnerMatcher.matches(*
Node.getAsNamespace(), Finder, Builder);
7913extern const internal::VariadicAllOfMatcher<Attr>
attr;
7953 BoundNodesTreeBuilder
Result;
7958 bool Matched =
false;
7960 SC = SC->getNextSwitchCase()) {
7961 BoundNodesTreeBuilder CaseBuilder(*Builder);
7962 bool CaseMatched = InnerMatcher.matches(*SC, Finder, &CaseBuilder);
7965 Result.addMatch(CaseBuilder);
7968 *Builder = std::move(
Result);
7983 internal::Matcher<CXXCtorInitializer>, InnerMatcher) {
7984 BoundNodesTreeBuilder
Result;
7985 bool Matched =
false;
7986 for (
const auto *I :
Node.inits()) {
7987 if (Finder->isTraversalIgnoringImplicitNodes() && !I->isWritten())
7989 BoundNodesTreeBuilder InitBuilder(*Builder);
7990 if (InnerMatcher.matches(*I, Finder, &InitBuilder)) {
7992 Result.addMatch(InitBuilder);
7995 *Builder = std::move(
Result);
8011 return Node.isCopyConstructor();
8026 return Node.isMoveConstructor();
8041 return Node.isDefaultConstructor();
8058 return Node.isDelegatingConstructor();
8086 return Node.isExplicit();
8116 ASTChildrenNotSpelledInSourceScope RAII(Finder,
false);
8118 return InnerMatcher.matches(*ES.
getExpr(), Finder, Builder);
8141 if (
const auto *FD = dyn_cast<FunctionDecl>(&
Node))
8142 return FD->isInlineSpecified();
8143 if (
const auto *NSD = dyn_cast<NamespaceDecl>(&
Node))
8144 return NSD->isInline();
8145 if (
const auto *VD = dyn_cast<VarDecl>(&
Node))
8146 return VD->isInline();
8147 llvm_unreachable(
"Not a valid polymorphic type");
8160 return Node.isAnonymousNamespace();