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;
2493extern const internal::VariadicDynCastAllOfMatcher<Decl, FileScopeAsmDecl>
2502extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBoolLiteralExpr>
2512extern const internal::VariadicDynCastAllOfMatcher<Stmt, StringLiteral>
2525extern const internal::VariadicDynCastAllOfMatcher<Stmt, CharacterLiteral>
2532extern const internal::VariadicDynCastAllOfMatcher<Stmt, IntegerLiteral>
2542extern const internal::VariadicDynCastAllOfMatcher<Stmt, FloatingLiteral>
2547extern const internal::VariadicDynCastAllOfMatcher<Stmt, ImaginaryLiteral>
2572extern const internal::VariadicDynCastAllOfMatcher<Stmt, FixedPointLiteral>
2578extern const internal::VariadicDynCastAllOfMatcher<Stmt, UserDefinedLiteral>
2588extern const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundLiteralExpr>
2599extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoawaitExpr>
2602extern const internal::VariadicDynCastAllOfMatcher<Stmt, DependentCoawaitExpr>
2612extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoyieldExpr>
2623extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoroutineBodyStmt>
2627extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNullPtrLiteralExpr>
2631extern const internal::VariadicDynCastAllOfMatcher<Stmt, ChooseExpr>
2635extern const internal::VariadicDynCastAllOfMatcher<Stmt, ConvertVectorExpr>
2639extern const internal::VariadicDynCastAllOfMatcher<Stmt, GNUNullExpr>
2643extern const internal::VariadicDynCastAllOfMatcher<Stmt, GenericSelectionExpr>
2651extern const internal::VariadicDynCastAllOfMatcher<Stmt, AtomicExpr>
atomicExpr;
2659extern const internal::VariadicDynCastAllOfMatcher<Stmt, StmtExpr>
stmtExpr;
2668extern const internal::VariadicDynCastAllOfMatcher<Stmt, BinaryOperator>
2677extern const internal::VariadicDynCastAllOfMatcher<Stmt, UnaryOperator>
2686extern const internal::VariadicDynCastAllOfMatcher<Stmt, ConditionalOperator>
2695extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
2707extern const internal::VariadicDynCastAllOfMatcher<Stmt, OpaqueValueExpr>
2723extern const internal::VariadicDynCastAllOfMatcher<Decl, StaticAssertDecl>
2736extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXReinterpretCastExpr>
2752extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXStaticCastExpr>
2767extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDynamicCastExpr>
2778extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXConstCastExpr>
2792extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNamedCastExpr>
2801extern const internal::VariadicDynCastAllOfMatcher<Stmt, CStyleCastExpr>
2825extern const internal::VariadicDynCastAllOfMatcher<Stmt, ExplicitCastExpr>
2832extern const internal::VariadicDynCastAllOfMatcher<Stmt, ImplicitCastExpr>
2848extern const internal::VariadicDynCastAllOfMatcher<Stmt, CastExpr>
castExpr;
2858extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXFunctionalCastExpr>
2867extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTemporaryObjectExpr>
2876extern const internal::VariadicDynCastAllOfMatcher<Stmt, PredefinedExpr>
2885extern const internal::VariadicDynCastAllOfMatcher<Stmt, DesignatedInitExpr>
2900 return Node.size() == N;
2904extern const internal::VariadicAllOfMatcher<QualType>
qualType;
2907extern const internal::VariadicAllOfMatcher<Type>
type;
2910extern const internal::VariadicAllOfMatcher<TypeLoc>
typeLoc;
2931extern const internal::VariadicOperatorMatcherFunc<
2932 2, std::numeric_limits<unsigned>::max()>
2938extern const internal::VariadicOperatorMatcherFunc<
2939 2, std::numeric_limits<unsigned>::max()>
2945extern const internal::VariadicOperatorMatcherFunc<
2946 2, std::numeric_limits<unsigned>::max()>
2973extern const internal::VariadicOperatorMatcherFunc<1, 1>
optionally;
2984extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
3013template <
typename T,
typename...
U>
3014auto mapAnyOf(internal::VariadicDynCastAllOfMatcher<T, U>
const &...) {
3015 return internal::MapAnyOfHelper<
U...>();
3128extern const internal::MapAnyOfMatcher<CallExpr, CXXConstructExpr>
invocation;
3139 internal::Matcher<QualType>, InnerMatcher) {
3140 const QualType ArgumentType = Node.getTypeOfArgument();
3141 return InnerMatcher.matches(ArgumentType, Finder, Builder);
3157 return Node.getKind() == Kind;
3163 const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
3165 allOf(
anyOf(ofKind(UETT_AlignOf), ofKind(UETT_PreferredAlignOf)),
3172 const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
3174 allOf(ofKind(UETT_SizeOf), InnerMatcher)));
3192inline internal::Matcher<NamedDecl>
hasName(StringRef Name) {
3193 return internal::Matcher<NamedDecl>(
3194 new internal::HasNameMatcher({std::string(Name)}));
3207extern const internal::VariadicFunction<internal::Matcher<NamedDecl>, StringRef,
3228 std::string FullNameString =
"::" + Node.getQualifiedNameAsString();
3229 return RegExp->match(FullNameString);
3251inline internal::PolymorphicMatcher<
3252 internal::HasOverloadedOperatorNameMatcher,
3254 std::vector<std::string>>
3256 return internal::PolymorphicMatcher<
3257 internal::HasOverloadedOperatorNameMatcher,
3259 std::vector<std::string>>({std::string(Name)});
3270extern const internal::VariadicFunction<
3271 internal::PolymorphicMatcher<internal::HasOverloadedOperatorNameMatcher,
3274 std::vector<std::string>>,
3299 return Node.getMember().getAsString() == N;
3337 std::string, BindingID) {
3338 auto MemberName = Node.getMember().getAsString();
3340 return Builder->removeBindings(
3341 [
this, MemberName](
const BoundNodesMap &Nodes) {
3342 const DynTypedNode &BN = Nodes.getNode(this->BindingID);
3346 return ND->getName() != MemberName;
3372 return internal::getDependentName(Node) == N;
3408 internal::Matcher<NamedDecl>,
Base) {
3410 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3411 return Finder->classIsDerivedFrom(RD,
Base, Builder,
false);
3415 return Finder->objcClassIsDerivedFrom(InterfaceDecl,
Base, Builder,
3423 std::string, BaseName, 1) {
3424 if (BaseName.empty())
3427 const auto M = isDerivedFrom(
hasName(BaseName));
3429 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3430 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3433 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3470 return Node.hasDefinition() &&
3472 return BaseSpecMatcher.matches(Base, Finder, Builder);
3479 isSameOrDerivedFrom,
3481 internal::Matcher<NamedDecl>,
Base, 0) {
3484 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3485 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3488 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3494 isSameOrDerivedFrom,
3496 std::string, BaseName, 1) {
3497 if (BaseName.empty())
3500 const auto M = isSameOrDerivedFrom(
hasName(BaseName));
3502 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3503 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3506 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3531 isDirectlyDerivedFrom,
3533 internal::Matcher<NamedDecl>,
Base, 0) {
3535 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3536 return Finder->classIsDerivedFrom(RD,
Base, Builder,
true);
3540 return Finder->objcClassIsDerivedFrom(InterfaceDecl,
Base, Builder,
3546 isDirectlyDerivedFrom,
3548 std::string, BaseName, 1) {
3549 if (BaseName.empty())
3551 const auto M = isDirectlyDerivedFrom(
hasName(BaseName));
3553 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3554 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3557 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3572 BoundNodesTreeBuilder
Result(*Builder);
3573 auto MatchIt = matchesFirstInPointerRange(InnerMatcher, Node.method_begin(),
3574 Node.method_end(), Finder, &
Result);
3575 if (MatchIt == Node.method_end())
3578 if (Finder->isTraversalIgnoringImplicitNodes() && (*MatchIt)->isImplicit())
3580 *Builder = std::move(
Result);
3594 return Node.isLambda();
3615extern const internal::ArgumentAdaptingMatcherFunc<internal::HasMatcher>
has;
3631extern const internal::ArgumentAdaptingMatcherFunc<
3632 internal::HasDescendantMatcher>
3653extern const internal::ArgumentAdaptingMatcherFunc<internal::ForEachMatcher>
3683extern const internal::ArgumentAdaptingMatcherFunc<
3684 internal::ForEachDescendantMatcher>
3703template <
typename T>
3704internal::Matcher<T>
findAll(
const internal::Matcher<T> &Matcher) {
3718extern const internal::ArgumentAdaptingMatcherFunc<
3719 internal::HasParentMatcher,
3720 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>,
3721 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>>
3735extern const internal::ArgumentAdaptingMatcherFunc<
3736 internal::HasAncestorMatcher,
3737 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>,
3738 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>>
3750extern const internal::VariadicOperatorMatcherFunc<1, 1>
unless;
3786inline internal::PolymorphicMatcher<
3787 internal::HasDeclarationMatcher,
3788 void(internal::HasDeclarationSupportedTypes), internal::Matcher<Decl>>
3790 return internal::PolymorphicMatcher<
3791 internal::HasDeclarationMatcher,
3792 void(internal::HasDeclarationSupportedTypes), internal::Matcher<Decl>>(
3811 return UnderlyingDecl !=
nullptr &&
3812 InnerMatcher.matches(*UnderlyingDecl, Finder, Builder);
3835 const Expr *ExprNode = Node.getImplicitObjectArgument()
3837 return (ExprNode !=
nullptr &&
3838 InnerMatcher.matches(*ExprNode, Finder, Builder));
3855 return InnerMatcher.matches(
TypeDecl, Finder, Builder);
3871 return Node.isClassMethod();
3887 return Node.isInstanceMethod();
3904 return Node.isClassMessage();
3921 return Node.isInstanceMessage();
3936 const Expr *ReceiverNode = Node.getInstanceReceiver();
3937 return (ReceiverNode !=
nullptr &&
3964extern const internal::VariadicFunction<internal::Matcher<ObjCMessageExpr>,
3978 std::string SelectorString = Node.getSelector().getAsString();
3979 return RegExp->match(SelectorString);
3987 return Node.getSelector().isNull();
3999 return Node.getSelector().isUnarySelector();
4015 return Node.getSelector().isKeywordSelector();
4030 return Node.getSelector().getNumArgs() == N;
4069 internal::Matcher<Stmt>, InnerMatcher, 0) {
4070 const auto *ExprNode = Node.getCallee();
4071 return (ExprNode !=
nullptr &&
4072 InnerMatcher.matches(*ExprNode, Finder, Builder));
4098 internal::Matcher<Decl>, InnerMatcher, 1) {
4101 .matches(Node, Finder, Builder);
4106 const Decl *DeclNode = MsgNode->getMethodDecl();
4107 return (DeclNode !=
nullptr &&
4108 InnerMatcher.matches(*DeclNode, Finder, Builder));
4132 internal::Matcher<QualType>, InnerMatcher, 0) {
4133 QualType QT = internal::getUnderlyingType(Node);
4135 return InnerMatcher.matches(QT, Finder, Builder);
4173 internal::Matcher<Decl>, InnerMatcher, 1) {
4174 QualType QT = internal::getUnderlyingType(Node);
4217 internal::Matcher<TypeLoc>, Inner) {
4219 if (source ==
nullptr) {
4223 return Inner.matches(source->
getTypeLoc(), Finder, Builder);
4236 return Name == Node.getAsString();
4250 QualType, pointsTo, internal::Matcher<QualType>,
4252 return (!Node.isNull() && Node->isAnyPointerType() &&
4253 InnerMatcher.matches(Node->getPointeeType(), Finder, Builder));
4260 .matches(Node, Finder, Builder);
4275 return InnerMatcher.matches(*Node.getUnqualifiedDesugaredType(), Finder,
4294 return (!Node.isNull() && Node->isReferenceType() &&
4295 InnerMatcher.matches(Node->getPointeeType(), Finder, Builder));
4314 return InnerMatcher.matches(Node.getCanonicalType(), Finder, Builder);
4321 .matches(Node, Finder, Builder);
4342 internal::Matcher<Expr>, InnerMatcher) {
4343 const Expr *ExprNode = Node.getImplicitObjectArgument();
4344 return (ExprNode !=
nullptr &&
4345 InnerMatcher.matches(*ExprNode, Finder, Builder));
4365 internal::Matcher<QualType>, InnerMatcher, 0) {
4366 return onImplicitObjectArgument(
4367 anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))))
4368 .matches(Node, Finder, Builder);
4373 internal::Matcher<Decl>, InnerMatcher, 1) {
4374 return onImplicitObjectArgument(
4375 anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))))
4376 .matches(Node, Finder, Builder);
4390 const Decl *DeclNode = Node.getDecl();
4391 return (DeclNode !=
nullptr &&
4392 InnerMatcher.matches(*DeclNode, Finder, Builder));
4419 internal::Matcher<UsingShadowDecl>, Inner) {
4421 if constexpr (std::is_same_v<NodeType, UsingType>) {
4422 FoundDecl = Node.getDecl();
4424 static_assert(std::is_same_v<NodeType, DeclRefExpr>);
4425 FoundDecl = Node.getFoundDecl();
4428 return Inner.matches(*
UsingDecl, Finder, Builder);
4449 return matchesFirstInPointerRange(InnerMatcher, Node.decls_begin(),
4450 Node.decls_end(), Finder,
4451 Builder) != Node.decls_end();
4464 if (Node.isSingleDecl()) {
4465 const Decl *FoundDecl = Node.getSingleDecl();
4466 return InnerMatcher.matches(*FoundDecl, Finder, Builder);
4480 VarDecl, hasInitializer, internal::Matcher<Expr>,
4484 InnerMatcher.matches(*
Initializer, Finder, Builder));
4510 internal::Matcher<LambdaCapture>, InnerMatcher) {
4511 BoundNodesTreeBuilder
Result;
4512 bool Matched =
false;
4513 for (
const auto &
Capture : Node.captures()) {
4514 if (Finder->isTraversalIgnoringImplicitNodes() &&
Capture.isImplicit())
4516 BoundNodesTreeBuilder CaptureBuilder(*Builder);
4517 if (InnerMatcher.matches(
Capture, Finder, &CaptureBuilder)) {
4519 Result.addMatch(CaptureBuilder);
4522 *Builder = std::move(
Result);
4537 return Node.isStaticLocal();
4552 return Node.hasLocalStorage();
4566 return Node.hasGlobalStorage();
4602 return Node.getStorageDuration() ==
SD_Static;
4618 return Node.getStorageDuration() ==
SD_Thread;
4633 return Node.isExceptionVariable();
4649 unsigned NumArgs = Node.getNumArgs();
4650 if (!Finder->isTraversalIgnoringImplicitNodes())
4651 return NumArgs == N;
4657 return NumArgs == N;
4676 unsigned NumArgs = Node.getNumArgs();
4677 if (!Finder->isTraversalIgnoringImplicitNodes())
4678 return NumArgs >= N;
4684 return NumArgs >= N;
4699 unsigned, N, internal::Matcher<Expr>, InnerMatcher) {
4700 if (N >= Node.getNumArgs())
4702 const Expr *Arg = Node.getArg(N);
4726 const auto *
const Init = Node.getInit();
4727 return Init && InnerMacher.matches(*
Init, Finder, Builder);
4748 const Expr *
const Pattern = Node.getPattern();
4749 return Pattern && InnerMacher.matches(*Pattern, Finder, Builder);
4830 return N < Node.getNumInits() &&
4831 InnerMatcher.matches(*Node.getInit(N), Finder, Builder);
4846 return std::distance(Node.decl_begin(), Node.decl_end()) == (
ptrdiff_t)N;
4869 internal::Matcher<Decl>, InnerMatcher) {
4870 const unsigned NumDecls = std::distance(Node.decl_begin(), Node.decl_end());
4874 std::advance(Iterator, N);
4875 return InnerMatcher.matches(**Iterator, Finder, Builder);
4892 return Node.getExceptionDecl() ==
nullptr;
4909 internal::Matcher<CXXCtorInitializer>, InnerMatcher) {
4910 auto MatchIt = matchesFirstInPointerRange(InnerMatcher, Node.init_begin(),
4911 Node.init_end(), Finder, Builder);
4912 if (MatchIt == Node.init_end())
4914 return (*MatchIt)->isWritten() || !Finder->isTraversalIgnoringImplicitNodes();
4931 internal::Matcher<FieldDecl>, InnerMatcher) {
4932 const FieldDecl *NodeAsDecl = Node.getAnyMember();
4933 return (NodeAsDecl !=
nullptr &&
4934 InnerMatcher.matches(*NodeAsDecl, Finder, Builder));
4951 internal::Matcher<Expr>, InnerMatcher) {
4952 const Expr* NodeAsExpr = Node.getInit();
4953 return (NodeAsExpr !=
nullptr &&
4954 InnerMatcher.matches(*NodeAsExpr, Finder, Builder));
4971 return Node.isWritten();
4991 return Node.isBaseInitializer();
5011 return Node.isMemberInitializer();
5037 internal::Matcher<Expr>, InnerMatcher) {
5038 for (
const Expr *Arg : Node.arguments()) {
5039 if (Finder->isTraversalIgnoringImplicitNodes() &&
5042 BoundNodesTreeBuilder
Result(*Builder);
5043 if (InnerMatcher.matches(*Arg, Finder, &
Result)) {
5044 *Builder = std::move(
Result);
5063extern const internal::VariadicAllOfMatcher<LambdaCapture>
lambdaCapture;
5080 clang::ast_matchers::internal::BoundNodesTreeBuilder
Result(*Builder);
5082 *Builder = std::move(
Result);
5106 if (!Node.capturesVariable())
5108 auto *capturedVar = Node.getCapturedVar();
5109 return capturedVar && InnerMatcher.matches(*capturedVar, Finder, Builder);
5130 return Node.isListInitialization();
5146 return Node.requiresZeroInitialization();
5173 unsigned, N, internal::Matcher<ParmVarDecl>,
5175 return (N < Node.parameters().size()
5176 && InnerMatcher.matches(*Node.parameters()[N], Finder, Builder));
5195 return Node.isExplicitObjectMemberFunction();
5219 internal::Matcher<Expr>, ArgMatcher,
5220 internal::Matcher<ParmVarDecl>, ParamMatcher) {
5221 BoundNodesTreeBuilder
Result;
5225 BoundNodesTreeBuilder Matches;
5229 .matches(Node, Finder, &Matches)
5233 bool Matched =
false;
5234 for (; ArgIndex < Node.getNumArgs(); ++ArgIndex) {
5235 BoundNodesTreeBuilder ArgMatches(*Builder);
5236 if (ArgMatcher.matches(*(Node.getArg(ArgIndex)->IgnoreParenCasts()),
5237 Finder, &ArgMatches)) {
5238 BoundNodesTreeBuilder ParamMatches(ArgMatches);
5240 hasParameter(ParamIndex, ParamMatcher)))),
5242 hasParameter(ParamIndex, ParamMatcher))))))
5243 .matches(Node, Finder, &ParamMatches)) {
5244 Result.addMatch(ParamMatches);
5250 *Builder = std::move(
Result);
5282 internal::Matcher<Expr>, ArgMatcher,
5283 internal::Matcher<QualType>, ParamMatcher) {
5284 BoundNodesTreeBuilder
Result;
5285 bool Matched =
false;
5286 auto ProcessParamAndArg = [&](
QualType ParamType,
const Expr *Arg) {
5287 BoundNodesTreeBuilder ArgMatches(*Builder);
5288 if (!ArgMatcher.matches(*Arg, Finder, &ArgMatches))
5290 BoundNodesTreeBuilder ParamMatches(std::move(ArgMatches));
5291 if (!ParamMatcher.matches(ParamType, Finder, &ParamMatches))
5293 Result.addMatch(ParamMatches);
5297 if (
auto *
Call = llvm::dyn_cast<CallExpr>(&Node))
5299 else if (
auto *Construct = llvm::dyn_cast<CXXConstructExpr>(&Node))
5302 llvm_unreachable(
"expected CallExpr or CXXConstructExpr");
5304 *Builder = std::move(
Result);
5326 if (
const auto *
Decl = dyn_cast_or_null<FunctionDecl>(Context))
5327 return N <
Decl->param_size() &&
Decl->getParamDecl(N) == &Node;
5328 if (
const auto *
Decl = dyn_cast_or_null<BlockDecl>(Context))
5329 return N <
Decl->param_size() &&
Decl->getParamDecl(N) == &Node;
5330 if (
const auto *
Decl = dyn_cast_or_null<ObjCMethodDecl>(Context))
5331 return N <
Decl->param_size() &&
Decl->getParamDecl(N) == &Node;
5371 internal::Matcher<ParmVarDecl>,
5373 return matchesFirstInPointerRange(InnerMatcher, Node.param_begin(),
5374 Node.param_end(), Finder,
5375 Builder) != Node.param_end();
5399 return Node.getNumParams() == N;
5427 forEachTemplateArgument,
5429 VarTemplateSpecializationDecl, FunctionDecl,
5430 TemplateSpecializationType),
5431 internal::Matcher<TemplateArgument>, InnerMatcher) {
5432 ArrayRef<TemplateArgument> TemplateArgs =
5433 clang::ast_matchers::internal::getTemplateSpecializationArgs(Node);
5434 clang::ast_matchers::internal::BoundNodesTreeBuilder
Result;
5435 bool Matched =
false;
5436 for (
const auto &Arg : TemplateArgs) {
5437 clang::ast_matchers::internal::BoundNodesTreeBuilder ArgBuilder(*Builder);
5438 if (InnerMatcher.matches(Arg, Finder, &ArgBuilder)) {
5440 Result.addMatch(ArgBuilder);
5443 *Builder = std::move(
Result);
5461AST_MATCHER(FunctionDecl, isNoReturn) {
return Node.isNoReturn(); }
5472 internal::Matcher<QualType>, InnerMatcher) {
5473 return InnerMatcher.matches(Node.getReturnType(), Finder, Builder);
5493 return Node.isExternC();
5513 return Node.getStorageClass() ==
SC_Static;
5526 return Node.isDeleted();
5539 return Node.isDefaulted();
5551AST_MATCHER(FunctionDecl, isWeak) {
return Node.isWeak(); }
5570 FunctionProtoType)) {
5571 if (
const FunctionProtoType *FnTy = internal::getFunctionProtoType(Node))
5572 return FnTy->hasDynamicExceptionSpec();
5590 FunctionProtoType)) {
5591 const FunctionProtoType *FnTy = internal::getFunctionProtoType(Node);
5603 return FnTy->isNothrow();
5622 return Node.isConsteval();
5644 return Node.isConstexpr();
5659 if (
const auto *CIA = Node.getAttr<ConstInitAttr>())
5660 return CIA->isConstinit();
5688 internal::Matcher<Stmt>, InnerMatcher) {
5689 const Stmt *
Init = Node.getInit();
5690 return Init !=
nullptr && InnerMatcher.matches(*
Init, Finder, Builder);
5703 SwitchStmt, AbstractConditionalOperator),
5704 internal::Matcher<Expr>, InnerMatcher) {
5705 const Expr *
const Condition = Node.getCond();
5707 InnerMatcher.matches(*
Condition, Finder, Builder));
5717AST_MATCHER_P(IfStmt, hasThen, internal::Matcher<Stmt>, InnerMatcher) {
5718 const Stmt *
const Then = Node.getThen();
5719 return (Then !=
nullptr && InnerMatcher.matches(*Then, Finder, Builder));
5729AST_MATCHER_P(IfStmt, hasElse, internal::Matcher<Stmt>, InnerMatcher) {
5730 const Stmt *
const Else = Node.getElse();
5731 return (Else !=
nullptr && InnerMatcher.matches(*Else, Finder, Builder));
5765 internal::NotEqualsBoundNodePredicate Predicate;
5768 return Builder->removeBindings(Predicate);
5773AST_MATCHER_P(Decl, declaresSameEntityAsBoundNode, std::string, ID) {
5774 return Builder->removeBindings([&](
const internal::BoundNodesMap &Nodes) {
5793 internal::Matcher<DeclStmt>, InnerMatcher) {
5794 const DeclStmt*
const DeclarationStatement =
5795 Node.getConditionVariableDeclStmt();
5796 return DeclarationStatement !=
nullptr &&
5797 InnerMatcher.matches(*DeclarationStatement, Finder, Builder);
5810 internal::Matcher<Expr>, InnerMatcher) {
5811 if (
const Expr* Expression = Node.getIdx())
5812 return InnerMatcher.matches(*Expression, Finder, Builder);
5827 internal::Matcher<Expr>, InnerMatcher) {
5828 if (
const Expr* Expression = Node.getBase())
5829 return InnerMatcher.matches(*Expression, Finder, Builder);
5860 FunctionDecl, CoroutineBodyStmt),
5861 internal::Matcher<Stmt>, InnerMatcher) {
5862 if (Finder->isTraversalIgnoringImplicitNodes() && isDefaultedHelper(&Node))
5864 const Stmt *
const Statement = internal::GetBodyMatcher<NodeType>::get(Node);
5865 return (Statement !=
nullptr &&
5866 InnerMatcher.matches(*Statement, Finder, Builder));
5886 internal::Matcher<Stmt>, InnerMatcher) {
5887 const Stmt *
const Statement = Node.getBody();
5888 return (Statement !=
nullptr &&
5889 InnerMatcher.matches(*Statement, Finder, Builder));
5907 internal::Matcher<Stmt>, InnerMatcher) {
5908 const CompoundStmt *CS = CompoundStmtMatcher<NodeType>::get(Node);
5909 return CS && matchesFirstInPointerRange(InnerMatcher, CS->body_begin(),
5910 CS->body_end(), Finder,
5911 Builder) != CS->body_end();
5925 return Node.size() == N;
5953template <
typename ValueT>
5954internal::PolymorphicMatcher<internal::ValueEqualsMatcher,
5955 void(internal::AllNodeBaseTypes), ValueT>
5957 return internal::PolymorphicMatcher<internal::ValueEqualsMatcher,
5958 void(internal::AllNodeBaseTypes), ValueT>(
5967 return internal::ValueEqualsMatcher<NodeType, ParamT>(
Value)
5975 unsigned,
Value, 1) {
5976 return internal::ValueEqualsMatcher<NodeType, ParamT>(
Value)
5986 return internal::ValueEqualsMatcher<NodeType, ParamT>(
Value)
6009 CXXRewrittenBinaryOperator, CXXFoldExpr,
6011 std::string, Name) {
6012 if (std::optional<StringRef> OpName = internal::getOpName(Node))
6013 return *OpName == Name;
6023extern const internal::VariadicFunction<
6024 internal::PolymorphicMatcher<internal::HasAnyOperatorNameMatcher,
6026 BinaryOperator, CXXOperatorCallExpr,
6027 CXXRewrittenBinaryOperator, UnaryOperator),
6028 std::vector<std::string>>,
6047 isAssignmentOperator,
6049 CXXRewrittenBinaryOperator)) {
6050 return Node.isAssignmentOp();
6068 isComparisonOperator,
6070 CXXRewrittenBinaryOperator)) {
6071 return Node.isComparisonOp();
6083 CXXRewrittenBinaryOperator,
6084 ArraySubscriptExpr, CXXFoldExpr),
6085 internal::Matcher<Expr>, InnerMatcher) {
6087 return (LeftHandSide !=
nullptr &&
6088 InnerMatcher.matches(*LeftHandSide, Finder, Builder));
6100 CXXRewrittenBinaryOperator,
6101 ArraySubscriptExpr, CXXFoldExpr),
6102 internal::Matcher<Expr>, InnerMatcher) {
6104 return (RightHandSide !=
nullptr &&
6105 InnerMatcher.matches(*RightHandSide, Finder, Builder));
6113 CXXFoldExpr, CXXRewrittenBinaryOperator),
6114 internal::Matcher<Expr>, InnerMatcher) {
6115 return internal::VariadicDynCastAllOfMatcher<Stmt, NodeType>()(
6116 anyOf(hasLHS(InnerMatcher), hasRHS(InnerMatcher)))
6117 .
matches(Node, Finder, Builder);
6134 CXXFoldExpr, CXXRewrittenBinaryOperator),
6135 internal::Matcher<Expr>, Matcher1, internal::Matcher<Expr>, Matcher2) {
6136 return internal::VariadicDynCastAllOfMatcher<Stmt, NodeType>()(
6137 anyOf(
allOf(hasLHS(Matcher1), hasRHS(Matcher2)),
6138 allOf(hasRHS(Matcher1), hasLHS(Matcher2))))
6139 .
matches(Node, Finder, Builder);
6151 CXXOperatorCallExpr),
6152 internal::Matcher<Expr>, InnerMatcher) {
6153 const Expr *
const Operand = internal::getSubExpr(Node);
6154 return (Operand !=
nullptr &&
6155 InnerMatcher.matches(*Operand, Finder, Builder));
6176 internal::Matcher<Expr>, InnerMatcher) {
6178 internal::GetSourceExpressionMatcher<NodeType>::get(Node);
6179 return (SubExpression !=
nullptr &&
6180 InnerMatcher.matches(*SubExpression, Finder, Builder));
6194 return Node.getCastKind() ==
Kind;
6202 internal::Matcher<QualType>, InnerMatcher) {
6203 const QualType NodeType = Node.getTypeAsWritten();
6204 return InnerMatcher.matches(NodeType, Finder, Builder);
6210 internal::Matcher<QualType>, InnerMatcher) {
6211 return InnerMatcher.matches(Node.getType(), Finder, Builder);
6224 return Node.isStruct();
6237 return Node.isUnion();
6250 return Node.isClass();
6263 return Node.isEnum();
6277AST_MATCHER_P(AbstractConditionalOperator, hasTrueExpression,
6278 internal::Matcher<Expr>, InnerMatcher) {
6280 return (Expression !=
nullptr &&
6281 InnerMatcher.matches(*Expression, Finder, Builder));
6292AST_MATCHER_P(AbstractConditionalOperator, hasFalseExpression,
6293 internal::Matcher<Expr>, InnerMatcher) {
6294 const Expr *
Expression = Node.getFalseExpr();
6295 return (Expression !=
nullptr &&
6296 InnerMatcher.matches(*Expression, Finder, Builder));
6323 return Node.isThisDeclarationADefinition();
6337 return Node.isVariadic();
6358 internal::Matcher<CXXRecordDecl>, InnerMatcher) {
6360 ASTChildrenNotSpelledInSourceScope RAII(Finder,
false);
6362 const CXXRecordDecl *Parent = Node.getParent();
6363 return (Parent !=
nullptr &&
6364 InnerMatcher.matches(*Parent, Finder, Builder));
6392 internal::Matcher<CXXMethodDecl>, InnerMatcher) {
6393 BoundNodesTreeBuilder
Result;
6394 bool Matched =
false;
6395 for (
const auto *Overridden : Node.overridden_methods()) {
6396 BoundNodesTreeBuilder OverriddenBuilder(*Builder);
6397 const bool OverriddenMatched =
6398 InnerMatcher.matches(*Overridden, Finder, &OverriddenBuilder);
6399 if (OverriddenMatched) {
6401 Result.addMatch(OverriddenBuilder);
6404 *Builder = std::move(
Result);
6429 CXXBaseSpecifier)) {
6430 return Node.isVirtual();
6448 return Node.isVirtualAsWritten();
6451AST_MATCHER(CXXConstructorDecl, isInheritingConstructor) {
6452 return Node.isInheritingConstructor();
6486AST_MATCHER(CXXMethodDecl, isPure) {
return Node.isPureVirtual(); }
6500 return Node.isConst();
6516AST_MATCHER(CXXMethodDecl, isCopyAssignmentOperator) {
6517 return Node.isCopyAssignmentOperator();
6533AST_MATCHER(CXXMethodDecl, isMoveAssignmentOperator) {
6534 return Node.isMoveAssignmentOperator();
6552 return Node.size_overridden_methods() > 0 || Node.hasAttr<OverrideAttr>();
6567 return Node.isUserProvided();
6596 CXXDependentScopeMemberExpr)) {
6597 return Node.isArrow();
6611 return Node->isIntegerType();
6625 return Node->isUnsignedIntegerType();
6639 return Node->isSignedIntegerType();
6653 return Node->isAnyCharacterType();
6673 return Node->isAnyPointerType();
6692 return Node.isConstQualified();
6711 return Node.isVolatileQualified();
6728 return Node.hasLocalQualifiers();
6744 internal::Matcher<ValueDecl>, InnerMatcher) {
6745 return InnerMatcher.matches(*Node.getMemberDecl(), Finder, Builder);
6765 hasObjectExpression,
6767 CXXDependentScopeMemberExpr),
6768 internal::Matcher<Expr>, InnerMatcher) {
6769 if (
const auto *E = dyn_cast<UnresolvedMemberExpr>(&Node))
6770 if (E->isImplicitAccess())
6772 if (
const auto *E = dyn_cast<CXXDependentScopeMemberExpr>(&Node))
6773 if (E->isImplicitAccess())
6775 return InnerMatcher.matches(*Node.getBase(), Finder, Builder);
6788 internal::Matcher<UsingShadowDecl>, InnerMatcher) {
6789 return matchesFirstInPointerRange(InnerMatcher, Node.shadow_begin(),
6790 Node.shadow_end(), Finder,
6791 Builder) != Node.shadow_end();
6807 internal::Matcher<NamedDecl>, InnerMatcher) {
6808 return InnerMatcher.matches(*Node.getTargetDecl(), Finder, Builder);
6842 Node.getTemplateSpecializationKind() ==
6844 Node.getTemplateSpecializationKind() ==
6907 internal::Matcher<QualType>, InnerMatcher, 0) {
6908 return internal::BindableMatcher<TypeLoc>(
6909 new internal::TypeLocTypeMatcher(InnerMatcher));
6920extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, QualifiedTypeLoc>
6933AST_MATCHER_P(QualifiedTypeLoc, hasUnqualifiedLoc, internal::Matcher<TypeLoc>,
6935 return InnerMatcher.matches(Node.getUnqualifiedLoc(), Finder, Builder);
6947AST_MATCHER_P(FunctionDecl, hasReturnTypeLoc, internal::Matcher<TypeLoc>,
6949 auto Loc = Node.getFunctionTypeLoc();
6950 return Loc && ReturnMatcher.matches(Loc.getReturnLoc(), Finder, Builder);
6961extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, PointerTypeLoc>
6973AST_MATCHER_P(PointerTypeLoc, hasPointeeLoc, internal::Matcher<TypeLoc>,
6975 return PointeeMatcher.matches(Node.getPointeeLoc(), Finder, Builder);
6988extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, ReferenceTypeLoc>
7001AST_MATCHER_P(ReferenceTypeLoc, hasReferentLoc, internal::Matcher<TypeLoc>,
7003 return ReferentMatcher.matches(Node.getPointeeLoc(), Finder, Builder);
7015extern const internal::VariadicDynCastAllOfMatcher<
7016 TypeLoc, TemplateSpecializationTypeLoc>
7033 hasAnyTemplateArgumentLoc,
7035 VarTemplateSpecializationDecl, FunctionDecl,
7036 DeclRefExpr, TemplateSpecializationTypeLoc),
7037 internal::Matcher<TemplateArgumentLoc>, InnerMatcher) {
7038 auto Args = internal::getTemplateArgsWritten(Node);
7039 return matchesFirstInRange(InnerMatcher, Args.begin(), Args.end(), Finder,
7040 Builder) != Args.end();
7058 hasTemplateArgumentLoc,
7060 VarTemplateSpecializationDecl, FunctionDecl,
7061 DeclRefExpr, TemplateSpecializationTypeLoc),
7062 unsigned, Index, internal::Matcher<TemplateArgumentLoc>, InnerMatcher) {
7063 auto Args = internal::getTemplateArgsWritten(Node);
7064 return Index < Args.size() &&
7065 InnerMatcher.matches(Args[Index], Finder, Builder);
7077 return Node.isBooleanType();
7089 return Node.isVoidType();
7092template <
typename NodeType>
7093using AstTypeMatcher = internal::VariadicDynCastAllOfMatcher<Type, NodeType>;
7107extern const AstTypeMatcher<BuiltinType>
builtinType;
7119extern const AstTypeMatcher<ArrayType>
arrayType;
7129extern const AstTypeMatcher<ComplexType>
complexType;
7141 return Node.isRealFloatingType();
7194 return internal::HasSizeMatcher<NodeType>::hasSize(Node, N);
7222extern const AstTypeMatcher<DependentSizedExtVectorType>
7265 internal::Matcher<Expr>, InnerMatcher) {
7266 return InnerMatcher.matches(*Node.getSizeExpr(), Finder, Builder);
7277extern const AstTypeMatcher<AtomicType>
atomicType;
7303extern const AstTypeMatcher<AutoType>
autoType;
7346 QualType QT = Node.getLocallyUnqualifiedSingleStepDesugaredType();
7347 if (QT == QualType(&Node, 0))
7349 return Inner.matches(QT, Finder, Builder);
7385extern const AstTypeMatcher<ParenType>
parenType;
7433extern const AstTypeMatcher<PointerType>
pointerType;
7516 pointee, getPointee,
7518 PointerType, ReferenceType,
7519 ObjCObjectPointerType));
7529extern const AstTypeMatcher<TypedefType>
typedefType;
7556extern const AstTypeMatcher<EnumType>
enumType;
7571extern const AstTypeMatcher<TemplateSpecializationType>
7586extern const AstTypeMatcher<DeducedTemplateSpecializationType>
7612extern const AstTypeMatcher<RecordType>
recordType;
7627extern const AstTypeMatcher<TagType>
tagType;
7646 if (NestedNameSpecifier Qualifier = Node.getPrefix())
7647 return InnerMatcher.matches(Qualifier, Finder, Builder);
7662extern const AstTypeMatcher<UsingType>
usingType;
7676extern const AstTypeMatcher<SubstTemplateTypeParmType>
7692 hasReplacementType, getReplacementType,
7726extern const AstTypeMatcher<DecayedType>
decayedType;
7729AST_MATCHER_P(DecayedType, hasDecayedType, internal::Matcher<QualType>,
7731 return InnerType.matches(Node.getDecayedType(), Finder, Builder);
7758AST_MATCHER_P(Decl, hasDeclContext, internal::Matcher<Decl>, InnerMatcher) {
7759 const DeclContext *DC = Node.getDeclContext();
7760 if (!DC)
return false;
7777extern const internal::VariadicAllOfMatcher<NestedNameSpecifier>
7781extern const internal::VariadicAllOfMatcher<NestedNameSpecifierLoc>
7787 internal::BindableMatcher<NestedNameSpecifierLoc>, loc,
7788 internal::Matcher<NestedNameSpecifier>, InnerMatcher, 1) {
7789 return internal::BindableMatcher<NestedNameSpecifierLoc>(
7790 new internal::LocMatcher<NestedNameSpecifierLoc, NestedNameSpecifier>(
7807 internal::Matcher<QualType>, InnerMatcher) {
7810 return InnerMatcher.matches(QualType(Node.getAsType(), 0), Finder, Builder);
7825 internal::Matcher<TypeLoc>, InnerMatcher) {
7828 TypeLoc TL = Node.getAsTypeLoc();
7831 return InnerMatcher.matches(TL, Finder, Builder);
7844 internal::Matcher<NestedNameSpecifier>, InnerMatcher,
7846 NestedNameSpecifier NextNode = std::nullopt;
7847 switch (Node.getKind()) {
7849 NextNode = Node.getAsNamespaceAndPrefix().Prefix;
7852 NextNode = Node.getAsType()->getPrefix();
7860 return InnerMatcher.matches(NextNode, Finder, Builder);
7873 internal::Matcher<NestedNameSpecifierLoc>, InnerMatcher,
7875 NestedNameSpecifierLoc NextNode;
7876 if (TypeLoc TL = Node.getAsTypeLoc())
7877 NextNode = TL.getPrefix();
7879 NextNode = Node.getAsNamespaceAndPrefix().Prefix;
7883 return InnerMatcher.matches(NextNode, Finder, Builder);
7897 internal::Matcher<NamespaceDecl>, InnerMatcher) {
7901 dyn_cast<NamespaceDecl>(Node.getAsNamespaceAndPrefix().Namespace);
7904 return InnerMatcher.matches(*Namespace, Finder, Builder);
7923extern const internal::VariadicAllOfMatcher<Attr>
attr;
7933 return &Node ==
Other;
7939 return &Node ==
Other;
7945 return &Node ==
Other;
7961AST_MATCHER_P(SwitchStmt, forEachSwitchCase, internal::Matcher<SwitchCase>,
7963 BoundNodesTreeBuilder
Result;
7968 bool Matched =
false;
7969 for (
const SwitchCase *SC = Node.getSwitchCaseList(); SC;
7970 SC = SC->getNextSwitchCase()) {
7971 BoundNodesTreeBuilder CaseBuilder(*Builder);
7972 bool CaseMatched = InnerMatcher.matches(*SC, Finder, &CaseBuilder);
7975 Result.addMatch(CaseBuilder);
7978 *Builder = std::move(
Result);
7992AST_MATCHER_P(CXXConstructorDecl, forEachConstructorInitializer,
7993 internal::Matcher<CXXCtorInitializer>, InnerMatcher) {
7994 BoundNodesTreeBuilder
Result;
7995 bool Matched =
false;
7996 for (
const auto *I : Node.inits()) {
7997 if (Finder->isTraversalIgnoringImplicitNodes() && !I->isWritten())
7999 BoundNodesTreeBuilder InitBuilder(*Builder);
8000 if (InnerMatcher.matches(*I, Finder, &InitBuilder)) {
8002 Result.addMatch(InitBuilder);
8005 *Builder = std::move(
Result);
8020AST_MATCHER(CXXConstructorDecl, isCopyConstructor) {
8021 return Node.isCopyConstructor();
8035AST_MATCHER(CXXConstructorDecl, isMoveConstructor) {
8036 return Node.isMoveConstructor();
8050AST_MATCHER(CXXConstructorDecl, isDefaultConstructor) {
8051 return Node.isDefaultConstructor();
8067AST_MATCHER(CXXConstructorDecl, isDelegatingConstructor) {
8068 return Node.isDelegatingConstructor();
8094 CXXConstructorDecl, CXXConversionDecl,
8095 CXXDeductionGuideDecl)) {
8096 return Node.isExplicit();
8120AST_MATCHER_P(FunctionDecl, hasExplicitSpecifier, internal::Matcher<Expr>,
8126 ASTChildrenNotSpelledInSourceScope RAII(Finder,
false);
8128 return InnerMatcher.matches(*ES.getExpr(), Finder, Builder);
8151 if (
const auto *FD = dyn_cast<FunctionDecl>(&Node))
8152 return FD->isInlineSpecified();
8153 if (
const auto *NSD = dyn_cast<NamespaceDecl>(&Node))
8154 return NSD->isInline();
8155 if (
const auto *VD = dyn_cast<VarDecl>(&Node))
8156 return VD->isInline();
8157 llvm_unreachable(
"Not a valid polymorphic type");
8170 return Node.isAnonymousNamespace();
8194AST_MATCHER(Decl, isInStdNamespace) {
return Node.isInStdNamespace(); }
8217 return Node.isInAnonymousNamespace();
8229AST_MATCHER_P(CaseStmt, hasCaseConstant, internal::Matcher<Expr>,
8234 return InnerMatcher.matches(*Node.getLHS(), Finder, Builder);
8247 for (
const auto *Attr : Node.attrs()) {
8248 if (Attr->getKind() == AttrKind)
8264AST_MATCHER_P(ReturnStmt, hasReturnValue, internal::Matcher<Expr>,
8266 if (
const auto *
RetValue = Node.getRetValue())
8267 return InnerMatcher.matches(*
RetValue, Finder, Builder);
8277extern const internal::VariadicDynCastAllOfMatcher<Stmt, CUDAKernelCallExpr>
8319AST_MATCHER_P(BindingDecl, forDecomposition, internal::Matcher<ValueDecl>,
8321 if (
const ValueDecl *VD = Node.getDecomposedDecl())
8322 return InnerMatcher.matches(*VD, Finder, Builder);
8345 internal::Matcher<BindingDecl>, InnerMatcher) {
8346 if (Node.bindings().size() <= N)
8348 return InnerMatcher.matches(*Node.bindings()[N], Finder, Builder);
8368AST_MATCHER_P(DecompositionDecl, hasAnyBinding, internal::Matcher<BindingDecl>,
8370 return llvm::any_of(Node.bindings(), [&](
const auto *Binding) {
8371 return InnerMatcher.matches(*Binding, Finder, Builder);
8392AST_MATCHER_P(Stmt, forFunction, internal::Matcher<FunctionDecl>,
8394 const auto &Parents = Finder->getASTContext().getParents(Node);
8396 llvm::SmallVector<DynTypedNode, 8> Stack(Parents.begin(), Parents.end());
8397 while (!Stack.empty()) {
8398 const auto &CurNode = Stack.back();
8400 if (
const auto *FuncDeclNode = CurNode.get<FunctionDecl>()) {
8401 if (InnerMatcher.matches(*FuncDeclNode, Finder, Builder)) {
8404 }
else if (
const auto *LambdaExprNode = CurNode.get<
LambdaExpr>()) {
8405 if (InnerMatcher.matches(*LambdaExprNode->getCallOperator(), Finder,
8410 llvm::append_range(Stack, Finder->getASTContext().getParents(CurNode));
8443AST_MATCHER_P(Stmt, forCallable, internal::Matcher<Decl>, InnerMatcher) {
8444 const auto &Parents = Finder->getASTContext().getParents(Node);
8446 llvm::SmallVector<DynTypedNode, 8> Stack(Parents.begin(), Parents.end());
8447 while (!Stack.empty()) {
8448 const auto &CurNode = Stack.back();
8450 if (
const auto *FuncDeclNode = CurNode.get<FunctionDecl>()) {
8451 BoundNodesTreeBuilder B = *Builder;
8452 if (InnerMatcher.matches(*FuncDeclNode, Finder, &B)) {
8453 *Builder = std::move(B);
8456 }
else if (
const auto *LambdaExprNode = CurNode.get<
LambdaExpr>()) {
8457 BoundNodesTreeBuilder B = *Builder;
8458 if (InnerMatcher.matches(*LambdaExprNode->getCallOperator(), Finder,
8460 *Builder = std::move(B);
8463 }
else if (
const auto *ObjCMethodDeclNode = CurNode.get<ObjCMethodDecl>()) {
8464 BoundNodesTreeBuilder B = *Builder;
8465 if (InnerMatcher.matches(*ObjCMethodDeclNode, Finder, &B)) {
8466 *Builder = std::move(B);
8469 }
else if (
const auto *BlockDeclNode = CurNode.get<BlockDecl>()) {
8470 BoundNodesTreeBuilder B = *Builder;
8471 if (InnerMatcher.matches(*BlockDeclNode, Finder, &B)) {
8472 *Builder = std::move(B);
8476 llvm::append_range(Stack, Finder->getASTContext().getParents(CurNode));
8503 return Node.hasExternalFormalLinkage();
8528 return Node.hasDefaultArg();
8540 return Node.isArray();
8552 internal::Matcher<Expr>, InnerMatcher) {
8553 return Node.getNumPlacementArgs() > Index &&
8554 InnerMatcher.matches(*Node.getPlacementArg(Index), Finder, Builder);
8565AST_MATCHER_P(CXXNewExpr, hasAnyPlacementArg, internal::Matcher<Expr>,
8567 return llvm::any_of(Node.placement_arguments(), [&](
const Expr *Arg) {
8568 return InnerMatcher.matches(*Arg, Finder, Builder);
8580AST_MATCHER_P(CXXNewExpr, hasArraySize, internal::Matcher<Expr>, InnerMatcher) {
8581 return Node.isArray() && *Node.getArraySize() &&
8582 InnerMatcher.matches(**Node.getArraySize(), Finder, Builder);
8593 return Node.hasDefinition();
8604 return Node.isScoped();
8615 if (
const auto *F = Node.getType()->getAs<FunctionProtoType>())
8616 return F->hasTrailingReturn();
8643AST_MATCHER_P(Expr, ignoringElidableConstructorCall, internal::Matcher<Expr>,
8646 const Expr *E = &Node;
8652 if (
const auto *CleanupsExpr = dyn_cast<ExprWithCleanups>(&Node))
8653 E = CleanupsExpr->getSubExpr();
8654 if (
const auto *CtorExpr = dyn_cast<CXXConstructExpr>(E)) {
8655 if (CtorExpr->isElidable()) {
8656 if (
const auto *MaterializeTemp =
8657 dyn_cast<MaterializeTemporaryExpr>(CtorExpr->getArg(0))) {
8658 return InnerMatcher.matches(*MaterializeTemp->getSubExpr(), Finder,
8663 return InnerMatcher.matches(Node, Finder, Builder);
8682extern const internal::VariadicDynCastAllOfMatcher<Stmt, OMPExecutableDirective>
8698AST_MATCHER(OMPExecutableDirective, isStandaloneDirective) {
8699 return Node.isStandaloneDirective();
8718 internal::Matcher<Stmt>, InnerMatcher) {
8719 if (Node.isStandaloneDirective())
8721 return InnerMatcher.matches(*Node.getStructuredBlock(), Finder, Builder);
8736 internal::Matcher<OMPClause>, InnerMatcher) {
8737 ArrayRef<OMPClause *> Clauses = Node.clauses();
8738 return matchesFirstInPointerRange(InnerMatcher, Clauses.begin(),
8739 Clauses.end(), Finder,
8740 Builder) != Clauses.end();
8757extern const internal::VariadicDynCastAllOfMatcher<OMPClause, OMPDefaultClause>
8774 return Node.getDefaultKind() == llvm::omp::OMP_DEFAULT_none;
8791 return Node.getDefaultKind() == llvm::omp::OMP_DEFAULT_shared;
8810 return Node.getDefaultKind() == llvm::omp::OMP_DEFAULT_private;
8828AST_MATCHER(OMPDefaultClause, isFirstPrivateKind) {
8829 return Node.getDefaultKind() == llvm::omp::OMP_DEFAULT_firstprivate;
8851 return llvm::omp::isAllowedClauseForDirective(
8852 Node.getDirectiveKind(), CKind,
8853 Finder->getASTContext().getLangOpts().OpenMP);