44 #ifndef LLVM_CLANG_ASTMATCHERS_ASTMATCHERS_H 45 #define LLVM_CLANG_ASTMATCHERS_ASTMATCHERS_H 78 #include "llvm/ADT/ArrayRef.h" 79 #include "llvm/ADT/SmallVector.h" 80 #include "llvm/ADT/StringRef.h" 81 #include "llvm/Support/Casting.h" 82 #include "llvm/Support/Compiler.h" 83 #include "llvm/Support/ErrorHandling.h" 84 #include "llvm/Support/Regex.h" 109 template <
typename T>
111 return MyBoundNodes.getNodeAs<T>(
ID);
121 return MyBoundNodes.getMap();
128 BoundNodes(internal::BoundNodesMap &MyBoundNodes)
129 : MyBoundNodes(MyBoundNodes) {}
131 internal::BoundNodesMap MyBoundNodes;
160 inline internal::TrueMatcher
anything() {
return internal::TrueMatcher(); }
173 extern const internal::VariadicDynCastAllOfMatcher<Decl, TranslationUnitDecl>
185 extern const internal::VariadicDynCastAllOfMatcher<Decl, TypedefDecl>
197 extern const internal::VariadicDynCastAllOfMatcher<Decl, TypedefNameDecl>
209 extern const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasDecl>
219 extern const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasTemplateDecl>
238 auto &
SourceManager = Finder->getASTContext().getSourceManager();
259 auto &
SourceManager = Finder->getASTContext().getSourceManager();
261 if (ExpansionLoc.isInvalid()) {
284 std::string, RegExp) {
285 auto &
SourceManager = Finder->getASTContext().getSourceManager();
287 if (ExpansionLoc.isInvalid()) {
297 llvm::Regex RE(RegExp);
310 extern const internal::VariadicAllOfMatcher<Decl>
decl;
320 extern const internal::VariadicDynCastAllOfMatcher<Decl, LinkageSpecDecl>
334 extern const internal::VariadicDynCastAllOfMatcher<Decl, NamedDecl>
namedDecl;
345 extern const internal::VariadicDynCastAllOfMatcher<Decl, LabelDecl>
labelDecl;
356 extern const internal::VariadicDynCastAllOfMatcher<Decl, NamespaceDecl>
368 extern const internal::VariadicDynCastAllOfMatcher<Decl, NamespaceAliasDecl>
380 extern const internal::VariadicDynCastAllOfMatcher<Decl, RecordDecl>
recordDecl;
389 extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXRecordDecl>
398 extern const internal::VariadicDynCastAllOfMatcher<Decl, ClassTemplateDecl>
411 extern const internal::VariadicDynCastAllOfMatcher<
430 extern const internal::VariadicDynCastAllOfMatcher<
443 extern const internal::VariadicDynCastAllOfMatcher<Decl, DeclaratorDecl>
454 extern const internal::VariadicDynCastAllOfMatcher<Decl, ParmVarDecl>
468 extern const internal::VariadicDynCastAllOfMatcher<Decl, AccessSpecDecl>
480 extern const internal::VariadicAllOfMatcher<CXXCtorInitializer>
492 extern const internal::VariadicAllOfMatcher<TemplateArgument>
templateArgument;
503 extern const internal::VariadicAllOfMatcher<TemplateName>
templateName;
513 extern const internal::VariadicDynCastAllOfMatcher<Decl,
525 extern const internal::VariadicDynCastAllOfMatcher<Decl, TemplateTypeParmDecl>
588 return Node.isBitField();
605 return Node.isBitField() &&
606 Node.getBitWidthValue(Finder->getASTContext()) == Width;
626 return (Initializer !=
nullptr &&
627 InnerMatcher.matches(*Initializer, Finder, Builder));
633 return Node.isMain();
647 internal::Matcher<ClassTemplateDecl>, InnerMatcher) {
649 return (Decl !=
nullptr &&
650 InnerMatcher.matches(*Decl, Finder, Builder));
656 return Node.isImplicit();
681 hasAnyTemplateArgument,
685 internal::Matcher<TemplateArgument>, InnerMatcher) {
687 internal::getTemplateSpecializationArgs(
Node);
688 return matchesFirstInRange(InnerMatcher, List.begin(), List.end(), Finder,
715 return InnerMatcher.matches(*
Node.IgnoreImplicit(), Finder, Builder);
744 internal::Matcher<Expr>, InnerMatcher) {
745 return InnerMatcher.matches(*
Node.IgnoreImpCasts(), Finder, Builder);
766 return InnerMatcher.matches(*
Node.IgnoreParenCasts(), Finder, Builder);
791 internal::Matcher<Expr>, InnerMatcher) {
792 return InnerMatcher.matches(*
Node.IgnoreParenImpCasts(), Finder, Builder);
808 return InnerMatcher.matches(
Node.IgnoreParens(), Finder, Builder);
824 const Expr *E =
Node.IgnoreParens();
825 return InnerMatcher.matches(*E, Finder, Builder);
842 return Node.isInstantiationDependent();
893 unsigned, N, internal::Matcher<TemplateArgument>, InnerMatcher) {
895 internal::getTemplateSpecializationArgs(
Node);
896 if (List.size() <= N)
898 return InnerMatcher.matches(List[N], Finder, Builder);
911 templateArgumentCountIs,
915 return internal::getTemplateSpecializationArgs(
Node).size() == N;
930 internal::Matcher<QualType>, InnerMatcher) {
933 return InnerMatcher.matches(
Node.getAsType(), Finder, Builder);
948 internal::Matcher<TemplateName>, InnerMatcher) {
951 return InnerMatcher.matches(
Node.getAsTemplate(), Finder, Builder);
968 internal::Matcher<Decl>, InnerMatcher) {
970 return InnerMatcher.matches(*
Node.getAsDecl(), Finder, Builder);
988 return InnerMatcher.matches(*
Node.getAsExpr(), Finder, Builder);
1018 internal::Matcher<QualType>, InnerMatcher) {
1021 return InnerMatcher.matches(
Node.getIntegralType(), Finder, Builder);
1039 std::string,
Value) {
1042 return Node.getAsIntegral().toString(10) ==
Value;
1055 extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
1065 extern const internal::VariadicDynCastAllOfMatcher<Decl, ValueDecl>
valueDecl;
1078 extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXConstructorDecl>
1090 extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXDestructorDecl>
1101 extern const internal::VariadicDynCastAllOfMatcher<Decl, EnumDecl>
enumDecl;
1111 extern const internal::VariadicDynCastAllOfMatcher<Decl, EnumConstantDecl>
1120 extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXMethodDecl>
1129 extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXConversionDecl>
1140 extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXDeductionGuideDecl>
1152 extern const internal::VariadicDynCastAllOfMatcher<Decl, VarDecl>
varDecl;
1162 extern const internal::VariadicDynCastAllOfMatcher<Decl, FieldDecl>
fieldDecl;
1172 extern const internal::VariadicDynCastAllOfMatcher<Decl, IndirectFieldDecl>
1181 extern const internal::VariadicDynCastAllOfMatcher<Decl, FunctionDecl>
1190 extern const internal::VariadicDynCastAllOfMatcher<Decl, FunctionTemplateDecl>
1201 extern const internal::VariadicDynCastAllOfMatcher<Decl, FriendDecl>
friendDecl;
1211 extern const internal::VariadicAllOfMatcher<Stmt>
stmt;
1221 extern const internal::VariadicDynCastAllOfMatcher<Stmt, DeclStmt>
declStmt;
1234 extern const internal::VariadicDynCastAllOfMatcher<Stmt, MemberExpr>
memberExpr;
1248 extern const internal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedMemberExpr>
1260 extern const internal::VariadicDynCastAllOfMatcher<Stmt,
1272 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CallExpr>
callExpr;
1302 extern const internal::VariadicDynCastAllOfMatcher<Stmt, LambdaExpr>
lambdaExpr;
1311 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXMemberCallExpr>
1323 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCMessageExpr>
1333 extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCInterfaceDecl>
1343 extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCImplementationDecl>
1353 extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCProtocolDecl>
1363 extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryDecl>
1373 extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryImplDecl>
1388 extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCMethodDecl>
1401 extern const internal::VariadicDynCastAllOfMatcher<Decl, BlockDecl>
1413 extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCIvarDecl>
1424 extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCPropertyDecl>
1433 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtThrowStmt>
1443 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtTryStmt>
1453 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtCatchStmt>
1463 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtFinallyStmt>
1473 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ExprWithCleanups>
1486 extern const internal::VariadicDynCastAllOfMatcher<Stmt, InitListExpr>
1492 internal::Matcher<Expr>, InnerMatcher) {
1493 const Expr *SyntForm =
Node.getSyntacticForm();
1494 return (SyntForm !=
nullptr &&
1495 InnerMatcher.matches(*SyntForm, Finder, Builder));
1509 extern const internal::VariadicDynCastAllOfMatcher<Stmt,
1521 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ImplicitValueInitExpr>
1539 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ParenListExpr>
1552 extern const internal::VariadicDynCastAllOfMatcher<Stmt,
1565 extern const internal::VariadicDynCastAllOfMatcher<Decl, UsingDecl>
usingDecl;
1576 extern const internal::VariadicDynCastAllOfMatcher<Decl, UsingDirectiveDecl>
1593 extern const internal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedLookupExpr>
1607 extern const internal::VariadicDynCastAllOfMatcher<Decl,
1626 extern const internal::VariadicDynCastAllOfMatcher<Decl,
1639 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ConstantExpr>
1649 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ParenExpr>
parenExpr;
1661 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXConstructExpr>
1672 extern const internal::VariadicDynCastAllOfMatcher<Stmt,
1686 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThisExpr>
1697 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBindTemporaryExpr>
1718 extern const internal::VariadicDynCastAllOfMatcher<Stmt,
1730 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNewExpr>
cxxNewExpr;
1740 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDeleteExpr>
1751 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ArraySubscriptExpr>
1763 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDefaultArgExpr>
1780 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXOperatorCallExpr>
1789 extern const internal::VariadicDynCastAllOfMatcher<Stmt, Expr>
expr;
1798 extern const internal::VariadicDynCastAllOfMatcher<Stmt, DeclRefExpr>
1812 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCIvarRefExpr>
1821 extern const internal::VariadicDynCastAllOfMatcher<Stmt, BlockExpr>
blockExpr;
1829 extern const internal::VariadicDynCastAllOfMatcher<Stmt, IfStmt>
ifStmt;
1838 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ForStmt>
forStmt;
1850 const Stmt *
const Increment =
Node.getInc();
1851 return (Increment !=
nullptr &&
1852 InnerMatcher.matches(*Increment, Finder, Builder));
1865 const Stmt *
const Init =
Node.getInit();
1866 return (Init !=
nullptr && InnerMatcher.matches(*Init, Finder, Builder));
1876 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXForRangeStmt>
1889 const VarDecl *
const Var =
Node.getLoopVariable();
1890 return (Var !=
nullptr && InnerMatcher.matches(*Var, Finder, Builder));
1903 const Expr *
const Init =
Node.getRangeInit();
1904 return (Init !=
nullptr && InnerMatcher.matches(*Init, Finder, Builder));
1915 extern const internal::VariadicDynCastAllOfMatcher<Stmt, WhileStmt>
whileStmt;
1925 extern const internal::VariadicDynCastAllOfMatcher<Stmt, DoStmt>
doStmt;
1935 extern const internal::VariadicDynCastAllOfMatcher<Stmt, BreakStmt>
breakStmt;
1945 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ContinueStmt>
1956 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ReturnStmt>
returnStmt;
1967 extern const internal::VariadicDynCastAllOfMatcher<Stmt, GotoStmt>
gotoStmt;
1978 extern const internal::VariadicDynCastAllOfMatcher<Stmt, LabelStmt>
labelStmt;
1990 extern const internal::VariadicDynCastAllOfMatcher<Stmt, AddrLabelExpr>
2001 extern const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchStmt>
switchStmt;
2011 extern const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchCase>
switchCase;
2021 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CaseStmt>
caseStmt;
2031 extern const internal::VariadicDynCastAllOfMatcher<Stmt, DefaultStmt>
2040 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundStmt>
2050 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXCatchStmt>
2060 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTryStmt>
cxxTryStmt;
2069 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThrowExpr>
2079 extern const internal::VariadicDynCastAllOfMatcher<Stmt, NullStmt>
nullStmt;
2089 extern const internal::VariadicDynCastAllOfMatcher<Stmt, AsmStmt>
asmStmt;
2097 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBoolLiteralExpr>
2107 extern const internal::VariadicDynCastAllOfMatcher<Stmt, StringLiteral>
2120 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CharacterLiteral>
2127 extern const internal::VariadicDynCastAllOfMatcher<Stmt, IntegerLiteral>
2137 extern const internal::VariadicDynCastAllOfMatcher<Stmt, FloatingLiteral>
2142 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ImaginaryLiteral>
2148 extern const internal::VariadicDynCastAllOfMatcher<Stmt, UserDefinedLiteral>
2158 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundLiteralExpr>
2162 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNullPtrLiteralExpr>
2166 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ChooseExpr>
2170 extern const internal::VariadicDynCastAllOfMatcher<Stmt, GNUNullExpr>
2178 extern const internal::VariadicDynCastAllOfMatcher<Stmt, AtomicExpr>
atomicExpr;
2186 extern const internal::VariadicDynCastAllOfMatcher<Stmt, StmtExpr>
stmtExpr;
2194 extern const internal::VariadicDynCastAllOfMatcher<Stmt, BinaryOperator>
2203 extern const internal::VariadicDynCastAllOfMatcher<Stmt, UnaryOperator>
2212 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ConditionalOperator>
2221 extern const internal::VariadicDynCastAllOfMatcher<Stmt,
2233 extern const internal::VariadicDynCastAllOfMatcher<Stmt, OpaqueValueExpr>
2249 extern const internal::VariadicDynCastAllOfMatcher<Decl, StaticAssertDecl>
2262 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXReinterpretCastExpr>
2278 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXStaticCastExpr>
2293 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDynamicCastExpr>
2304 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXConstCastExpr>
2313 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CStyleCastExpr>
2337 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ExplicitCastExpr>
2344 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ImplicitCastExpr>
2360 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CastExpr>
castExpr;
2370 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXFunctionalCastExpr>
2379 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTemporaryObjectExpr>
2388 extern const internal::VariadicDynCastAllOfMatcher<Stmt, PredefinedExpr>
2397 extern const internal::VariadicDynCastAllOfMatcher<Stmt, DesignatedInitExpr>
2412 return Node.size() == N;
2416 extern const internal::VariadicAllOfMatcher<QualType>
qualType;
2419 extern const internal::VariadicAllOfMatcher<Type>
type;
2422 extern const internal::VariadicAllOfMatcher<TypeLoc>
typeLoc;
2443 extern const internal::VariadicOperatorMatcherFunc<
2450 extern const internal::VariadicOperatorMatcherFunc<
2457 extern const internal::VariadicOperatorMatcherFunc<
2470 extern const internal::VariadicDynCastAllOfMatcher<Stmt,
2483 internal::Matcher<QualType>, InnerMatcher) {
2484 const QualType ArgumentType =
Node.getTypeOfArgument();
2485 return InnerMatcher.matches(ArgumentType, Finder, Builder);
2507 const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
2516 const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
2536 inline internal::Matcher<NamedDecl>
hasName(
const std::string &Name) {
2537 return internal::Matcher<NamedDecl>(
new internal::HasNameMatcher({Name}));
2550 extern const internal::VariadicFunction<internal::Matcher<NamedDecl>, StringRef,
2571 assert(!RegExp.empty());
2572 std::string FullNameString =
"::" +
Node.getQualifiedNameAsString();
2573 llvm::Regex RE(RegExp);
2574 return RE.match(FullNameString);
2596 inline internal::PolymorphicMatcherWithParam1<
2597 internal::HasOverloadedOperatorNameMatcher, StringRef,
2600 return internal::PolymorphicMatcherWithParam1<
2601 internal::HasOverloadedOperatorNameMatcher, StringRef,
2638 internal::Matcher<NamedDecl>,
Base) {
2640 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
2641 return Finder->classIsDerivedFrom(RD,
Base, Builder,
false);
2644 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
2645 return Finder->objcClassIsDerivedFrom(InterfaceDecl,
Base, Builder,
2653 std::string, BaseName, 1) {
2654 if (BaseName.empty())
2657 const auto M = isDerivedFrom(
hasName(BaseName));
2659 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
2660 return Matcher<CXXRecordDecl>(M).
matches(*RD, Finder, Builder);
2662 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
2663 return Matcher<ObjCInterfaceDecl>(M).
matches(*InterfaceDecl, Finder, Builder);
2669 isSameOrDerivedFrom,
2671 internal::Matcher<NamedDecl>,
Base, 0) {
2674 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
2675 return Matcher<CXXRecordDecl>(M).
matches(*RD, Finder, Builder);
2677 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
2678 return Matcher<ObjCInterfaceDecl>(M).
matches(*InterfaceDecl, Finder, Builder);
2684 isSameOrDerivedFrom,
2686 std::string, BaseName, 1) {
2687 if (BaseName.empty())
2690 const auto M = isSameOrDerivedFrom(
hasName(BaseName));
2692 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
2693 return Matcher<CXXRecordDecl>(M).
matches(*RD, Finder, Builder);
2695 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
2696 return Matcher<ObjCInterfaceDecl>(M).
matches(*InterfaceDecl, Finder, Builder);
2721 isDirectlyDerivedFrom,
2723 internal::Matcher<NamedDecl>,
Base, 0) {
2725 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
2726 return Finder->classIsDerivedFrom(RD,
Base, Builder,
true);
2729 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
2730 return Finder->objcClassIsDerivedFrom(InterfaceDecl,
Base, Builder,
2736 isDirectlyDerivedFrom,
2738 std::string, BaseName, 1) {
2739 if (BaseName.empty())
2741 const auto M = isDirectlyDerivedFrom(
hasName(BaseName));
2743 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
2744 return Matcher<CXXRecordDecl>(M).
matches(*RD, Finder, Builder);
2746 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
2747 return Matcher<ObjCInterfaceDecl>(M).
matches(*InterfaceDecl, Finder, Builder);
2762 return matchesFirstInPointerRange(InnerMatcher,
Node.method_begin(),
2763 Node.method_end(), Finder, Builder);
2776 return Node.isLambda();
2797 extern const internal::ArgumentAdaptingMatcherFunc<internal::HasMatcher>
has;
2813 extern const internal::ArgumentAdaptingMatcherFunc<
2814 internal::HasDescendantMatcher>
2835 extern const internal::ArgumentAdaptingMatcherFunc<internal::ForEachMatcher>
2865 extern const internal::ArgumentAdaptingMatcherFunc<
2866 internal::ForEachDescendantMatcher>
2885 template <
typename T>
2886 internal::Matcher<T>
findAll(
const internal::Matcher<T> &Matcher) {
2900 extern const internal::ArgumentAdaptingMatcherFunc<
2901 internal::HasParentMatcher,
2902 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc>,
2903 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc>>
2917 extern const internal::ArgumentAdaptingMatcherFunc<
2918 internal::HasAncestorMatcher,
2919 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc>,
2920 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc>>
2932 extern const internal::VariadicOperatorMatcherFunc<1, 1>
unless;
2968 inline internal::PolymorphicMatcherWithParam1<
2969 internal::HasDeclarationMatcher, internal::Matcher<Decl>,
2970 void(internal::HasDeclarationSupportedTypes)>
2972 return internal::PolymorphicMatcherWithParam1<
2973 internal::HasDeclarationMatcher, internal::Matcher<Decl>,
2974 void(internal::HasDeclarationSupportedTypes)>(InnerMatcher);
2992 return UnderlyingDecl !=
nullptr &&
2993 InnerMatcher.matches(*UnderlyingDecl, Finder, Builder);
3016 const Expr *ExprNode =
Node.getImplicitObjectArgument()
3017 ->IgnoreParenImpCasts();
3018 return (ExprNode !=
nullptr &&
3019 InnerMatcher.matches(*ExprNode, Finder, Builder));
3036 return InnerMatcher.matches(TypeDecl, Finder, Builder);
3052 return Node.isClassMethod();
3068 return Node.isInstanceMethod();
3085 return Node.isClassMessage();
3102 return Node.isInstanceMessage();
3117 const Expr *ReceiverNode =
Node.getInstanceReceiver();
3118 return (ReceiverNode !=
nullptr &&
3146 extern const internal::VariadicFunction<internal::Matcher<ObjCMessageExpr>,
3160 assert(!RegExp.empty());
3161 std::string SelectorString =
Node.getSelector().getAsString();
3162 llvm::Regex RE(RegExp);
3163 return RE.match(SelectorString);
3171 return Node.getSelector().isNull();
3183 return Node.getSelector().isUnarySelector();
3199 return Node.getSelector().isKeywordSelector();
3214 return Node.getSelector().getNumArgs() == N;
3235 const Expr *ExprNode =
Node.getCallee();
3236 return (ExprNode !=
nullptr &&
3237 InnerMatcher.matches(*ExprNode, Finder, Builder));
3271 internal::Matcher<QualType>, InnerMatcher, 0) {
3274 return InnerMatcher.matches(QT, Finder, Builder);
3299 internal::Matcher<Decl>, InnerMatcher, 1) {
3316 if (!
Node.getTypeSourceInfo())
3319 return Inner.matches(
Node.getTypeSourceInfo()->getTypeLoc(), Finder, Builder);
3332 return Name ==
Node.getAsString();
3346 QualType, pointsTo, internal::Matcher<QualType>,
3348 return (!
Node.isNull() &&
Node->isAnyPointerType() &&
3349 InnerMatcher.matches(
Node->getPointeeType(), Finder, Builder));
3356 .matches(
Node, Finder, Builder);
3371 return InnerMatcher.matches(*
Node.getUnqualifiedDesugaredType(), Finder,
3390 return (!
Node.isNull() &&
Node->isReferenceType() &&
3391 InnerMatcher.matches(
Node->getPointeeType(), Finder, Builder));
3410 return InnerMatcher.matches(
Node.getCanonicalType(), Finder, Builder);
3417 .matches(
Node, Finder, Builder);
3438 internal::Matcher<Expr>, InnerMatcher) {
3439 const Expr *ExprNode =
Node.getImplicitObjectArgument();
3440 return (ExprNode !=
nullptr &&
3441 InnerMatcher.matches(*ExprNode, Finder, Builder));
3461 internal::Matcher<QualType>, InnerMatcher, 0) {
3462 return onImplicitObjectArgument(
3463 anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))))
3464 .matches(
Node, Finder, Builder);
3469 internal::Matcher<Decl>, InnerMatcher, 1) {
3470 return onImplicitObjectArgument(
3471 anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))))
3472 .matches(
Node, Finder, Builder);
3486 const Decl *DeclNode =
Node.getDecl();
3487 return (DeclNode !=
nullptr &&
3488 InnerMatcher.matches(*DeclNode, Finder, Builder));
3506 internal::Matcher<UsingShadowDecl>, InnerMatcher) {
3509 return InnerMatcher.matches(*
UsingDecl, Finder, Builder);
3530 return matchesFirstInPointerRange(InnerMatcher,
Node.decls_begin(),
3531 Node.decls_end(), Finder, Builder);
3544 if (
Node.isSingleDecl()) {
3545 const Decl *FoundDecl =
Node.getSingleDecl();
3546 return InnerMatcher.matches(*FoundDecl, Finder, Builder);
3560 VarDecl, hasInitializer, internal::Matcher<Expr>,
3563 return (Initializer !=
nullptr &&
3564 InnerMatcher.matches(*Initializer, Finder, Builder));
3578 return Node.isStaticLocal();
3593 return Node.hasLocalStorage();
3607 return Node.hasGlobalStorage();
3674 return Node.isExceptionVariable();
3690 return Node.getNumArgs() == N;
3705 unsigned, N, internal::Matcher<Expr>, InnerMatcher) {
3706 return (N <
Node.getNumArgs() &&
3707 InnerMatcher.matches(
3708 *
Node.getArg(N)->IgnoreParenImpCasts(), Finder, Builder));
3719 ast_matchers::internal::Matcher<Expr>, InnerMatcher) {
3720 return N <
Node.getNumInits() &&
3721 InnerMatcher.matches(*
Node.getInit(N), Finder, Builder);
3759 internal::Matcher<Decl>, InnerMatcher) {
3764 std::advance(Iterator, N);
3765 return InnerMatcher.matches(**Iterator, Finder, Builder);
3782 return Node.getExceptionDecl() ==
nullptr;
3799 internal::Matcher<CXXCtorInitializer>, InnerMatcher) {
3800 return matchesFirstInPointerRange(InnerMatcher,
Node.init_begin(),
3801 Node.init_end(), Finder, Builder);
3818 internal::Matcher<FieldDecl>, InnerMatcher) {
3820 return (NodeAsDecl !=
nullptr &&
3821 InnerMatcher.matches(*NodeAsDecl, Finder, Builder));
3838 internal::Matcher<Expr>, InnerMatcher) {
3839 const Expr* NodeAsExpr =
Node.getInit();
3840 return (NodeAsExpr !=
nullptr &&
3841 InnerMatcher.matches(*NodeAsExpr, Finder, Builder));
3858 return Node.isWritten();
3878 return Node.isBaseInitializer();
3898 return Node.isMemberInitializer();
3924 internal::Matcher<Expr>, InnerMatcher) {
3925 for (
const Expr *Arg :
Node.arguments()) {
3926 BoundNodesTreeBuilder Result(*Builder);
3927 if (InnerMatcher.matches(*Arg, Finder, &Result)) {
3928 *Builder = std::move(Result);
3937 return Node.isListInitialization();
3953 return Node.requiresZeroInitialization();
3980 unsigned, N, internal::Matcher<ParmVarDecl>,
3982 return (N <
Node.parameters().size()
3983 && InnerMatcher.matches(*
Node.parameters()[N], Finder, Builder));
4007 internal::Matcher<Expr>, ArgMatcher,
4008 internal::Matcher<ParmVarDecl>, ParamMatcher) {
4009 BoundNodesTreeBuilder Result;
4013 BoundNodesTreeBuilder Matches;
4015 .matches(
Node, Finder, &Matches)
4019 bool Matched =
false;
4020 for (; ArgIndex <
Node.getNumArgs(); ++ArgIndex) {
4021 BoundNodesTreeBuilder ArgMatches(*Builder);
4022 if (ArgMatcher.matches(*(
Node.getArg(ArgIndex)->IgnoreParenCasts()),
4023 Finder, &ArgMatches)) {
4024 BoundNodesTreeBuilder ParamMatches(ArgMatches);
4026 hasParameter(ParamIndex, ParamMatcher)))),
4028 hasParameter(ParamIndex, ParamMatcher))))))
4030 Result.addMatch(ParamMatches);
4036 *Builder = std::move(Result);
4075 internal::Matcher<ParmVarDecl>,
4077 return matchesFirstInPointerRange(InnerMatcher,
Node.param_begin(),
4078 Node.param_end(), Finder, Builder);
4102 return Node.getNumParams() == N;
4130 internal::Matcher<QualType>, InnerMatcher) {
4131 return InnerMatcher.matches(
Node.getReturnType(), Finder, Builder);
4151 return Node.isExternC();
4184 return Node.isDeleted();
4197 return Node.isDefaulted();
4219 return FnTy->hasDynamicExceptionSpec();
4272 return Node.isConstexpr();
4286 internal::Matcher<Expr>, InnerMatcher) {
4287 const Expr *
const Condition =
Node.getCond();
4288 return (Condition !=
nullptr &&
4289 InnerMatcher.matches(*Condition, Finder, Builder));
4300 const Stmt *
const Then =
Node.getThen();
4301 return (Then !=
nullptr && InnerMatcher.matches(*Then, Finder, Builder));
4312 const Stmt *
const Else =
Node.getElse();
4313 return (Else !=
nullptr && InnerMatcher.matches(*Else, Finder, Builder));
4347 internal::NotEqualsBoundNodePredicate Predicate;
4350 return Builder->removeBindings(Predicate);
4362 internal::Matcher<DeclStmt>, InnerMatcher) {
4363 const DeclStmt*
const DeclarationStatement =
4364 Node.getConditionVariableDeclStmt();
4365 return DeclarationStatement !=
nullptr &&
4366 InnerMatcher.matches(*DeclarationStatement, Finder, Builder);
4379 internal::Matcher<Expr>, InnerMatcher) {
4380 if (
const Expr* Expression =
Node.getIdx())
4381 return InnerMatcher.matches(*Expression, Finder, Builder);
4396 internal::Matcher<Expr>, InnerMatcher) {
4397 if (
const Expr* Expression =
Node.getBase())
4398 return InnerMatcher.matches(*Expression, Finder, Builder);
4418 internal::Matcher<Stmt>, InnerMatcher) {
4419 const Stmt *
const Statement = internal::GetBodyMatcher<NodeType>::get(
Node);
4420 return (Statement !=
nullptr &&
4421 InnerMatcher.matches(*Statement, Finder, Builder));
4438 internal::Matcher<Stmt>, InnerMatcher) {
4440 return CS && matchesFirstInPointerRange(InnerMatcher, CS->
body_begin(),
4455 return Node.size() == N;
4483 template <
typename ValueT>
4484 internal::PolymorphicMatcherWithParam1<internal::ValueEqualsMatcher, ValueT>
4486 return internal::PolymorphicMatcherWithParam1<
4487 internal::ValueEqualsMatcher,
4496 return internal::ValueEqualsMatcher<NodeType, ParamT>(
Value)
4504 unsigned,
Value, 1) {
4505 return internal::ValueEqualsMatcher<NodeType, ParamT>(
Value)
4515 return internal::ValueEqualsMatcher<NodeType, ParamT>(
Value)
4529 std::string, Name) {
4530 return Name ==
Node.getOpcodeStr(
Node.getOpcode());
4550 return Node.isAssignmentOp();
4562 internal::Matcher<Expr>, InnerMatcher) {
4563 const Expr *LeftHandSide =
Node.getLHS();
4564 return (LeftHandSide !=
nullptr &&
4565 InnerMatcher.matches(*LeftHandSide, Finder, Builder));
4577 internal::Matcher<Expr>, InnerMatcher) {
4578 const Expr *RightHandSide =
Node.getRHS();
4579 return (RightHandSide !=
nullptr &&
4580 InnerMatcher.matches(*RightHandSide, Finder, Builder));
4586 const internal::Matcher<Expr> &InnerMatcher) {
4587 return anyOf(hasLHS(InnerMatcher), hasRHS(InnerMatcher));
4598 internal::Matcher<Expr>, InnerMatcher) {
4599 const Expr *
const Operand =
Node.getSubExpr();
4600 return (Operand !=
nullptr &&
4601 InnerMatcher.matches(*Operand, Finder, Builder));
4622 internal::Matcher<Expr>, InnerMatcher) {
4623 const Expr *
const SubExpression =
4624 internal::GetSourceExpressionMatcher<NodeType>::get(
Node);
4625 return (SubExpression !=
nullptr &&
4626 InnerMatcher.matches(*SubExpression, Finder, Builder));
4648 internal::Matcher<QualType>, InnerMatcher) {
4650 return InnerMatcher.matches(NodeType, Finder, Builder);
4658 internal::Matcher<QualType>, InnerMatcher) {
4659 return InnerMatcher.matches(
Node.getType(), Finder, Builder);
4671 return Node.isStruct();
4683 return Node.isUnion();
4695 return Node.isClass();
4710 internal::Matcher<Expr>, InnerMatcher) {
4711 const Expr *Expression =
Node.getTrueExpr();
4712 return (Expression !=
nullptr &&
4713 InnerMatcher.matches(*Expression, Finder, Builder));
4725 internal::Matcher<Expr>, InnerMatcher) {
4726 const Expr *Expression =
Node.getFalseExpr();
4727 return (Expression !=
nullptr &&
4728 InnerMatcher.matches(*Expression, Finder, Builder));
4755 return Node.isThisDeclarationADefinition();
4769 return Node.isVariadic();
4790 internal::Matcher<CXXRecordDecl>, InnerMatcher) {
4792 return (Parent !=
nullptr &&
4793 InnerMatcher.matches(*Parent, Finder, Builder));
4821 internal::Matcher<CXXMethodDecl>, InnerMatcher) {
4822 BoundNodesTreeBuilder Result;
4823 bool Matched =
false;
4824 for (
const auto *Overridden :
Node.overridden_methods()) {
4825 BoundNodesTreeBuilder OverriddenBuilder(*Builder);
4826 const bool OverriddenMatched =
4827 InnerMatcher.matches(*Overridden, Finder, &OverriddenBuilder);
4828 if (OverriddenMatched) {
4830 Result.addMatch(OverriddenBuilder);
4833 *Builder = std::move(Result);
4848 return Node.isVirtual();
4866 return Node.isVirtualAsWritten();
4887 return Node.template hasAttr<FinalAttr>();
4901 return Node.isPure();
4916 return Node.isConst();
4933 return Node.isCopyAssignmentOperator();
4950 return Node.isMoveAssignmentOperator();
4968 return Node.size_overridden_methods() > 0 ||
Node.hasAttr<OverrideAttr>();
4983 return Node.isUserProvided();
5013 return Node.isArrow();
5027 return Node->isIntegerType();
5041 return Node->isUnsignedIntegerType();
5055 return Node->isSignedIntegerType();
5069 return Node->isAnyCharacterType();
5089 return Node->isAnyPointerType();
5108 return Node.isConstQualified();
5127 return Node.isVolatileQualified();
5144 return Node.hasLocalQualifiers();
5160 internal::Matcher<ValueDecl>, InnerMatcher) {
5161 return InnerMatcher.matches(*
Node.getMemberDecl(), Finder, Builder);
5181 hasObjectExpression,
5184 internal::Matcher<Expr>, InnerMatcher) {
5185 if (
const auto *E = dyn_cast<UnresolvedMemberExpr>(&
Node))
5186 if (E->isImplicitAccess())
5188 if (
const auto *E = dyn_cast<CXXDependentScopeMemberExpr>(&
Node))
5189 if (E->isImplicitAccess())
5191 return InnerMatcher.matches(*
Node.getBase(), Finder, Builder);
5204 internal::Matcher<UsingShadowDecl>, InnerMatcher) {
5205 return matchesFirstInPointerRange(InnerMatcher,
Node.shadow_begin(),
5206 Node.shadow_end(), Finder, Builder);
5222 internal::Matcher<NamedDecl>, InnerMatcher) {
5223 return InnerMatcher.matches(*
Node.getTargetDecl(), Finder, Builder);
5257 Node.getTemplateSpecializationKind() ==
5259 Node.getTemplateSpecializationKind() ==
5321 internal::Matcher<QualType>, InnerMatcher, 0) {
5322 return internal::BindableMatcher<TypeLoc>(
5323 new internal::TypeLocTypeMatcher(InnerMatcher));
5335 return Node.isBooleanType();
5347 return Node.isVoidType();
5350 template <
typename NodeType>
5399 return Node.isRealFloatingType();
5452 return internal::HasSizeMatcher<NodeType>::hasSize(
Node, N);
5508 internal::Matcher<Expr>, InnerMatcher) {
5509 return InnerMatcher.matches(*
Node.getSizeExpr(), Finder, Builder);
5754 pointee, getPointee,
5875 internal::Matcher<NestedNameSpecifier>, InnerMatcher) {
5877 return InnerMatcher.matches(*Qualifier, Finder, Builder);
5899 return InnerMatcher.matches(
Node.getNamedType(), Finder, Builder);
5930 hasReplacementType, getReplacementType,
5969 return InnerType.matches(
Node.getDecayedType(), Finder, Builder);
5988 if (!DC)
return false;
6005 extern const internal::VariadicAllOfMatcher<NestedNameSpecifier>
6009 extern const internal::VariadicAllOfMatcher<NestedNameSpecifierLoc>
6015 internal::BindableMatcher<NestedNameSpecifierLoc>, loc,
6016 internal::Matcher<NestedNameSpecifier>, InnerMatcher, 1) {
6017 return internal::BindableMatcher<NestedNameSpecifierLoc>(
6018 new internal::LocMatcher<NestedNameSpecifierLoc, NestedNameSpecifier>(
6035 internal::Matcher<QualType>, InnerMatcher) {
6036 if (!
Node.getAsType())
6038 return InnerMatcher.matches(
QualType(
Node.getAsType(), 0), Finder, Builder);
6053 internal::Matcher<TypeLoc>, InnerMatcher) {
6054 return Node &&
Node.getNestedNameSpecifier()->getAsType() &&
6055 InnerMatcher.matches(
Node.getTypeLoc(), Finder, Builder);
6068 internal::Matcher<NestedNameSpecifier>, InnerMatcher,
6073 return InnerMatcher.matches(*NextNode, Finder, Builder);
6086 internal::Matcher<NestedNameSpecifierLoc>, InnerMatcher,
6091 return InnerMatcher.matches(NextNode, Finder, Builder);
6105 internal::Matcher<NamespaceDecl>, InnerMatcher) {
6106 if (!
Node.getAsNamespace())
6108 return InnerMatcher.matches(*
Node.getAsNamespace(), Finder, Builder);
6119 return &
Node == Other;
6125 return &
Node == Other;
6131 return &
Node == Other;
6149 BoundNodesTreeBuilder Result;
6154 bool Matched =
false;
6156 SC = SC->getNextSwitchCase()) {
6157 BoundNodesTreeBuilder CaseBuilder(*Builder);
6158 bool CaseMatched = InnerMatcher.matches(*SC, Finder, &CaseBuilder);
6161 Result.addMatch(CaseBuilder);
6164 *Builder = std::move(Result);
6179 internal::Matcher<CXXCtorInitializer>, InnerMatcher) {
6180 BoundNodesTreeBuilder Result;
6181 bool Matched =
false;
6182 for (
const auto *I :
Node.inits()) {
6183 BoundNodesTreeBuilder InitBuilder(*Builder);
6184 if (InnerMatcher.matches(*I, Finder, &InitBuilder)) {
6186 Result.addMatch(InitBuilder);
6189 *Builder = std::move(Result);
6205 return Node.isCopyConstructor();
6220 return Node.isMoveConstructor();
6235 return Node.isDefaultConstructor();
6252 return Node.isDelegatingConstructor();
6280 return Node.isExplicit();
6309 return InnerMatcher.matches(*ES.
getExpr(), Finder, Builder);
6330 if (
const auto *FD = dyn_cast<FunctionDecl>(&
Node))
6331 return FD->isInlineSpecified();
6332 else if (
const auto *NSD = dyn_cast<NamespaceDecl>(&
Node))
6333 return NSD->isInline();
6334 llvm_unreachable(
"Not a valid polymorphic type");
6347 return Node.isAnonymousNamespace();
6387 return InnerMatcher.matches(*
Node.getLHS(), Finder, Builder);
6400 for (
const auto *
Attr :
Node.attrs()) {