117 template <
typename T>
119 return MyBoundNodes.getNodeAs<
T>(ID);
129 return MyBoundNodes.getMap();
136 BoundNodes(internal::BoundNodesMap &MyBoundNodes)
137 : MyBoundNodes(MyBoundNodes) {}
139 internal::BoundNodesMap MyBoundNodes;
173inline internal::TrueMatcher
anything() {
return internal::TrueMatcher(); }
186extern const internal::VariadicDynCastAllOfMatcher<Decl, TranslationUnitDecl>
198extern const internal::VariadicDynCastAllOfMatcher<Decl, TypedefDecl>
210extern const internal::VariadicDynCastAllOfMatcher<Decl, TypedefNameDecl>
222extern const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasDecl>
235extern const internal::VariadicDynCastAllOfMatcher<Decl, UsingShadowDecl>
245extern const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasTemplateDecl>
264 auto &
SourceManager = Finder->getASTContext().getSourceManager();
285 auto &
SourceManager = Finder->getASTContext().getSourceManager();
287 if (ExpansionLoc.isInvalid()) {
312 auto &
SourceManager = Finder->getASTContext().getSourceManager();
314 if (ExpansionLoc.isInvalid()) {
324 return RegExp->match(Filename);
333 std::string, MacroName) {
336 auto& Context = Finder->getASTContext();
337 std::optional<SourceLocation> B =
339 if (!B)
return false;
340 std::optional<SourceLocation> E =
342 if (!E)
return false;
355extern const internal::VariadicAllOfMatcher<Decl>
decl;
367extern const internal::VariadicDynCastAllOfMatcher<Decl, DecompositionDecl>
377extern const internal::VariadicDynCastAllOfMatcher<Decl, BindingDecl>
388extern const internal::VariadicDynCastAllOfMatcher<Decl, LinkageSpecDecl>
402extern const internal::VariadicDynCastAllOfMatcher<Decl, NamedDecl>
namedDecl;
413extern const internal::VariadicDynCastAllOfMatcher<Decl, LabelDecl>
labelDecl;
424extern const internal::VariadicDynCastAllOfMatcher<Decl, NamespaceDecl>
436extern const internal::VariadicDynCastAllOfMatcher<Decl, NamespaceAliasDecl>
448extern const internal::VariadicDynCastAllOfMatcher<Decl, RecordDecl>
recordDecl;
457extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXRecordDecl>
466extern const internal::VariadicDynCastAllOfMatcher<Decl, ClassTemplateDecl>
479extern const internal::VariadicDynCastAllOfMatcher<
498extern const internal::VariadicDynCastAllOfMatcher<
511extern const internal::VariadicDynCastAllOfMatcher<Decl, DeclaratorDecl>
522extern const internal::VariadicDynCastAllOfMatcher<Decl, ParmVarDecl>
536extern const internal::VariadicDynCastAllOfMatcher<Decl, AccessSpecDecl>
546extern const internal::VariadicAllOfMatcher<CXXBaseSpecifier>
cxxBaseSpecifier;
557extern const internal::VariadicAllOfMatcher<CXXCtorInitializer>
569extern const internal::VariadicAllOfMatcher<TemplateArgument>
templateArgument;
580extern const internal::VariadicAllOfMatcher<TemplateArgumentLoc>
592extern const internal::VariadicAllOfMatcher<TemplateName>
templateName;
602extern const internal::VariadicDynCastAllOfMatcher<
Decl,
614extern const internal::VariadicDynCastAllOfMatcher<Decl, TemplateTypeParmDecl>
625extern const internal::VariadicDynCastAllOfMatcher<
Decl,
649 return getAccessSpecifier(Node) ==
AS_public;
694 return getAccessSpecifier(Node) ==
AS_private;
709 return Node.isBitField();
726 return Node.isBitField() && Node.hasConstantIntegerBitWidth() &&
727 Node.getBitWidthValue() == Width;
748 InnerMatcher.matches(*
Initializer, Finder, Builder));
754 return Node.isMain();
768 internal::Matcher<ClassTemplateDecl>, InnerMatcher) {
770 return (
Decl !=
nullptr &&
771 InnerMatcher.matches(*
Decl, Finder, Builder));
804 hasAnyTemplateArgument,
807 TemplateSpecializationType),
808 internal::Matcher<TemplateArgument>, InnerMatcher) {
810 internal::getTemplateSpecializationArgs(Node);
811 return matchesFirstInRange(InnerMatcher, List.begin(), List.end(), Finder,
812 Builder) != List.end();
833 const internal::Matcher<T> &InnerMatcher) {
834 return internal::DynTypedMatcher::constructRestrictedWrapper(
835 new internal::TraversalMatcher<T>(TK, InnerMatcher),
836 InnerMatcher.getID().first)
837 .template unconditionalConvertTo<T>();
841internal::BindableMatcher<T>
843 return internal::BindableMatcher<T>(
844 internal::DynTypedMatcher::constructRestrictedWrapper(
845 new internal::TraversalMatcher<T>(TK, InnerMatcher),
846 InnerMatcher.getID().first)
847 .template unconditionalConvertTo<T>());
850template <
typename...
T>
851internal::TraversalWrapper<internal::VariadicOperatorMatcher<
T...>>
853 const internal::VariadicOperatorMatcher<T...> &InnerMatcher) {
854 return internal::TraversalWrapper<internal::VariadicOperatorMatcher<
T...>>(
858template <
template <
typename ToArg,
typename FromArg>
class ArgumentAdapterT,
859 typename T,
typename ToTypes>
860internal::TraversalWrapper<
861 internal::ArgumentAdaptingMatcherFuncAdaptor<ArgumentAdapterT, T, ToTypes>>
863 ArgumentAdapterT,
T, ToTypes> &InnerMatcher) {
864 return internal::TraversalWrapper<
865 internal::ArgumentAdaptingMatcherFuncAdaptor<ArgumentAdapterT,
T,
866 ToTypes>>(TK, InnerMatcher);
869template <
template <
typename T,
typename... P>
class MatcherT, typename... P,
870 typename ReturnTypesF>
872 internal::PolymorphicMatcher<MatcherT, ReturnTypesF, P...>>
874 const internal::PolymorphicMatcher<MatcherT, ReturnTypesF, P...>
876 return internal::TraversalWrapper<
877 internal::PolymorphicMatcher<MatcherT, ReturnTypesF, P...>>(TK,
881template <
typename...
T>
882internal::Matcher<
typename internal::GetClade<
T...>
::Type>
884 return traverse(TK, InnerMatcher.with());
910 return InnerMatcher.matches(*Node.IgnoreImplicit(), Finder, Builder);
939 internal::Matcher<Expr>, InnerMatcher) {
940 return InnerMatcher.matches(*Node.IgnoreImpCasts(), Finder, Builder);
961 return InnerMatcher.matches(*Node.IgnoreParenCasts(), Finder, Builder);
986 internal::Matcher<Expr>, InnerMatcher) {
987 return InnerMatcher.matches(*Node.IgnoreParenImpCasts(), Finder, Builder);
1003 return InnerMatcher.matches(Node.IgnoreParens(), Finder, Builder);
1020 return InnerMatcher.matches(*E, Finder, Builder);
1085 hasTemplateArgument,
1088 TemplateSpecializationType),
1089 unsigned, N, internal::Matcher<TemplateArgument>, InnerMatcher) {
1091 internal::getTemplateSpecializationArgs(Node);
1092 if (List.size() <= N)
1094 return InnerMatcher.matches(List[N], Finder, Builder);
1113 templateArgumentCountIs,
1116 TemplateSpecializationType),
1118 return internal::getTemplateSpecializationArgs(Node).size() == N;
1133 internal::Matcher<QualType>, InnerMatcher) {
1136 return InnerMatcher.matches(Node.getAsType(), Finder, Builder);
1151 internal::Matcher<TemplateName>, InnerMatcher) {
1154 return InnerMatcher.matches(Node.getAsTemplate(), Finder, Builder);
1171 internal::Matcher<Decl>, InnerMatcher) {
1173 return InnerMatcher.matches(*Node.getAsDecl(), Finder, Builder);
1191 return InnerMatcher.matches(*Node.getAsExpr(), Finder, Builder);
1221 internal::Matcher<QualType>, InnerMatcher) {
1224 return InnerMatcher.matches(Node.getIntegralType(), Finder, Builder);
1242 std::string,
Value) {
1258extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1270extern const internal::VariadicDynCastAllOfMatcher<Decl, ExportDecl>
exportDecl;
1279extern const internal::VariadicDynCastAllOfMatcher<Decl, ValueDecl>
valueDecl;
1292extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXConstructorDecl>
1304extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXDestructorDecl>
1315extern const internal::VariadicDynCastAllOfMatcher<Decl, EnumDecl>
enumDecl;
1325extern const internal::VariadicDynCastAllOfMatcher<Decl, EnumConstantDecl>
1340extern const internal::VariadicDynCastAllOfMatcher<Decl, TagDecl>
tagDecl;
1348extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXMethodDecl>
1357extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXConversionDecl>
1368extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXDeductionGuideDecl>
1378extern const internal::VariadicDynCastAllOfMatcher<Decl, ConceptDecl>
1388extern const internal::VariadicDynCastAllOfMatcher<Expr, RequiresExpr>
1398extern const internal::VariadicDynCastAllOfMatcher<Decl, RequiresExprBodyDecl>
1410extern const internal::VariadicDynCastAllOfMatcher<Decl, VarDecl>
varDecl;
1420extern const internal::VariadicDynCastAllOfMatcher<Decl, FieldDecl>
fieldDecl;
1430extern const internal::VariadicDynCastAllOfMatcher<Decl, IndirectFieldDecl>
1439extern const internal::VariadicDynCastAllOfMatcher<Decl, FunctionDecl>
1448extern const internal::VariadicDynCastAllOfMatcher<Decl, FunctionTemplateDecl>
1459extern const internal::VariadicDynCastAllOfMatcher<Decl, FriendDecl>
friendDecl;
1469extern const internal::VariadicAllOfMatcher<Stmt>
stmt;
1479extern const internal::VariadicDynCastAllOfMatcher<Stmt, DeclStmt>
declStmt;
1492extern const internal::VariadicDynCastAllOfMatcher<Stmt, MemberExpr>
memberExpr;
1506extern const internal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedMemberExpr>
1518extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1530extern const internal::VariadicDynCastAllOfMatcher<Stmt, CallExpr>
callExpr;
1560extern const internal::VariadicDynCastAllOfMatcher<Stmt, LambdaExpr>
lambdaExpr;
1569extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXMemberCallExpr>
1581extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCMessageExpr>
1590extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCStringLiteral>
1600extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCInterfaceDecl>
1610extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCImplementationDecl>
1620extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCProtocolDecl>
1630extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryDecl>
1640extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryImplDecl>
1655extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCMethodDecl>
1668extern const internal::VariadicDynCastAllOfMatcher<Decl, BlockDecl>
1680extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCIvarDecl>
1691extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCPropertyDecl>
1700extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtThrowStmt>
1710extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtTryStmt>
1720extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtCatchStmt>
1730extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtFinallyStmt>
1740extern const internal::VariadicDynCastAllOfMatcher<Stmt, ExprWithCleanups>
1753extern const internal::VariadicDynCastAllOfMatcher<Stmt, InitListExpr>
1759 internal::Matcher<Expr>, InnerMatcher) {
1760 const Expr *SyntForm = Node.getSyntacticForm();
1761 return (SyntForm !=
nullptr &&
1762 InnerMatcher.matches(*SyntForm, Finder, Builder));
1776extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1788extern const internal::VariadicDynCastAllOfMatcher<Stmt, ImplicitValueInitExpr>
1806extern const internal::VariadicDynCastAllOfMatcher<Stmt, ParenListExpr>
1819extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1832extern const internal::VariadicDynCastAllOfMatcher<Decl, UsingDecl>
usingDecl;
1843extern const internal::VariadicDynCastAllOfMatcher<Decl, UsingEnumDecl>
1855extern const internal::VariadicDynCastAllOfMatcher<Decl, UsingDirectiveDecl>
1872extern const internal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedLookupExpr>
1886extern const internal::VariadicDynCastAllOfMatcher<
Decl,
1905extern const internal::VariadicDynCastAllOfMatcher<
Decl,
1918extern const internal::VariadicDynCastAllOfMatcher<Stmt, ConstantExpr>
1928extern const internal::VariadicDynCastAllOfMatcher<Stmt, ParenExpr>
parenExpr;
1940extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXConstructExpr>
1951extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1965extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThisExpr>
1976extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBindTemporaryExpr>
1997extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
2009extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNewExpr>
cxxNewExpr;
2019extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDeleteExpr>
2035extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNoexceptExpr>
2055extern const internal::VariadicDynCastAllOfMatcher<Stmt, ArrayInitLoopExpr>
2074extern const internal::VariadicDynCastAllOfMatcher<Stmt, ArrayInitIndexExpr>
2085extern const internal::VariadicDynCastAllOfMatcher<Stmt, ArraySubscriptExpr>
2097extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDefaultArgExpr>
2116extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXOperatorCallExpr>
2128extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXFoldExpr>
2148extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
2158extern const internal::VariadicDynCastAllOfMatcher<Stmt, Expr>
expr;
2167extern const internal::VariadicDynCastAllOfMatcher<Stmt, DeclRefExpr>
2176extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
2191extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCIvarRefExpr>
2200extern const internal::VariadicDynCastAllOfMatcher<Stmt, BlockExpr>
blockExpr;
2208extern const internal::VariadicDynCastAllOfMatcher<Stmt, IfStmt>
ifStmt;
2217extern const internal::VariadicDynCastAllOfMatcher<Stmt, ForStmt>
forStmt;
2229 const Stmt *
const Increment = Node.getInc();
2230 return (Increment !=
nullptr &&
2231 InnerMatcher.matches(*Increment, Finder, Builder));
2244 const Stmt *
const Init = Node.getInit();
2245 return (
Init !=
nullptr && InnerMatcher.matches(*
Init, Finder, Builder));
2255extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXForRangeStmt>
2268 const VarDecl *
const Var = Node.getLoopVariable();
2269 return (Var !=
nullptr && InnerMatcher.matches(*Var, Finder, Builder));
2282 const Expr *
const Init = Node.getRangeInit();
2283 return (
Init !=
nullptr && InnerMatcher.matches(*
Init, Finder, Builder));
2294extern const internal::VariadicDynCastAllOfMatcher<Stmt, WhileStmt>
whileStmt;
2304extern const internal::VariadicDynCastAllOfMatcher<Stmt, DoStmt>
doStmt;
2314extern const internal::VariadicDynCastAllOfMatcher<Stmt, BreakStmt>
breakStmt;
2324extern const internal::VariadicDynCastAllOfMatcher<Stmt, ContinueStmt>
2335extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoreturnStmt>
2346extern const internal::VariadicDynCastAllOfMatcher<Stmt, ReturnStmt>
returnStmt;
2357extern const internal::VariadicDynCastAllOfMatcher<Stmt, GotoStmt>
gotoStmt;
2368extern const internal::VariadicDynCastAllOfMatcher<Stmt, LabelStmt>
labelStmt;
2380extern const internal::VariadicDynCastAllOfMatcher<Stmt, AddrLabelExpr>
2391extern const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchStmt>
switchStmt;
2401extern const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchCase>
switchCase;
2411extern const internal::VariadicDynCastAllOfMatcher<Stmt, CaseStmt>
caseStmt;
2421extern const internal::VariadicDynCastAllOfMatcher<Stmt, DefaultStmt>
2430extern const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundStmt>
2440extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXCatchStmt>
2450extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTryStmt>
cxxTryStmt;
2459extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThrowExpr>
2469extern const internal::VariadicDynCastAllOfMatcher<Stmt, NullStmt>
nullStmt;
2479extern const internal::VariadicDynCastAllOfMatcher<Stmt, AsmStmt>
asmStmt;
2487extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBoolLiteralExpr>
2497extern const internal::VariadicDynCastAllOfMatcher<Stmt, StringLiteral>
2510extern const internal::VariadicDynCastAllOfMatcher<Stmt, CharacterLiteral>
2517extern const internal::VariadicDynCastAllOfMatcher<Stmt, IntegerLiteral>
2527extern const internal::VariadicDynCastAllOfMatcher<Stmt, FloatingLiteral>
2532extern const internal::VariadicDynCastAllOfMatcher<Stmt, ImaginaryLiteral>
2557extern const internal::VariadicDynCastAllOfMatcher<Stmt, FixedPointLiteral>
2563extern const internal::VariadicDynCastAllOfMatcher<Stmt, UserDefinedLiteral>
2573extern const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundLiteralExpr>
2584extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoawaitExpr>
2587extern const internal::VariadicDynCastAllOfMatcher<Stmt, DependentCoawaitExpr>
2597extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoyieldExpr>
2608extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoroutineBodyStmt>
2612extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNullPtrLiteralExpr>
2616extern const internal::VariadicDynCastAllOfMatcher<Stmt, ChooseExpr>
2620extern const internal::VariadicDynCastAllOfMatcher<Stmt, ConvertVectorExpr>
2624extern const internal::VariadicDynCastAllOfMatcher<Stmt, GNUNullExpr>
2628extern const internal::VariadicDynCastAllOfMatcher<Stmt, GenericSelectionExpr>
2636extern const internal::VariadicDynCastAllOfMatcher<Stmt, AtomicExpr>
atomicExpr;
2644extern const internal::VariadicDynCastAllOfMatcher<Stmt, StmtExpr>
stmtExpr;
2653extern const internal::VariadicDynCastAllOfMatcher<Stmt, BinaryOperator>
2662extern const internal::VariadicDynCastAllOfMatcher<Stmt, UnaryOperator>
2671extern const internal::VariadicDynCastAllOfMatcher<Stmt, ConditionalOperator>
2680extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
2692extern const internal::VariadicDynCastAllOfMatcher<Stmt, OpaqueValueExpr>
2708extern const internal::VariadicDynCastAllOfMatcher<Decl, StaticAssertDecl>
2721extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXReinterpretCastExpr>
2737extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXStaticCastExpr>
2752extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDynamicCastExpr>
2763extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXConstCastExpr>
2772extern const internal::VariadicDynCastAllOfMatcher<Stmt, CStyleCastExpr>
2796extern const internal::VariadicDynCastAllOfMatcher<Stmt, ExplicitCastExpr>
2803extern const internal::VariadicDynCastAllOfMatcher<Stmt, ImplicitCastExpr>
2819extern const internal::VariadicDynCastAllOfMatcher<Stmt, CastExpr>
castExpr;
2829extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXFunctionalCastExpr>
2838extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTemporaryObjectExpr>
2847extern const internal::VariadicDynCastAllOfMatcher<Stmt, PredefinedExpr>
2856extern const internal::VariadicDynCastAllOfMatcher<Stmt, DesignatedInitExpr>
2871 return Node.size() == N;
2875extern const internal::VariadicAllOfMatcher<QualType>
qualType;
2878extern const internal::VariadicAllOfMatcher<Type>
type;
2881extern const internal::VariadicAllOfMatcher<TypeLoc>
typeLoc;
2902extern const internal::VariadicOperatorMatcherFunc<
2903 2, std::numeric_limits<unsigned>::max()>
2909extern const internal::VariadicOperatorMatcherFunc<
2910 2, std::numeric_limits<unsigned>::max()>
2916extern const internal::VariadicOperatorMatcherFunc<
2917 2, std::numeric_limits<unsigned>::max()>
2944extern const internal::VariadicOperatorMatcherFunc<1, 1>
optionally;
2955extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
2984template <
typename T,
typename...
U>
2985auto mapAnyOf(internal::VariadicDynCastAllOfMatcher<T, U>
const &...) {
2986 return internal::MapAnyOfHelper<
U...>();
3099extern const internal::MapAnyOfMatcher<CallExpr, CXXConstructExpr>
invocation;
3110 internal::Matcher<QualType>, InnerMatcher) {
3111 const QualType ArgumentType = Node.getTypeOfArgument();
3112 return InnerMatcher.matches(ArgumentType, Finder, Builder);
3128 return Node.getKind() == Kind;
3134 const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
3136 allOf(
anyOf(ofKind(UETT_AlignOf), ofKind(UETT_PreferredAlignOf)),
3143 const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
3145 allOf(ofKind(UETT_SizeOf), InnerMatcher)));
3163inline internal::Matcher<NamedDecl>
hasName(StringRef Name) {
3164 return internal::Matcher<NamedDecl>(
3165 new internal::HasNameMatcher({std::string(Name)}));
3178extern const internal::VariadicFunction<internal::Matcher<NamedDecl>, StringRef,
3199 std::string FullNameString =
"::" + Node.getQualifiedNameAsString();
3200 return RegExp->match(FullNameString);
3222inline internal::PolymorphicMatcher<
3223 internal::HasOverloadedOperatorNameMatcher,
3225 std::vector<std::string>>
3227 return internal::PolymorphicMatcher<
3228 internal::HasOverloadedOperatorNameMatcher,
3230 std::vector<std::string>>({std::string(Name)});
3241extern const internal::VariadicFunction<
3242 internal::PolymorphicMatcher<internal::HasOverloadedOperatorNameMatcher,
3245 std::vector<std::string>>,
3270 return Node.getMember().getAsString() == N;
3308 std::string, BindingID) {
3309 auto MemberName = Node.getMember().getAsString();
3311 return Builder->removeBindings(
3312 [
this, MemberName](
const BoundNodesMap &Nodes) {
3313 const DynTypedNode &BN = Nodes.getNode(this->BindingID);
3317 return ND->getName() != MemberName;
3343 return internal::getDependentName(Node) == N;
3379 internal::Matcher<NamedDecl>,
Base) {
3381 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3382 return Finder->classIsDerivedFrom(RD,
Base, Builder,
false);
3386 return Finder->objcClassIsDerivedFrom(InterfaceDecl,
Base, Builder,
3394 std::string, BaseName, 1) {
3395 if (BaseName.empty())
3398 const auto M = isDerivedFrom(
hasName(BaseName));
3400 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3401 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3404 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3441 return Node.hasDefinition() &&
3443 return BaseSpecMatcher.matches(Base, Finder, Builder);
3450 isSameOrDerivedFrom,
3452 internal::Matcher<NamedDecl>,
Base, 0) {
3455 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3456 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3459 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3465 isSameOrDerivedFrom,
3467 std::string, BaseName, 1) {
3468 if (BaseName.empty())
3471 const auto M = isSameOrDerivedFrom(
hasName(BaseName));
3473 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3474 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3477 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3502 isDirectlyDerivedFrom,
3504 internal::Matcher<NamedDecl>,
Base, 0) {
3506 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3507 return Finder->classIsDerivedFrom(RD,
Base, Builder,
true);
3511 return Finder->objcClassIsDerivedFrom(InterfaceDecl,
Base, Builder,
3517 isDirectlyDerivedFrom,
3519 std::string, BaseName, 1) {
3520 if (BaseName.empty())
3522 const auto M = isDirectlyDerivedFrom(
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);
3543 BoundNodesTreeBuilder
Result(*Builder);
3544 auto MatchIt = matchesFirstInPointerRange(InnerMatcher, Node.method_begin(),
3545 Node.method_end(), Finder, &
Result);
3546 if (MatchIt == Node.method_end())
3549 if (Finder->isTraversalIgnoringImplicitNodes() && (*MatchIt)->isImplicit())
3551 *Builder = std::move(
Result);
3565 return Node.isLambda();
3586extern const internal::ArgumentAdaptingMatcherFunc<internal::HasMatcher>
has;
3602extern const internal::ArgumentAdaptingMatcherFunc<
3603 internal::HasDescendantMatcher>
3624extern const internal::ArgumentAdaptingMatcherFunc<internal::ForEachMatcher>
3654extern const internal::ArgumentAdaptingMatcherFunc<
3655 internal::ForEachDescendantMatcher>
3674template <
typename T>
3675internal::Matcher<T>
findAll(
const internal::Matcher<T> &Matcher) {
3689extern const internal::ArgumentAdaptingMatcherFunc<
3690 internal::HasParentMatcher,
3691 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>,
3692 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>>
3706extern const internal::ArgumentAdaptingMatcherFunc<
3707 internal::HasAncestorMatcher,
3708 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>,
3709 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>>
3721extern const internal::VariadicOperatorMatcherFunc<1, 1>
unless;
3757inline internal::PolymorphicMatcher<
3758 internal::HasDeclarationMatcher,
3759 void(internal::HasDeclarationSupportedTypes), internal::Matcher<Decl>>
3761 return internal::PolymorphicMatcher<
3762 internal::HasDeclarationMatcher,
3763 void(internal::HasDeclarationSupportedTypes), internal::Matcher<Decl>>(
3782 return UnderlyingDecl !=
nullptr &&
3783 InnerMatcher.matches(*UnderlyingDecl, Finder, Builder);
3806 const Expr *ExprNode = Node.getImplicitObjectArgument()
3808 return (ExprNode !=
nullptr &&
3809 InnerMatcher.matches(*ExprNode, Finder, Builder));
3826 return InnerMatcher.matches(
TypeDecl, Finder, Builder);
3842 return Node.isClassMethod();
3858 return Node.isInstanceMethod();
3875 return Node.isClassMessage();
3892 return Node.isInstanceMessage();
3907 const Expr *ReceiverNode = Node.getInstanceReceiver();
3908 return (ReceiverNode !=
nullptr &&
3935extern const internal::VariadicFunction<internal::Matcher<ObjCMessageExpr>,
3949 std::string SelectorString = Node.getSelector().getAsString();
3950 return RegExp->match(SelectorString);
3958 return Node.getSelector().isNull();
3970 return Node.getSelector().isUnarySelector();
3986 return Node.getSelector().isKeywordSelector();
4001 return Node.getSelector().getNumArgs() == N;
4040 internal::Matcher<Stmt>, InnerMatcher, 0) {
4041 const auto *ExprNode = Node.getCallee();
4042 return (ExprNode !=
nullptr &&
4043 InnerMatcher.matches(*ExprNode, Finder, Builder));
4069 internal::Matcher<Decl>, InnerMatcher, 1) {
4072 .matches(Node, Finder, Builder);
4077 const Decl *DeclNode = MsgNode->getMethodDecl();
4078 return (DeclNode !=
nullptr &&
4079 InnerMatcher.matches(*DeclNode, Finder, Builder));
4103 internal::Matcher<QualType>, InnerMatcher, 0) {
4104 QualType QT = internal::getUnderlyingType(Node);
4106 return InnerMatcher.matches(QT, Finder, Builder);
4144 internal::Matcher<Decl>, InnerMatcher, 1) {
4145 QualType QT = internal::getUnderlyingType(Node);
4188 internal::Matcher<TypeLoc>, Inner) {
4190 if (source ==
nullptr) {
4194 return Inner.matches(source->
getTypeLoc(), Finder, Builder);
4207 return Name == Node.getAsString();
4221 QualType, pointsTo, internal::Matcher<QualType>,
4223 return (!Node.isNull() && Node->isAnyPointerType() &&
4224 InnerMatcher.matches(Node->getPointeeType(), Finder, Builder));
4231 .matches(Node, Finder, Builder);
4246 return InnerMatcher.matches(*Node.getUnqualifiedDesugaredType(), Finder,
4265 return (!Node.isNull() && Node->isReferenceType() &&
4266 InnerMatcher.matches(Node->getPointeeType(), Finder, Builder));
4285 return InnerMatcher.matches(Node.getCanonicalType(), Finder, Builder);
4292 .matches(Node, Finder, Builder);
4313 internal::Matcher<Expr>, InnerMatcher) {
4314 const Expr *ExprNode = Node.getImplicitObjectArgument();
4315 return (ExprNode !=
nullptr &&
4316 InnerMatcher.matches(*ExprNode, Finder, Builder));
4336 internal::Matcher<QualType>, InnerMatcher, 0) {
4337 return onImplicitObjectArgument(
4338 anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))))
4339 .matches(Node, Finder, Builder);
4344 internal::Matcher<Decl>, InnerMatcher, 1) {
4345 return onImplicitObjectArgument(
4346 anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))))
4347 .matches(Node, Finder, Builder);
4361 const Decl *DeclNode = Node.getDecl();
4362 return (DeclNode !=
nullptr &&
4363 InnerMatcher.matches(*DeclNode, Finder, Builder));
4390 internal::Matcher<UsingShadowDecl>, Inner) {
4392 if constexpr (std::is_same_v<NodeType, UsingType>) {
4393 FoundDecl = Node.getDecl();
4395 static_assert(std::is_same_v<NodeType, DeclRefExpr>);
4396 FoundDecl = Node.getFoundDecl();
4399 return Inner.matches(*
UsingDecl, Finder, Builder);
4420 return matchesFirstInPointerRange(InnerMatcher, Node.decls_begin(),
4421 Node.decls_end(), Finder,
4422 Builder) != Node.decls_end();
4435 if (Node.isSingleDecl()) {
4436 const Decl *FoundDecl = Node.getSingleDecl();
4437 return InnerMatcher.matches(*FoundDecl, Finder, Builder);
4451 VarDecl, hasInitializer, internal::Matcher<Expr>,
4455 InnerMatcher.matches(*
Initializer, Finder, Builder));
4481 internal::Matcher<LambdaCapture>, InnerMatcher) {
4482 BoundNodesTreeBuilder
Result;
4483 bool Matched =
false;
4484 for (
const auto &
Capture : Node.captures()) {
4485 if (Finder->isTraversalIgnoringImplicitNodes() &&
Capture.isImplicit())
4487 BoundNodesTreeBuilder CaptureBuilder(*Builder);
4488 if (InnerMatcher.matches(
Capture, Finder, &CaptureBuilder)) {
4490 Result.addMatch(CaptureBuilder);
4493 *Builder = std::move(
Result);
4508 return Node.isStaticLocal();
4523 return Node.hasLocalStorage();
4537 return Node.hasGlobalStorage();
4573 return Node.getStorageDuration() ==
SD_Static;
4589 return Node.getStorageDuration() ==
SD_Thread;
4604 return Node.isExceptionVariable();
4620 unsigned NumArgs = Node.getNumArgs();
4621 if (!Finder->isTraversalIgnoringImplicitNodes())
4622 return NumArgs == N;
4628 return NumArgs == N;
4647 unsigned NumArgs = Node.getNumArgs();
4648 if (!Finder->isTraversalIgnoringImplicitNodes())
4649 return NumArgs >= N;
4655 return NumArgs >= N;
4670 unsigned, N, internal::Matcher<Expr>, InnerMatcher) {
4671 if (N >= Node.getNumArgs())
4673 const Expr *Arg = Node.getArg(N);
4697 const auto *
const Init = Node.getInit();
4698 return Init && InnerMacher.matches(*
Init, Finder, Builder);
4719 const Expr *
const Pattern = Node.getPattern();
4720 return Pattern && InnerMacher.matches(*Pattern, Finder, Builder);
4801 return N < Node.getNumInits() &&
4802 InnerMatcher.matches(*Node.getInit(N), Finder, Builder);
4817 return std::distance(Node.decl_begin(), Node.decl_end()) == (
ptrdiff_t)N;
4840 internal::Matcher<Decl>, InnerMatcher) {
4841 const unsigned NumDecls = std::distance(Node.decl_begin(), Node.decl_end());
4845 std::advance(Iterator, N);
4846 return InnerMatcher.matches(**Iterator, Finder, Builder);
4863 return Node.getExceptionDecl() ==
nullptr;
4880 internal::Matcher<CXXCtorInitializer>, InnerMatcher) {
4881 auto MatchIt = matchesFirstInPointerRange(InnerMatcher, Node.init_begin(),
4882 Node.init_end(), Finder, Builder);
4883 if (MatchIt == Node.init_end())
4885 return (*MatchIt)->isWritten() || !Finder->isTraversalIgnoringImplicitNodes();
4902 internal::Matcher<FieldDecl>, InnerMatcher) {
4903 const FieldDecl *NodeAsDecl = Node.getAnyMember();
4904 return (NodeAsDecl !=
nullptr &&
4905 InnerMatcher.matches(*NodeAsDecl, Finder, Builder));
4922 internal::Matcher<Expr>, InnerMatcher) {
4923 const Expr* NodeAsExpr = Node.getInit();
4924 return (NodeAsExpr !=
nullptr &&
4925 InnerMatcher.matches(*NodeAsExpr, Finder, Builder));
4942 return Node.isWritten();
4962 return Node.isBaseInitializer();
4982 return Node.isMemberInitializer();
5008 internal::Matcher<Expr>, InnerMatcher) {
5009 for (
const Expr *Arg : Node.arguments()) {
5010 if (Finder->isTraversalIgnoringImplicitNodes() &&
5013 BoundNodesTreeBuilder
Result(*Builder);
5014 if (InnerMatcher.matches(*Arg, Finder, &
Result)) {
5015 *Builder = std::move(
Result);
5034extern const internal::VariadicAllOfMatcher<LambdaCapture>
lambdaCapture;
5051 clang::ast_matchers::internal::BoundNodesTreeBuilder
Result(*Builder);
5053 *Builder = std::move(
Result);
5077 if (!Node.capturesVariable())
5079 auto *capturedVar = Node.getCapturedVar();
5080 return capturedVar && InnerMatcher.matches(*capturedVar, Finder, Builder);
5101 return Node.isListInitialization();
5117 return Node.requiresZeroInitialization();
5144 unsigned, N, internal::Matcher<ParmVarDecl>,
5146 return (N < Node.parameters().size()
5147 && InnerMatcher.matches(*Node.parameters()[N], Finder, Builder));
5166 return Node.isExplicitObjectMemberFunction();
5190 internal::Matcher<Expr>, ArgMatcher,
5191 internal::Matcher<ParmVarDecl>, ParamMatcher) {
5192 BoundNodesTreeBuilder
Result;
5196 BoundNodesTreeBuilder Matches;
5200 .matches(Node, Finder, &Matches)
5204 bool Matched =
false;
5205 for (; ArgIndex < Node.getNumArgs(); ++ArgIndex) {
5206 BoundNodesTreeBuilder ArgMatches(*Builder);
5207 if (ArgMatcher.matches(*(Node.getArg(ArgIndex)->IgnoreParenCasts()),
5208 Finder, &ArgMatches)) {
5209 BoundNodesTreeBuilder ParamMatches(ArgMatches);
5211 hasParameter(ParamIndex, ParamMatcher)))),
5213 hasParameter(ParamIndex, ParamMatcher))))))
5214 .matches(Node, Finder, &ParamMatches)) {
5215 Result.addMatch(ParamMatches);
5221 *Builder = std::move(
Result);
5253 internal::Matcher<Expr>, ArgMatcher,
5254 internal::Matcher<QualType>, ParamMatcher) {
5255 BoundNodesTreeBuilder
Result;
5256 bool Matched =
false;
5257 auto ProcessParamAndArg = [&](
QualType ParamType,
const Expr *Arg) {
5258 BoundNodesTreeBuilder ArgMatches(*Builder);
5259 if (!ArgMatcher.matches(*Arg, Finder, &ArgMatches))
5261 BoundNodesTreeBuilder ParamMatches(std::move(ArgMatches));
5262 if (!ParamMatcher.matches(ParamType, Finder, &ParamMatches))
5264 Result.addMatch(ParamMatches);
5268 if (
auto *
Call = llvm::dyn_cast<CallExpr>(&Node))
5270 else if (
auto *Construct = llvm::dyn_cast<CXXConstructExpr>(&Node))
5273 llvm_unreachable(
"expected CallExpr or CXXConstructExpr");
5275 *Builder = std::move(
Result);
5297 if (
const auto *
Decl = dyn_cast_or_null<FunctionDecl>(Context))
5298 return N <
Decl->param_size() &&
Decl->getParamDecl(N) == &Node;
5299 if (
const auto *
Decl = dyn_cast_or_null<BlockDecl>(Context))
5300 return N <
Decl->param_size() &&
Decl->getParamDecl(N) == &Node;
5301 if (
const auto *
Decl = dyn_cast_or_null<ObjCMethodDecl>(Context))
5302 return N <
Decl->param_size() &&
Decl->getParamDecl(N) == &Node;
5342 internal::Matcher<ParmVarDecl>,
5344 return matchesFirstInPointerRange(InnerMatcher, Node.param_begin(),
5345 Node.param_end(), Finder,
5346 Builder) != Node.param_end();
5370 return Node.getNumParams() == N;
5398 forEachTemplateArgument,
5400 VarTemplateSpecializationDecl, FunctionDecl,
5401 TemplateSpecializationType),
5402 internal::Matcher<TemplateArgument>, InnerMatcher) {
5403 ArrayRef<TemplateArgument> TemplateArgs =
5404 clang::ast_matchers::internal::getTemplateSpecializationArgs(Node);
5405 clang::ast_matchers::internal::BoundNodesTreeBuilder
Result;
5406 bool Matched =
false;
5407 for (
const auto &Arg : TemplateArgs) {
5408 clang::ast_matchers::internal::BoundNodesTreeBuilder ArgBuilder(*Builder);
5409 if (InnerMatcher.matches(Arg, Finder, &ArgBuilder)) {
5411 Result.addMatch(ArgBuilder);
5414 *Builder = std::move(
Result);
5432AST_MATCHER(FunctionDecl, isNoReturn) {
return Node.isNoReturn(); }
5443 internal::Matcher<QualType>, InnerMatcher) {
5444 return InnerMatcher.matches(Node.getReturnType(), Finder, Builder);
5464 return Node.isExternC();
5484 return Node.getStorageClass() ==
SC_Static;
5497 return Node.isDeleted();
5510 return Node.isDefaulted();
5522AST_MATCHER(FunctionDecl, isWeak) {
return Node.isWeak(); }
5541 FunctionProtoType)) {
5542 if (
const FunctionProtoType *FnTy = internal::getFunctionProtoType(Node))
5543 return FnTy->hasDynamicExceptionSpec();
5561 FunctionProtoType)) {
5562 const FunctionProtoType *FnTy = internal::getFunctionProtoType(Node);
5574 return FnTy->isNothrow();
5593 return Node.isConsteval();
5615 return Node.isConstexpr();
5630 if (
const auto *CIA = Node.getAttr<ConstInitAttr>())
5631 return CIA->isConstinit();
5659 internal::Matcher<Stmt>, InnerMatcher) {
5660 const Stmt *
Init = Node.getInit();
5661 return Init !=
nullptr && InnerMatcher.matches(*
Init, Finder, Builder);
5674 SwitchStmt, AbstractConditionalOperator),
5675 internal::Matcher<Expr>, InnerMatcher) {
5676 const Expr *
const Condition = Node.getCond();
5678 InnerMatcher.matches(*
Condition, Finder, Builder));
5688AST_MATCHER_P(IfStmt, hasThen, internal::Matcher<Stmt>, InnerMatcher) {
5689 const Stmt *
const Then = Node.getThen();
5690 return (Then !=
nullptr && InnerMatcher.matches(*Then, Finder, Builder));
5700AST_MATCHER_P(IfStmt, hasElse, internal::Matcher<Stmt>, InnerMatcher) {
5701 const Stmt *
const Else = Node.getElse();
5702 return (Else !=
nullptr && InnerMatcher.matches(*Else, Finder, Builder));
5736 internal::NotEqualsBoundNodePredicate Predicate;
5739 return Builder->removeBindings(Predicate);
5744AST_MATCHER_P(Decl, declaresSameEntityAsBoundNode, std::string, ID) {
5745 return Builder->removeBindings([&](
const internal::BoundNodesMap &Nodes) {
5764 internal::Matcher<DeclStmt>, InnerMatcher) {
5765 const DeclStmt*
const DeclarationStatement =
5766 Node.getConditionVariableDeclStmt();
5767 return DeclarationStatement !=
nullptr &&
5768 InnerMatcher.matches(*DeclarationStatement, Finder, Builder);
5781 internal::Matcher<Expr>, InnerMatcher) {
5782 if (
const Expr* Expression = Node.getIdx())
5783 return InnerMatcher.matches(*Expression, Finder, Builder);
5798 internal::Matcher<Expr>, InnerMatcher) {
5799 if (
const Expr* Expression = Node.getBase())
5800 return InnerMatcher.matches(*Expression, Finder, Builder);
5831 FunctionDecl, CoroutineBodyStmt),
5832 internal::Matcher<Stmt>, InnerMatcher) {
5833 if (Finder->isTraversalIgnoringImplicitNodes() && isDefaultedHelper(&Node))
5835 const Stmt *
const Statement = internal::GetBodyMatcher<NodeType>::get(Node);
5836 return (Statement !=
nullptr &&
5837 InnerMatcher.matches(*Statement, Finder, Builder));
5857 internal::Matcher<Stmt>, InnerMatcher) {
5858 const Stmt *
const Statement = Node.getBody();
5859 return (Statement !=
nullptr &&
5860 InnerMatcher.matches(*Statement, Finder, Builder));
5878 internal::Matcher<Stmt>, InnerMatcher) {
5879 const CompoundStmt *CS = CompoundStmtMatcher<NodeType>::get(Node);
5880 return CS && matchesFirstInPointerRange(InnerMatcher, CS->body_begin(),
5881 CS->body_end(), Finder,
5882 Builder) != CS->body_end();
5896 return Node.size() == N;
5924template <
typename ValueT>
5925internal::PolymorphicMatcher<internal::ValueEqualsMatcher,
5926 void(internal::AllNodeBaseTypes), ValueT>
5928 return internal::PolymorphicMatcher<internal::ValueEqualsMatcher,
5929 void(internal::AllNodeBaseTypes), ValueT>(
5938 return internal::ValueEqualsMatcher<NodeType, ParamT>(
Value)
5946 unsigned,
Value, 1) {
5947 return internal::ValueEqualsMatcher<NodeType, ParamT>(
Value)
5957 return internal::ValueEqualsMatcher<NodeType, ParamT>(
Value)
5980 CXXRewrittenBinaryOperator, CXXFoldExpr,
5982 std::string, Name) {
5983 if (std::optional<StringRef> OpName = internal::getOpName(Node))
5984 return *OpName == Name;
5994extern const internal::VariadicFunction<
5995 internal::PolymorphicMatcher<internal::HasAnyOperatorNameMatcher,
5997 BinaryOperator, CXXOperatorCallExpr,
5998 CXXRewrittenBinaryOperator, UnaryOperator),
5999 std::vector<std::string>>,
6018 isAssignmentOperator,
6020 CXXRewrittenBinaryOperator)) {
6021 return Node.isAssignmentOp();
6039 isComparisonOperator,
6041 CXXRewrittenBinaryOperator)) {
6042 return Node.isComparisonOp();
6054 CXXRewrittenBinaryOperator,
6055 ArraySubscriptExpr, CXXFoldExpr),
6056 internal::Matcher<Expr>, InnerMatcher) {
6058 return (LeftHandSide !=
nullptr &&
6059 InnerMatcher.matches(*LeftHandSide, Finder, Builder));
6071 CXXRewrittenBinaryOperator,
6072 ArraySubscriptExpr, CXXFoldExpr),
6073 internal::Matcher<Expr>, InnerMatcher) {
6075 return (RightHandSide !=
nullptr &&
6076 InnerMatcher.matches(*RightHandSide, Finder, Builder));
6084 CXXFoldExpr, CXXRewrittenBinaryOperator),
6085 internal::Matcher<Expr>, InnerMatcher) {
6086 return internal::VariadicDynCastAllOfMatcher<Stmt, NodeType>()(
6087 anyOf(hasLHS(InnerMatcher), hasRHS(InnerMatcher)))
6088 .
matches(Node, Finder, Builder);
6105 CXXFoldExpr, CXXRewrittenBinaryOperator),
6106 internal::Matcher<Expr>, Matcher1, internal::Matcher<Expr>, Matcher2) {
6107 return internal::VariadicDynCastAllOfMatcher<Stmt, NodeType>()(
6108 anyOf(
allOf(hasLHS(Matcher1), hasRHS(Matcher2)),
6109 allOf(hasRHS(Matcher1), hasLHS(Matcher2))))
6110 .
matches(Node, Finder, Builder);
6122 CXXOperatorCallExpr),
6123 internal::Matcher<Expr>, InnerMatcher) {
6124 const Expr *
const Operand = internal::getSubExpr(Node);
6125 return (Operand !=
nullptr &&
6126 InnerMatcher.matches(*Operand, Finder, Builder));
6147 internal::Matcher<Expr>, InnerMatcher) {
6149 internal::GetSourceExpressionMatcher<NodeType>::get(Node);
6150 return (SubExpression !=
nullptr &&
6151 InnerMatcher.matches(*SubExpression, Finder, Builder));
6165 return Node.getCastKind() ==
Kind;
6173 internal::Matcher<QualType>, InnerMatcher) {
6174 const QualType NodeType = Node.getTypeAsWritten();
6175 return InnerMatcher.matches(NodeType, Finder, Builder);
6181 internal::Matcher<QualType>, InnerMatcher) {
6182 return InnerMatcher.matches(Node.getType(), Finder, Builder);
6195 return Node.isStruct();
6208 return Node.isUnion();
6221 return Node.isClass();
6234 return Node.isEnum();
6248AST_MATCHER_P(AbstractConditionalOperator, hasTrueExpression,
6249 internal::Matcher<Expr>, InnerMatcher) {
6251 return (Expression !=
nullptr &&
6252 InnerMatcher.matches(*Expression, Finder, Builder));
6263AST_MATCHER_P(AbstractConditionalOperator, hasFalseExpression,
6264 internal::Matcher<Expr>, InnerMatcher) {
6265 const Expr *
Expression = Node.getFalseExpr();
6266 return (Expression !=
nullptr &&
6267 InnerMatcher.matches(*Expression, Finder, Builder));
6294 return Node.isThisDeclarationADefinition();
6308 return Node.isVariadic();
6329 internal::Matcher<CXXRecordDecl>, InnerMatcher) {
6331 ASTChildrenNotSpelledInSourceScope RAII(Finder,
false);
6333 const CXXRecordDecl *Parent = Node.getParent();
6334 return (Parent !=
nullptr &&
6335 InnerMatcher.matches(*Parent, Finder, Builder));
6363 internal::Matcher<CXXMethodDecl>, InnerMatcher) {
6364 BoundNodesTreeBuilder
Result;
6365 bool Matched =
false;
6366 for (
const auto *Overridden : Node.overridden_methods()) {
6367 BoundNodesTreeBuilder OverriddenBuilder(*Builder);
6368 const bool OverriddenMatched =
6369 InnerMatcher.matches(*Overridden, Finder, &OverriddenBuilder);
6370 if (OverriddenMatched) {
6372 Result.addMatch(OverriddenBuilder);
6375 *Builder = std::move(
Result);
6400 CXXBaseSpecifier)) {
6401 return Node.isVirtual();
6419 return Node.isVirtualAsWritten();
6422AST_MATCHER(CXXConstructorDecl, isInheritingConstructor) {
6423 return Node.isInheritingConstructor();
6457AST_MATCHER(CXXMethodDecl, isPure) {
return Node.isPureVirtual(); }
6471 return Node.isConst();
6487AST_MATCHER(CXXMethodDecl, isCopyAssignmentOperator) {
6488 return Node.isCopyAssignmentOperator();
6504AST_MATCHER(CXXMethodDecl, isMoveAssignmentOperator) {
6505 return Node.isMoveAssignmentOperator();
6523 return Node.size_overridden_methods() > 0 || Node.hasAttr<OverrideAttr>();
6538 return Node.isUserProvided();
6567 CXXDependentScopeMemberExpr)) {
6568 return Node.isArrow();
6582 return Node->isIntegerType();
6596 return Node->isUnsignedIntegerType();
6610 return Node->isSignedIntegerType();
6624 return Node->isAnyCharacterType();
6644 return Node->isAnyPointerType();
6663 return Node.isConstQualified();
6682 return Node.isVolatileQualified();
6699 return Node.hasLocalQualifiers();
6715 internal::Matcher<ValueDecl>, InnerMatcher) {
6716 return InnerMatcher.matches(*Node.getMemberDecl(), Finder, Builder);
6736 hasObjectExpression,
6738 CXXDependentScopeMemberExpr),
6739 internal::Matcher<Expr>, InnerMatcher) {
6740 if (
const auto *E = dyn_cast<UnresolvedMemberExpr>(&Node))
6741 if (E->isImplicitAccess())
6743 if (
const auto *E = dyn_cast<CXXDependentScopeMemberExpr>(&Node))
6744 if (E->isImplicitAccess())
6746 return InnerMatcher.matches(*Node.getBase(), Finder, Builder);
6759 internal::Matcher<UsingShadowDecl>, InnerMatcher) {
6760 return matchesFirstInPointerRange(InnerMatcher, Node.shadow_begin(),
6761 Node.shadow_end(), Finder,
6762 Builder) != Node.shadow_end();
6778 internal::Matcher<NamedDecl>, InnerMatcher) {
6779 return InnerMatcher.matches(*Node.getTargetDecl(), Finder, Builder);
6813 Node.getTemplateSpecializationKind() ==
6815 Node.getTemplateSpecializationKind() ==
6878 internal::Matcher<QualType>, InnerMatcher, 0) {
6879 return internal::BindableMatcher<TypeLoc>(
6880 new internal::TypeLocTypeMatcher(InnerMatcher));
6891extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, QualifiedTypeLoc>
6904AST_MATCHER_P(QualifiedTypeLoc, hasUnqualifiedLoc, internal::Matcher<TypeLoc>,
6906 return InnerMatcher.matches(Node.getUnqualifiedLoc(), Finder, Builder);
6918AST_MATCHER_P(FunctionDecl, hasReturnTypeLoc, internal::Matcher<TypeLoc>,
6920 auto Loc = Node.getFunctionTypeLoc();
6921 return Loc && ReturnMatcher.matches(Loc.getReturnLoc(), Finder, Builder);
6932extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, PointerTypeLoc>
6944AST_MATCHER_P(PointerTypeLoc, hasPointeeLoc, internal::Matcher<TypeLoc>,
6946 return PointeeMatcher.matches(Node.getPointeeLoc(), Finder, Builder);
6959extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, ReferenceTypeLoc>
6972AST_MATCHER_P(ReferenceTypeLoc, hasReferentLoc, internal::Matcher<TypeLoc>,
6974 return ReferentMatcher.matches(Node.getPointeeLoc(), Finder, Builder);
6986extern const internal::VariadicDynCastAllOfMatcher<
6987 TypeLoc, TemplateSpecializationTypeLoc>
7004 hasAnyTemplateArgumentLoc,
7006 VarTemplateSpecializationDecl, FunctionDecl,
7007 DeclRefExpr, TemplateSpecializationTypeLoc),
7008 internal::Matcher<TemplateArgumentLoc>, InnerMatcher) {
7009 auto Args = internal::getTemplateArgsWritten(Node);
7010 return matchesFirstInRange(InnerMatcher, Args.begin(), Args.end(), Finder,
7011 Builder) != Args.end();
7029 hasTemplateArgumentLoc,
7031 VarTemplateSpecializationDecl, FunctionDecl,
7032 DeclRefExpr, TemplateSpecializationTypeLoc),
7033 unsigned, Index, internal::Matcher<TemplateArgumentLoc>, InnerMatcher) {
7034 auto Args = internal::getTemplateArgsWritten(Node);
7035 return Index < Args.size() &&
7036 InnerMatcher.matches(Args[Index], Finder, Builder);
7048 return Node.isBooleanType();
7060 return Node.isVoidType();
7063template <
typename NodeType>
7064using AstTypeMatcher = internal::VariadicDynCastAllOfMatcher<Type, NodeType>;
7078extern const AstTypeMatcher<BuiltinType>
builtinType;
7090extern const AstTypeMatcher<ArrayType>
arrayType;
7100extern const AstTypeMatcher<ComplexType>
complexType;
7112 return Node.isRealFloatingType();
7165 return internal::HasSizeMatcher<NodeType>::hasSize(Node, N);
7193extern const AstTypeMatcher<DependentSizedExtVectorType>
7236 internal::Matcher<Expr>, InnerMatcher) {
7237 return InnerMatcher.matches(*Node.getSizeExpr(), Finder, Builder);
7248extern const AstTypeMatcher<AtomicType>
atomicType;
7274extern const AstTypeMatcher<AutoType>
autoType;
7317 QualType QT = Node.getLocallyUnqualifiedSingleStepDesugaredType();
7318 if (QT == QualType(&Node, 0))
7320 return Inner.matches(QT, Finder, Builder);
7356extern const AstTypeMatcher<ParenType>
parenType;
7404extern const AstTypeMatcher<PointerType>
pointerType;
7487 pointee, getPointee,
7489 PointerType, ReferenceType,
7490 ObjCObjectPointerType));
7500extern const AstTypeMatcher<TypedefType>
typedefType;
7527extern const AstTypeMatcher<EnumType>
enumType;
7542extern const AstTypeMatcher<TemplateSpecializationType>
7557extern const AstTypeMatcher<DeducedTemplateSpecializationType>
7583extern const AstTypeMatcher<RecordType>
recordType;
7598extern const AstTypeMatcher<TagType>
tagType;
7617 if (NestedNameSpecifier Qualifier = Node.getPrefix())
7618 return InnerMatcher.matches(Qualifier, Finder, Builder);
7633extern const AstTypeMatcher<UsingType>
usingType;
7647extern const AstTypeMatcher<SubstTemplateTypeParmType>
7663 hasReplacementType, getReplacementType,
7697extern const AstTypeMatcher<DecayedType>
decayedType;
7700AST_MATCHER_P(DecayedType, hasDecayedType, internal::Matcher<QualType>,
7702 return InnerType.matches(Node.getDecayedType(), Finder, Builder);
7724extern const AstTypeMatcher<DependentTemplateSpecializationType>
7741AST_MATCHER_P(Decl, hasDeclContext, internal::Matcher<Decl>, InnerMatcher) {
7742 const DeclContext *DC = Node.getDeclContext();
7743 if (!DC)
return false;
7760extern const internal::VariadicAllOfMatcher<NestedNameSpecifier>
7764extern const internal::VariadicAllOfMatcher<NestedNameSpecifierLoc>
7770 internal::BindableMatcher<NestedNameSpecifierLoc>, loc,
7771 internal::Matcher<NestedNameSpecifier>, InnerMatcher, 1) {
7772 return internal::BindableMatcher<NestedNameSpecifierLoc>(
7773 new internal::LocMatcher<NestedNameSpecifierLoc, NestedNameSpecifier>(
7790 internal::Matcher<QualType>, InnerMatcher) {
7793 return InnerMatcher.matches(QualType(Node.getAsType(), 0), Finder, Builder);
7808 internal::Matcher<TypeLoc>, InnerMatcher) {
7811 TypeLoc TL = Node.getAsTypeLoc();
7814 return InnerMatcher.matches(TL, Finder, Builder);
7827 internal::Matcher<NestedNameSpecifier>, InnerMatcher,
7829 NestedNameSpecifier NextNode = std::nullopt;
7830 switch (Node.getKind()) {
7832 NextNode = Node.getAsNamespaceAndPrefix().Prefix;
7835 NextNode = Node.getAsType()->getPrefix();
7843 return InnerMatcher.matches(NextNode, Finder, Builder);
7856 internal::Matcher<NestedNameSpecifierLoc>, InnerMatcher,
7858 NestedNameSpecifierLoc NextNode;
7859 if (TypeLoc TL = Node.getAsTypeLoc())
7860 NextNode = TL.getPrefix();
7862 NextNode = Node.getAsNamespaceAndPrefix().Prefix;
7866 return InnerMatcher.matches(NextNode, Finder, Builder);
7880 internal::Matcher<NamespaceDecl>, InnerMatcher) {
7884 dyn_cast<NamespaceDecl>(Node.getAsNamespaceAndPrefix().Namespace);
7887 return InnerMatcher.matches(*Namespace, Finder, Builder);
7906extern const internal::VariadicAllOfMatcher<Attr>
attr;
7916 return &Node ==
Other;
7922 return &Node ==
Other;
7928 return &Node ==
Other;
7944AST_MATCHER_P(SwitchStmt, forEachSwitchCase, internal::Matcher<SwitchCase>,
7946 BoundNodesTreeBuilder
Result;
7951 bool Matched =
false;
7952 for (
const SwitchCase *SC = Node.getSwitchCaseList(); SC;
7953 SC = SC->getNextSwitchCase()) {
7954 BoundNodesTreeBuilder CaseBuilder(*Builder);
7955 bool CaseMatched = InnerMatcher.matches(*SC, Finder, &CaseBuilder);
7958 Result.addMatch(CaseBuilder);
7961 *Builder = std::move(
Result);
7975AST_MATCHER_P(CXXConstructorDecl, forEachConstructorInitializer,
7976 internal::Matcher<CXXCtorInitializer>, InnerMatcher) {
7977 BoundNodesTreeBuilder
Result;
7978 bool Matched =
false;
7979 for (
const auto *I : Node.inits()) {
7980 if (Finder->isTraversalIgnoringImplicitNodes() && !I->isWritten())
7982 BoundNodesTreeBuilder InitBuilder(*Builder);
7983 if (InnerMatcher.matches(*I, Finder, &InitBuilder)) {
7985 Result.addMatch(InitBuilder);
7988 *Builder = std::move(
Result);
8003AST_MATCHER(CXXConstructorDecl, isCopyConstructor) {
8004 return Node.isCopyConstructor();
8018AST_MATCHER(CXXConstructorDecl, isMoveConstructor) {
8019 return Node.isMoveConstructor();
8033AST_MATCHER(CXXConstructorDecl, isDefaultConstructor) {
8034 return Node.isDefaultConstructor();
8050AST_MATCHER(CXXConstructorDecl, isDelegatingConstructor) {
8051 return Node.isDelegatingConstructor();
8077 CXXConstructorDecl, CXXConversionDecl,
8078 CXXDeductionGuideDecl)) {
8079 return Node.isExplicit();
8103AST_MATCHER_P(FunctionDecl, hasExplicitSpecifier, internal::Matcher<Expr>,
8109 ASTChildrenNotSpelledInSourceScope RAII(Finder,
false);
8111 return InnerMatcher.matches(*ES.getExpr(), Finder, Builder);
8134 if (
const auto *FD = dyn_cast<FunctionDecl>(&Node))
8135 return FD->isInlineSpecified();
8136 if (
const auto *NSD = dyn_cast<NamespaceDecl>(&Node))
8137 return NSD->isInline();
8138 if (
const auto *VD = dyn_cast<VarDecl>(&Node))
8139 return VD->isInline();
8140 llvm_unreachable(
"Not a valid polymorphic type");
8153 return Node.isAnonymousNamespace();
8177AST_MATCHER(Decl, isInStdNamespace) {
return Node.isInStdNamespace(); }
8200 return Node.isInAnonymousNamespace();
8212AST_MATCHER_P(CaseStmt, hasCaseConstant, internal::Matcher<Expr>,
8217 return InnerMatcher.matches(*Node.getLHS(), Finder, Builder);
8230 for (
const auto *Attr : Node.attrs()) {
8231 if (Attr->getKind() == AttrKind)
8247AST_MATCHER_P(ReturnStmt, hasReturnValue, internal::Matcher<Expr>,
8249 if (
const auto *
RetValue = Node.getRetValue())
8250 return InnerMatcher.matches(*
RetValue, Finder, Builder);
8260extern const internal::VariadicDynCastAllOfMatcher<Stmt, CUDAKernelCallExpr>
8302AST_MATCHER_P(BindingDecl, forDecomposition, internal::Matcher<ValueDecl>,
8304 if (
const ValueDecl *VD = Node.getDecomposedDecl())
8305 return InnerMatcher.matches(*VD, Finder, Builder);
8328 internal::Matcher<BindingDecl>, InnerMatcher) {
8329 if (Node.bindings().size() <= N)
8331 return InnerMatcher.matches(*Node.bindings()[N], Finder, Builder);
8351AST_MATCHER_P(DecompositionDecl, hasAnyBinding, internal::Matcher<BindingDecl>,
8353 return llvm::any_of(Node.bindings(), [&](
const auto *Binding) {
8354 return InnerMatcher.matches(*Binding, Finder, Builder);
8375AST_MATCHER_P(Stmt, forFunction, internal::Matcher<FunctionDecl>,
8377 const auto &Parents = Finder->getASTContext().getParents(Node);
8379 llvm::SmallVector<DynTypedNode, 8> Stack(Parents.begin(), Parents.end());
8380 while (!Stack.empty()) {
8381 const auto &CurNode = Stack.back();
8383 if (
const auto *FuncDeclNode = CurNode.get<FunctionDecl>()) {
8384 if (InnerMatcher.matches(*FuncDeclNode, Finder, Builder)) {
8387 }
else if (
const auto *LambdaExprNode = CurNode.get<
LambdaExpr>()) {
8388 if (InnerMatcher.matches(*LambdaExprNode->getCallOperator(), Finder,
8393 llvm::append_range(Stack, Finder->getASTContext().getParents(CurNode));
8426AST_MATCHER_P(Stmt, forCallable, internal::Matcher<Decl>, InnerMatcher) {
8427 const auto &Parents = Finder->getASTContext().getParents(Node);
8429 llvm::SmallVector<DynTypedNode, 8> Stack(Parents.begin(), Parents.end());
8430 while (!Stack.empty()) {
8431 const auto &CurNode = Stack.back();
8433 if (
const auto *FuncDeclNode = CurNode.get<FunctionDecl>()) {
8434 BoundNodesTreeBuilder B = *Builder;
8435 if (InnerMatcher.matches(*FuncDeclNode, Finder, &B)) {
8436 *Builder = std::move(B);
8439 }
else if (
const auto *LambdaExprNode = CurNode.get<
LambdaExpr>()) {
8440 BoundNodesTreeBuilder B = *Builder;
8441 if (InnerMatcher.matches(*LambdaExprNode->getCallOperator(), Finder,
8443 *Builder = std::move(B);
8446 }
else if (
const auto *ObjCMethodDeclNode = CurNode.get<ObjCMethodDecl>()) {
8447 BoundNodesTreeBuilder B = *Builder;
8448 if (InnerMatcher.matches(*ObjCMethodDeclNode, Finder, &B)) {
8449 *Builder = std::move(B);
8452 }
else if (
const auto *BlockDeclNode = CurNode.get<BlockDecl>()) {
8453 BoundNodesTreeBuilder B = *Builder;
8454 if (InnerMatcher.matches(*BlockDeclNode, Finder, &B)) {
8455 *Builder = std::move(B);
8459 llvm::append_range(Stack, Finder->getASTContext().getParents(CurNode));
8486 return Node.hasExternalFormalLinkage();
8511 return Node.hasDefaultArg();
8523 return Node.isArray();
8535 internal::Matcher<Expr>, InnerMatcher) {
8536 return Node.getNumPlacementArgs() > Index &&
8537 InnerMatcher.matches(*Node.getPlacementArg(Index), Finder, Builder);
8548AST_MATCHER_P(CXXNewExpr, hasAnyPlacementArg, internal::Matcher<Expr>,
8550 return llvm::any_of(Node.placement_arguments(), [&](
const Expr *Arg) {
8551 return InnerMatcher.matches(*Arg, Finder, Builder);
8563AST_MATCHER_P(CXXNewExpr, hasArraySize, internal::Matcher<Expr>, InnerMatcher) {
8564 return Node.isArray() && *Node.getArraySize() &&
8565 InnerMatcher.matches(**Node.getArraySize(), Finder, Builder);
8576 return Node.hasDefinition();
8587 return Node.isScoped();
8598 if (
const auto *F = Node.getType()->getAs<FunctionProtoType>())
8599 return F->hasTrailingReturn();
8626AST_MATCHER_P(Expr, ignoringElidableConstructorCall, internal::Matcher<Expr>,
8629 const Expr *E = &Node;
8635 if (
const auto *CleanupsExpr = dyn_cast<ExprWithCleanups>(&Node))
8636 E = CleanupsExpr->getSubExpr();
8637 if (
const auto *CtorExpr = dyn_cast<CXXConstructExpr>(E)) {
8638 if (CtorExpr->isElidable()) {
8639 if (
const auto *MaterializeTemp =
8640 dyn_cast<MaterializeTemporaryExpr>(CtorExpr->getArg(0))) {
8641 return InnerMatcher.matches(*MaterializeTemp->getSubExpr(), Finder,
8646 return InnerMatcher.matches(Node, Finder, Builder);
8665extern const internal::VariadicDynCastAllOfMatcher<Stmt, OMPExecutableDirective>
8681AST_MATCHER(OMPExecutableDirective, isStandaloneDirective) {
8682 return Node.isStandaloneDirective();
8701 internal::Matcher<Stmt>, InnerMatcher) {
8702 if (Node.isStandaloneDirective())
8704 return InnerMatcher.matches(*Node.getStructuredBlock(), Finder, Builder);
8719 internal::Matcher<OMPClause>, InnerMatcher) {
8720 ArrayRef<OMPClause *> Clauses = Node.clauses();
8721 return matchesFirstInPointerRange(InnerMatcher, Clauses.begin(),
8722 Clauses.end(), Finder,
8723 Builder) != Clauses.end();
8740extern const internal::VariadicDynCastAllOfMatcher<OMPClause, OMPDefaultClause>
8757 return Node.getDefaultKind() == llvm::omp::OMP_DEFAULT_none;
8774 return Node.getDefaultKind() == llvm::omp::OMP_DEFAULT_shared;
8793 return Node.getDefaultKind() == llvm::omp::OMP_DEFAULT_private;
8811AST_MATCHER(OMPDefaultClause, isFirstPrivateKind) {
8812 return Node.getDefaultKind() == llvm::omp::OMP_DEFAULT_firstprivate;
8834 return llvm::omp::isAllowedClauseForDirective(
8835 Node.getDirectiveKind(), CKind,
8836 Finder->getASTContext().getLangOpts().OpenMP);