44#ifndef LLVM_CLANG_ASTMATCHERS_ASTMATCHERS_H
45#define LLVM_CLANG_ASTMATCHERS_ASTMATCHERS_H
84#include "llvm/ADT/ArrayRef.h"
85#include "llvm/ADT/SmallVector.h"
86#include "llvm/ADT/StringExtras.h"
87#include "llvm/ADT/StringRef.h"
88#include "llvm/Support/Casting.h"
89#include "llvm/Support/Compiler.h"
90#include "llvm/Support/ErrorHandling.h"
91#include "llvm/Support/Regex.h"
102namespace ast_matchers {
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()) {
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,
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));
779 return Node.isImplicit();
804 hasAnyTemplateArgument,
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>
871internal::TraversalWrapper<
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);
1037 return Node.isInstantiationDependent();
1085 hasTemplateArgument,
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,
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));
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));
2283 return (
Init !=
nullptr && InnerMatcher.matches(*
Init, Finder, Builder));
2294extern const internal::VariadicDynCastAllOfMatcher<Stmt, WhileStmt>
whileStmt;
2304extern const internal::VariadicDynCastAllOfMatcher<Stmt, DoStmt>
doStmt;
2314extern const internal::VariadicDynCastAllOfMatcher<Stmt, BreakStmt>
breakStmt;
2324extern const internal::VariadicDynCastAllOfMatcher<Stmt, ContinueStmt>
2335extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoreturnStmt>
2346extern const internal::VariadicDynCastAllOfMatcher<Stmt, ReturnStmt>
returnStmt;
2357extern const internal::VariadicDynCastAllOfMatcher<Stmt, GotoStmt>
gotoStmt;
2368extern const internal::VariadicDynCastAllOfMatcher<Stmt, LabelStmt>
labelStmt;
2380extern const internal::VariadicDynCastAllOfMatcher<Stmt, AddrLabelExpr>
2391extern const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchStmt>
switchStmt;
2401extern const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchCase>
switchCase;
2411extern const internal::VariadicDynCastAllOfMatcher<Stmt, CaseStmt>
caseStmt;
2421extern const internal::VariadicDynCastAllOfMatcher<Stmt, DefaultStmt>
2430extern const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundStmt>
2440extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXCatchStmt>
2450extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTryStmt>
cxxTryStmt;
2459extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThrowExpr>
2469extern const internal::VariadicDynCastAllOfMatcher<Stmt, NullStmt>
nullStmt;
2479extern const internal::VariadicDynCastAllOfMatcher<Stmt, AsmStmt>
asmStmt;
2487extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBoolLiteralExpr>
2497extern const internal::VariadicDynCastAllOfMatcher<Stmt, StringLiteral>
2510extern const internal::VariadicDynCastAllOfMatcher<Stmt, CharacterLiteral>
2517extern const internal::VariadicDynCastAllOfMatcher<Stmt, IntegerLiteral>
2527extern const internal::VariadicDynCastAllOfMatcher<Stmt, FloatingLiteral>
2532extern const internal::VariadicDynCastAllOfMatcher<Stmt, ImaginaryLiteral>
2557extern const internal::VariadicDynCastAllOfMatcher<Stmt, FixedPointLiteral>
2563extern const internal::VariadicDynCastAllOfMatcher<Stmt, UserDefinedLiteral>
2573extern const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundLiteralExpr>
2584extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoawaitExpr>
2587extern const internal::VariadicDynCastAllOfMatcher<Stmt, DependentCoawaitExpr>
2597extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoyieldExpr>
2608extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoroutineBodyStmt>
2612extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNullPtrLiteralExpr>
2616extern const internal::VariadicDynCastAllOfMatcher<Stmt, ChooseExpr>
2620extern const internal::VariadicDynCastAllOfMatcher<Stmt, ConvertVectorExpr>
2624extern const internal::VariadicDynCastAllOfMatcher<Stmt, GNUNullExpr>
2628extern const internal::VariadicDynCastAllOfMatcher<Stmt, GenericSelectionExpr>
2636extern const internal::VariadicDynCastAllOfMatcher<Stmt, AtomicExpr>
atomicExpr;
2644extern const internal::VariadicDynCastAllOfMatcher<Stmt, StmtExpr>
stmtExpr;
2653extern const internal::VariadicDynCastAllOfMatcher<Stmt, BinaryOperator>
2662extern const internal::VariadicDynCastAllOfMatcher<Stmt, UnaryOperator>
2671extern const internal::VariadicDynCastAllOfMatcher<Stmt, ConditionalOperator>
2680extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
2692extern const internal::VariadicDynCastAllOfMatcher<Stmt, OpaqueValueExpr>
2708extern const internal::VariadicDynCastAllOfMatcher<Decl, StaticAssertDecl>
2721extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXReinterpretCastExpr>
2737extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXStaticCastExpr>
2752extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDynamicCastExpr>
2763extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXConstCastExpr>
2772extern const internal::VariadicDynCastAllOfMatcher<Stmt, CStyleCastExpr>
2796extern const internal::VariadicDynCastAllOfMatcher<Stmt, ExplicitCastExpr>
2803extern const internal::VariadicDynCastAllOfMatcher<Stmt, ImplicitCastExpr>
2819extern const internal::VariadicDynCastAllOfMatcher<Stmt, CastExpr>
castExpr;
2829extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXFunctionalCastExpr>
2838extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTemporaryObjectExpr>
2847extern const internal::VariadicDynCastAllOfMatcher<Stmt, PredefinedExpr>
2856extern const internal::VariadicDynCastAllOfMatcher<Stmt, DesignatedInitExpr>
2871 return Node.size() == N;
2875extern const internal::VariadicAllOfMatcher<QualType>
qualType;
2878extern const internal::VariadicAllOfMatcher<Type>
type;
2881extern const internal::VariadicAllOfMatcher<TypeLoc>
typeLoc;
2902extern const internal::VariadicOperatorMatcherFunc<
2903 2, std::numeric_limits<unsigned>::max()>
2909extern const internal::VariadicOperatorMatcherFunc<
2910 2, std::numeric_limits<unsigned>::max()>
2916extern const internal::VariadicOperatorMatcherFunc<
2917 2, std::numeric_limits<unsigned>::max()>
2944extern const internal::VariadicOperatorMatcherFunc<1, 1>
optionally;
2955extern const internal::VariadicDynCastAllOfMatcher<
Stmt,
2984template <
typename T,
typename...
U>
2985auto mapAnyOf(internal::VariadicDynCastAllOfMatcher<T, U>
const &...) {
2986 return internal::MapAnyOfHelper<
U...>();
3099extern const internal::MapAnyOfMatcher<CallExpr, CXXConstructExpr>
invocation;
3110 internal::Matcher<QualType>, InnerMatcher) {
3111 const QualType ArgumentType =
Node.getTypeOfArgument();
3112 return InnerMatcher.matches(ArgumentType, Finder, Builder);
3134 const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
3136 allOf(
anyOf(ofKind(UETT_AlignOf), ofKind(UETT_PreferredAlignOf)),
3143 const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
3145 allOf(ofKind(UETT_SizeOf), InnerMatcher)));
3163inline internal::Matcher<NamedDecl>
hasName(StringRef Name) {
3164 return internal::Matcher<NamedDecl>(
3165 new internal::HasNameMatcher({std::string(Name)}));
3178extern const internal::VariadicFunction<internal::Matcher<NamedDecl>, StringRef,
3199 std::string FullNameString =
"::" +
Node.getQualifiedNameAsString();
3200 return RegExp->match(FullNameString);
3222inline internal::PolymorphicMatcher<
3223 internal::HasOverloadedOperatorNameMatcher,
3225 std::vector<std::string>>
3227 return internal::PolymorphicMatcher<
3228 internal::HasOverloadedOperatorNameMatcher,
3230 std::vector<std::string>>({std::string(Name)});
3241extern const internal::VariadicFunction<
3242 internal::PolymorphicMatcher<internal::HasOverloadedOperatorNameMatcher,
3245 std::vector<std::string>>,
3270 return Node.getMember().getAsString() == N;
3308 std::string, BindingID) {
3309 auto MemberName =
Node.getMember().getAsString();
3311 return Builder->removeBindings(
3312 [
this, MemberName](
const BoundNodesMap &
Nodes) {
3315 if (!isa<FieldDecl, CXXMethodDecl, VarDecl>(ND))
3317 return ND->getName() != MemberName;
3343 return internal::getDependentName(
Node) == N;
3379 internal::Matcher<NamedDecl>,
Base) {
3381 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
3382 return Finder->classIsDerivedFrom(RD,
Base, Builder,
false);
3385 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
3386 return Finder->objcClassIsDerivedFrom(InterfaceDecl,
Base, Builder,
3394 std::string, BaseName, 1) {
3395 if (BaseName.empty())
3398 const auto M = isDerivedFrom(
hasName(BaseName));
3400 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
3401 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3403 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
3404 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3441 return Node.hasDefinition() &&
3443 return BaseSpecMatcher.matches(Base, Finder, Builder);
3450 isSameOrDerivedFrom,
3452 internal::Matcher<NamedDecl>,
Base, 0) {
3455 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
3456 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3458 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
3459 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3465 isSameOrDerivedFrom,
3467 std::string, BaseName, 1) {
3468 if (BaseName.empty())
3471 const auto M = isSameOrDerivedFrom(
hasName(BaseName));
3473 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
3474 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3476 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
3477 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3502 isDirectlyDerivedFrom,
3504 internal::Matcher<NamedDecl>,
Base, 0) {
3506 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
3507 return Finder->classIsDerivedFrom(RD,
Base, Builder,
true);
3510 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
3511 return Finder->objcClassIsDerivedFrom(InterfaceDecl,
Base, Builder,
3517 isDirectlyDerivedFrom,
3519 std::string, BaseName, 1) {
3520 if (BaseName.empty())
3522 const auto M = isDirectlyDerivedFrom(
hasName(BaseName));
3524 if (
const auto *RD = dyn_cast<CXXRecordDecl>(&
Node))
3525 return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3527 const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&
Node);
3528 return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3543 BoundNodesTreeBuilder
Result(*Builder);
3544 auto MatchIt = matchesFirstInPointerRange(InnerMatcher,
Node.method_begin(),
3546 if (MatchIt ==
Node.method_end())
3549 if (Finder->isTraversalIgnoringImplicitNodes() && (*MatchIt)->isImplicit())
3551 *Builder = std::move(
Result);
3565 return Node.isLambda();
3586extern const internal::ArgumentAdaptingMatcherFunc<internal::HasMatcher>
has;
3602extern const internal::ArgumentAdaptingMatcherFunc<
3603 internal::HasDescendantMatcher>
3624extern const internal::ArgumentAdaptingMatcherFunc<internal::ForEachMatcher>
3654extern const internal::ArgumentAdaptingMatcherFunc<
3655 internal::ForEachDescendantMatcher>
3674template <
typename T>
3675internal::Matcher<T>
findAll(
const internal::Matcher<T> &Matcher) {
3689extern const internal::ArgumentAdaptingMatcherFunc<
3690 internal::HasParentMatcher,
3691 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>,
3692 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>>
3706extern const internal::ArgumentAdaptingMatcherFunc<
3707 internal::HasAncestorMatcher,
3708 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>,
3709 internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>>
3721extern const internal::VariadicOperatorMatcherFunc<1, 1>
unless;
3757inline internal::PolymorphicMatcher<
3758 internal::HasDeclarationMatcher,
3759 void(internal::HasDeclarationSupportedTypes), internal::Matcher<Decl>>
3761 return internal::PolymorphicMatcher<
3762 internal::HasDeclarationMatcher,
3763 void(internal::HasDeclarationSupportedTypes), internal::Matcher<Decl>>(
3782 return UnderlyingDecl !=
nullptr &&
3783 InnerMatcher.matches(*UnderlyingDecl, Finder, Builder);
3806 const Expr *ExprNode =
Node.getImplicitObjectArgument()
3807 ->IgnoreParenImpCasts();
3808 return (ExprNode !=
nullptr &&
3809 InnerMatcher.matches(*ExprNode, Finder, Builder));
3826 return InnerMatcher.matches(
TypeDecl, Finder, Builder);
3842 return Node.isClassMethod();
3858 return Node.isInstanceMethod();
3875 return Node.isClassMessage();
3892 return Node.isInstanceMessage();
3907 const Expr *ReceiverNode =
Node.getInstanceReceiver();
3908 return (ReceiverNode !=
nullptr &&
3935extern const internal::VariadicFunction<internal::Matcher<ObjCMessageExpr>,
3949 std::string SelectorString =
Node.getSelector().getAsString();
3950 return RegExp->match(SelectorString);
3958 return Node.getSelector().isNull();
3970 return Node.getSelector().isUnarySelector();
3986 return Node.getSelector().isKeywordSelector();
4001 return Node.getSelector().getNumArgs() == N;
4040 internal::Matcher<Stmt>, InnerMatcher, 0) {
4041 const auto *ExprNode =
Node.getCallee();
4042 return (ExprNode !=
nullptr &&
4043 InnerMatcher.matches(*ExprNode, Finder, Builder));
4069 internal::Matcher<Decl>, InnerMatcher, 1) {
4070 if (isa<CallExpr>(&
Node))
4072 .matches(
Node, Finder, Builder);
4076 const auto *MsgNode = cast<ObjCMessageExpr>(&
Node);
4077 const Decl *DeclNode = MsgNode->getMethodDecl();
4078 return (DeclNode !=
nullptr &&
4079 InnerMatcher.matches(*DeclNode, Finder, Builder));
4103 internal::Matcher<QualType>, InnerMatcher, 0) {
4106 return InnerMatcher.matches(QT, Finder, Builder);
4144 internal::Matcher<Decl>, InnerMatcher, 1) {
4188 internal::Matcher<TypeLoc>, Inner) {
4190 if (source ==
nullptr) {
4194 return Inner.matches(source->
getTypeLoc(), Finder, Builder);
4207 return Name ==
Node.getAsString();
4221 QualType, pointsTo, internal::Matcher<QualType>,
4223 return (!
Node.isNull() &&
Node->isAnyPointerType() &&
4224 InnerMatcher.matches(
Node->getPointeeType(), Finder, Builder));
4231 .matches(
Node, Finder, Builder);
4246 return InnerMatcher.matches(*
Node.getUnqualifiedDesugaredType(), Finder,
4265 return (!
Node.isNull() &&
Node->isReferenceType() &&
4266 InnerMatcher.matches(
Node->getPointeeType(), Finder, Builder));
4285 return InnerMatcher.matches(
Node.getCanonicalType(), Finder, Builder);
4292 .matches(
Node, Finder, Builder);
4313 internal::Matcher<Expr>, InnerMatcher) {
4314 const Expr *ExprNode =
Node.getImplicitObjectArgument();
4315 return (ExprNode !=
nullptr &&
4316 InnerMatcher.matches(*ExprNode, Finder, Builder));
4336 internal::Matcher<QualType>, InnerMatcher, 0) {
4337 return onImplicitObjectArgument(
4338 anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))))
4339 .matches(
Node, Finder, Builder);
4344 internal::Matcher<Decl>, InnerMatcher, 1) {
4345 return onImplicitObjectArgument(
4346 anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))))
4347 .matches(
Node, Finder, Builder);
4361 const Decl *DeclNode =
Node.getDecl();
4362 return (DeclNode !=
nullptr &&
4363 InnerMatcher.matches(*DeclNode, Finder, Builder));
4390 internal::Matcher<UsingShadowDecl>, Inner) {
4392 if constexpr (std::is_same_v<NodeType, UsingType>) {
4393 FoundDecl =
Node.getDecl();
4395 static_assert(std::is_same_v<NodeType, DeclRefExpr>);
4396 FoundDecl =
Node.getFoundDecl();
4399 return Inner.matches(*
UsingDecl, Finder, Builder);
4420 return matchesFirstInPointerRange(InnerMatcher,
Node.decls_begin(),
4421 Node.decls_end(), Finder,
4422 Builder) !=
Node.decls_end();
4435 if (
Node.isSingleDecl()) {
4436 const Decl *FoundDecl =
Node.getSingleDecl();
4437 return InnerMatcher.matches(*FoundDecl, Finder, Builder);
4451 VarDecl, hasInitializer, internal::Matcher<Expr>,
4455 InnerMatcher.matches(*
Initializer, Finder, Builder));
4481 internal::Matcher<LambdaCapture>, InnerMatcher) {
4482 BoundNodesTreeBuilder
Result;
4483 bool Matched =
false;
4485 if (Finder->isTraversalIgnoringImplicitNodes() &&
Capture.isImplicit())
4487 BoundNodesTreeBuilder CaptureBuilder(*Builder);
4488 if (InnerMatcher.matches(
Capture, Finder, &CaptureBuilder)) {
4490 Result.addMatch(CaptureBuilder);
4493 *Builder = std::move(
Result);
4508 return Node.isStaticLocal();
4523 return Node.hasLocalStorage();
4537 return Node.hasGlobalStorage();
4604 return Node.isExceptionVariable();
4620 unsigned NumArgs =
Node.getNumArgs();
4621 if (!Finder->isTraversalIgnoringImplicitNodes())
4622 return NumArgs == N;
4624 if (!isa<CXXDefaultArgExpr>(
Node.getArg(NumArgs - 1)))
4628 return NumArgs == N;
4647 unsigned NumArgs =
Node.getNumArgs();
4648 if (!Finder->isTraversalIgnoringImplicitNodes())
4649 return NumArgs >= N;
4651 if (!isa<CXXDefaultArgExpr>(
Node.getArg(NumArgs - 1)))
4655 return NumArgs >= N;
4670 unsigned, N, internal::Matcher<Expr>, InnerMatcher) {
4671 if (N >=
Node.getNumArgs())
4674 if (Finder->isTraversalIgnoringImplicitNodes() && isa<CXXDefaultArgExpr>(Arg))
4697 const auto *
const Init =
Node.getInit();
4698 return Init && InnerMacher.matches(*
Init, Finder, Builder);
4719 const Expr *
const Pattern =
Node.getPattern();
4720 return Pattern && InnerMacher.matches(*Pattern, Finder, Builder);
4801 return N <
Node.getNumInits() &&
4802 InnerMatcher.matches(*
Node.getInit(N), Finder, Builder);
4840 internal::Matcher<Decl>, InnerMatcher) {
4841 const unsigned NumDecls = std::distance(
Node.decl_begin(),
Node.decl_end());
4845 std::advance(Iterator, N);
4846 return InnerMatcher.matches(**Iterator, Finder, Builder);
4863 return Node.getExceptionDecl() ==
nullptr;
4880 internal::Matcher<CXXCtorInitializer>, InnerMatcher) {
4881 auto MatchIt = matchesFirstInPointerRange(InnerMatcher,
Node.init_begin(),
4882 Node.init_end(), Finder, Builder);
4883 if (MatchIt ==
Node.init_end())
4885 return (*MatchIt)->isWritten() || !Finder->isTraversalIgnoringImplicitNodes();
4902 internal::Matcher<FieldDecl>, InnerMatcher) {
4904 return (NodeAsDecl !=
nullptr &&
4905 InnerMatcher.matches(*NodeAsDecl, Finder, Builder));
4922 internal::Matcher<Expr>, InnerMatcher) {
4923 const Expr* NodeAsExpr =
Node.getInit();
4924 return (NodeAsExpr !=
nullptr &&
4925 InnerMatcher.matches(*NodeAsExpr, Finder, Builder));
4942 return Node.isWritten();
4962 return Node.isBaseInitializer();
4982 return Node.isMemberInitializer();
5008 internal::Matcher<Expr>, InnerMatcher) {
5009 for (
const Expr *Arg :
Node.arguments()) {
5010 if (Finder->isTraversalIgnoringImplicitNodes() &&
5011 isa<CXXDefaultArgExpr>(Arg))
5013 BoundNodesTreeBuilder
Result(*Builder);
5014 if (InnerMatcher.matches(*Arg, Finder, &
Result)) {
5015 *Builder = std::move(
Result);
5034extern const internal::VariadicAllOfMatcher<LambdaCapture>
lambdaCapture;
5051 clang::ast_matchers::internal::BoundNodesTreeBuilder
Result(*Builder);
5053 *Builder = std::move(
Result);
5077 if (!
Node.capturesVariable())
5079 auto *capturedVar =
Node.getCapturedVar();
5080 return capturedVar && InnerMatcher.matches(*capturedVar, Finder, Builder);
5101 return Node.isListInitialization();
5117 return Node.requiresZeroInitialization();
5144 unsigned, N, internal::Matcher<ParmVarDecl>,
5146 return (N <
Node.parameters().size()
5147 && InnerMatcher.matches(*
Node.parameters()[N], Finder, Builder));
5166 return Node.isExplicitObjectMemberFunction();
5190 internal::Matcher<Expr>, ArgMatcher,
5191 internal::Matcher<ParmVarDecl>, ParamMatcher) {
5192 BoundNodesTreeBuilder
Result;
5196 BoundNodesTreeBuilder Matches;
5200 .matches(
Node, Finder, &Matches)
5204 bool Matched =
false;
5205 for (; ArgIndex <
Node.getNumArgs(); ++ArgIndex) {
5206 BoundNodesTreeBuilder ArgMatches(*Builder);
5207 if (ArgMatcher.matches(*(
Node.getArg(ArgIndex)->IgnoreParenCasts()),
5208 Finder, &ArgMatches)) {
5209 BoundNodesTreeBuilder ParamMatches(ArgMatches);
5211 hasParameter(ParamIndex, ParamMatcher)))),
5213 hasParameter(ParamIndex, ParamMatcher))))))
5214 .matches(
Node, Finder, &ParamMatches)) {
5215 Result.addMatch(ParamMatches);
5221 *Builder = std::move(
Result);
5253 internal::Matcher<Expr>, ArgMatcher,
5254 internal::Matcher<QualType>, ParamMatcher) {
5255 BoundNodesTreeBuilder
Result;
5256 bool Matched =
false;
5257 auto ProcessParamAndArg = [&](
QualType ParamType,
const Expr *Arg) {
5258 BoundNodesTreeBuilder ArgMatches(*Builder);
5259 if (!ArgMatcher.matches(*Arg, Finder, &ArgMatches))
5261 BoundNodesTreeBuilder ParamMatches(std::move(ArgMatches));
5262 if (!ParamMatcher.matches(ParamType, Finder, &ParamMatches))
5264 Result.addMatch(ParamMatches);
5268 if (
auto *
Call = llvm::dyn_cast<CallExpr>(&
Node))
5270 else if (
auto *Construct = llvm::dyn_cast<CXXConstructExpr>(&
Node))
5273 llvm_unreachable(
"expected CallExpr or CXXConstructExpr");
5275 *Builder = std::move(
Result);
5297 if (
const auto *
Decl = dyn_cast_or_null<FunctionDecl>(Context))
5298 return N <
Decl->param_size() &&
Decl->getParamDecl(N) == &
Node;
5299 if (
const auto *
Decl = dyn_cast_or_null<BlockDecl>(Context))
5300 return N <
Decl->param_size() &&
Decl->getParamDecl(N) == &
Node;
5301 if (
const auto *
Decl = dyn_cast_or_null<ObjCMethodDecl>(Context))
5302 return N <
Decl->param_size() &&
Decl->getParamDecl(N) == &
Node;
5342 internal::Matcher<ParmVarDecl>,
5344 return matchesFirstInPointerRange(InnerMatcher,
Node.param_begin(),
5345 Node.param_end(), Finder,
5346 Builder) !=
Node.param_end();
5370 return Node.getNumParams() == N;
5398 forEachTemplateArgument,
5402 internal::Matcher<TemplateArgument>, InnerMatcher) {
5404 clang::ast_matchers::internal::getTemplateSpecializationArgs(
Node);
5405 clang::ast_matchers::internal::BoundNodesTreeBuilder
Result;
5406 bool Matched =
false;
5407 for (
const auto &Arg : TemplateArgs) {
5408 clang::ast_matchers::internal::BoundNodesTreeBuilder ArgBuilder(*Builder);
5409 if (InnerMatcher.matches(Arg, Finder, &ArgBuilder)) {
5411 Result.addMatch(ArgBuilder);
5414 *Builder = std::move(
Result);
5443 internal::Matcher<QualType>, InnerMatcher) {
5444 return InnerMatcher.matches(
Node.getReturnType(), Finder, Builder);
5464 return Node.isExternC();
5497 return Node.isDeleted();
5510 return Node.isDefaulted();
5543 return FnTy->hasDynamicExceptionSpec();
5593 return Node.isConsteval();
5615 return Node.isConstexpr();
5630 if (
const auto *CIA =
Node.getAttr<ConstInitAttr>())
5631 return CIA->isConstinit();
5659 internal::Matcher<Stmt>, InnerMatcher) {
5661 return Init !=
nullptr && InnerMatcher.matches(*
Init, Finder, Builder);
5675 internal::Matcher<Expr>, InnerMatcher) {
5678 InnerMatcher.matches(*
Condition, Finder, Builder));
5689 const Stmt *
const Then =
Node.getThen();
5690 return (Then !=
nullptr && InnerMatcher.matches(*Then, Finder, Builder));
5701 const Stmt *
const Else =
Node.getElse();
5702 return (Else !=
nullptr && InnerMatcher.matches(*Else, Finder, Builder));
5736 internal::NotEqualsBoundNodePredicate Predicate;
5739 return Builder->removeBindings(Predicate);
5745 return Builder->removeBindings([&](
const internal::BoundNodesMap &
Nodes) {
5764 internal::Matcher<DeclStmt>, InnerMatcher) {
5765 const DeclStmt*
const DeclarationStatement =
5766 Node.getConditionVariableDeclStmt();
5767 return DeclarationStatement !=
nullptr &&
5768 InnerMatcher.matches(*DeclarationStatement, Finder, Builder);
5781 internal::Matcher<Expr>, InnerMatcher) {
5783 return InnerMatcher.matches(*
Expression, Finder, Builder);
5798 internal::Matcher<Expr>, InnerMatcher) {
5800 return InnerMatcher.matches(*
Expression, Finder, Builder);
5832 internal::Matcher<Stmt>, InnerMatcher) {
5833 if (Finder->isTraversalIgnoringImplicitNodes() && isDefaultedHelper(&
Node))
5835 const Stmt *
const Statement = internal::GetBodyMatcher<NodeType>::get(
Node);
5836 return (Statement !=
nullptr &&
5837 InnerMatcher.matches(*Statement, Finder, Builder));
5857 internal::Matcher<Stmt>, InnerMatcher) {
5858 const Stmt *
const Statement =
Node.getBody();
5859 return (Statement !=
nullptr &&
5860 InnerMatcher.matches(*Statement, Finder, Builder));
5878 internal::Matcher<Stmt>, InnerMatcher) {
5880 return CS && matchesFirstInPointerRange(InnerMatcher, CS->
body_begin(),
5896 return Node.size() == N;
5924template <
typename ValueT>
5925internal::PolymorphicMatcher<internal::ValueEqualsMatcher,
5926 void(internal::AllNodeBaseTypes), ValueT>
5928 return internal::PolymorphicMatcher<internal::ValueEqualsMatcher,
5929 void(internal::AllNodeBaseTypes), ValueT>(
5938 return internal::ValueEqualsMatcher<NodeType, ParamT>(
Value)
5946 unsigned,
Value, 1) {
5947 return internal::ValueEqualsMatcher<NodeType, ParamT>(
Value)
5957 return internal::ValueEqualsMatcher<NodeType, ParamT>(
Value)
5982 std::string, Name) {
5983 if (std::optional<StringRef> OpName = internal::getOpName(
Node))
5984 return *OpName == Name;
5994extern const internal::VariadicFunction<
5995 internal::PolymorphicMatcher<internal::HasAnyOperatorNameMatcher,
5999 std::vector<std::string>>,
6018 isAssignmentOperator,
6021 return Node.isAssignmentOp();
6039 isComparisonOperator,
6042 return Node.isComparisonOp();
6056 internal::Matcher<Expr>, InnerMatcher) {
6057 const Expr *LeftHandSide = internal::getLHS(
Node);
6058 return (LeftHandSide !=
nullptr &&
6059 InnerMatcher.matches(*LeftHandSide, Finder, Builder));
6073 internal::Matcher<Expr>, InnerMatcher) {
6074 const Expr *RightHandSide = internal::getRHS(
Node);
6075 return (RightHandSide !=
nullptr &&
6076 InnerMatcher.matches(*RightHandSide, Finder, Builder));
6085 internal::Matcher<Expr>, InnerMatcher) {
6086 return internal::VariadicDynCastAllOfMatcher<Stmt, NodeType>()(
6087 anyOf(hasLHS(InnerMatcher), hasRHS(InnerMatcher)))
6088 .matches(
Node, Finder, Builder);
6106 internal::Matcher<Expr>, Matcher1, internal::Matcher<Expr>, Matcher2) {
6107 return internal::VariadicDynCastAllOfMatcher<Stmt, NodeType>()(
6108 anyOf(
allOf(hasLHS(Matcher1), hasRHS(Matcher2)),
6109 allOf(hasRHS(Matcher1), hasLHS(Matcher2))))
6110 .matches(
Node, Finder, Builder);
6123 internal::Matcher<Expr>, InnerMatcher) {
6124 const Expr *
const Operand = internal::getSubExpr(
Node);
6125 return (Operand !=
nullptr &&
6126 InnerMatcher.matches(*Operand, Finder, Builder));
6147 internal::Matcher<Expr>, InnerMatcher) {
6148 const Expr *
const SubExpression =
6149 internal::GetSourceExpressionMatcher<NodeType>::get(
Node);
6150 return (SubExpression !=
nullptr &&
6151 InnerMatcher.matches(*SubExpression, Finder, Builder));
6173 internal::Matcher<QualType>, InnerMatcher) {
6175 return InnerMatcher.matches(NodeType, Finder, Builder);
6181 internal::Matcher<QualType>, InnerMatcher) {
6182 return InnerMatcher.matches(
Node.getType(), Finder, Builder);
6195 return Node.isStruct();
6208 return Node.isUnion();
6221 return Node.isClass();
6234 return Node.isEnum();
6249 internal::Matcher<Expr>, InnerMatcher) {
6252 InnerMatcher.matches(*
Expression, Finder, Builder));
6264 internal::Matcher<Expr>, InnerMatcher) {
6267 InnerMatcher.matches(*
Expression, Finder, Builder));
6294 return Node.isThisDeclarationADefinition();
6308 return Node.isVariadic();
6329 internal::Matcher<CXXRecordDecl>, InnerMatcher) {
6331 ASTChildrenNotSpelledInSourceScope RAII(Finder,
false);
6334 return (
Parent !=
nullptr &&
6335 InnerMatcher.matches(*
Parent, Finder, Builder));
6363 internal::Matcher<CXXMethodDecl>, InnerMatcher) {
6364 BoundNodesTreeBuilder
Result;
6365 bool Matched =
false;
6366 for (
const auto *Overridden :
Node.overridden_methods()) {
6367 BoundNodesTreeBuilder OverriddenBuilder(*Builder);
6368 const bool OverriddenMatched =
6369 InnerMatcher.matches(*Overridden, Finder, &OverriddenBuilder);
6370 if (OverriddenMatched) {
6372 Result.addMatch(OverriddenBuilder);
6375 *Builder = std::move(
Result);
6401 return Node.isVirtual();
6419 return Node.isVirtualAsWritten();
6423 return Node.isInheritingConstructor();
6444 return Node.template hasAttr<FinalAttr>();
6471 return Node.isConst();
6488 return Node.isCopyAssignmentOperator();
6505 return Node.isMoveAssignmentOperator();
6523 return Node.size_overridden_methods() > 0 ||
Node.hasAttr<OverrideAttr>();
6538 return Node.isUserProvided();
6568 return Node.isArrow();
6582 return Node->isIntegerType();
6596 return Node->isUnsignedIntegerType();
6610 return Node->isSignedIntegerType();
6624 return Node->isAnyCharacterType();
6644 return Node->isAnyPointerType();
6663 return Node.isConstQualified();
6682 return Node.isVolatileQualified();
6699 return Node.hasLocalQualifiers();
6715 internal::Matcher<ValueDecl>, InnerMatcher) {
6716 return InnerMatcher.matches(*
Node.getMemberDecl(), Finder, Builder);
6736 hasObjectExpression,
6739 internal::Matcher<Expr>, InnerMatcher) {
6740 if (
const auto *
E = dyn_cast<UnresolvedMemberExpr>(&
Node))
6741 if (
E->isImplicitAccess())
6743 if (
const auto *
E = dyn_cast<CXXDependentScopeMemberExpr>(&
Node))
6744 if (
E->isImplicitAccess())
6746 return InnerMatcher.matches(*
Node.getBase(), Finder, Builder);
6759 internal::Matcher<UsingShadowDecl>, InnerMatcher) {
6760 return matchesFirstInPointerRange(InnerMatcher,
Node.shadow_begin(),
6761 Node.shadow_end(), Finder,
6762 Builder) !=
Node.shadow_end();
6778 internal::Matcher<NamedDecl>, InnerMatcher) {
6779 return InnerMatcher.matches(*
Node.getTargetDecl(), Finder, Builder);
6813 Node.getTemplateSpecializationKind() ==
6815 Node.getTemplateSpecializationKind() ==
6878 internal::Matcher<QualType>, InnerMatcher, 0) {
6879 return internal::BindableMatcher<TypeLoc>(
6880 new internal::TypeLocTypeMatcher(InnerMatcher));
6891extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, QualifiedTypeLoc>
6906 return InnerMatcher.matches(
Node.getUnqualifiedLoc(), Finder, Builder);
6920 auto Loc =
Node.getFunctionTypeLoc();
6921 return Loc && ReturnMatcher.matches(
Loc.getReturnLoc(), Finder, Builder);
6932extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, PointerTypeLoc>
6946 return PointeeMatcher.matches(
Node.getPointeeLoc(), Finder, Builder);
6959extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, ReferenceTypeLoc>
6974 return ReferentMatcher.matches(
Node.getPointeeLoc(), Finder, Builder);
6986extern const internal::VariadicDynCastAllOfMatcher<
7004 hasAnyTemplateArgumentLoc,
7008 internal::Matcher<TemplateArgumentLoc>, InnerMatcher) {
7009 auto Args = internal::getTemplateArgsWritten(
Node);
7010 return matchesFirstInRange(InnerMatcher, Args.begin(), Args.end(), Finder,
7011 Builder) != Args.end();
7029 hasTemplateArgumentLoc,
7033 unsigned, Index, internal::Matcher<TemplateArgumentLoc>, InnerMatcher) {
7034 auto Args = internal::getTemplateArgsWritten(
Node);
7035 return Index < Args.size() &&
7036 InnerMatcher.matches(Args[Index], Finder, Builder);
7048 return Node.isBooleanType();
7060 return Node.isVoidType();
7063template <
typename NodeType>
7112 return Node.isRealFloatingType();
7165 return internal::HasSizeMatcher<NodeType>::hasSize(
Node, N);
7236 internal::Matcher<Expr>, InnerMatcher) {
7237 return InnerMatcher.matches(*
Node.getSizeExpr(), Finder, Builder);
7317 QualType QT =
Node.getLocallyUnqualifiedSingleStepDesugaredType();
7320 return Inner.matches(QT, Finder, Builder);
7487 pointee, getPointee,
7618 return InnerMatcher.matches(Qualifier, Finder, Builder);
7663 hasReplacementType, getReplacementType,
7702 return InnerType.matches(
Node.getDecayedType(), Finder, Builder);
7743 if (!DC)
return false;
7760extern const internal::VariadicAllOfMatcher<NestedNameSpecifier>
7764extern const internal::VariadicAllOfMatcher<NestedNameSpecifierLoc>
7770 internal::BindableMatcher<NestedNameSpecifierLoc>, loc,
7771 internal::Matcher<NestedNameSpecifier>, InnerMatcher, 1) {
7772 return internal::BindableMatcher<NestedNameSpecifierLoc>(
7773 new internal::LocMatcher<NestedNameSpecifierLoc, NestedNameSpecifier>(
7790 internal::Matcher<QualType>, InnerMatcher) {
7793 return InnerMatcher.matches(
QualType(
Node.getAsType(), 0), Finder, Builder);
7808 internal::Matcher<TypeLoc>, InnerMatcher) {
7814 return InnerMatcher.matches(TL, Finder, Builder);
7827 internal::Matcher<NestedNameSpecifier>, InnerMatcher,
7830 switch (
Node.getKind()) {
7832 NextNode =
Node.getAsNamespaceAndPrefix().Prefix;
7835 NextNode =
Node.getAsType()->getPrefix();
7843 return InnerMatcher.matches(NextNode, Finder, Builder);
7856 internal::Matcher<NestedNameSpecifierLoc>, InnerMatcher,
7860 NextNode = TL.getPrefix();
7862 NextNode =
Node.getAsNamespaceAndPrefix().Prefix;
7866 return InnerMatcher.matches(NextNode, Finder, Builder);
7880 internal::Matcher<NamespaceDecl>, InnerMatcher) {
7883 const auto *Namespace =
7884 dyn_cast<NamespaceDecl>(
Node.getAsNamespaceAndPrefix().Namespace);
7887 return InnerMatcher.matches(*Namespace, Finder, Builder);
7906extern const internal::VariadicAllOfMatcher<Attr>
attr;
7946 BoundNodesTreeBuilder
Result;
7951 bool Matched =
false;
7953 SC = SC->getNextSwitchCase()) {
7954 BoundNodesTreeBuilder CaseBuilder(*Builder);
7955 bool CaseMatched = InnerMatcher.matches(*SC, Finder, &CaseBuilder);
7958 Result.addMatch(CaseBuilder);
7961 *Builder = std::move(
Result);
7976 internal::Matcher<CXXCtorInitializer>, InnerMatcher) {
7977 BoundNodesTreeBuilder
Result;
7978 bool Matched =
false;
7979 for (
const auto *I :
Node.inits()) {
7980 if (Finder->isTraversalIgnoringImplicitNodes() && !I->isWritten())
7982 BoundNodesTreeBuilder InitBuilder(*Builder);
7983 if (InnerMatcher.matches(*I, Finder, &InitBuilder)) {
7985 Result.addMatch(InitBuilder);
7988 *Builder = std::move(
Result);
8004 return Node.isCopyConstructor();
8019 return Node.isMoveConstructor();
8034 return Node.isDefaultConstructor();
8051 return Node.isDelegatingConstructor();
8079 return Node.isExplicit();
8109 ASTChildrenNotSpelledInSourceScope RAII(Finder,
false);
8111 return InnerMatcher.matches(*ES.
getExpr(), Finder, Builder);
8134 if (
const auto *FD = dyn_cast<FunctionDecl>(&
Node))
8135 return FD->isInlineSpecified();
8136 if (
const auto *NSD = dyn_cast<NamespaceDecl>(&
Node))
8137 return NSD->isInline();
8138 if (
const auto *VD = dyn_cast<VarDecl>(&
Node))
8139 return VD->isInline();
8140 llvm_unreachable(
"Not a valid polymorphic type");
8153 return Node.isAnonymousNamespace();
8200 return Node.isInAnonymousNamespace();
8217 return InnerMatcher.matches(*
Node.getLHS(), Finder, Builder);
8230 for (
const auto *
Attr :
Node.attrs()) {
8250 return InnerMatcher.matches(*
RetValue, Finder, Builder);
8260extern const internal::VariadicDynCastAllOfMatcher<Stmt, CUDAKernelCallExpr>
8305 return InnerMatcher.matches(*VD, Finder, Builder);
8328 internal::Matcher<BindingDecl>, InnerMatcher) {
8329 if (
Node.bindings().size() <= N)
8331 return InnerMatcher.matches(*
Node.bindings()[N], Finder, Builder);
8353 return llvm::any_of(
Node.bindings(), [&](
const auto *Binding) {
8354 return InnerMatcher.matches(*Binding, Finder, Builder);
8377 const auto &Parents = Finder->getASTContext().getParents(
Node);
8380 while (!Stack.empty()) {
8381 const auto &CurNode = Stack.back();
8383 if (
const auto *FuncDeclNode = CurNode.get<
FunctionDecl>()) {
8384 if (InnerMatcher.matches(*FuncDeclNode, Finder, Builder)) {
8387 }
else if (
const auto *LambdaExprNode = CurNode.get<
LambdaExpr>()) {
8388 if (InnerMatcher.matches(*LambdaExprNode->getCallOperator(), Finder,
8393 llvm::append_range(Stack, Finder->getASTContext().getParents(CurNode));
8427 const auto &Parents = Finder->getASTContext().getParents(
Node);
8430 while (!Stack.empty()) {
8431 const auto &CurNode = Stack.back();
8433 if (
const auto *FuncDeclNode = CurNode.get<
FunctionDecl>()) {
8434 BoundNodesTreeBuilder B = *Builder;
8435 if (InnerMatcher.matches(*FuncDeclNode, Finder, &B)) {
8436 *Builder = std::move(B);
8439 }
else if (
const auto *LambdaExprNode = CurNode.get<
LambdaExpr>()) {
8440 BoundNodesTreeBuilder B = *Builder;
8441 if (InnerMatcher.matches(*LambdaExprNode->getCallOperator(), Finder,
8443 *Builder = std::move(B);
8446 }
else if (
const auto *ObjCMethodDeclNode = CurNode.get<
ObjCMethodDecl>()) {
8447 BoundNodesTreeBuilder B = *Builder;
8448 if (InnerMatcher.matches(*ObjCMethodDeclNode, Finder, &B)) {
8449 *Builder = std::move(B);
8452 }
else if (
const auto *BlockDeclNode = CurNode.get<
BlockDecl>()) {
8453 BoundNodesTreeBuilder B = *Builder;
8454 if (InnerMatcher.matches(*BlockDeclNode, Finder, &B)) {
8455 *Builder = std::move(B);
8459 llvm::append_range(Stack, Finder->getASTContext().getParents(CurNode));
8486 return Node.hasExternalFormalLinkage();
8511 return Node.hasDefaultArg();
8523 return Node.isArray();
8535 internal::Matcher<Expr>, InnerMatcher) {
8536 return Node.getNumPlacementArgs() > Index &&
8537 InnerMatcher.matches(*
Node.getPlacementArg(Index), Finder, Builder);
8550 return llvm::any_of(
Node.placement_arguments(), [&](
const Expr *Arg) {
8551 return InnerMatcher.matches(*Arg, Finder, Builder);
8564 return Node.isArray() && *
Node.getArraySize() &&
8565 InnerMatcher.matches(**
Node.getArraySize(), Finder, Builder);
8576 return Node.hasDefinition();
8587 return Node.isScoped();
8599 return F->hasTrailingReturn();
8635 if (
const auto *CleanupsExpr = dyn_cast<ExprWithCleanups>(&
Node))
8636 E = CleanupsExpr->getSubExpr();
8637 if (
const auto *CtorExpr = dyn_cast<CXXConstructExpr>(
E)) {
8638 if (CtorExpr->isElidable()) {
8639 if (
const auto *MaterializeTemp =
8640 dyn_cast<MaterializeTemporaryExpr>(CtorExpr->getArg(0))) {
8641 return InnerMatcher.matches(*MaterializeTemp->getSubExpr(), Finder,
8646 return InnerMatcher.matches(
Node, Finder, Builder);
8665extern const internal::VariadicDynCastAllOfMatcher<Stmt, OMPExecutableDirective>
8682 return Node.isStandaloneDirective();
8701 internal::Matcher<Stmt>, InnerMatcher) {
8702 if (
Node.isStandaloneDirective())
8704 return InnerMatcher.matches(*
Node.getStructuredBlock(), Finder, Builder);
8719 internal::Matcher<OMPClause>, InnerMatcher) {
8721 return matchesFirstInPointerRange(InnerMatcher, Clauses.begin(),
8722 Clauses.end(), Finder,
8723 Builder) != Clauses.end();
8740extern const internal::VariadicDynCastAllOfMatcher<OMPClause, OMPDefaultClause>
8757 return Node.getDefaultKind() == llvm::omp::OMP_DEFAULT_none;
8774 return Node.getDefaultKind() == llvm::omp::OMP_DEFAULT_shared;
8793 return Node.getDefaultKind() == llvm::omp::OMP_DEFAULT_private;
8812 return Node.getDefaultKind() == llvm::omp::OMP_DEFAULT_firstprivate;
8834 return llvm::omp::isAllowedClauseForDirective(
8835 Node.getDirectiveKind(), CKind,
8836 Finder->getASTContext().getLangOpts().OpenMP);
Defines the clang::ASTContext interface.
BoundNodesTreeBuilder BoundNodes
BoundNodesTreeBuilder Nodes
#define AST_POLYMORPHIC_MATCHER_P(DefineMatcher, ReturnTypesF, ParamType, Param)
AST_POLYMORPHIC_MATCHER_P(DefineMatcher, ParamType, Param) { ... } defines a single-parameter functio...
#define AST_POLYMORPHIC_MATCHER_P2(DefineMatcher, ReturnTypesF, ParamType1, Param1, ParamType2, Param2)
AST_POLYMORPHIC_MATCHER_P2( DefineMatcher, ParamType1, Param1, ParamType2, Param2) { ....
#define AST_POLYMORPHIC_MATCHER(DefineMatcher, ReturnTypesF)
AST_POLYMORPHIC_MATCHER(DefineMatcher) { ... } defines a single-parameter function named DefineMatche...
#define AST_MATCHER_FUNCTION_P_OVERLOAD(ReturnType, DefineMatcher, ParamType, Param, OverloadId)
#define AST_POLYMORPHIC_MATCHER_P_OVERLOAD(DefineMatcher, ReturnTypesF, ParamType, Param, OverloadId)
#define AST_POLYMORPHIC_SUPPORTED_TYPES(...)
Construct a type-list to be passed to the AST_POLYMORPHIC_MATCHER* macros.
#define AST_MATCHER_P_OVERLOAD(Type, DefineMatcher, ParamType, Param, OverloadId)
#define AST_TYPE_TRAVERSE_MATCHER(MatcherName, FunctionName, ReturnTypesF)
AST_TYPE_TRAVERSE_MATCHER(MatcherName, FunctionName) defines the matcher MatcherName that can be used...
#define AST_POLYMORPHIC_MATCHER_REGEX(DefineMatcher, ReturnTypesF, Param)
AST_POLYMORPHIC_MATCHER_REGEX(DefineMatcher, ReturnTypesF, Param) { ... } defines a function named De...
#define AST_MATCHER(Type, DefineMatcher)
AST_MATCHER(Type, DefineMatcher) { ... } defines a zero parameter function named DefineMatcher() that...
#define AST_TYPELOC_TRAVERSE_MATCHER_DECL(MatcherName, FunctionName, ReturnTypesF)
#define AST_MATCHER_P2(Type, DefineMatcher, ParamType1, Param1, ParamType2, Param2)
AST_MATCHER_P2( Type, DefineMatcher, ParamType1, Param1, ParamType2, Param2) { ....
#define AST_MATCHER_REGEX(Type, DefineMatcher, Param)
AST_MATCHER_REGEX(Type, DefineMatcher, Param) { ... } defines a function named DefineMatcher() that t...
#define AST_MATCHER_FUNCTION(ReturnType, DefineMatcher)
AST_MATCHER_FUNCTION(ReturnType, DefineMatcher) { ... } defines a zero parameter function named Defin...
#define AST_MATCHER_P(Type, DefineMatcher, ParamType, Param)
AST_MATCHER_P(Type, DefineMatcher, ParamType, Param) { ... } defines a single-parameter function name...
Defines the clang::attr::Kind enum.
enum clang::sema::@1840::IndirectLocalPathEntry::EntryKind Kind
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
static bool hasDefinition(const ObjCObjectPointerType *ObjPtr)
Defines the ExceptionSpecificationType enumeration and various utility functions.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines Expressions and AST nodes for C++2a concepts.
Defines the clang::FileManager interface and associated types.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
static bool RetValue(InterpState &S, CodePtr &Pt)
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the LambdaCapture class.
static bool isExternC(const NamedDecl *ND)
This file defines OpenMP AST classes for clauses.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
static bool hasAttr(const Decl *D, bool IgnoreImplicitAttr)
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
Defines the Objective-C statement AST node classes.
This file defines OpenMP AST classes for executable directives and clauses.
Defines the clang::TypeLoc interface and its subclasses.
Defines enumerations for the type traits support.
C Language Family Type Representation.
__PTRDIFF_TYPE__ ptrdiff_t
AbstractConditionalOperator - An abstract base class for ConditionalOperator and BinaryConditionalOpe...
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Attr - This represents one attribute.
attr::Kind getKind() const
Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained by a type-constraint.
Represents a C++ declaration that introduces decls from somewhere else.
BinaryConditionalOperator - The GNU extension to the conditional operator which allows the middle ope...
A builtin binary operation expression such as "x + y" or "x <= y".
A binding in a decomposition declaration.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Represents a base class of a C++ class.
A boolean literal, per ([C++ lex.bool] Boolean literals).
CXXCatchStmt - This represents a C++ catch block.
Represents a call to a C++ constructor.
Represents a C++ constructor within a class.
Represents a C++ conversion function within a class.
Represents a C++ base or member initializer.
Represents a C++ deduction guide declaration.
Represents a C++ member access expression where the actual member referenced could not be resolved be...
Represents a folding of a pack over an operator.
CXXForRangeStmt - This represents C++0x [stmt.ranged]'s ranged for statement, represented as 'for (ra...
Represents an explicit C++ type conversion that uses "functional" notation (C++ [expr....
Represents a call to a member function that may be written either with member call syntax (e....
Represents a static or instance method of a struct/union/class.
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
A call to an overloaded operator written using operator syntax.
Represents a C++ struct/union/class.
A rewritten comparison expression that was originally written using operator syntax.
Implicit construction of a std::initializer_list<T> object from an array temporary within list-initia...
Represents a C++ functional cast expression that builds a temporary object.
Describes an explicit type conversion that uses functional notion but could not be resolved because o...
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
CaseStmt - Represent a case statement.
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
Declaration of a class template.
Represents a class template specialization, which refers to a class template with a given set of temp...
Complex values, per C99 6.2.5p11.
CompoundLiteralExpr - [C99 6.5.2.5].
CompoundStmt - This represents a group of statements like { stmt stmt }.
body_iterator body_begin()
Represents the canonical version of C arrays with a specified constant size.
Represents the body of a coroutine.
Represents a pointer type decayed from an array or function type.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
A reference to a declared variable, function, enum, etc.
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
DeclGroupRef::const_iterator const_decl_iterator
Decl - This represents one declaration (or definition), e.g.
static Decl * castFromDeclContext(const DeclContext *)
Represents a ValueDecl that came out of a declarator.
A decomposition declaration.
Represents a qualified type name for which the type name is dependent.
A qualified reference to a name whose declaration cannot yet be resolved.
Represents a C99 designated initializer expression.
DoStmt - This represents a 'do/while' stmt.
A dynamically typed AST node container.
const T * get() const
Retrieve the stored node as type T.
static DynTypedNode create(const T &Node)
Creates a DynTypedNode from Node.
ExplicitCastExpr - An explicit cast written in the source code.
Store information needed for an explicit specifier.
const Expr * getExpr() const
static ExplicitSpecifier getFromDecl(FunctionDecl *Function)
This represents one expression.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Represents a member of a struct/union/class.
Cached information about one file (either on disk or in the virtual file system).
ForStmt - This represents a 'for (init;cond;inc)' stmt.
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
Represents a function declaration or definition.
Represents a prototype with parameter type info, e.g.
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
bool isNothrow(bool ResultIfDependent=false) const
Determine whether this function type has a non-throwing exception specification.
IfStmt - This represents an if/then/else.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
Describes an C or C++ initializer list.
Describes the capture of a variable or of this, or of a C++1y init-capture.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
A pointer to member type per C++ 8.3.3 - Pointers to members.
This represents a decl that may have a name.
Represent a C++ namespace.
A C++ nested-name-specifier augmented with source location information.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
@ Type
A type, stored as a Type*.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
This represents 'default' clause in the '#pragma omp ...' directive.
This is a basic class for representing single OpenMP executable directive.
Represents Objective-C's @autoreleasepool Statement.
Represents an ObjC class declaration.
An expression that sends a message to the given Objective-C object or class.
ObjCMethodDecl - Represents an instance or class method declaration.
Represents a pointer to an Objective C object.
Represents one property declaration in an Objective-C interface.
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr.
Sugar for parentheses used when specifying types.
Represents a parameter to a function.
Wrapper for source info for pointers.
PointerType - C99 6.7.5.1 - Pointer Declarators.
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Wrapper of type source information for a type with non-trivial direct qualifiers.
Base for LValueReferenceType and RValueReferenceType.
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
Smart pointer class that efficiently represents Objective-C method names.
std::string getAsString() const
Derive the full selector name (e.g.
This class handles loading and caching of source files into memory.
FileID getFileID(SourceLocation SpellingLoc) const
Return the FileID for a SourceLocation.
bool isInMainFile(SourceLocation Loc) const
Returns whether the PresumedLoc for a given SourceLocation is in the main file.
OptionalFileEntryRef getFileEntryRefForID(FileID FID) const
Returns the FileEntryRef for the provided FileID.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
SourceLocation getExpansionLoc(SourceLocation Loc) const
Given a SourceLocation object Loc, return the expansion location referenced by the ID.
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
Stmt - This represents one statement.
StringLiteral - This represents a string literal expression, e.g.
Represents a reference to a non-type template parameter that has been substituted with a template arg...
Represents the result of substituting a type for a template type parameter.
SwitchStmt - This represents a 'switch' stmt.
Represents the declaration of a struct/union/class/enum.
Location wrapper for a TemplateArgument.
Represents a template argument.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ Type
The template argument is a type.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
Represents a type template specialization; the template must be a class template, a type alias templa...
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
Represents a declaration of a type.
Base wrapper for a particular "section" of type source info.
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
The base class of the type hierarchy.
Base class for declarations which introduce a typedef-name.
UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) expression operand.
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Represents a C++ member access expression for which lookup produced a set of overloaded functions.
Represents a dependent using declaration which was marked with typename.
Represents a dependent using declaration which was not marked with typename.
Represents a C++ using-declaration.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
Represents a variable template specialization, which refers to a variable template with a given set o...
Represents a C array with a specified size that is not an integer-constant-expression.
WhileStmt - This represents a 'while' stmt.
Maps string IDs to AST nodes matched by parts of a matcher.
internal::BoundNodesMap::IDToNodeMap IDToNodeMap
Type of mapping from binding identifiers to bound nodes.
const IDToNodeMap & getMap() const
Retrieve mapping from binding identifiers to bound nodes.
friend class internal::BoundNodesTreeBuilder
const T * getNodeAs(StringRef ID) const
Returns the AST node bound to ID.
HasOverloadOpNameMatcher hasAnyOverloadedOperatorNameFunc(ArrayRef< const StringRef * > NameRefs)
Matcher< ObjCMessageExpr > hasAnySelectorFunc(ArrayRef< const StringRef * > NameRefs)
Matcher< NamedDecl > hasAnyNameFunc(ArrayRef< const StringRef * > NameRefs)
HasOpNameMatcher hasAnyOperatorNameFunc(ArrayRef< const StringRef * > NameRefs)
std::optional< SourceLocation > getExpansionLocOfMacro(StringRef MacroName, SourceLocation Loc, const ASTContext &Context)
bool matchesAnyBase(const CXXRecordDecl &Node, const Matcher< CXXBaseSpecifier > &BaseSpecMatcher, ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder)
const internal::VariadicDynCastAllOfMatcher< Stmt, FixedPointLiteral > fixedPointLiteral
Matches fixed-point literals eg.
const internal::VariadicDynCastAllOfMatcher< Stmt, CStyleCastExpr > cStyleCastExpr
Matches a C-style cast expression.
const internal::VariadicDynCastAllOfMatcher< Decl, TagDecl > tagDecl
Matches tag declarations.
internal::Matcher< QualType > TypeMatcher
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXReinterpretCastExpr > cxxReinterpretCastExpr
Matches a reinterpret_cast expression.
const internal::VariadicDynCastAllOfMatcher< Decl, VarDecl > varDecl
Matches variable declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, StmtExpr > stmtExpr
Matches statement expression (GNU extension).
const internal::VariadicDynCastAllOfMatcher< Stmt, ExprWithCleanups > exprWithCleanups
Matches expressions that introduce cleanups to be run at the end of the sub-expression's evaluation.
const internal::VariadicDynCastAllOfMatcher< Stmt, DeclRefExpr > declRefExpr
Matches expressions that refer to declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, TypedefNameDecl > typedefNameDecl
Matches typedef name declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, ObjCIvarDecl > objcIvarDecl
Matches Objective-C instance variable declarations.
const AstTypeMatcher< EnumType > enumType
Matches enum types.
const AstTypeMatcher< FunctionProtoType > functionProtoType
Matches FunctionProtoType nodes.
const internal::VariadicDynCastAllOfMatcher< Decl, TypeAliasDecl > typeAliasDecl
Matches type alias declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, UsingEnumDecl > usingEnumDecl
Matches using-enum declarations.
const AstTypeMatcher< ObjCObjectPointerType > objcObjectPointerType
Matches an Objective-C object pointer type, which is different from a pointer type,...
const internal::VariadicDynCastAllOfMatcher< Stmt, ConstantExpr > constantExpr
Matches a constant expression wrapper.
const internal::VariadicDynCastAllOfMatcher< Stmt, ArrayInitLoopExpr > arrayInitLoopExpr
Matches a loop initializing the elements of an array in a number of contexts:
const internal::VariadicDynCastAllOfMatcher< Stmt, ObjCIvarRefExpr > objcIvarRefExpr
Matches a reference to an ObjCIvar.
const AstTypeMatcher< BuiltinType > builtinType
Matches builtin Types.
const internal::VariadicOperatorMatcherFunc< 1, 1 > unless
Matches if the provided matcher does not match.
const internal::VariadicDynCastAllOfMatcher< Decl, ConceptDecl > conceptDecl
Matches concept declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, CoyieldExpr > coyieldExpr
Matches co_yield expressions.
const AstTypeMatcher< DependentSizedExtVectorType > dependentSizedExtVectorType
Matches C++ extended vector type where either the type or size is dependent.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXDeleteExpr > cxxDeleteExpr
Matches delete expressions.
const internal::VariadicAllOfMatcher< TemplateName > templateName
Matches template name.
internal::Matcher< Decl > DeclarationMatcher
Types of matchers for the top-level classes in the AST class hierarchy.
internal::Matcher< NestedNameSpecifier > NestedNameSpecifierMatcher
const internal::VariadicDynCastAllOfMatcher< Decl, ObjCProtocolDecl > objcProtocolDecl
Matches Objective-C protocol declarations.
const AstTypeMatcher< DependentTemplateSpecializationType > dependentTemplateSpecializationType
Matches a dependent template specialization type.
const internal::VariadicDynCastAllOfMatcher< Stmt, ImplicitCastExpr > implicitCastExpr
Matches the implicit cast nodes of Clang's AST.
const internal::VariadicOperatorMatcherFunc< 1, 1 > optionally
Matches any node regardless of the submatcher.
const internal::VariadicDynCastAllOfMatcher< Decl, UsingDecl > usingDecl
Matches using declarations.
const internal::ArgumentAdaptingMatcherFunc< internal::HasDescendantMatcher > hasDescendant
Matches AST nodes that have descendant AST nodes that match the provided matcher.
const internal::VariadicDynCastAllOfMatcher< Decl, ObjCPropertyDecl > objcPropertyDecl
Matches Objective-C property declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, StringLiteral > stringLiteral
Matches string literals (also matches wide string literals).
const internal::VariadicAllOfMatcher< CXXCtorInitializer > cxxCtorInitializer
Matches constructor initializers.
const internal::VariadicDynCastAllOfMatcher< Stmt, ObjCAtFinallyStmt > objcFinallyStmt
Matches Objective-C @finally statements.
const AstTypeMatcher< DependentSizedArrayType > dependentSizedArrayType
Matches C++ arrays whose size is a value-dependent expression.
const AstTypeMatcher< TemplateSpecializationType > templateSpecializationType
Matches template specialization types.
const internal::VariadicDynCastAllOfMatcher< Stmt, AtomicExpr > atomicExpr
Matches atomic builtins.
const AstTypeMatcher< DeducedTemplateSpecializationType > deducedTemplateSpecializationType
Matches C++17 deduced template specialization types, e.g.
const internal::VariadicDynCastAllOfMatcher< Stmt, CoawaitExpr > coawaitExpr
Matches co_await expressions.
const internal::VariadicDynCastAllOfMatcher< Decl, EnumDecl > enumDecl
Matches enum declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, ConvertVectorExpr > convertVectorExpr
Matches builtin function __builtin_convertvector.
const internal::VariadicDynCastAllOfMatcher< Stmt, AddrLabelExpr > addrLabelExpr
Matches address of label statements (GNU extension).
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXDependentScopeMemberExpr > cxxDependentScopeMemberExpr
Matches member expressions where the actual member referenced could not be resolved because the base ...
const internal::VariadicDynCastAllOfMatcher< Stmt, PredefinedExpr > predefinedExpr
Matches predefined identifier expressions [C99 6.4.2.2].
const internal::VariadicAllOfMatcher< NestedNameSpecifier > nestedNameSpecifier
Matches nested name specifiers.
const AstTypeMatcher< PointerType > pointerType
Matches pointer types, but does not match Objective-C object pointer types.
const internal::VariadicDynCastAllOfMatcher< Stmt, DependentCoawaitExpr > dependentCoawaitExpr
Matches co_await expressions where the type of the promise is dependent.
const internal::VariadicDynCastAllOfMatcher< Stmt, BreakStmt > breakStmt
Matches break statements.
const internal::VariadicDynCastAllOfMatcher< Decl, BindingDecl > bindingDecl
Matches binding declarations Example matches foo and bar (matcher = bindingDecl()
const internal::VariadicDynCastAllOfMatcher< Stmt, UnresolvedLookupExpr > unresolvedLookupExpr
Matches reference to a name that can be looked up during parsing but could not be resolved to a speci...
const internal::VariadicDynCastAllOfMatcher< Stmt, OMPExecutableDirective > ompExecutableDirective
Matches any #pragma omp executable directive.
const internal::VariadicDynCastAllOfMatcher< Stmt, ObjCStringLiteral > objcStringLiteral
Matches ObjectiveC String literal expressions.
const internal::VariadicDynCastAllOfMatcher< Decl, ObjCMethodDecl > objcMethodDecl
Matches Objective-C method declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, ParmVarDecl > parmVarDecl
Matches parameter variable declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXRewrittenBinaryOperator > cxxRewrittenBinaryOperator
Matches rewritten binary operators.
const internal::VariadicDynCastAllOfMatcher< Decl, TypedefDecl > typedefDecl
Matches typedef declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, GenericSelectionExpr > genericSelectionExpr
Matches C11 _Generic expression.
const internal::VariadicDynCastAllOfMatcher< Decl, CXXDeductionGuideDecl > cxxDeductionGuideDecl
Matches user-defined and implicitly generated deduction guide.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXBoolLiteralExpr > cxxBoolLiteral
Matches bool literals.
const AstTypeMatcher< DependentNameType > dependentNameType
Matches a dependent name type.
const internal::VariadicDynCastAllOfMatcher< Stmt, ReturnStmt > returnStmt
Matches return statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, AsmStmt > asmStmt
Matches asm statements.
internal::Matcher< NamedDecl > hasName(StringRef Name)
Matches NamedDecl nodes that have the specified name.
const internal::VariadicAllOfMatcher< Attr > attr
Matches attributes.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXDynamicCastExpr > cxxDynamicCastExpr
Matches a dynamic_cast expression.
const internal::VariadicDynCastAllOfMatcher< Stmt, CoreturnStmt > coreturnStmt
Matches co_return statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, CallExpr > callExpr
Matches call expressions.
const internal::VariadicDynCastAllOfMatcher< Stmt, LambdaExpr > lambdaExpr
Matches lambda expressions.
const internal::VariadicDynCastAllOfMatcher< Stmt, CompoundStmt > compoundStmt
Matches compound statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, FloatingLiteral > floatLiteral
Matches float literals of all sizes / encodings, e.g.
const internal::VariadicDynCastAllOfMatcher< Stmt, ObjCAutoreleasePoolStmt > autoreleasePoolStmt
Matches an Objective-C autorelease pool statement.
const internal::VariadicFunction< internal::PolymorphicMatcher< internal::HasOverloadedOperatorNameMatcher, AST_POLYMORPHIC_SUPPORTED_TYPES(CXXOperatorCallExpr, FunctionDecl), std::vector< std::string > >, StringRef, internal::hasAnyOverloadedOperatorNameFunc > hasAnyOverloadedOperatorName
Matches overloaded operator names.
const internal::VariadicDynCastAllOfMatcher< Decl, NonTypeTemplateParmDecl > nonTypeTemplateParmDecl
Matches non-type template parameter declarations.
const AstTypeMatcher< VariableArrayType > variableArrayType
Matches C arrays with a specified size that is not an integer-constant-expression.
const internal::VariadicDynCastAllOfMatcher< Stmt, UnaryExprOrTypeTraitExpr > unaryExprOrTypeTraitExpr
Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
const internal::VariadicDynCastAllOfMatcher< Stmt, NullStmt > nullStmt
Matches null statements.
const internal::VariadicDynCastAllOfMatcher< TypeLoc, TemplateSpecializationTypeLoc > templateSpecializationTypeLoc
Matches template specialization TypeLocs.
const internal::ArgumentAdaptingMatcherFunc< internal::ForEachDescendantMatcher > forEachDescendant
Matches AST nodes that have descendant AST nodes that match the provided matcher.
const internal::VariadicAllOfMatcher< CXXBaseSpecifier > cxxBaseSpecifier
Matches class bases.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXDefaultArgExpr > cxxDefaultArgExpr
Matches the value of a default argument at the call site.
const internal::VariadicAllOfMatcher< TemplateArgument > templateArgument
Matches template arguments.
const internal::ArgumentAdaptingMatcherFunc< internal::ForEachMatcher > forEach
Matches AST nodes that have child AST nodes that match the provided matcher.
const internal::VariadicDynCastAllOfMatcher< Stmt, CaseStmt > caseStmt
Matches case statements inside switch statements.
const internal::VariadicAllOfMatcher< NestedNameSpecifierLoc > nestedNameSpecifierLoc
Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
const internal::VariadicDynCastAllOfMatcher< Decl, NamedDecl > namedDecl
Matches a declaration of anything that could have a name.
const internal::VariadicDynCastAllOfMatcher< Decl, UnresolvedUsingTypenameDecl > unresolvedUsingTypenameDecl
Matches unresolved using value declarations that involve the typename.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const AstTypeMatcher< DecltypeType > decltypeType
Matches types nodes representing C++11 decltype(<expr>) types.
const internal::VariadicAllOfMatcher< TypeLoc > typeLoc
Matches TypeLocs in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Stmt, ParenListExpr > parenListExpr
Matches paren list expressions.
const internal::VariadicDynCastAllOfMatcher< Decl, ClassTemplatePartialSpecializationDecl > classTemplatePartialSpecializationDecl
Matches C++ class template partial specializations.
const internal::VariadicDynCastAllOfMatcher< Stmt, WhileStmt > whileStmt
Matches while statements.
const internal::VariadicDynCastAllOfMatcher< Decl, ObjCCategoryDecl > objcCategoryDecl
Matches Objective-C category declarations.
internal::TrueMatcher anything()
Matches any node.
const internal::VariadicFunction< internal::Matcher< ObjCMessageExpr >, StringRef, internal::hasAnySelectorFunc > hasAnySelector
Matches when at least one of the supplied string equals to the Selector.getAsString()
const AstTypeMatcher< AutoType > autoType
Matches types nodes representing C++11 auto types.
const AstTypeMatcher< ArrayType > arrayType
Matches all kinds of arrays.
const internal::VariadicDynCastAllOfMatcher< Decl, CXXConversionDecl > cxxConversionDecl
Matches conversion operator declarations.
const AstTypeMatcher< ParenType > parenType
Matches ParenType nodes.
const internal::VariadicDynCastAllOfMatcher< Decl, LabelDecl > labelDecl
Matches a declaration of label.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXFunctionalCastExpr > cxxFunctionalCastExpr
Matches functional cast expressions.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXConstCastExpr > cxxConstCastExpr
Matches a const_cast expression.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXTemporaryObjectExpr > cxxTemporaryObjectExpr
Matches functional cast expressions having N != 1 arguments.
const internal::VariadicDynCastAllOfMatcher< Stmt, UnaryOperator > unaryOperator
Matches unary operator expressions.
const internal::VariadicDynCastAllOfMatcher< TypeLoc, ReferenceTypeLoc > referenceTypeLoc
Matches reference TypeLocs.
const internal::VariadicFunction< internal::Matcher< NamedDecl >, StringRef, internal::hasAnyNameFunc > hasAnyName
Matches NamedDecl nodes that have any of the specified names.
const internal::VariadicDynCastAllOfMatcher< Stmt, ObjCMessageExpr > objcMessageExpr
Matches ObjectiveC Message invocation expressions.
const internal::MapAnyOfMatcher< BinaryOperator, CXXOperatorCallExpr, CXXRewrittenBinaryOperator > binaryOperation
Matches nodes which can be used with binary operators.
const internal::VariadicDynCastAllOfMatcher< Stmt, ArraySubscriptExpr > arraySubscriptExpr
Matches array subscript expressions.
const internal::VariadicDynCastAllOfMatcher< OMPClause, OMPDefaultClause > ompDefaultClause
Matches OpenMP default clause.
const internal::VariadicDynCastAllOfMatcher< Decl, AccessSpecDecl > accessSpecDecl
Matches C++ access specifier declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, LinkageSpecDecl > linkageSpecDecl
Matches a declaration of a linkage specification.
const AstTypeMatcher< InjectedClassNameType > injectedClassNameType
Matches injected class name types.
const internal::VariadicDynCastAllOfMatcher< Stmt, GNUNullExpr > gnuNullExpr
Matches GNU __null expression.
const internal::VariadicDynCastAllOfMatcher< TypeLoc, PointerTypeLoc > pointerTypeLoc
Matches pointer TypeLocs.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXForRangeStmt > cxxForRangeStmt
Matches range-based for statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXMemberCallExpr > cxxMemberCallExpr
Matches member call expressions.
const internal::VariadicDynCastAllOfMatcher< Decl, CXXConstructorDecl > cxxConstructorDecl
Matches C++ constructor declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, DependentScopeDeclRefExpr > dependentScopeDeclRefExpr
Matches expressions that refer to dependent scope declarations.
const AstTypeMatcher< BlockPointerType > blockPointerType
Matches block pointer types, i.e.
internal::BindableMatcher< Stmt > sizeOfExpr(const internal::Matcher< UnaryExprOrTypeTraitExpr > &InnerMatcher)
Same as unaryExprOrTypeTraitExpr, but only matching sizeof.
const internal::VariadicDynCastAllOfMatcher< Stmt, InitListExpr > initListExpr
Matches init list expressions.
internal::Matcher< CXXCtorInitializer > CXXCtorInitializerMatcher
const AstTypeMatcher< AtomicType > atomicType
Matches atomic types.
const internal::VariadicDynCastAllOfMatcher< Decl, TypeAliasTemplateDecl > typeAliasTemplateDecl
Matches type alias template declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXNoexceptExpr > cxxNoexceptExpr
Matches noexcept expressions.
const internal::VariadicDynCastAllOfMatcher< Stmt, ArrayInitIndexExpr > arrayInitIndexExpr
The arrayInitIndexExpr consists of two subexpressions: a common expression (the source array) that is...
internal::VariadicDynCastAllOfMatcher< Type, NodeType > AstTypeMatcher
const AstTypeMatcher< UsingType > usingType
Matches types specified through a using declaration.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXNewExpr > cxxNewExpr
Matches new expressions.
const internal::VariadicDynCastAllOfMatcher< Decl, EnumConstantDecl > enumConstantDecl
Matches enum constants.
const internal::VariadicDynCastAllOfMatcher< Stmt, ForStmt > forStmt
Matches for statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, GotoStmt > gotoStmt
Matches goto statements.
internal::Matcher< CXXBaseSpecifier > CXXBaseSpecifierMatcher
auto mapAnyOf(internal::VariadicDynCastAllOfMatcher< T, U > const &...)
Matches any of the NodeMatchers with InnerMatchers nested within.
const internal::VariadicDynCastAllOfMatcher< Decl, DeclaratorDecl > declaratorDecl
Matches declarator declarations (field, variable, function and non-type template parameter declaratio...
const internal::VariadicDynCastAllOfMatcher< Stmt, ObjCAtCatchStmt > objcCatchStmt
Matches Objective-C @catch statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, BinaryOperator > binaryOperator
Matches binary operator expressions.
const internal::VariadicDynCastAllOfMatcher< TypeLoc, QualifiedTypeLoc > qualifiedTypeLoc
Matches QualifiedTypeLocs in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Decl, TemplateTypeParmDecl > templateTypeParmDecl
Matches template type parameter declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, BlockExpr > blockExpr
Matches a reference to a block.
const internal::VariadicDynCastAllOfMatcher< Decl, FunctionTemplateDecl > functionTemplateDecl
Matches C++ function template declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, ParenExpr > parenExpr
Matches parentheses used in expressions.
const internal::VariadicDynCastAllOfMatcher< Decl, StaticAssertDecl > staticAssertDecl
Matches a C++ static_assert declaration.
const internal::ArgumentAdaptingMatcherFunc< internal::HasMatcher > has
Matches AST nodes that have child AST nodes that match the provided matcher.
const internal::VariadicDynCastAllOfMatcher< Stmt, CoroutineBodyStmt > coroutineBodyStmt
Matches coroutine body statements.
const AstTypeMatcher< MacroQualifiedType > macroQualifiedType
Matches qualified types when the qualifier is applied via a macro.
const internal::VariadicDynCastAllOfMatcher< Decl, ObjCCategoryImplDecl > objcCategoryImplDecl
Matches Objective-C category definitions.
const AstTypeMatcher< TypedefType > typedefType
Matches typedef types.
const internal::VariadicDynCastAllOfMatcher< Stmt, MaterializeTemporaryExpr > materializeTemporaryExpr
Matches nodes where temporaries are materialized.
const AstTypeMatcher< TagType > tagType
Matches tag types (record and enum types).
const internal::VariadicDynCastAllOfMatcher< Stmt, BinaryConditionalOperator > binaryConditionalOperator
Matches binary conditional operator expressions (GNU extension).
const internal::VariadicDynCastAllOfMatcher< Stmt, ObjCAtTryStmt > objcTryStmt
Matches Objective-C @try statements.
const internal::VariadicDynCastAllOfMatcher< Decl, UsingShadowDecl > usingShadowDecl
Matches shadow declarations introduced into a scope by a (resolved) using declaration.
const internal::VariadicDynCastAllOfMatcher< Stmt, ExplicitCastExpr > explicitCastExpr
Matches explicit cast expressions.
internal::PolymorphicMatcher< internal::ValueEqualsMatcher, void(internal::AllNodeBaseTypes), ValueT > equals(const ValueT &Value)
Matches literals that are equal to the given value of type ValueT.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXStaticCastExpr > cxxStaticCastExpr
Matches a C++ static_cast expression.
const internal::VariadicDynCastAllOfMatcher< Decl, ValueDecl > valueDecl
Matches any value declaration.
const internal::VariadicDynCastAllOfMatcher< Decl, TranslationUnitDecl > translationUnitDecl
Matches the top declaration context.
const AstTypeMatcher< TemplateTypeParmType > templateTypeParmType
Matches template type parameter types.
const AstTypeMatcher< ConstantArrayType > constantArrayType
Matches C arrays with a specified constant size.
internal::Matcher< Stmt > StatementMatcher
internal::Matcher< TypeLoc > TypeLocMatcher
const internal::VariadicAllOfMatcher< LambdaCapture > lambdaCapture
Matches lambda captures.
internal::Matcher< TemplateArgumentLoc > TemplateArgumentLocMatcher
const internal::VariadicOperatorMatcherFunc< 2, std::numeric_limits< unsigned >::max()> eachOf
Matches if any of the given matchers matches.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXConstructExpr > cxxConstructExpr
Matches constructor call expressions (including implicit ones).
const internal::VariadicDynCastAllOfMatcher< Decl, ObjCInterfaceDecl > objcInterfaceDecl
Matches Objective-C interface declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, TemplateTemplateParmDecl > templateTemplateParmDecl
Matches template template parameter declarations.
void matchEachArgumentWithParamType(const CallExpr &Node, llvm::function_ref< void(QualType, const Expr *)> OnParamAndArg)
const internal::VariadicDynCastAllOfMatcher< Decl, FieldDecl > fieldDecl
Matches field declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, UserDefinedLiteral > userDefinedLiteral
Matches user defined literal operator call.
const internal::VariadicDynCastAllOfMatcher< Stmt, ChooseExpr > chooseExpr
Matches GNU __builtin_choose_expr.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXOperatorCallExpr > cxxOperatorCallExpr
Matches overloaded operator calls.
const internal::VariadicDynCastAllOfMatcher< Decl, RequiresExprBodyDecl > requiresExprBodyDecl
Matches concept requirement body declaration.
internal::PolymorphicMatcher< internal::HasOverloadedOperatorNameMatcher, AST_POLYMORPHIC_SUPPORTED_TYPES(CXXOperatorCallExpr, FunctionDecl), std::vector< std::string > > hasOverloadedOperatorName(StringRef Name)
Matches overloaded operator names.
const internal::VariadicDynCastAllOfMatcher< Decl, NamespaceAliasDecl > namespaceAliasDecl
Matches a declaration of a namespace alias.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXBindTemporaryExpr > cxxBindTemporaryExpr
Matches nodes where temporaries are created.
const internal::VariadicDynCastAllOfMatcher< Stmt, SwitchCase > switchCase
Matches case and default statements inside switch statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, DefaultStmt > defaultStmt
Matches default statements inside switch statements.
const internal::VariadicOperatorMatcherFunc< 2, std::numeric_limits< unsigned >::max()> allOf
Matches if all given matchers match.
const internal::VariadicDynCastAllOfMatcher< Decl, ClassTemplateSpecializationDecl > classTemplateSpecializationDecl
Matches C++ class template specializations.
const internal::VariadicDynCastAllOfMatcher< Decl, DecompositionDecl > decompositionDecl
Matches decomposition-declarations.
const AstTypeMatcher< SubstTemplateTypeParmType > substTemplateTypeParmType
Matches types that represent the result of substituting a type for a template type parameter.
const internal::VariadicDynCastAllOfMatcher< Decl, FunctionDecl > functionDecl
Matches function declarations.
const AstTypeMatcher< UnaryTransformType > unaryTransformType
Matches types nodes representing unary type transformations.
const internal::VariadicDynCastAllOfMatcher< Stmt, UnresolvedMemberExpr > unresolvedMemberExpr
Matches unresolved member expressions.
const internal::VariadicDynCastAllOfMatcher< Stmt, ObjCAtThrowStmt > objcThrowStmt
Matches Objective-C @throw statements.
const internal::MapAnyOfMatcher< CallExpr, CXXConstructExpr > invocation
Matches function calls and constructor calls.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXThrowExpr > cxxThrowExpr
Matches throw expressions.
const internal::VariadicDynCastAllOfMatcher< Stmt, SwitchStmt > switchStmt
Matches switch statements.
const AstTypeMatcher< RecordType > recordType
Matches record types (e.g.
const internal::VariadicDynCastAllOfMatcher< Stmt, MemberExpr > memberExpr
Matches member expressions.
const internal::VariadicDynCastAllOfMatcher< Decl, CXXRecordDecl > cxxRecordDecl
Matches C++ class declarations.
const internal::VariadicAllOfMatcher< TemplateArgumentLoc > templateArgumentLoc
Matches template arguments (with location info).
internal::Matcher< T > traverse(TraversalKind TK, const internal::Matcher< T > &InnerMatcher)
Causes all nested matchers to be matched with the specified traversal kind.
const AstTypeMatcher< ReferenceType > referenceType
Matches both lvalue and rvalue reference types.
const internal::VariadicDynCastAllOfMatcher< Stmt, DesignatedInitExpr > designatedInitExpr
Matches C99 designated initializer expressions [C99 6.7.8].
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, CXXDestructorDecl > cxxDestructorDecl
Matches explicit C++ destructor declarations.
internal::BindableMatcher< Stmt > alignOfExpr(const internal::Matcher< UnaryExprOrTypeTraitExpr > &InnerMatcher)
Same as unaryExprOrTypeTraitExpr, but only matching alignof.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXUnresolvedConstructExpr > cxxUnresolvedConstructExpr
Matches unresolved constructor call expressions.
const internal::VariadicDynCastAllOfMatcher< Decl, ObjCImplementationDecl > objcImplementationDecl
Matches Objective-C implementation declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, RecordDecl > recordDecl
Matches class, struct, and union declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, IntegerLiteral > integerLiteral
Matches integer literals of all sizes / encodings, e.g.
const internal::VariadicDynCastAllOfMatcher< Decl, ExportDecl > exportDecl
Matches any export declaration.
internal::Matcher< T > findAll(const internal::Matcher< T > &Matcher)
Matches if the node or any descendant matches.
const internal::VariadicDynCastAllOfMatcher< Stmt, ImplicitValueInitExpr > implicitValueInitExpr
Matches implicit initializers of init list expressions.
const internal::VariadicDynCastAllOfMatcher< Stmt, DoStmt > doStmt
Matches do statements.
const internal::VariadicDynCastAllOfMatcher< Decl, NamespaceDecl > namespaceDecl
Matches a declaration of a namespace.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXNullPtrLiteralExpr > cxxNullPtrLiteralExpr
Matches nullptr literal.
internal::PolymorphicMatcher< internal::HasDeclarationMatcher, void(internal::HasDeclarationSupportedTypes), internal::Matcher< Decl > > hasDeclaration(const internal::Matcher< Decl > &InnerMatcher)
Matches a node if the declaration associated with that node matches the given matcher.
const AstTypeMatcher< DecayedType > decayedType
Matches decayed type Example matches i[] in declaration of f.
const internal::VariadicDynCastAllOfMatcher< Stmt, DeclStmt > declStmt
Matches declaration statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, CompoundLiteralExpr > compoundLiteralExpr
Matches compound (i.e.
const AstTypeMatcher< MemberPointerType > memberPointerType
Matches member pointer types.
const internal::VariadicDynCastAllOfMatcher< Stmt, LabelStmt > labelStmt
Matches label statements.
const internal::VariadicAllOfMatcher< Stmt > stmt
Matches statements.
const internal::VariadicDynCastAllOfMatcher< Decl, FriendDecl > friendDecl
Matches friend declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
internal::Matcher< TemplateArgument > TemplateArgumentMatcher
const AstTypeMatcher< IncompleteArrayType > incompleteArrayType
Matches C arrays with unspecified size.
const internal::VariadicDynCastAllOfMatcher< Stmt, CharacterLiteral > characterLiteral
Matches character literals (also matches wchar_t).
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXFoldExpr > cxxFoldExpr
Matches C++17 fold expressions.
const internal::VariadicDynCastAllOfMatcher< Stmt, ConditionalOperator > conditionalOperator
Matches conditional operator expressions.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXStdInitializerListExpr > cxxStdInitializerListExpr
Matches C++ initializer list expressions.
const internal::VariadicOperatorMatcherFunc< 2, std::numeric_limits< unsigned >::max()> anyOf
Matches if any of the given matchers matches.
internal::Matcher< Attr > AttrMatcher
const internal::VariadicFunction< internal::PolymorphicMatcher< internal::HasAnyOperatorNameMatcher, AST_POLYMORPHIC_SUPPORTED_TYPES(BinaryOperator, CXXOperatorCallExpr, CXXRewrittenBinaryOperator, UnaryOperator), std::vector< std::string > >, StringRef, internal::hasAnyOperatorNameFunc > hasAnyOperatorName
Matches operator expressions (binary or unary) that have any of the specified names.
const internal::VariadicDynCastAllOfMatcher< Stmt, OpaqueValueExpr > opaqueValueExpr
Matches opaque value expressions.
const AstTypeMatcher< ComplexType > complexType
Matches C99 complex types.
const internal::VariadicDynCastAllOfMatcher< Stmt, CUDAKernelCallExpr > cudaKernelCallExpr
Matches CUDA kernel call expression.
const internal::VariadicDynCastAllOfMatcher< Decl, IndirectFieldDecl > indirectFieldDecl
Matches indirect field declarations.
const AstTypeMatcher< FunctionType > functionType
Matches FunctionType nodes.
const internal::VariadicDynCastAllOfMatcher< Decl, BlockDecl > blockDecl
Matches block declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, CXXMethodDecl > cxxMethodDecl
Matches method declarations.
internal::Matcher< LambdaCapture > LambdaCaptureMatcher
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXCatchStmt > cxxCatchStmt
Matches catch statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, CastExpr > castExpr
Matches any cast nodes of Clang's AST.
internal::Matcher< NestedNameSpecifierLoc > NestedNameSpecifierLocMatcher
const internal::VariadicAllOfMatcher< QualType > qualType
Matches QualTypes in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXTryStmt > cxxTryStmt
Matches try statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, SubstNonTypeTemplateParmExpr > substNonTypeTemplateParmExpr
Matches substitutions of non-type template parameters.
const internal::VariadicDynCastAllOfMatcher< Decl, UsingDirectiveDecl > usingDirectiveDecl
Matches using namespace declarations.
const internal::VariadicDynCastAllOfMatcher< Decl, UnresolvedUsingValueDecl > unresolvedUsingValueDecl
Matches unresolved using value declarations.
const internal::ArgumentAdaptingMatcherFunc< internal::HasAncestorMatcher, internal::TypeList< Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr >, internal::TypeList< Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr > > hasAncestor
Matches AST nodes that have an ancestor that matches the provided matcher.
const internal::ArgumentAdaptingMatcherFunc< internal::HasParentMatcher, internal::TypeList< Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr >, internal::TypeList< Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr > > hasParent
Matches AST nodes that have a parent that matches the provided matcher.
const internal::VariadicDynCastAllOfMatcher< Stmt, IfStmt > ifStmt
Matches if statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXThisExpr > cxxThisExpr
Matches implicit and explicit this expressions.
const internal::VariadicDynCastAllOfMatcher< Stmt, ImaginaryLiteral > imaginaryLiteral
Matches imaginary literals, which are based on integer and floating point literals e....
const AstTypeMatcher< RValueReferenceType > rValueReferenceType
Matches rvalue reference types.
const internal::VariadicDynCastAllOfMatcher< Stmt, ContinueStmt > continueStmt
Matches continue statements.
const internal::VariadicDynCastAllOfMatcher< Expr, RequiresExpr > requiresExpr
Matches concept requirement.
const internal::VariadicDynCastAllOfMatcher< Decl, ClassTemplateDecl > classTemplateDecl
Matches C++ class template declarations.
const AstTypeMatcher< LValueReferenceType > lValueReferenceType
Matches lvalue reference types.
The JSON file list parser is used to communicate input to InstallAPI.
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
bool isInstanceMethod(const Decl *D)
llvm::omp::Clause OpenMPClauseKind
OpenMP clauses.
UnaryExprOrTypeTrait
Names for the "expression or type" traits.
TraversalKind
Defines how we descend a level in the AST when we pass through expressions.
@ SD_Thread
Thread storage duration.
@ SD_Static
Static storage duration.
@ SD_Automatic
Automatic storage duration (most local variables).
@ Result
The result type of a method or function.
CastKind
CastKind - The kind of operation required for a conversion.
const FunctionProtoType * T
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ Other
Other implicit parameter.