118 template <
typename T>
120 return MyBoundNodes.getNodeAs<T>(ID);
130 return MyBoundNodes.getMap();
137 BoundNodes(internal::BoundNodesMap &MyBoundNodes)
138 : MyBoundNodes(MyBoundNodes) {}
140 internal::BoundNodesMap MyBoundNodes;
174inline internal::TrueMatcher
anything() {
return internal::TrueMatcher(); }
187extern const internal::VariadicDynCastAllOfMatcher<Decl, TranslationUnitDecl>
199extern const internal::VariadicDynCastAllOfMatcher<Decl, TypedefDecl>
211extern const internal::VariadicDynCastAllOfMatcher<Decl, TypedefNameDecl>
223extern const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasDecl>
236extern const internal::VariadicDynCastAllOfMatcher<Decl, UsingShadowDecl>
246extern const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasTemplateDecl>
265 auto &
SourceManager = Finder->getASTContext().getSourceManager();
286 auto &
SourceManager = Finder->getASTContext().getSourceManager();
288 if (ExpansionLoc.isInvalid()) {
313 auto &
SourceManager = Finder->getASTContext().getSourceManager();
315 if (ExpansionLoc.isInvalid()) {
325 return RegExp->match(Filename);
334 std::string, MacroName) {
337 auto& Context = Finder->getASTContext();
338 std::optional<SourceLocation> B =
340 if (!B)
return false;
341 std::optional<SourceLocation> E =
343 if (!E)
return false;
356extern const internal::VariadicAllOfMatcher<Decl>
decl;
368extern const internal::VariadicDynCastAllOfMatcher<Decl, DecompositionDecl>
378extern const internal::VariadicDynCastAllOfMatcher<Decl, BindingDecl>
389extern const internal::VariadicDynCastAllOfMatcher<Decl, LinkageSpecDecl>
403extern const internal::VariadicDynCastAllOfMatcher<Decl, NamedDecl>
namedDecl;
414extern const internal::VariadicDynCastAllOfMatcher<Decl, LabelDecl>
labelDecl;
425extern const internal::VariadicDynCastAllOfMatcher<Decl, NamespaceDecl>
437extern const internal::VariadicDynCastAllOfMatcher<Decl, NamespaceAliasDecl>
449extern const internal::VariadicDynCastAllOfMatcher<Decl, RecordDecl>
recordDecl;
458extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXRecordDecl>
467extern const internal::VariadicDynCastAllOfMatcher<Decl, ClassTemplateDecl>
480extern const internal::VariadicDynCastAllOfMatcher<
499extern const internal::VariadicDynCastAllOfMatcher<
512extern const internal::VariadicDynCastAllOfMatcher<Decl, DeclaratorDecl>
523extern const internal::VariadicDynCastAllOfMatcher<Decl, ParmVarDecl>
537extern const internal::VariadicDynCastAllOfMatcher<Decl, AccessSpecDecl>
547extern const internal::VariadicAllOfMatcher<CXXBaseSpecifier>
cxxBaseSpecifier;
558extern const internal::VariadicAllOfMatcher<CXXCtorInitializer>
570extern const internal::VariadicAllOfMatcher<TemplateArgument>
templateArgument;
581extern const internal::VariadicAllOfMatcher<TemplateArgumentLoc>
593extern const internal::VariadicAllOfMatcher<TemplateName>
templateName;
603extern const internal::VariadicDynCastAllOfMatcher<
Decl,
615extern const internal::VariadicDynCastAllOfMatcher<Decl, TemplateTypeParmDecl>
626extern const internal::VariadicDynCastAllOfMatcher<
Decl,
650 return getAccessSpecifier(Node) ==
AS_public;
695 return getAccessSpecifier(Node) ==
AS_private;
710 return Node.isBitField();
727 return Node.isBitField() && Node.hasConstantIntegerBitWidth() &&
728 Node.getBitWidthValue() == Width;
749 InnerMatcher.matches(*
Initializer, Finder, Builder));
755 return Node.isMain();
769 internal::Matcher<ClassTemplateDecl>, InnerMatcher) {
771 return (
Decl !=
nullptr &&
772 InnerMatcher.matches(*
Decl, Finder, Builder));
798 if constexpr (std::is_same_v<NodeType, InitListExpr>)
799 return !Node.isExplicit();
826 hasAnyTemplateArgument,
829 TemplateSpecializationType),
830 internal::Matcher<TemplateArgument>, InnerMatcher) {
832 internal::getTemplateSpecializationArgs(Node);
833 return matchesFirstInRange(InnerMatcher, List.begin(), List.end(), Finder,
834 Builder) != List.end();
855 const internal::Matcher<T> &InnerMatcher) {
856 return internal::DynTypedMatcher::constructRestrictedWrapper(
857 new internal::TraversalMatcher<T>(TK, InnerMatcher),
858 InnerMatcher.getID().first)
859 .template unconditionalConvertTo<T>();
863internal::BindableMatcher<T>
865 return internal::BindableMatcher<T>(
866 internal::DynTypedMatcher::constructRestrictedWrapper(
867 new internal::TraversalMatcher<T>(TK, InnerMatcher),
868 InnerMatcher.getID().first)
869 .template unconditionalConvertTo<T>());
872template <
typename... T>
873internal::TraversalWrapper<internal::VariadicOperatorMatcher<T...>>
875 const internal::VariadicOperatorMatcher<T...> &InnerMatcher) {
876 return internal::TraversalWrapper<internal::VariadicOperatorMatcher<T...>>(
880template <
template <
typename ToArg,
typename FromArg>
class ArgumentAdapterT,
881 typename T,
typename ToTypes>
882internal::TraversalWrapper<
883 internal::ArgumentAdaptingMatcherFuncAdaptor<ArgumentAdapterT, T, ToTypes>>
885 ArgumentAdapterT, T, ToTypes> &InnerMatcher) {
886 return internal::TraversalWrapper<
887 internal::ArgumentAdaptingMatcherFuncAdaptor<ArgumentAdapterT, T,
888 ToTypes>>(TK, InnerMatcher);
891template <
template <
typename T,
typename... P>
class MatcherT, typename... P,
892 typename ReturnTypesF>
894 internal::PolymorphicMatcher<MatcherT, ReturnTypesF, P...>>
896 const internal::PolymorphicMatcher<MatcherT, ReturnTypesF, P...>
898 return internal::TraversalWrapper<
899 internal::PolymorphicMatcher<MatcherT, ReturnTypesF, P...>>(TK,
903template <
typename... T>
904internal::Matcher<
typename internal::GetClade<T...>
::Type>
906 return traverse(TK, InnerMatcher.with());
932 return InnerMatcher.matches(*Node.IgnoreImplicit(), Finder, Builder);
961 internal::Matcher<Expr>, InnerMatcher) {
962 return InnerMatcher.matches(*Node.IgnoreImpCasts(), Finder, Builder);
983 return InnerMatcher.matches(*Node.IgnoreParenCasts(), Finder, Builder);
1008 internal::Matcher<Expr>, InnerMatcher) {
1009 return InnerMatcher.matches(*Node.IgnoreParenImpCasts(), Finder, Builder);
1025 return InnerMatcher.matches(Node.IgnoreParens(), Finder, Builder);
1042 return InnerMatcher.matches(*E, Finder, Builder);
1107 hasTemplateArgument,
1110 TemplateSpecializationType),
1111 unsigned, N, internal::Matcher<TemplateArgument>, InnerMatcher) {
1113 internal::getTemplateSpecializationArgs(Node);
1114 if (List.size() <= N)
1116 return InnerMatcher.matches(List[N], Finder, Builder);
1135 templateArgumentCountIs,
1138 TemplateSpecializationType),
1140 return internal::getTemplateSpecializationArgs(Node).size() == N;
1155 internal::Matcher<QualType>, InnerMatcher) {
1158 return InnerMatcher.matches(Node.getAsType(), Finder, Builder);
1173 internal::Matcher<TemplateName>, InnerMatcher) {
1176 return InnerMatcher.matches(Node.getAsTemplate(), Finder, Builder);
1193 internal::Matcher<Decl>, InnerMatcher) {
1195 return InnerMatcher.matches(*Node.getAsDecl(), Finder, Builder);
1213 return InnerMatcher.matches(*Node.getAsExpr(), Finder, Builder);
1243 internal::Matcher<QualType>, InnerMatcher) {
1246 return InnerMatcher.matches(Node.getIntegralType(), Finder, Builder);
1264 std::string,
Value) {
1280extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1292extern const internal::VariadicDynCastAllOfMatcher<Decl, ExportDecl>
exportDecl;
1301extern const internal::VariadicDynCastAllOfMatcher<Decl, ValueDecl>
valueDecl;
1314extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXConstructorDecl>
1326extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXDestructorDecl>
1337extern const internal::VariadicDynCastAllOfMatcher<Decl, EnumDecl>
enumDecl;
1347extern const internal::VariadicDynCastAllOfMatcher<Decl, EnumConstantDecl>
1362extern const internal::VariadicDynCastAllOfMatcher<Decl, TagDecl>
tagDecl;
1370extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXMethodDecl>
1379extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXConversionDecl>
1390extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXDeductionGuideDecl>
1400extern const internal::VariadicDynCastAllOfMatcher<Decl, ConceptDecl>
1410extern const internal::VariadicDynCastAllOfMatcher<Expr, RequiresExpr>
1420extern const internal::VariadicDynCastAllOfMatcher<Decl, RequiresExprBodyDecl>
1432extern const internal::VariadicDynCastAllOfMatcher<Decl, VarDecl>
varDecl;
1442extern const internal::VariadicDynCastAllOfMatcher<Decl, FieldDecl>
fieldDecl;
1452extern const internal::VariadicDynCastAllOfMatcher<Decl, IndirectFieldDecl>
1461extern const internal::VariadicDynCastAllOfMatcher<Decl, FunctionDecl>
1470extern const internal::VariadicDynCastAllOfMatcher<Decl, FunctionTemplateDecl>
1481extern const internal::VariadicDynCastAllOfMatcher<Decl, FriendDecl>
friendDecl;
1491extern const internal::VariadicAllOfMatcher<Stmt>
stmt;
1501extern const internal::VariadicDynCastAllOfMatcher<Stmt, DeclStmt>
declStmt;
1514extern const internal::VariadicDynCastAllOfMatcher<Stmt, MemberExpr>
memberExpr;
1528extern const internal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedMemberExpr>
1540extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1552extern const internal::VariadicDynCastAllOfMatcher<Stmt, CallExpr>
callExpr;
1582extern const internal::VariadicDynCastAllOfMatcher<Stmt, LambdaExpr>
lambdaExpr;
1591extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXMemberCallExpr>
1603extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCMessageExpr>
1612extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCStringLiteral>
1622extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCInterfaceDecl>
1632extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCImplementationDecl>
1642extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCProtocolDecl>
1652extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryDecl>
1662extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryImplDecl>
1677extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCMethodDecl>
1690extern const internal::VariadicDynCastAllOfMatcher<Decl, BlockDecl>
1702extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCIvarDecl>
1713extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCPropertyDecl>
1722extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtThrowStmt>
1732extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtTryStmt>
1742extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtCatchStmt>
1752extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtFinallyStmt>
1762extern const internal::VariadicDynCastAllOfMatcher<Stmt, ExprWithCleanups>
1775extern const internal::VariadicDynCastAllOfMatcher<Stmt, InitListExpr>
1781 internal::Matcher<Expr>, InnerMatcher) {
1782 const Expr *SyntForm = Node.getSyntacticForm();
1783 return (SyntForm !=
nullptr &&
1784 InnerMatcher.matches(*SyntForm, Finder, Builder));
1798extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1810extern const internal::VariadicDynCastAllOfMatcher<Stmt, ImplicitValueInitExpr>
1828extern const internal::VariadicDynCastAllOfMatcher<Stmt, ParenListExpr>
1841extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1854extern const internal::VariadicDynCastAllOfMatcher<Decl, UsingDecl>
usingDecl;
1865extern const internal::VariadicDynCastAllOfMatcher<Decl, UsingEnumDecl>
1877extern const internal::VariadicDynCastAllOfMatcher<Decl, UsingDirectiveDecl>
1894extern const internal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedLookupExpr>
1908extern const internal::VariadicDynCastAllOfMatcher<
Decl,
1927extern const internal::VariadicDynCastAllOfMatcher<
Decl,
1940extern const internal::VariadicDynCastAllOfMatcher<Stmt, ConstantExpr>
1950extern const internal::VariadicDynCastAllOfMatcher<Stmt, ParenExpr>
parenExpr;
1962extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXConstructExpr>
1973extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1987extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThisExpr>
1998extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBindTemporaryExpr>
2019extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
2031extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNewExpr>
cxxNewExpr;
2041extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDeleteExpr>
2057extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNoexceptExpr>
2077extern const internal::VariadicDynCastAllOfMatcher<Stmt, ArrayInitLoopExpr>
2096extern const internal::VariadicDynCastAllOfMatcher<Stmt, ArrayInitIndexExpr>
2107extern const internal::VariadicDynCastAllOfMatcher<Stmt, ArraySubscriptExpr>
2119extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDefaultArgExpr>
2138extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXOperatorCallExpr>
2150extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXFoldExpr>
2170extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
2180extern const internal::VariadicDynCastAllOfMatcher<Stmt, Expr>
expr;
2189extern const internal::VariadicDynCastAllOfMatcher<Stmt, DeclRefExpr>
2198extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
2213extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCIvarRefExpr>
2222extern const internal::VariadicDynCastAllOfMatcher<Stmt, BlockExpr>
blockExpr;
2230extern const internal::VariadicDynCastAllOfMatcher<Stmt, IfStmt>
ifStmt;
2239extern const internal::VariadicDynCastAllOfMatcher<Stmt, ForStmt>
forStmt;
2251 const Stmt *
const Increment = Node.getInc();
2252 return (Increment !=
nullptr &&
2253 InnerMatcher.matches(*Increment, Finder, Builder));
2266 const Stmt *
const Init = Node.getInit();
2267 return (
Init !=
nullptr && InnerMatcher.matches(*
Init, Finder, Builder));
2277extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXForRangeStmt>
2290 const VarDecl *
const Var = Node.getLoopVariable();
2291 return (Var !=
nullptr && InnerMatcher.matches(*Var, Finder, Builder));
2304 const Expr *
const Init = Node.getRangeInit();
2305 return (
Init !=
nullptr && InnerMatcher.matches(*
Init, Finder, Builder));
2316extern const internal::VariadicDynCastAllOfMatcher<Stmt, WhileStmt>
whileStmt;
2326extern const internal::VariadicDynCastAllOfMatcher<Stmt, DoStmt>
doStmt;
2336extern const internal::VariadicDynCastAllOfMatcher<Stmt, BreakStmt>
breakStmt;
2346extern const internal::VariadicDynCastAllOfMatcher<Stmt, ContinueStmt>
2357extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoreturnStmt>
2368extern const internal::VariadicDynCastAllOfMatcher<Stmt, ReturnStmt>
returnStmt;
2379extern const internal::VariadicDynCastAllOfMatcher<Stmt, GotoStmt>
gotoStmt;
2390extern const internal::VariadicDynCastAllOfMatcher<Stmt, LabelStmt>
labelStmt;
2402extern const internal::VariadicDynCastAllOfMatcher<Stmt, AddrLabelExpr>
2413extern const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchStmt>
switchStmt;
2423extern const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchCase>
switchCase;
2433extern const internal::VariadicDynCastAllOfMatcher<Stmt, CaseStmt>
caseStmt;
2443extern const internal::VariadicDynCastAllOfMatcher<Stmt, DefaultStmt>
2452extern const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundStmt>
2462extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXCatchStmt>
2472extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTryStmt>
cxxTryStmt;
2481extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThrowExpr>
2491extern const internal::VariadicDynCastAllOfMatcher<Stmt, NullStmt>
nullStmt;
2501extern const internal::VariadicDynCastAllOfMatcher<Stmt, AsmStmt>
asmStmt;
2515extern const internal::VariadicDynCastAllOfMatcher<Decl, FileScopeAsmDecl>
2524extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBoolLiteralExpr>
2534extern const internal::VariadicDynCastAllOfMatcher<Stmt, StringLiteral>
2547extern const internal::VariadicDynCastAllOfMatcher<Stmt, CharacterLiteral>
2554extern const internal::VariadicDynCastAllOfMatcher<Stmt, IntegerLiteral>
2564extern const internal::VariadicDynCastAllOfMatcher<Stmt, FloatingLiteral>
2569extern const internal::VariadicDynCastAllOfMatcher<Stmt, ImaginaryLiteral>
2594extern const internal::VariadicDynCastAllOfMatcher<Stmt, FixedPointLiteral>
2600extern const internal::VariadicDynCastAllOfMatcher<Stmt, UserDefinedLiteral>
2610extern const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundLiteralExpr>
2621extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoawaitExpr>
2624extern const internal::VariadicDynCastAllOfMatcher<Stmt, DependentCoawaitExpr>
2634extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoyieldExpr>
2645extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoroutineBodyStmt>
2649extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNullPtrLiteralExpr>
2653extern const internal::VariadicDynCastAllOfMatcher<Stmt, ChooseExpr>
2657extern const internal::VariadicDynCastAllOfMatcher<Stmt, ConvertVectorExpr>
2661extern const internal::VariadicDynCastAllOfMatcher<Stmt, GNUNullExpr>
2665extern const internal::VariadicDynCastAllOfMatcher<Stmt, GenericSelectionExpr>
2673extern const internal::VariadicDynCastAllOfMatcher<Stmt, AtomicExpr>
atomicExpr;
2681extern const internal::VariadicDynCastAllOfMatcher<Stmt, StmtExpr>
stmtExpr;
2690extern const internal::VariadicDynCastAllOfMatcher<Stmt, BinaryOperator>
2699extern const internal::VariadicDynCastAllOfMatcher<Stmt, UnaryOperator>
2708extern const internal::VariadicDynCastAllOfMatcher<Stmt, ConditionalOperator>
2717extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
2729extern const internal::VariadicDynCastAllOfMatcher<Stmt, OpaqueValueExpr>
2745extern const internal::VariadicDynCastAllOfMatcher<Decl, StaticAssertDecl>
2758extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXReinterpretCastExpr>
2774extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXStaticCastExpr>
2789extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDynamicCastExpr>
2800extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXConstCastExpr>
2814extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNamedCastExpr>
2823extern const internal::VariadicDynCastAllOfMatcher<Stmt, CStyleCastExpr>
2847extern const internal::VariadicDynCastAllOfMatcher<Stmt, ExplicitCastExpr>
2854extern const internal::VariadicDynCastAllOfMatcher<Stmt, ImplicitCastExpr>
2870extern const internal::VariadicDynCastAllOfMatcher<Stmt, CastExpr>
castExpr;
2880extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXFunctionalCastExpr>
2889extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTemporaryObjectExpr>
2898extern const internal::VariadicDynCastAllOfMatcher<Stmt, PredefinedExpr>
2907extern const internal::VariadicDynCastAllOfMatcher<Stmt, DesignatedInitExpr>
2922 return Node.size() == N;
2926extern const internal::VariadicAllOfMatcher<QualType>
qualType;
2929extern const internal::VariadicAllOfMatcher<Type>
type;
2932extern const internal::VariadicAllOfMatcher<TypeLoc>
typeLoc;
2953extern const internal::VariadicOperatorMatcherFunc<
2954 2, std::numeric_limits<unsigned>::max()>
2960extern const internal::VariadicOperatorMatcherFunc<
2961 2, std::numeric_limits<unsigned>::max()>
2967extern const internal::VariadicOperatorMatcherFunc<
2968 2, std::numeric_limits<unsigned>::max()>
2995extern const internal::VariadicOperatorMatcherFunc<1, 1>
optionally;
3006extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
3035template <
typename T,
typename...
U>
3036auto mapAnyOf(internal::VariadicDynCastAllOfMatcher<T, U>
const &...) {
3037 return internal::MapAnyOfHelper<
U...>();
3150extern const internal::MapAnyOfMatcher<CallExpr, CXXConstructExpr>
invocation;
3161 internal::Matcher<QualType>, InnerMatcher) {
3162 const QualType ArgumentType = Node.getTypeOfArgument();
3163 return InnerMatcher.matches(ArgumentType, Finder, Builder);
3179 return Node.getKind() == Kind;
3185 const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
3187 allOf(
anyOf(ofKind(UETT_AlignOf), ofKind(UETT_PreferredAlignOf)),
3194 const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
3196 allOf(ofKind(UETT_SizeOf), InnerMatcher)));
3214inline internal::Matcher<NamedDecl>
hasName(StringRef Name) {
3215 return internal::Matcher<NamedDecl>(
3216 new internal::HasNameMatcher({std::string(Name)}));
3229extern const internal::VariadicFunction<internal::Matcher<NamedDecl>, StringRef,
3250 std::string FullNameString =
"::" + Node.getQualifiedNameAsString();
3251 return RegExp->match(FullNameString);
3273inline internal::PolymorphicMatcher<
3274 internal::HasOverloadedOperatorNameMatcher,
3276 std::vector<std::string>>
3278 return internal::PolymorphicMatcher<
3279 internal::HasOverloadedOperatorNameMatcher,
3281 std::vector<std::string>>({std::string(Name)});
3292extern const internal::VariadicFunction<
3293 internal::PolymorphicMatcher<internal::HasOverloadedOperatorNameMatcher,
3296 std::vector<std::string>>,
3321 return Node.getMember().getAsString() == N;
3359 std::string, BindingID) {
3360 auto MemberName = Node.getMember().getAsString();
3362 return Builder->removeBindings(
3363 [
this, MemberName](
const BoundNodesMap &Nodes) {
3364 const DynTypedNode &BN = Nodes.getNode(this->BindingID);
3368 return ND->getName() != MemberName;
3394 return internal::getDependentName(Node) == N;
3430 internal::Matcher<NamedDecl>,
Base) {
3432 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3433 return Finder->classIsDerivedFrom(RD,
Base, Builder,
false);
3437 return Finder->objcClassIsDerivedFrom(InterfaceDecl,
Base, Builder,
3445 std::string, BaseName, 1) {
3446 if (BaseName.empty())
3449 const auto M = isDerivedFrom(
hasName(BaseName));
3451 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3452 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3455 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3492 return Node.hasDefinition() &&
3494 return BaseSpecMatcher.matches(Base, Finder, Builder);
3501 isSameOrDerivedFrom,
3503 internal::Matcher<NamedDecl>,
Base, 0) {
3506 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3507 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3510 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3516 isSameOrDerivedFrom,
3518 std::string, BaseName, 1) {
3519 if (BaseName.empty())
3522 const auto M = isSameOrDerivedFrom(
hasName(BaseName));
3524 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3525 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3528 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3553 isDirectlyDerivedFrom,
3555 internal::Matcher<NamedDecl>,
Base, 0) {
3557 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3558 return Finder->classIsDerivedFrom(RD,
Base, Builder,
true);
3562 return Finder->objcClassIsDerivedFrom(InterfaceDecl,
Base, Builder,
3568 isDirectlyDerivedFrom,
3570 std::string, BaseName, 1) {
3571 if (BaseName.empty())
3573 const auto M = isDirectlyDerivedFrom(
hasName(BaseName));
3575 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3576 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3579 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3594 BoundNodesTreeBuilder
Result(*Builder);
3595 auto MatchIt = matchesFirstInPointerRange(InnerMatcher, Node.method_begin(),
3596 Node.method_end(), Finder, &
Result);
3597 if (MatchIt == Node.method_end())
3600 if (Finder->isTraversalIgnoringImplicitNodes() && (*MatchIt)->isImplicit())
3602 *Builder = std::move(
Result);
3616 return Node.isLambda();
3637extern const internal::ArgumentAdaptingMatcherFunc<internal::HasMatcher>
has;
3653extern const internal::ArgumentAdaptingMatcherFunc<
3654 internal::HasDescendantMatcher>
3675extern const internal::ArgumentAdaptingMatcherFunc<internal::ForEachMatcher>
3705extern const internal::ArgumentAdaptingMatcherFunc<
3706 internal::ForEachDescendantMatcher>
3725template <
typename T>
3726internal::Matcher<T>
findAll(
const internal::Matcher<T> &Matcher) {
3740extern const internal::ArgumentAdaptingMatcherFunc<
3741 internal::HasParentMatcher,
3742 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>,
3743 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>>
3757extern const internal::ArgumentAdaptingMatcherFunc<
3758 internal::HasAncestorMatcher,
3759 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>,
3760 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>>
3772extern const internal::VariadicOperatorMatcherFunc<1, 1>
unless;
3808inline internal::PolymorphicMatcher<
3809 internal::HasDeclarationMatcher,
3810 void(internal::HasDeclarationSupportedTypes), internal::Matcher<Decl>>
3812 return internal::PolymorphicMatcher<
3813 internal::HasDeclarationMatcher,
3814 void(internal::HasDeclarationSupportedTypes), internal::Matcher<Decl>>(
3833 return UnderlyingDecl !=
nullptr &&
3834 InnerMatcher.matches(*UnderlyingDecl, Finder, Builder);
3857 const Expr *ExprNode = Node.getImplicitObjectArgument()
3859 return (ExprNode !=
nullptr &&
3860 InnerMatcher.matches(*ExprNode, Finder, Builder));
3877 return InnerMatcher.matches(
TypeDecl, Finder, Builder);
3893 return Node.isClassMethod();
3909 return Node.isInstanceMethod();
3926 return Node.isClassMessage();
3943 return Node.isInstanceMessage();
3958 const Expr *ReceiverNode = Node.getInstanceReceiver();
3959 return (ReceiverNode !=
nullptr &&
3986extern const internal::VariadicFunction<internal::Matcher<ObjCMessageExpr>,
4000 std::string SelectorString = Node.getSelector().getAsString();
4001 return RegExp->match(SelectorString);
4009 return Node.getSelector().isNull();
4021 return Node.getSelector().isUnarySelector();
4037 return Node.getSelector().isKeywordSelector();
4052 return Node.getSelector().getNumArgs() == N;
4091 internal::Matcher<Stmt>, InnerMatcher, 0) {
4092 const auto *ExprNode = Node.getCallee();
4093 return (ExprNode !=
nullptr &&
4094 InnerMatcher.matches(*ExprNode, Finder, Builder));
4120 internal::Matcher<Decl>, InnerMatcher, 1) {
4123 .matches(Node, Finder, Builder);
4128 const Decl *DeclNode = MsgNode->getMethodDecl();
4129 return (DeclNode !=
nullptr &&
4130 InnerMatcher.matches(*DeclNode, Finder, Builder));
4154 internal::Matcher<QualType>, InnerMatcher, 0) {
4155 QualType QT = internal::getUnderlyingType(Node);
4157 return InnerMatcher.matches(QT, Finder, Builder);
4195 internal::Matcher<Decl>, InnerMatcher, 1) {
4196 QualType QT = internal::getUnderlyingType(Node);
4239 internal::Matcher<TypeLoc>, Inner) {
4241 if (source ==
nullptr) {
4245 return Inner.matches(source->
getTypeLoc(), Finder, Builder);
4258 return Name == Node.getAsString();
4272 QualType, pointsTo, internal::Matcher<QualType>,
4274 return (!Node.isNull() && Node->isAnyPointerType() &&
4275 InnerMatcher.matches(Node->getPointeeType(), Finder, Builder));
4282 .matches(Node, Finder, Builder);
4297 return InnerMatcher.matches(*Node.getUnqualifiedDesugaredType(), Finder,
4316 return (!Node.isNull() && Node->isReferenceType() &&
4317 InnerMatcher.matches(Node->getPointeeType(), Finder, Builder));
4336 return InnerMatcher.matches(Node.getCanonicalType(), Finder, Builder);
4343 .matches(Node, Finder, Builder);
4364 internal::Matcher<Expr>, InnerMatcher) {
4365 const Expr *ExprNode = Node.getImplicitObjectArgument();
4366 return (ExprNode !=
nullptr &&
4367 InnerMatcher.matches(*ExprNode, Finder, Builder));
4387 internal::Matcher<QualType>, InnerMatcher, 0) {
4388 return onImplicitObjectArgument(
4389 anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))))
4390 .matches(Node, Finder, Builder);
4395 internal::Matcher<Decl>, InnerMatcher, 1) {
4396 return onImplicitObjectArgument(
4397 anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))))
4398 .matches(Node, Finder, Builder);
4412 const Decl *DeclNode = Node.getDecl();
4413 return (DeclNode !=
nullptr &&
4414 InnerMatcher.matches(*DeclNode, Finder, Builder));
4441 internal::Matcher<UsingShadowDecl>, Inner) {
4443 if constexpr (std::is_same_v<NodeType, UsingType>) {
4444 FoundDecl = Node.getDecl();
4446 static_assert(std::is_same_v<NodeType, DeclRefExpr>);
4447 FoundDecl = Node.getFoundDecl();
4450 return Inner.matches(*
UsingDecl, Finder, Builder);
4471 return matchesFirstInPointerRange(InnerMatcher, Node.decls_begin(),
4472 Node.decls_end(), Finder,
4473 Builder) != Node.decls_end();
4486 if (Node.isSingleDecl()) {
4487 const Decl *FoundDecl = Node.getSingleDecl();
4488 return InnerMatcher.matches(*FoundDecl, Finder, Builder);
4502 VarDecl, hasInitializer, internal::Matcher<Expr>,
4506 InnerMatcher.matches(*
Initializer, Finder, Builder));
4532 internal::Matcher<LambdaCapture>, InnerMatcher) {
4533 BoundNodesTreeBuilder
Result;
4534 bool Matched =
false;
4535 for (
const auto &
Capture : Node.captures()) {
4536 if (Finder->isTraversalIgnoringImplicitNodes() &&
Capture.isImplicit())
4538 BoundNodesTreeBuilder CaptureBuilder(*Builder);
4539 if (InnerMatcher.matches(
Capture, Finder, &CaptureBuilder)) {
4541 Result.addMatch(CaptureBuilder);
4544 *Builder = std::move(
Result);
4559 return Node.isStaticLocal();
4574 return Node.hasLocalStorage();
4588 return Node.hasGlobalStorage();
4624 return Node.getStorageDuration() ==
SD_Static;
4640 return Node.getStorageDuration() ==
SD_Thread;
4655 return Node.isExceptionVariable();
4671 unsigned NumArgs = Node.getNumArgs();
4672 if (!Finder->isTraversalIgnoringImplicitNodes())
4673 return NumArgs == N;
4679 return NumArgs == N;
4698 unsigned NumArgs = Node.getNumArgs();
4699 if (!Finder->isTraversalIgnoringImplicitNodes())
4700 return NumArgs >= N;
4706 return NumArgs >= N;
4721 unsigned, N, internal::Matcher<Expr>, InnerMatcher) {
4722 if (N >= Node.getNumArgs())
4724 const Expr *Arg = Node.getArg(N);
4748 const auto *
const Init = Node.getInit();
4749 return Init && InnerMacher.matches(*
Init, Finder, Builder);
4770 const Expr *
const Pattern = Node.getPattern();
4771 return Pattern && InnerMacher.matches(*Pattern, Finder, Builder);
4852 return N < Node.getNumInits() &&
4853 InnerMatcher.matches(*Node.getInit(N), Finder, Builder);
4868 return std::distance(Node.decl_begin(), Node.decl_end()) == (
ptrdiff_t)N;
4891 internal::Matcher<Decl>, InnerMatcher) {
4892 const unsigned NumDecls = std::distance(Node.decl_begin(), Node.decl_end());
4896 std::advance(Iterator, N);
4897 return InnerMatcher.matches(**Iterator, Finder, Builder);
4914 return Node.getExceptionDecl() ==
nullptr;
4931 internal::Matcher<CXXCtorInitializer>, InnerMatcher) {
4932 auto MatchIt = matchesFirstInPointerRange(InnerMatcher, Node.init_begin(),
4933 Node.init_end(), Finder, Builder);
4934 if (MatchIt == Node.init_end())
4936 return (*MatchIt)->isWritten() || !Finder->isTraversalIgnoringImplicitNodes();
4953 internal::Matcher<FieldDecl>, InnerMatcher) {
4954 const FieldDecl *NodeAsDecl = Node.getAnyMember();
4955 return (NodeAsDecl !=
nullptr &&
4956 InnerMatcher.matches(*NodeAsDecl, Finder, Builder));
4973 internal::Matcher<Expr>, InnerMatcher) {
4974 const Expr* NodeAsExpr = Node.getInit();
4975 return (NodeAsExpr !=
nullptr &&
4976 InnerMatcher.matches(*NodeAsExpr, Finder, Builder));
4993 return Node.isWritten();
5013 return Node.isBaseInitializer();
5033 return Node.isMemberInitializer();
5059 internal::Matcher<Expr>, InnerMatcher) {
5060 for (
const Expr *Arg : Node.arguments()) {
5061 if (Finder->isTraversalIgnoringImplicitNodes() &&
5064 BoundNodesTreeBuilder
Result(*Builder);
5065 if (InnerMatcher.matches(*Arg, Finder, &
Result)) {
5066 *Builder = std::move(
Result);
5085extern const internal::VariadicAllOfMatcher<LambdaCapture>
lambdaCapture;
5102 clang::ast_matchers::internal::BoundNodesTreeBuilder
Result(*Builder);
5104 *Builder = std::move(
Result);
5128 if (!Node.capturesVariable())
5130 auto *capturedVar = Node.getCapturedVar();
5131 return capturedVar && InnerMatcher.matches(*capturedVar, Finder, Builder);
5152 return Node.isListInitialization();
5168 return Node.requiresZeroInitialization();
5195 unsigned, N, internal::Matcher<ParmVarDecl>,
5197 return (N < Node.parameters().size()
5198 && InnerMatcher.matches(*Node.parameters()[N], Finder, Builder));
5217 return Node.isExplicitObjectMemberFunction();
5241 internal::Matcher<Expr>, ArgMatcher,
5242 internal::Matcher<ParmVarDecl>, ParamMatcher) {
5243 BoundNodesTreeBuilder
Result;
5247 BoundNodesTreeBuilder Matches;
5251 .matches(Node, Finder, &Matches)
5255 bool Matched =
false;
5256 for (; ArgIndex < Node.getNumArgs(); ++ArgIndex) {
5257 BoundNodesTreeBuilder ArgMatches(*Builder);
5258 if (ArgMatcher.matches(*(Node.getArg(ArgIndex)->IgnoreParenCasts()),
5259 Finder, &ArgMatches)) {
5260 BoundNodesTreeBuilder ParamMatches(ArgMatches);
5262 hasParameter(ParamIndex, ParamMatcher)))),
5264 hasParameter(ParamIndex, ParamMatcher))))))
5265 .matches(Node, Finder, &ParamMatches)) {
5266 Result.addMatch(ParamMatches);
5272 *Builder = std::move(
Result);
5304 internal::Matcher<Expr>, ArgMatcher,
5305 internal::Matcher<QualType>, ParamMatcher) {
5306 BoundNodesTreeBuilder
Result;
5307 bool Matched =
false;
5308 auto ProcessParamAndArg = [&](
QualType ParamType,
const Expr *Arg) {
5309 BoundNodesTreeBuilder ArgMatches(*Builder);
5310 if (!ArgMatcher.matches(*Arg, Finder, &ArgMatches))
5312 BoundNodesTreeBuilder ParamMatches(std::move(ArgMatches));
5313 if (!ParamMatcher.matches(ParamType, Finder, &ParamMatches))
5315 Result.addMatch(ParamMatches);
5319 if (
auto *
Call = llvm::dyn_cast<CallExpr>(&Node))
5321 else if (
auto *Construct = llvm::dyn_cast<CXXConstructExpr>(&Node))
5324 llvm_unreachable(
"expected CallExpr or CXXConstructExpr");
5326 *Builder = std::move(
Result);
5348 if (
const auto *
Decl = dyn_cast_or_null<FunctionDecl>(Context))
5349 return N <
Decl->param_size() &&
Decl->getParamDecl(N) == &Node;
5350 if (
const auto *
Decl = dyn_cast_or_null<BlockDecl>(Context))
5351 return N <
Decl->param_size() &&
Decl->getParamDecl(N) == &Node;
5352 if (
const auto *
Decl = dyn_cast_or_null<ObjCMethodDecl>(Context))
5353 return N <
Decl->param_size() &&
Decl->getParamDecl(N) == &Node;
5393 internal::Matcher<ParmVarDecl>,
5395 return matchesFirstInPointerRange(InnerMatcher, Node.param_begin(),
5396 Node.param_end(), Finder,
5397 Builder) != Node.param_end();
5421 return Node.getNumParams() == N;
5449 forEachTemplateArgument,
5451 VarTemplateSpecializationDecl, FunctionDecl,
5452 TemplateSpecializationType),
5453 internal::Matcher<TemplateArgument>, InnerMatcher) {
5454 ArrayRef<TemplateArgument> TemplateArgs =
5455 clang::ast_matchers::internal::getTemplateSpecializationArgs(Node);
5456 clang::ast_matchers::internal::BoundNodesTreeBuilder
Result;
5457 bool Matched =
false;
5458 for (
const auto &Arg : TemplateArgs) {
5459 clang::ast_matchers::internal::BoundNodesTreeBuilder ArgBuilder(*Builder);
5460 if (InnerMatcher.matches(Arg, Finder, &ArgBuilder)) {
5462 Result.addMatch(ArgBuilder);
5465 *Builder = std::move(
Result);
5483AST_MATCHER(FunctionDecl, isNoReturn) {
return Node.isNoReturn(); }
5494 internal::Matcher<QualType>, InnerMatcher) {
5495 return InnerMatcher.matches(Node.getReturnType(), Finder, Builder);
5515 return Node.isExternC();
5535 return Node.getStorageClass() ==
SC_Static;
5548 return Node.isDeleted();
5561 return Node.isDefaulted();
5573AST_MATCHER(FunctionDecl, isWeak) {
return Node.isWeak(); }
5592 FunctionProtoType)) {
5593 if (
const FunctionProtoType *FnTy = internal::getFunctionProtoType(Node))
5594 return FnTy->hasDynamicExceptionSpec();
5612 FunctionProtoType)) {
5613 const FunctionProtoType *FnTy = internal::getFunctionProtoType(Node);
5625 return FnTy->isNothrow();
5644 return Node.isConsteval();
5666 return Node.isConstexpr();
5681 if (
const auto *CIA = Node.getAttr<ConstInitAttr>())
5682 return CIA->isConstinit();
5710 internal::Matcher<Stmt>, InnerMatcher) {
5711 const Stmt *
Init = Node.getInit();
5712 return Init !=
nullptr && InnerMatcher.matches(*
Init, Finder, Builder);
5725 SwitchStmt, AbstractConditionalOperator),
5726 internal::Matcher<Expr>, InnerMatcher) {
5727 const Expr *
const Condition = Node.getCond();
5729 InnerMatcher.matches(*
Condition, Finder, Builder));
5739AST_MATCHER_P(IfStmt, hasThen, internal::Matcher<Stmt>, InnerMatcher) {
5740 const Stmt *
const Then = Node.getThen();
5741 return (Then !=
nullptr && InnerMatcher.matches(*Then, Finder, Builder));
5751AST_MATCHER_P(IfStmt, hasElse, internal::Matcher<Stmt>, InnerMatcher) {
5752 const Stmt *
const Else = Node.getElse();
5753 return (Else !=
nullptr && InnerMatcher.matches(*Else, Finder, Builder));
5787 internal::NotEqualsBoundNodePredicate Predicate;
5790 return Builder->removeBindings(Predicate);
5795AST_MATCHER_P(Decl, declaresSameEntityAsBoundNode, std::string, ID) {
5796 return Builder->removeBindings([&](
const internal::BoundNodesMap &Nodes) {
5815 internal::Matcher<DeclStmt>, InnerMatcher) {
5816 const DeclStmt*
const DeclarationStatement =
5817 Node.getConditionVariableDeclStmt();
5818 return DeclarationStatement !=
nullptr &&
5819 InnerMatcher.matches(*DeclarationStatement, Finder, Builder);
5832 internal::Matcher<Expr>, InnerMatcher) {
5833 if (
const Expr* Expression = Node.getIdx())
5834 return InnerMatcher.matches(*Expression, Finder, Builder);
5849 internal::Matcher<Expr>, InnerMatcher) {
5850 if (
const Expr* Expression = Node.getBase())
5851 return InnerMatcher.matches(*Expression, Finder, Builder);
5882 FunctionDecl, CoroutineBodyStmt),
5883 internal::Matcher<Stmt>, InnerMatcher) {
5884 if (Finder->isTraversalIgnoringImplicitNodes() && isDefaultedHelper(&Node))
5886 const Stmt *
const Statement = internal::GetBodyMatcher<NodeType>::get(Node);
5887 return (Statement !=
nullptr &&
5888 InnerMatcher.matches(*Statement, Finder, Builder));
5908 internal::Matcher<Stmt>, InnerMatcher) {
5909 const Stmt *
const Statement = Node.getBody();
5910 return (Statement !=
nullptr &&
5911 InnerMatcher.matches(*Statement, Finder, Builder));
5929 internal::Matcher<Stmt>, InnerMatcher) {
5930 const CompoundStmt *CS = CompoundStmtMatcher<NodeType>::get(Node);
5931 return CS && matchesFirstInPointerRange(InnerMatcher, CS->body_begin(),
5932 CS->body_end(), Finder,
5933 Builder) != CS->body_end();
5947 return Node.size() == N;
5975template <
typename ValueT>
5976internal::PolymorphicMatcher<internal::ValueEqualsMatcher,
5977 void(internal::AllNodeBaseTypes), ValueT>
5979 return internal::PolymorphicMatcher<internal::ValueEqualsMatcher,
5980 void(internal::AllNodeBaseTypes), ValueT>(
5989 return internal::ValueEqualsMatcher<NodeType, ParamT>(
Value)
5997 unsigned,
Value, 1) {
5998 return internal::ValueEqualsMatcher<NodeType, ParamT>(
Value)
6008 return internal::ValueEqualsMatcher<NodeType, ParamT>(
Value)
6031 CXXRewrittenBinaryOperator, CXXFoldExpr,
6033 std::string, Name) {
6034 if (std::optional<StringRef> OpName = internal::getOpName(Node))
6035 return *OpName == Name;
6045extern const internal::VariadicFunction<
6046 internal::PolymorphicMatcher<internal::HasAnyOperatorNameMatcher,
6048 BinaryOperator, CXXOperatorCallExpr,
6049 CXXRewrittenBinaryOperator, UnaryOperator),
6050 std::vector<std::string>>,
6069 isAssignmentOperator,
6071 CXXRewrittenBinaryOperator)) {
6072 return Node.isAssignmentOp();
6090 isComparisonOperator,
6092 CXXRewrittenBinaryOperator)) {
6093 return Node.isComparisonOp();
6105 CXXRewrittenBinaryOperator,
6106 ArraySubscriptExpr, CXXFoldExpr),
6107 internal::Matcher<Expr>, InnerMatcher) {
6109 return (LeftHandSide !=
nullptr &&
6110 InnerMatcher.matches(*LeftHandSide, Finder, Builder));
6122 CXXRewrittenBinaryOperator,
6123 ArraySubscriptExpr, CXXFoldExpr),
6124 internal::Matcher<Expr>, InnerMatcher) {
6126 return (RightHandSide !=
nullptr &&
6127 InnerMatcher.matches(*RightHandSide, Finder, Builder));
6135 CXXFoldExpr, CXXRewrittenBinaryOperator),
6136 internal::Matcher<Expr>, InnerMatcher) {
6137 return internal::VariadicDynCastAllOfMatcher<Stmt, NodeType>()(
6138 anyOf(hasLHS(InnerMatcher), hasRHS(InnerMatcher)))
6139 .
matches(Node, Finder, Builder);
6156 CXXFoldExpr, CXXRewrittenBinaryOperator),
6157 internal::Matcher<Expr>, Matcher1, internal::Matcher<Expr>, Matcher2) {
6158 return internal::VariadicDynCastAllOfMatcher<Stmt, NodeType>()(
6159 anyOf(
allOf(hasLHS(Matcher1), hasRHS(Matcher2)),
6160 allOf(hasRHS(Matcher1), hasLHS(Matcher2))))
6161 .
matches(Node, Finder, Builder);
6173 CXXOperatorCallExpr),
6174 internal::Matcher<Expr>, InnerMatcher) {
6175 const Expr *
const Operand = internal::getSubExpr(Node);
6176 return (Operand !=
nullptr &&
6177 InnerMatcher.matches(*Operand, Finder, Builder));
6198 internal::Matcher<Expr>, InnerMatcher) {
6200 internal::GetSourceExpressionMatcher<NodeType>::get(Node);
6201 return (SubExpression !=
nullptr &&
6202 InnerMatcher.matches(*SubExpression, Finder, Builder));
6216 return Node.getCastKind() ==
Kind;
6224 internal::Matcher<QualType>, InnerMatcher) {
6225 const QualType NodeType = Node.getTypeAsWritten();
6226 return InnerMatcher.matches(NodeType, Finder, Builder);
6232 internal::Matcher<QualType>, InnerMatcher) {
6233 return InnerMatcher.matches(Node.getType(), Finder, Builder);
6246 return Node.isStruct();
6259 return Node.isUnion();
6272 return Node.isClass();
6285 return Node.isEnum();
6299AST_MATCHER_P(AbstractConditionalOperator, hasTrueExpression,
6300 internal::Matcher<Expr>, InnerMatcher) {
6302 return (Expression !=
nullptr &&
6303 InnerMatcher.matches(*Expression, Finder, Builder));
6314AST_MATCHER_P(AbstractConditionalOperator, hasFalseExpression,
6315 internal::Matcher<Expr>, InnerMatcher) {
6316 const Expr *
Expression = Node.getFalseExpr();
6317 return (Expression !=
nullptr &&
6318 InnerMatcher.matches(*Expression, Finder, Builder));
6345 return Node.isThisDeclarationADefinition();
6359 return Node.isVariadic();
6380 internal::Matcher<CXXRecordDecl>, InnerMatcher) {
6382 ASTChildrenNotSpelledInSourceScope RAII(Finder,
false);
6384 const CXXRecordDecl *Parent = Node.getParent();
6385 return (Parent !=
nullptr &&
6386 InnerMatcher.matches(*Parent, Finder, Builder));
6414 internal::Matcher<CXXMethodDecl>, InnerMatcher) {
6415 BoundNodesTreeBuilder
Result;
6416 bool Matched =
false;
6417 for (
const auto *Overridden : Node.overridden_methods()) {
6418 BoundNodesTreeBuilder OverriddenBuilder(*Builder);
6419 const bool OverriddenMatched =
6420 InnerMatcher.matches(*Overridden, Finder, &OverriddenBuilder);
6421 if (OverriddenMatched) {
6423 Result.addMatch(OverriddenBuilder);
6426 *Builder = std::move(
Result);
6451 CXXBaseSpecifier)) {
6452 return Node.isVirtual();
6470 return Node.isVirtualAsWritten();
6473AST_MATCHER(CXXConstructorDecl, isInheritingConstructor) {
6474 return Node.isInheritingConstructor();
6508AST_MATCHER(CXXMethodDecl, isPure) {
return Node.isPureVirtual(); }
6522 return Node.isConst();
6538AST_MATCHER(CXXMethodDecl, isCopyAssignmentOperator) {
6539 return Node.isCopyAssignmentOperator();
6555AST_MATCHER(CXXMethodDecl, isMoveAssignmentOperator) {
6556 return Node.isMoveAssignmentOperator();
6574 return Node.size_overridden_methods() > 0 || Node.hasAttr<OverrideAttr>();
6589 return Node.isUserProvided();
6618 CXXDependentScopeMemberExpr)) {
6619 return Node.isArrow();
6633 return Node->isIntegerType();
6647 return Node->isUnsignedIntegerType();
6661 return Node->isSignedIntegerType();
6675 return Node->isAnyCharacterType();
6695 return Node->isAnyPointerType();
6714 return Node.isConstQualified();
6733 return Node.isVolatileQualified();
6750 return Node.hasLocalQualifiers();
6766 internal::Matcher<ValueDecl>, InnerMatcher) {
6767 return InnerMatcher.matches(*Node.getMemberDecl(), Finder, Builder);
6787 hasObjectExpression,
6789 CXXDependentScopeMemberExpr),
6790 internal::Matcher<Expr>, InnerMatcher) {
6791 if (
const auto *E = dyn_cast<UnresolvedMemberExpr>(&Node))
6792 if (E->isImplicitAccess())
6794 if (
const auto *E = dyn_cast<CXXDependentScopeMemberExpr>(&Node))
6795 if (E->isImplicitAccess())
6797 return InnerMatcher.matches(*Node.getBase(), Finder, Builder);
6810 internal::Matcher<UsingShadowDecl>, InnerMatcher) {
6811 return matchesFirstInPointerRange(InnerMatcher, Node.shadow_begin(),
6812 Node.shadow_end(), Finder,
6813 Builder) != Node.shadow_end();
6829 internal::Matcher<NamedDecl>, InnerMatcher) {
6830 return InnerMatcher.matches(*Node.getTargetDecl(), Finder, Builder);
6864 Node.getTemplateSpecializationKind() ==
6866 Node.getTemplateSpecializationKind() ==
6929 internal::Matcher<QualType>, InnerMatcher, 0) {
6930 return internal::BindableMatcher<TypeLoc>(
6931 new internal::TypeLocTypeMatcher(InnerMatcher));
6942extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, QualifiedTypeLoc>
6955AST_MATCHER_P(QualifiedTypeLoc, hasUnqualifiedLoc, internal::Matcher<TypeLoc>,
6957 return InnerMatcher.matches(Node.getUnqualifiedLoc(), Finder, Builder);
6969AST_MATCHER_P(FunctionDecl, hasReturnTypeLoc, internal::Matcher<TypeLoc>,
6971 auto Loc = Node.getFunctionTypeLoc();
6972 return Loc && ReturnMatcher.matches(Loc.getReturnLoc(), Finder, Builder);
6983extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, PointerTypeLoc>
6995AST_MATCHER_P(PointerTypeLoc, hasPointeeLoc, internal::Matcher<TypeLoc>,
6997 return PointeeMatcher.matches(Node.getPointeeLoc(), Finder, Builder);
7010extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, ReferenceTypeLoc>
7023AST_MATCHER_P(ReferenceTypeLoc, hasReferentLoc, internal::Matcher<TypeLoc>,
7025 return ReferentMatcher.matches(Node.getPointeeLoc(), Finder, Builder);
7038extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, ArrayTypeLoc>
7051extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, FunctionTypeLoc>
7063extern const internal::VariadicDynCastAllOfMatcher<
7064 TypeLoc, TemplateSpecializationTypeLoc>
7081 hasAnyTemplateArgumentLoc,
7083 VarTemplateSpecializationDecl, FunctionDecl,
7084 DeclRefExpr, TemplateSpecializationTypeLoc,
7086 internal::Matcher<TemplateArgumentLoc>, InnerMatcher) {
7087 auto Args = internal::getTemplateArgsWritten(Node);
7088 return matchesFirstInRange(InnerMatcher, Args.begin(), Args.end(), Finder,
7089 Builder) != Args.end();
7108 hasTemplateArgumentLoc,
7110 VarTemplateSpecializationDecl, FunctionDecl,
7111 DeclRefExpr, TemplateSpecializationTypeLoc,
7113 unsigned, Index, internal::Matcher<TemplateArgumentLoc>, InnerMatcher) {
7114 auto Args = internal::getTemplateArgsWritten(Node);
7115 return Index < Args.size() &&
7116 InnerMatcher.matches(Args[Index], Finder, Builder);
7132 templateArgumentLocCountIs,
7134 VarTemplateSpecializationDecl, FunctionDecl,
7135 DeclRefExpr, TemplateSpecializationTypeLoc,
7137 unsigned, MatchCount) {
7138 unsigned Count = internal::getNumTemplateArgsWritten(Node);
7139 return Count == MatchCount;
7151 return Node.isBooleanType();
7163 return Node.isVoidType();
7166template <
typename NodeType>
7167using AstTypeMatcher = internal::VariadicDynCastAllOfMatcher<Type, NodeType>;
7181extern const AstTypeMatcher<BuiltinType>
builtinType;
7193extern const AstTypeMatcher<ArrayType>
arrayType;
7203extern const AstTypeMatcher<ComplexType>
complexType;
7215 return Node.isRealFloatingType();
7268 return internal::HasSizeMatcher<NodeType>::hasSize(Node, N);
7296extern const AstTypeMatcher<DependentSizedExtVectorType>
7339 internal::Matcher<Expr>, InnerMatcher) {
7340 return InnerMatcher.matches(*Node.getSizeExpr(), Finder, Builder);
7351extern const AstTypeMatcher<AtomicType>
atomicType;
7377extern const AstTypeMatcher<AutoType>
autoType;
7420 QualType QT = Node.getLocallyUnqualifiedSingleStepDesugaredType();
7421 if (QT == QualType(&Node, 0))
7423 return Inner.matches(QT, Finder, Builder);
7459extern const AstTypeMatcher<ParenType>
parenType;
7507extern const AstTypeMatcher<PointerType>
pointerType;
7590 pointee, getPointee,
7592 PointerType, ReferenceType,
7593 ObjCObjectPointerType));
7603extern const AstTypeMatcher<TypedefType>
typedefType;
7630extern const AstTypeMatcher<EnumType>
enumType;
7645extern const AstTypeMatcher<TemplateSpecializationType>
7660extern const AstTypeMatcher<DeducedTemplateSpecializationType>
7686extern const AstTypeMatcher<RecordType>
recordType;
7701extern const AstTypeMatcher<TagType>
tagType;
7720 if (NestedNameSpecifier Qualifier = Node.getPrefix())
7721 return InnerMatcher.matches(Qualifier, Finder, Builder);
7736extern const AstTypeMatcher<UsingType>
usingType;
7750extern const AstTypeMatcher<SubstTemplateTypeParmType>
7766 hasReplacementType, getReplacementType,
7800extern const AstTypeMatcher<DecayedType>
decayedType;
7803AST_MATCHER_P(DecayedType, hasDecayedType, internal::Matcher<QualType>,
7805 return InnerType.matches(Node.getDecayedType(), Finder, Builder);
7832AST_MATCHER_P(Decl, hasDeclContext, internal::Matcher<Decl>, InnerMatcher) {
7833 const DeclContext *DC = Node.getDeclContext();
7834 if (!DC)
return false;
7851extern const internal::VariadicAllOfMatcher<NestedNameSpecifier>
7855extern const internal::VariadicAllOfMatcher<NestedNameSpecifierLoc>
7861 internal::BindableMatcher<NestedNameSpecifierLoc>, loc,
7862 internal::Matcher<NestedNameSpecifier>, InnerMatcher, 1) {
7863 return internal::BindableMatcher<NestedNameSpecifierLoc>(
7864 new internal::LocMatcher<NestedNameSpecifierLoc, NestedNameSpecifier>(
7881 internal::Matcher<QualType>, InnerMatcher) {
7884 return InnerMatcher.matches(QualType(Node.getAsType(), 0), Finder, Builder);
7899 internal::Matcher<TypeLoc>, InnerMatcher) {
7902 TypeLoc TL = Node.getAsTypeLoc();
7905 return InnerMatcher.matches(TL, Finder, Builder);
7918 internal::Matcher<NestedNameSpecifier>, InnerMatcher,
7920 NestedNameSpecifier NextNode = std::nullopt;
7921 switch (Node.getKind()) {
7923 NextNode = Node.getAsNamespaceAndPrefix().Prefix;
7926 NextNode = Node.getAsType()->getPrefix();
7934 return InnerMatcher.matches(NextNode, Finder, Builder);
7947 internal::Matcher<NestedNameSpecifierLoc>, InnerMatcher,
7949 NestedNameSpecifierLoc NextNode;
7950 if (TypeLoc TL = Node.getAsTypeLoc())
7951 NextNode = TL.getPrefix();
7953 NextNode = Node.getAsNamespaceAndPrefix().Prefix;
7957 return InnerMatcher.matches(NextNode, Finder, Builder);
7971 internal::Matcher<NamespaceDecl>, InnerMatcher) {
7975 dyn_cast<NamespaceDecl>(Node.getAsNamespaceAndPrefix().Namespace);
7978 return InnerMatcher.matches(*Namespace, Finder, Builder);
7997extern const internal::VariadicAllOfMatcher<Attr>
attr;
8007 return &Node ==
Other;
8013 return &Node ==
Other;
8019 return &Node ==
Other;
8035AST_MATCHER_P(SwitchStmt, forEachSwitchCase, internal::Matcher<SwitchCase>,
8037 BoundNodesTreeBuilder
Result;
8042 bool Matched =
false;
8043 for (
const SwitchCase *SC = Node.getSwitchCaseList(); SC;
8044 SC = SC->getNextSwitchCase()) {
8045 BoundNodesTreeBuilder CaseBuilder(*Builder);
8046 bool CaseMatched = InnerMatcher.matches(*SC, Finder, &CaseBuilder);
8049 Result.addMatch(CaseBuilder);
8052 *Builder = std::move(
Result);
8066AST_MATCHER_P(CXXConstructorDecl, forEachConstructorInitializer,
8067 internal::Matcher<CXXCtorInitializer>, InnerMatcher) {
8068 BoundNodesTreeBuilder
Result;
8069 bool Matched =
false;
8070 for (
const auto *I : Node.inits()) {
8071 if (Finder->isTraversalIgnoringImplicitNodes() && !I->isWritten())
8073 BoundNodesTreeBuilder InitBuilder(*Builder);
8074 if (InnerMatcher.matches(*I, Finder, &InitBuilder)) {
8076 Result.addMatch(InitBuilder);
8079 *Builder = std::move(
Result);
8094AST_MATCHER(CXXConstructorDecl, isCopyConstructor) {
8095 return Node.isCopyConstructor();
8109AST_MATCHER(CXXConstructorDecl, isMoveConstructor) {
8110 return Node.isMoveConstructor();
8124AST_MATCHER(CXXConstructorDecl, isDefaultConstructor) {
8125 return Node.isDefaultConstructor();
8141AST_MATCHER(CXXConstructorDecl, isDelegatingConstructor) {
8142 return Node.isDelegatingConstructor();
8168 CXXConstructorDecl, CXXConversionDecl,
8169 CXXDeductionGuideDecl)) {
8170 return Node.isExplicit();
8194AST_MATCHER_P(FunctionDecl, hasExplicitSpecifier, internal::Matcher<Expr>,
8200 ASTChildrenNotSpelledInSourceScope RAII(Finder,
false);
8202 return InnerMatcher.matches(*ES.getExpr(), Finder, Builder);
8225 if (
const auto *FD = dyn_cast<FunctionDecl>(&Node))
8226 return FD->isInlineSpecified();
8227 if (
const auto *NSD = dyn_cast<NamespaceDecl>(&Node))
8228 return NSD->isInline();
8229 if (
const auto *VD = dyn_cast<VarDecl>(&Node))
8230 return VD->isInline();
8231 llvm_unreachable(
"Not a valid polymorphic type");
8244 return Node.isAnonymousNamespace();
8268AST_MATCHER(Decl, isInStdNamespace) {
return Node.isInStdNamespace(); }
8291 return Node.isInAnonymousNamespace();
8303AST_MATCHER_P(CaseStmt, hasCaseConstant, internal::Matcher<Expr>,
8308 return InnerMatcher.matches(*Node.getLHS(), Finder, Builder);
8321 for (
const auto *Attr : Node.attrs()) {
8322 if (Attr->getKind() == AttrKind)
8338AST_MATCHER_P(ReturnStmt, hasReturnValue, internal::Matcher<Expr>,
8340 if (
const auto *
RetValue = Node.getRetValue())
8341 return InnerMatcher.matches(*
RetValue, Finder, Builder);
8351extern const internal::VariadicDynCastAllOfMatcher<Stmt, CUDAKernelCallExpr>
8393AST_MATCHER_P(BindingDecl, forDecomposition, internal::Matcher<ValueDecl>,
8395 if (
const ValueDecl *VD = Node.getDecomposedDecl())
8396 return InnerMatcher.matches(*VD, Finder, Builder);
8419 internal::Matcher<BindingDecl>, InnerMatcher) {
8420 if (Node.bindings().size() <= N)
8422 return InnerMatcher.matches(*Node.bindings()[N], Finder, Builder);
8442AST_MATCHER_P(DecompositionDecl, hasAnyBinding, internal::Matcher<BindingDecl>,
8444 return llvm::any_of(Node.bindings(), [&](
const auto *Binding) {
8445 return InnerMatcher.matches(*Binding, Finder, Builder);
8466AST_MATCHER_P(Stmt, forFunction, internal::Matcher<FunctionDecl>,
8468 const auto &Parents = Finder->getASTContext().getParents(Node);
8470 llvm::SmallVector<DynTypedNode, 8> Stack(Parents.begin(), Parents.end());
8471 while (!Stack.empty()) {
8472 const auto &CurNode = Stack.back();
8474 if (
const auto *FuncDeclNode = CurNode.get<FunctionDecl>()) {
8475 if (InnerMatcher.matches(*FuncDeclNode, Finder, Builder)) {
8478 }
else if (
const auto *LambdaExprNode = CurNode.get<
LambdaExpr>()) {
8479 if (InnerMatcher.matches(*LambdaExprNode->getCallOperator(), Finder,
8484 llvm::append_range(Stack, Finder->getASTContext().getParents(CurNode));
8517AST_MATCHER_P(Stmt, forCallable, internal::Matcher<Decl>, InnerMatcher) {
8518 const auto &Parents = Finder->getASTContext().getParents(Node);
8520 llvm::SmallVector<DynTypedNode, 8> Stack(Parents.begin(), Parents.end());
8521 while (!Stack.empty()) {
8522 const auto &CurNode = Stack.back();
8524 if (
const auto *FuncDeclNode = CurNode.get<FunctionDecl>()) {
8525 BoundNodesTreeBuilder B = *Builder;
8526 if (InnerMatcher.matches(*FuncDeclNode, Finder, &B)) {
8527 *Builder = std::move(B);
8530 }
else if (
const auto *LambdaExprNode = CurNode.get<
LambdaExpr>()) {
8531 BoundNodesTreeBuilder B = *Builder;
8532 if (InnerMatcher.matches(*LambdaExprNode->getCallOperator(), Finder,
8534 *Builder = std::move(B);
8537 }
else if (
const auto *ObjCMethodDeclNode = CurNode.get<ObjCMethodDecl>()) {
8538 BoundNodesTreeBuilder B = *Builder;
8539 if (InnerMatcher.matches(*ObjCMethodDeclNode, Finder, &B)) {
8540 *Builder = std::move(B);
8543 }
else if (
const auto *BlockDeclNode = CurNode.get<BlockDecl>()) {
8544 BoundNodesTreeBuilder B = *Builder;
8545 if (InnerMatcher.matches(*BlockDeclNode, Finder, &B)) {
8546 *Builder = std::move(B);
8550 llvm::append_range(Stack, Finder->getASTContext().getParents(CurNode));
8577 return Node.hasExternalFormalLinkage();
8602 return Node.hasDefaultArg();
8614 return Node.isArray();
8626 internal::Matcher<Expr>, InnerMatcher) {
8627 return Node.getNumPlacementArgs() > Index &&
8628 InnerMatcher.matches(*Node.getPlacementArg(Index), Finder, Builder);
8639AST_MATCHER_P(CXXNewExpr, hasAnyPlacementArg, internal::Matcher<Expr>,
8641 return llvm::any_of(Node.placement_arguments(), [&](
const Expr *Arg) {
8642 return InnerMatcher.matches(*Arg, Finder, Builder);
8654AST_MATCHER_P(CXXNewExpr, hasArraySize, internal::Matcher<Expr>, InnerMatcher) {
8655 return Node.isArray() && *Node.getArraySize() &&
8656 InnerMatcher.matches(**Node.getArraySize(), Finder, Builder);
8667 return Node.hasDefinition();
8678 return Node.isScoped();
8689 if (
const auto *F = Node.getType()->getAs<FunctionProtoType>())
8690 return F->hasTrailingReturn();
8717AST_MATCHER_P(Expr, ignoringElidableConstructorCall, internal::Matcher<Expr>,
8720 const Expr *E = &Node;
8726 if (
const auto *CleanupsExpr = dyn_cast<ExprWithCleanups>(&Node))
8727 E = CleanupsExpr->getSubExpr();
8728 if (
const auto *CtorExpr = dyn_cast<CXXConstructExpr>(E)) {
8729 if (CtorExpr->isElidable()) {
8730 if (
const auto *MaterializeTemp =
8731 dyn_cast<MaterializeTemporaryExpr>(CtorExpr->getArg(0))) {
8732 return InnerMatcher.matches(*MaterializeTemp->getSubExpr(), Finder,
8737 return InnerMatcher.matches(Node, Finder, Builder);
8756extern const internal::VariadicDynCastAllOfMatcher<Stmt, OMPExecutableDirective>
8772AST_MATCHER(OMPExecutableDirective, isStandaloneDirective) {
8773 return Node.isStandaloneDirective();
8792 internal::Matcher<Stmt>, InnerMatcher) {
8793 if (Node.isStandaloneDirective())
8795 return InnerMatcher.matches(*Node.getStructuredBlock(), Finder, Builder);
8810 internal::Matcher<OMPClause>, InnerMatcher) {
8811 ArrayRef<OMPClause *> Clauses = Node.clauses();
8812 return matchesFirstInPointerRange(InnerMatcher, Clauses.begin(),
8813 Clauses.end(), Finder,
8814 Builder) != Clauses.end();
8828extern const internal::VariadicDynCastAllOfMatcher<Stmt,
8829 OMPTargetUpdateDirective>
8842extern const internal::VariadicDynCastAllOfMatcher<Stmt, OMPSplitDirective>
8849extern const internal::VariadicDynCastAllOfMatcher<OMPClause, OMPCountsClause>
8866extern const internal::VariadicDynCastAllOfMatcher<OMPClause, OMPDefaultClause>
8883 return Node.getDefaultKind() == llvm::omp::OMP_DEFAULT_none;
8900 return Node.getDefaultKind() == llvm::omp::OMP_DEFAULT_shared;
8919 return Node.getDefaultKind() == llvm::omp::OMP_DEFAULT_private;
8937AST_MATCHER(OMPDefaultClause, isFirstPrivateKind) {
8938 return Node.getDefaultKind() == llvm::omp::OMP_DEFAULT_firstprivate;
8958AST_MATCHER_P(OMPExecutableDirective, isAllowedToContainClauseKind,
8960 return llvm::omp::isAllowedClauseForDirective(
8961 Node.getDirectiveKind(), CKind,
8962 Finder->getASTContext().getLangOpts().OpenMP);
8974extern const internal::VariadicDynCastAllOfMatcher<OMPClause, OMPFromClause>
8986extern const internal::VariadicDynCastAllOfMatcher<OMPClause, OMPToClause>