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() &&
712 Node.getBitWidthValue(Finder->getASTContext()) == Width;
733 InnerMatcher.matches(*
Initializer, Finder, Builder));
739 return Node.isMain();
753 internal::Matcher<ClassTemplateDecl>, InnerMatcher) {
755 return (
Decl !=
nullptr &&
756 InnerMatcher.matches(*
Decl, Finder, Builder));
764 return Node.isImplicit();
789 hasAnyTemplateArgument,
793 internal::Matcher<TemplateArgument>, InnerMatcher) {
795 internal::getTemplateSpecializationArgs(
Node);
796 return matchesFirstInRange(InnerMatcher, List.begin(), List.end(), Finder,
797 Builder) != List.end();
818 const internal::Matcher<T> &InnerMatcher) {
819 return internal::DynTypedMatcher::constructRestrictedWrapper(
820 new internal::TraversalMatcher<T>(TK, InnerMatcher),
821 InnerMatcher.getID().first)
822 .template unconditionalConvertTo<T>();
826internal::BindableMatcher<T>
828 return internal::BindableMatcher<T>(
829 internal::DynTypedMatcher::constructRestrictedWrapper(
830 new internal::TraversalMatcher<T>(TK, InnerMatcher),
831 InnerMatcher.getID().first)
832 .template unconditionalConvertTo<T>());
835template <
typename...
T>
836internal::TraversalWrapper<internal::VariadicOperatorMatcher<
T...>>
838 const internal::VariadicOperatorMatcher<T...> &InnerMatcher) {
839 return internal::TraversalWrapper<internal::VariadicOperatorMatcher<
T...>>(
843template <
template <
typename ToArg,
typename FromArg>
class ArgumentAdapterT,
844 typename T,
typename ToTypes>
845internal::TraversalWrapper<
846 internal::ArgumentAdaptingMatcherFuncAdaptor<ArgumentAdapterT, T, ToTypes>>
848 ArgumentAdapterT,
T, ToTypes> &InnerMatcher) {
849 return internal::TraversalWrapper<
850 internal::ArgumentAdaptingMatcherFuncAdaptor<ArgumentAdapterT,
T,
851 ToTypes>>(TK, InnerMatcher);
854template <
template <
typename T,
typename...
P>
class MatcherT, typename...
P,
855 typename ReturnTypesF>
856internal::TraversalWrapper<
857 internal::PolymorphicMatcher<MatcherT, ReturnTypesF, P...>>
859 const internal::PolymorphicMatcher<MatcherT, ReturnTypesF, P...>
861 return internal::TraversalWrapper<
862 internal::PolymorphicMatcher<MatcherT, ReturnTypesF,
P...>>(TK,
866template <
typename...
T>
867internal::Matcher<
typename internal::GetClade<
T...>::Type>
869 return traverse(TK, InnerMatcher.with());
895 return InnerMatcher.matches(*
Node.IgnoreImplicit(), Finder, Builder);
924 internal::Matcher<Expr>, InnerMatcher) {
925 return InnerMatcher.matches(*
Node.IgnoreImpCasts(), Finder, Builder);
946 return InnerMatcher.matches(*
Node.IgnoreParenCasts(), Finder, Builder);
971 internal::Matcher<Expr>, InnerMatcher) {
972 return InnerMatcher.matches(*
Node.IgnoreParenImpCasts(), Finder, Builder);
988 return InnerMatcher.matches(
Node.IgnoreParens(), Finder, Builder);
1005 return InnerMatcher.matches(*
E, Finder, Builder);
1022 return Node.isInstantiationDependent();
1070 hasTemplateArgument,
1074 unsigned, N, internal::Matcher<TemplateArgument>, InnerMatcher) {
1076 internal::getTemplateSpecializationArgs(
Node);
1077 if (List.size() <= N)
1079 return InnerMatcher.matches(List[N], Finder, Builder);
1092 templateArgumentCountIs,
1096 return internal::getTemplateSpecializationArgs(
Node).size() == N;
1111 internal::Matcher<QualType>, InnerMatcher) {
1114 return InnerMatcher.matches(
Node.getAsType(), Finder, Builder);
1129 internal::Matcher<TemplateName>, InnerMatcher) {
1132 return InnerMatcher.matches(
Node.getAsTemplate(), Finder, Builder);
1149 internal::Matcher<Decl>, InnerMatcher) {
1151 return InnerMatcher.matches(*
Node.getAsDecl(), Finder, Builder);
1169 return InnerMatcher.matches(*
Node.getAsExpr(), Finder, Builder);
1199 internal::Matcher<QualType>, InnerMatcher) {
1202 return InnerMatcher.matches(
Node.getIntegralType(), Finder, Builder);
1220 std::string,
Value) {
1236extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1248extern const internal::VariadicDynCastAllOfMatcher<Decl, ExportDecl>
exportDecl;
1257extern const internal::VariadicDynCastAllOfMatcher<Decl, ValueDecl>
valueDecl;
1270extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXConstructorDecl>
1282extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXDestructorDecl>
1293extern const internal::VariadicDynCastAllOfMatcher<Decl, EnumDecl>
enumDecl;
1303extern const internal::VariadicDynCastAllOfMatcher<Decl, EnumConstantDecl>
1318extern const internal::VariadicDynCastAllOfMatcher<Decl, TagDecl>
tagDecl;
1326extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXMethodDecl>
1335extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXConversionDecl>
1346extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXDeductionGuideDecl>
1356extern const internal::VariadicDynCastAllOfMatcher<Decl, ConceptDecl>
1368extern const internal::VariadicDynCastAllOfMatcher<Decl, VarDecl>
varDecl;
1378extern const internal::VariadicDynCastAllOfMatcher<Decl, FieldDecl>
fieldDecl;
1388extern const internal::VariadicDynCastAllOfMatcher<Decl, IndirectFieldDecl>
1397extern const internal::VariadicDynCastAllOfMatcher<Decl, FunctionDecl>
1406extern const internal::VariadicDynCastAllOfMatcher<Decl, FunctionTemplateDecl>
1417extern const internal::VariadicDynCastAllOfMatcher<Decl, FriendDecl>
friendDecl;
1427extern const internal::VariadicAllOfMatcher<Stmt>
stmt;
1437extern const internal::VariadicDynCastAllOfMatcher<Stmt, DeclStmt>
declStmt;
1450extern const internal::VariadicDynCastAllOfMatcher<Stmt, MemberExpr>
memberExpr;
1464extern const internal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedMemberExpr>
1476extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1488extern const internal::VariadicDynCastAllOfMatcher<Stmt, CallExpr>
callExpr;
1518extern const internal::VariadicDynCastAllOfMatcher<Stmt, LambdaExpr>
lambdaExpr;
1527extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXMemberCallExpr>
1539extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCMessageExpr>
1548extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCStringLiteral>
1558extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCInterfaceDecl>
1568extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCImplementationDecl>
1578extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCProtocolDecl>
1588extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryDecl>
1598extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryImplDecl>
1613extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCMethodDecl>
1626extern const internal::VariadicDynCastAllOfMatcher<Decl, BlockDecl>
1638extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCIvarDecl>
1649extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCPropertyDecl>
1658extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtThrowStmt>
1668extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtTryStmt>
1678extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtCatchStmt>
1688extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtFinallyStmt>
1698extern const internal::VariadicDynCastAllOfMatcher<Stmt, ExprWithCleanups>
1711extern const internal::VariadicDynCastAllOfMatcher<Stmt, InitListExpr>
1717 internal::Matcher<Expr>, InnerMatcher) {
1718 const Expr *SyntForm =
Node.getSyntacticForm();
1719 return (SyntForm !=
nullptr &&
1720 InnerMatcher.matches(*SyntForm, Finder, Builder));
1734extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1746extern const internal::VariadicDynCastAllOfMatcher<Stmt, ImplicitValueInitExpr>
1764extern const internal::VariadicDynCastAllOfMatcher<Stmt, ParenListExpr>
1777extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1790extern const internal::VariadicDynCastAllOfMatcher<Decl, UsingDecl>
usingDecl;
1801extern const internal::VariadicDynCastAllOfMatcher<Decl, UsingEnumDecl>
1813extern const internal::VariadicDynCastAllOfMatcher<Decl, UsingDirectiveDecl>
1830extern const internal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedLookupExpr>
1844extern const internal::VariadicDynCastAllOfMatcher<
Decl,
1863extern const internal::VariadicDynCastAllOfMatcher<
Decl,
1876extern const internal::VariadicDynCastAllOfMatcher<Stmt, ConstantExpr>
1886extern const internal::VariadicDynCastAllOfMatcher<Stmt, ParenExpr>
parenExpr;
1898extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXConstructExpr>
1909extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1923extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThisExpr>
1934extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBindTemporaryExpr>
1955extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1967extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNewExpr>
cxxNewExpr;
1977extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDeleteExpr>
1993extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNoexceptExpr>
2013extern const internal::VariadicDynCastAllOfMatcher<Stmt, ArrayInitLoopExpr>
2032extern const internal::VariadicDynCastAllOfMatcher<Stmt, ArrayInitIndexExpr>
2043extern const internal::VariadicDynCastAllOfMatcher<Stmt, ArraySubscriptExpr>
2055extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDefaultArgExpr>
2074extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXOperatorCallExpr>
2086extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXFoldExpr>
2106extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
2116extern const internal::VariadicDynCastAllOfMatcher<Stmt, Expr>
expr;
2125extern const internal::VariadicDynCastAllOfMatcher<Stmt, DeclRefExpr>
2134extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
2149extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCIvarRefExpr>
2158extern const internal::VariadicDynCastAllOfMatcher<Stmt, BlockExpr>
blockExpr;
2166extern const internal::VariadicDynCastAllOfMatcher<Stmt, IfStmt>
ifStmt;
2175extern const internal::VariadicDynCastAllOfMatcher<Stmt, ForStmt>
forStmt;
2187 const Stmt *
const Increment =
Node.getInc();
2188 return (Increment !=
nullptr &&
2189 InnerMatcher.matches(*Increment, Finder, Builder));
2203 return (
Init !=
nullptr && InnerMatcher.matches(*
Init, Finder, Builder));
2213extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXForRangeStmt>
2226 const VarDecl *
const Var =
Node.getLoopVariable();
2227 return (Var !=
nullptr && InnerMatcher.matches(*Var, Finder, Builder));
2241 return (
Init !=
nullptr && InnerMatcher.matches(*
Init, Finder, Builder));
2252extern const internal::VariadicDynCastAllOfMatcher<Stmt, WhileStmt>
whileStmt;
2262extern const internal::VariadicDynCastAllOfMatcher<Stmt, DoStmt>
doStmt;
2272extern const internal::VariadicDynCastAllOfMatcher<Stmt, BreakStmt>
breakStmt;
2282extern const internal::VariadicDynCastAllOfMatcher<Stmt, ContinueStmt>
2293extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoreturnStmt>
2304extern const internal::VariadicDynCastAllOfMatcher<Stmt, ReturnStmt>
returnStmt;
2315extern const internal::VariadicDynCastAllOfMatcher<Stmt, GotoStmt>
gotoStmt;
2326extern const internal::VariadicDynCastAllOfMatcher<Stmt, LabelStmt>
labelStmt;
2338extern const internal::VariadicDynCastAllOfMatcher<Stmt, AddrLabelExpr>
2349extern const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchStmt>
switchStmt;
2359extern const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchCase>
switchCase;
2369extern const internal::VariadicDynCastAllOfMatcher<Stmt, CaseStmt>
caseStmt;
2379extern const internal::VariadicDynCastAllOfMatcher<Stmt, DefaultStmt>
2388extern const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundStmt>
2398extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXCatchStmt>
2408extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTryStmt>
cxxTryStmt;
2417extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThrowExpr>
2427extern const internal::VariadicDynCastAllOfMatcher<Stmt, NullStmt>
nullStmt;
2437extern const internal::VariadicDynCastAllOfMatcher<Stmt, AsmStmt>
asmStmt;
2445extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBoolLiteralExpr>
2455extern const internal::VariadicDynCastAllOfMatcher<Stmt, StringLiteral>
2468extern const internal::VariadicDynCastAllOfMatcher<Stmt, CharacterLiteral>
2475extern const internal::VariadicDynCastAllOfMatcher<Stmt, IntegerLiteral>
2485extern const internal::VariadicDynCastAllOfMatcher<Stmt, FloatingLiteral>
2490extern const internal::VariadicDynCastAllOfMatcher<Stmt, ImaginaryLiteral>
2494extern const internal::VariadicDynCastAllOfMatcher<Stmt, FixedPointLiteral>
2500extern const internal::VariadicDynCastAllOfMatcher<Stmt, UserDefinedLiteral>
2510extern const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundLiteralExpr>
2521extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoawaitExpr>
2524extern const internal::VariadicDynCastAllOfMatcher<Stmt, DependentCoawaitExpr>
2534extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoyieldExpr>
2545extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoroutineBodyStmt>
2549extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNullPtrLiteralExpr>
2553extern const internal::VariadicDynCastAllOfMatcher<Stmt, ChooseExpr>
2557extern const internal::VariadicDynCastAllOfMatcher<Stmt, ConvertVectorExpr>
2561extern const internal::VariadicDynCastAllOfMatcher<Stmt, GNUNullExpr>
2565extern const internal::VariadicDynCastAllOfMatcher<Stmt, GenericSelectionExpr>
2573extern const internal::VariadicDynCastAllOfMatcher<Stmt, AtomicExpr>
atomicExpr;
2581extern const internal::VariadicDynCastAllOfMatcher<Stmt, StmtExpr>
stmtExpr;
2590extern const internal::VariadicDynCastAllOfMatcher<Stmt, BinaryOperator>
2599extern const internal::VariadicDynCastAllOfMatcher<Stmt, UnaryOperator>
2608extern const internal::VariadicDynCastAllOfMatcher<Stmt, ConditionalOperator>
2617extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
2629extern const internal::VariadicDynCastAllOfMatcher<Stmt, OpaqueValueExpr>
2645extern const internal::VariadicDynCastAllOfMatcher<Decl, StaticAssertDecl>
2658extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXReinterpretCastExpr>
2674extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXStaticCastExpr>
2689extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDynamicCastExpr>
2700extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXConstCastExpr>
2709extern const internal::VariadicDynCastAllOfMatcher<Stmt, CStyleCastExpr>
2733extern const internal::VariadicDynCastAllOfMatcher<Stmt, ExplicitCastExpr>
2740extern const internal::VariadicDynCastAllOfMatcher<Stmt, ImplicitCastExpr>
2756extern const internal::VariadicDynCastAllOfMatcher<Stmt, CastExpr>
castExpr;
2766extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXFunctionalCastExpr>
2775extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTemporaryObjectExpr>
2784extern const internal::VariadicDynCastAllOfMatcher<Stmt, PredefinedExpr>
2793extern const internal::VariadicDynCastAllOfMatcher<Stmt, DesignatedInitExpr>
2808 return Node.size() == N;
2812extern const internal::VariadicAllOfMatcher<QualType>
qualType;
2815extern const internal::VariadicAllOfMatcher<Type>
type;
2818extern const internal::VariadicAllOfMatcher<TypeLoc>
typeLoc;
2839extern const internal::VariadicOperatorMatcherFunc<
2840 2, std::numeric_limits<unsigned>::max()>
2846extern const internal::VariadicOperatorMatcherFunc<
2847 2, std::numeric_limits<unsigned>::max()>
2853extern const internal::VariadicOperatorMatcherFunc<
2854 2, std::numeric_limits<unsigned>::max()>
2881extern const internal::VariadicOperatorMatcherFunc<1, 1>
optionally;
2892extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
2921template <
typename T,
typename...
U>
2922auto mapAnyOf(internal::VariadicDynCastAllOfMatcher<T, U>
const &...) {
2923 return internal::MapAnyOfHelper<
U...>();
3036extern const internal::MapAnyOfMatcher<CallExpr, CXXConstructExpr>
invocation;
3047 internal::Matcher<QualType>, InnerMatcher) {
3048 const QualType ArgumentType =
Node.getTypeOfArgument();
3049 return InnerMatcher.matches(ArgumentType, Finder, Builder);
3071 const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
3073 allOf(
anyOf(ofKind(UETT_AlignOf), ofKind(UETT_PreferredAlignOf)),
3080 const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
3082 allOf(ofKind(UETT_SizeOf), InnerMatcher)));
3100inline internal::Matcher<NamedDecl>
hasName(StringRef Name) {
3101 return internal::Matcher<NamedDecl>(
3102 new internal::HasNameMatcher({std::string(Name)}));
3115extern const internal::VariadicFunction<internal::Matcher<NamedDecl>, StringRef,
3136 std::string FullNameString =
"::" +
Node.getQualifiedNameAsString();
3137 return RegExp->match(FullNameString);
3159inline internal::PolymorphicMatcher<
3160 internal::HasOverloadedOperatorNameMatcher,
3162 std::vector<std::string>>
3164 return internal::PolymorphicMatcher<
3165 internal::HasOverloadedOperatorNameMatcher,
3167 std::vector<std::string>>({std::string(Name)});
3178extern const internal::VariadicFunction<
3179 internal::PolymorphicMatcher<internal::HasOverloadedOperatorNameMatcher,
3182 std::vector<std::string>>,
3207 return Node.getMember().getAsString() == N;
3245 std::string, BindingID) {
3246 auto MemberName =
Node.getMember().getAsString();
3248 return Builder->removeBindings(
3249 [
this, MemberName](
const BoundNodesMap &
Nodes) {
3252 if (!isa<FieldDecl, CXXMethodDecl, VarDecl>(ND))
3254 return ND->getName() != MemberName;
3293 internal::Matcher<NamedDecl>,
Base) {
3295 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
3296 return Finder->classIsDerivedFrom(RD,
Base, Builder,
false);
3299 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
3300 return Finder->objcClassIsDerivedFrom(InterfaceDecl,
Base, Builder,
3308 std::string, BaseName, 1) {
3309 if (BaseName.empty())
3312 const auto M = isDerivedFrom(
hasName(BaseName));
3314 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
3315 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3317 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
3318 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3355 return Node.hasDefinition() &&
3357 return BaseSpecMatcher.matches(Base, Finder, Builder);
3364 isSameOrDerivedFrom,
3366 internal::Matcher<NamedDecl>,
Base, 0) {
3369 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
3370 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3372 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
3373 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3379 isSameOrDerivedFrom,
3381 std::string, BaseName, 1) {
3382 if (BaseName.empty())
3385 const auto M = isSameOrDerivedFrom(
hasName(BaseName));
3387 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
3388 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3390 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
3391 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3416 isDirectlyDerivedFrom,
3418 internal::Matcher<NamedDecl>,
Base, 0) {
3420 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
3421 return Finder->classIsDerivedFrom(RD,
Base, Builder,
true);
3424 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
3425 return Finder->objcClassIsDerivedFrom(InterfaceDecl,
Base, Builder,
3431 isDirectlyDerivedFrom,
3433 std::string, BaseName, 1) {
3434 if (BaseName.empty())
3436 const auto M = isDirectlyDerivedFrom(
hasName(BaseName));
3438 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
3439 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3441 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
3442 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3457 BoundNodesTreeBuilder
Result(*Builder);
3458 auto MatchIt = matchesFirstInPointerRange(InnerMatcher,
Node.method_begin(),
3460 if (MatchIt ==
Node.method_end())
3463 if (Finder->isTraversalIgnoringImplicitNodes() && (*MatchIt)->isImplicit())
3465 *Builder = std::move(
Result);
3479 return Node.isLambda();
3500extern const internal::ArgumentAdaptingMatcherFunc<internal::HasMatcher>
has;
3516extern const internal::ArgumentAdaptingMatcherFunc<
3517 internal::HasDescendantMatcher>
3538extern const internal::ArgumentAdaptingMatcherFunc<internal::ForEachMatcher>
3568extern const internal::ArgumentAdaptingMatcherFunc<
3569 internal::ForEachDescendantMatcher>
3588template <
typename T>
3589internal::Matcher<T>
findAll(
const internal::Matcher<T> &Matcher) {
3603extern const internal::ArgumentAdaptingMatcherFunc<
3604 internal::HasParentMatcher,
3605 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>,
3606 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>>
3620extern const internal::ArgumentAdaptingMatcherFunc<
3621 internal::HasAncestorMatcher,
3622 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>,
3623 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>>
3635extern const internal::VariadicOperatorMatcherFunc<1, 1>
unless;
3671inline internal::PolymorphicMatcher<
3672 internal::HasDeclarationMatcher,
3673 void(internal::HasDeclarationSupportedTypes), internal::Matcher<Decl>>
3675 return internal::PolymorphicMatcher<
3676 internal::HasDeclarationMatcher,
3677 void(internal::HasDeclarationSupportedTypes), internal::Matcher<Decl>>(
3696 return UnderlyingDecl !=
nullptr &&
3697 InnerMatcher.matches(*UnderlyingDecl, Finder, Builder);
3720 const Expr *ExprNode =
Node.getImplicitObjectArgument()
3721 ->IgnoreParenImpCasts();
3722 return (ExprNode !=
nullptr &&
3723 InnerMatcher.matches(*ExprNode, Finder, Builder));
3740 return InnerMatcher.matches(
TypeDecl, Finder, Builder);
3756 return Node.isClassMethod();
3772 return Node.isInstanceMethod();
3789 return Node.isClassMessage();
3806 return Node.isInstanceMessage();
3821 const Expr *ReceiverNode =
Node.getInstanceReceiver();
3822 return (ReceiverNode !=
nullptr &&
3849extern const internal::VariadicFunction<internal::Matcher<ObjCMessageExpr>,
3863 std::string SelectorString =
Node.getSelector().getAsString();
3864 return RegExp->match(SelectorString);
3872 return Node.getSelector().isNull();
3884 return Node.getSelector().isUnarySelector();
3900 return Node.getSelector().isKeywordSelector();
3915 return Node.getSelector().getNumArgs() == N;
3954 internal::Matcher<Stmt>, InnerMatcher, 0) {
3955 const auto *ExprNode =
Node.getCallee();
3956 return (ExprNode !=
nullptr &&
3957 InnerMatcher.matches(*ExprNode, Finder, Builder));
3983 internal::Matcher<Decl>, InnerMatcher, 1) {
3984 if (isa<CallExpr>(&
Node))
3986 .matches(
Node, Finder, Builder);
3990 const auto *MsgNode = cast<ObjCMessageExpr>(&
Node);
3991 const Decl *DeclNode = MsgNode->getMethodDecl();
3992 return (DeclNode !=
nullptr &&
3993 InnerMatcher.matches(*DeclNode, Finder, Builder));
4017 internal::Matcher<QualType>, InnerMatcher, 0) {
4020 return InnerMatcher.matches(QT, Finder, Builder);
4058 internal::Matcher<Decl>, InnerMatcher, 1) {
4102 internal::Matcher<TypeLoc>, Inner) {
4104 if (source ==
nullptr) {
4108 return Inner.matches(source->
getTypeLoc(), Finder, Builder);
4121 return Name ==
Node.getAsString();
4135 QualType, pointsTo, internal::Matcher<QualType>,
4137 return (!
Node.isNull() &&
Node->isAnyPointerType() &&
4138 InnerMatcher.matches(
Node->getPointeeType(), Finder, Builder));
4145 .matches(
Node, Finder, Builder);
4160 return InnerMatcher.matches(*
Node.getUnqualifiedDesugaredType(), Finder,
4179 return (!
Node.isNull() &&
Node->isReferenceType() &&
4180 InnerMatcher.matches(
Node->getPointeeType(), Finder, Builder));
4199 return InnerMatcher.matches(
Node.getCanonicalType(), Finder, Builder);
4206 .matches(
Node, Finder, Builder);
4227 internal::Matcher<Expr>, InnerMatcher) {
4228 const Expr *ExprNode =
Node.getImplicitObjectArgument();
4229 return (ExprNode !=
nullptr &&
4230 InnerMatcher.matches(*ExprNode, Finder, Builder));
4250 internal::Matcher<QualType>, InnerMatcher, 0) {
4251 return onImplicitObjectArgument(
4252 anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))))
4253 .matches(
Node, Finder, Builder);
4258 internal::Matcher<Decl>, InnerMatcher, 1) {
4259 return onImplicitObjectArgument(
4260 anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))))
4261 .matches(
Node, Finder, Builder);
4275 const Decl *DeclNode =
Node.getDecl();
4276 return (DeclNode !=
nullptr &&
4277 InnerMatcher.matches(*DeclNode, Finder, Builder));
4304 internal::Matcher<UsingShadowDecl>, Inner) {
4307 return Inner.matches(*
UsingDecl, Finder, Builder);
4328 return matchesFirstInPointerRange(InnerMatcher,
Node.decls_begin(),
4329 Node.decls_end(), Finder,
4330 Builder) !=
Node.decls_end();
4343 if (
Node.isSingleDecl()) {
4344 const Decl *FoundDecl =
Node.getSingleDecl();
4345 return InnerMatcher.matches(*FoundDecl, Finder, Builder);
4359 VarDecl, hasInitializer, internal::Matcher<Expr>,
4363 InnerMatcher.matches(*
Initializer, Finder, Builder));
4389 internal::Matcher<LambdaCapture>, InnerMatcher) {
4390 BoundNodesTreeBuilder
Result;
4391 bool Matched =
false;
4393 if (Finder->isTraversalIgnoringImplicitNodes() &&
Capture.isImplicit())
4395 BoundNodesTreeBuilder CaptureBuilder(*Builder);
4396 if (InnerMatcher.matches(
Capture, Finder, &CaptureBuilder)) {
4398 Result.addMatch(CaptureBuilder);
4401 *Builder = std::move(
Result);
4416 return Node.isStaticLocal();
4431 return Node.hasLocalStorage();
4445 return Node.hasGlobalStorage();
4512 return Node.isExceptionVariable();
4528 unsigned NumArgs =
Node.getNumArgs();
4529 if (!Finder->isTraversalIgnoringImplicitNodes())
4530 return NumArgs == N;
4532 if (!isa<CXXDefaultArgExpr>(
Node.getArg(NumArgs - 1)))
4536 return NumArgs == N;
4555 unsigned NumArgs =
Node.getNumArgs();
4556 if (!Finder->isTraversalIgnoringImplicitNodes())
4557 return NumArgs >= N;
4559 if (!isa<CXXDefaultArgExpr>(
Node.getArg(NumArgs - 1)))
4563 return NumArgs >= N;
4578 unsigned, N, internal::Matcher<Expr>, InnerMatcher) {
4579 if (N >=
Node.getNumArgs())
4582 if (Finder->isTraversalIgnoringImplicitNodes() && isa<CXXDefaultArgExpr>(Arg))
4605 const auto *
const Init =
Node.getInit();
4606 return Init && InnerMacher.matches(*
Init, Finder, Builder);
4627 const Expr *
const Pattern =
Node.getPattern();
4628 return Pattern && InnerMacher.matches(*Pattern, Finder, Builder);
4709 return N <
Node.getNumInits() &&
4710 InnerMatcher.matches(*
Node.getInit(N), Finder, Builder);
4748 internal::Matcher<Decl>, InnerMatcher) {
4749 const unsigned NumDecls = std::distance(
Node.decl_begin(),
Node.decl_end());
4753 std::advance(Iterator, N);
4754 return InnerMatcher.matches(**Iterator, Finder, Builder);
4771 return Node.getExceptionDecl() ==
nullptr;
4788 internal::Matcher<CXXCtorInitializer>, InnerMatcher) {
4789 auto MatchIt = matchesFirstInPointerRange(InnerMatcher,
Node.init_begin(),
4790 Node.init_end(), Finder, Builder);
4791 if (MatchIt ==
Node.init_end())
4793 return (*MatchIt)->isWritten() || !Finder->isTraversalIgnoringImplicitNodes();
4810 internal::Matcher<FieldDecl>, InnerMatcher) {
4812 return (NodeAsDecl !=
nullptr &&
4813 InnerMatcher.matches(*NodeAsDecl, Finder, Builder));
4830 internal::Matcher<Expr>, InnerMatcher) {
4831 const Expr* NodeAsExpr =
Node.getInit();
4832 return (NodeAsExpr !=
nullptr &&
4833 InnerMatcher.matches(*NodeAsExpr, Finder, Builder));
4850 return Node.isWritten();
4870 return Node.isBaseInitializer();
4890 return Node.isMemberInitializer();
4916 internal::Matcher<Expr>, InnerMatcher) {
4917 for (
const Expr *Arg :
Node.arguments()) {
4918 if (Finder->isTraversalIgnoringImplicitNodes() &&
4919 isa<CXXDefaultArgExpr>(Arg))
4921 BoundNodesTreeBuilder
Result(*Builder);
4922 if (InnerMatcher.matches(*Arg, Finder, &
Result)) {
4923 *Builder = std::move(
Result);
4942extern const internal::VariadicAllOfMatcher<LambdaCapture>
lambdaCapture;
4959 clang::ast_matchers::internal::BoundNodesTreeBuilder
Result(*Builder);
4961 *Builder = std::move(
Result);
4985 if (!
Node.capturesVariable())
4987 auto *capturedVar =
Node.getCapturedVar();
4988 return capturedVar && InnerMatcher.matches(*capturedVar, Finder, Builder);
5009 return Node.isListInitialization();
5025 return Node.requiresZeroInitialization();
5052 unsigned, N, internal::Matcher<ParmVarDecl>,
5054 return (N <
Node.parameters().size()
5055 && InnerMatcher.matches(*
Node.parameters()[N], Finder, Builder));
5074 return Node.isExplicitObjectMemberFunction();
5098 internal::Matcher<Expr>, ArgMatcher,
5099 internal::Matcher<ParmVarDecl>, ParamMatcher) {
5100 BoundNodesTreeBuilder
Result;
5104 BoundNodesTreeBuilder Matches;
5108 .matches(
Node, Finder, &Matches)
5112 bool Matched =
false;
5113 for (; ArgIndex <
Node.getNumArgs(); ++ArgIndex) {
5114 BoundNodesTreeBuilder ArgMatches(*Builder);
5115 if (ArgMatcher.matches(*(
Node.getArg(ArgIndex)->IgnoreParenCasts()),
5116 Finder, &ArgMatches)) {
5117 BoundNodesTreeBuilder ParamMatches(ArgMatches);
5119 hasParameter(ParamIndex, ParamMatcher)))),
5121 hasParameter(ParamIndex, ParamMatcher))))))
5122 .matches(
Node, Finder, &ParamMatches)) {
5123 Result.addMatch(ParamMatches);
5129 *Builder = std::move(
Result);
5161 internal::Matcher<Expr>, ArgMatcher,
5162 internal::Matcher<QualType>, ParamMatcher) {
5163 BoundNodesTreeBuilder
Result;
5167 BoundNodesTreeBuilder Matches;
5171 .matches(
Node, Finder, &Matches)
5176 if (
const auto *
Call = dyn_cast<CallExpr>(&
Node)) {
5177 if (
const auto *
Value =
5178 dyn_cast_or_null<ValueDecl>(
Call->getCalleeDecl())) {
5188 assert(MP &&
"Must be member-pointer if its a memberfunctionpointer");
5191 "The call must have happened through a member function "
5197 unsigned ParamIndex = 0;
5198 bool Matched =
false;
5199 unsigned NumArgs =
Node.getNumArgs();
5203 for (; ArgIndex < NumArgs; ++ArgIndex, ++ParamIndex) {
5204 BoundNodesTreeBuilder ArgMatches(*Builder);
5205 if (ArgMatcher.matches(*(
Node.getArg(ArgIndex)->IgnoreParenCasts()), Finder,
5207 BoundNodesTreeBuilder ParamMatches(ArgMatches);
5213 if (ParamMatcher.matches(ParamType, Finder, &ParamMatches)) {
5214 Result.addMatch(ParamMatches);
5220 hasParameter(ParamIndex, hasType(ParamMatcher))))),
5222 hasParameter(ParamIndex, hasType(ParamMatcher)))))))
5223 .matches(
Node, Finder, &ParamMatches)) {
5224 Result.addMatch(ParamMatches);
5230 *Builder = std::move(
Result);
5252 if (
const auto *
Decl = dyn_cast_or_null<FunctionDecl>(Context))
5253 return N <
Decl->param_size() &&
Decl->getParamDecl(N) == &
Node;
5254 if (
const auto *
Decl = dyn_cast_or_null<BlockDecl>(Context))
5255 return N <
Decl->param_size() &&
Decl->getParamDecl(N) == &
Node;
5256 if (
const auto *
Decl = dyn_cast_or_null<ObjCMethodDecl>(Context))
5257 return N <
Decl->param_size() &&
Decl->getParamDecl(N) == &
Node;
5297 internal::Matcher<ParmVarDecl>,
5299 return matchesFirstInPointerRange(InnerMatcher,
Node.param_begin(),
5300 Node.param_end(), Finder,
5301 Builder) !=
Node.param_end();
5325 return Node.getNumParams() == N;
5353 forEachTemplateArgument,
5357 internal::Matcher<TemplateArgument>, InnerMatcher) {
5359 clang::ast_matchers::internal::getTemplateSpecializationArgs(
Node);
5360 clang::ast_matchers::internal::BoundNodesTreeBuilder
Result;
5361 bool Matched =
false;
5362 for (
const auto &Arg : TemplateArgs) {
5363 clang::ast_matchers::internal::BoundNodesTreeBuilder ArgBuilder(*Builder);
5364 if (InnerMatcher.matches(Arg, Finder, &ArgBuilder)) {
5366 Result.addMatch(ArgBuilder);
5369 *Builder = std::move(
Result);
5398 internal::Matcher<QualType>, InnerMatcher) {
5399 return InnerMatcher.matches(
Node.getReturnType(), Finder, Builder);
5419 return Node.isExternC();
5452 return Node.isDeleted();
5465 return Node.isDefaulted();
5498 return FnTy->hasDynamicExceptionSpec();
5548 return Node.isConsteval();
5570 return Node.isConstexpr();
5585 if (
const auto *CIA =
Node.getAttr<ConstInitAttr>())
5586 return CIA->isConstinit();
5614 internal::Matcher<Stmt>, InnerMatcher) {
5616 return Init !=
nullptr && InnerMatcher.matches(*
Init, Finder, Builder);
5630 internal::Matcher<Expr>, InnerMatcher) {
5633 InnerMatcher.matches(*
Condition, Finder, Builder));
5644 const Stmt *
const Then =
Node.getThen();
5645 return (Then !=
nullptr && InnerMatcher.matches(*Then, Finder, Builder));
5656 const Stmt *
const Else =
Node.getElse();
5657 return (Else !=
nullptr && InnerMatcher.matches(*Else, Finder, Builder));
5691 internal::NotEqualsBoundNodePredicate Predicate;
5694 return Builder->removeBindings(Predicate);
5706 internal::Matcher<DeclStmt>, InnerMatcher) {
5707 const DeclStmt*
const DeclarationStatement =
5708 Node.getConditionVariableDeclStmt();
5709 return DeclarationStatement !=
nullptr &&
5710 InnerMatcher.matches(*DeclarationStatement, Finder, Builder);
5723 internal::Matcher<Expr>, InnerMatcher) {
5725 return InnerMatcher.matches(*
Expression, Finder, Builder);
5740 internal::Matcher<Expr>, InnerMatcher) {
5742 return InnerMatcher.matches(*
Expression, Finder, Builder);
5774 internal::Matcher<Stmt>, InnerMatcher) {
5775 if (Finder->isTraversalIgnoringImplicitNodes() && isDefaultedHelper(&
Node))
5777 const Stmt *
const Statement = internal::GetBodyMatcher<NodeType>::get(
Node);
5778 return (Statement !=
nullptr &&
5779 InnerMatcher.matches(*Statement, Finder, Builder));
5799 internal::Matcher<Stmt>, InnerMatcher) {
5800 const Stmt *
const Statement =
Node.getBody();
5801 return (Statement !=
nullptr &&
5802 InnerMatcher.matches(*Statement, Finder, Builder));
5820 internal::Matcher<Stmt>, InnerMatcher) {
5822 return CS && matchesFirstInPointerRange(InnerMatcher, CS->
body_begin(),
5838 return Node.size() == N;
5866template <
typename ValueT>
5867internal::PolymorphicMatcher<internal::ValueEqualsMatcher,
5868 void(internal::AllNodeBaseTypes), ValueT>
5870 return internal::PolymorphicMatcher<internal::ValueEqualsMatcher,
5871 void(internal::AllNodeBaseTypes), ValueT>(
5880 return internal::ValueEqualsMatcher<NodeType, ParamT>(
Value)
5888 unsigned,
Value, 1) {
5889 return internal::ValueEqualsMatcher<NodeType, ParamT>(
Value)
5899 return internal::ValueEqualsMatcher<NodeType, ParamT>(
Value)
5924 std::string, Name) {
5925 if (std::optional<StringRef> OpName = internal::getOpName(
Node))
5926 return *OpName == Name;
5936extern const internal::VariadicFunction<
5937 internal::PolymorphicMatcher<internal::HasAnyOperatorNameMatcher,
5941 std::vector<std::string>>,
5960 isAssignmentOperator,
5963 return Node.isAssignmentOp();
5981 isComparisonOperator,
5984 return Node.isComparisonOp();
5998 internal::Matcher<Expr>, InnerMatcher) {
5999 const Expr *LeftHandSide = internal::getLHS(
Node);
6000 return (LeftHandSide !=
nullptr &&
6001 InnerMatcher.matches(*LeftHandSide, Finder, Builder));
6015 internal::Matcher<Expr>, InnerMatcher) {
6016 const Expr *RightHandSide = internal::getRHS(
Node);
6017 return (RightHandSide !=
nullptr &&
6018 InnerMatcher.matches(*RightHandSide, Finder, Builder));
6027 internal::Matcher<Expr>, InnerMatcher) {
6028 return internal::VariadicDynCastAllOfMatcher<Stmt, NodeType>()(
6029 anyOf(hasLHS(InnerMatcher), hasRHS(InnerMatcher)))
6030 .matches(
Node, Finder, Builder);