ast_matchers {
48 returnllvm::is_contained(Matches,
Node.getSelector().getAsString());
54ASTMatchFinder *Finder,
55BoundNodesTreeBuilder *Builder,
59ASTMatchFinder *Finder,
60BoundNodesTreeBuilder *Builder,
64ASTMatchFinder *Finder,
65BoundNodesTreeBuilder *Builder,
69ASTMatchFinder *Finder,
70BoundNodesTreeBuilder *Builder,
74ASTMatchFinder *Finder,
75BoundNodesTreeBuilder *Builder,
79 constMatcher<CXXBaseSpecifier> &BaseSpecMatcher,
80ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder) {
81 if(!
Node.hasDefinition())
85Paths.setOrigin(&
Node);
87 const autobasePredicate =
90BoundNodesTreeBuilder
Result(*Builder);
91 if(BaseSpecMatcher.matches(*BaseSpec, Finder, &
Result)) {
92*Builder = std::move(
Result);
98 return Node.lookupInBases(basePredicate, Paths,
102voidBoundNodesTreeBuilder::visitMatches(Visitor *ResultVisitor) {
104 Bindings.push_back(BoundNodesMap());
105 for(BoundNodesMap &Binding :
Bindings) {
106ResultVisitor->visitMatch(
BoundNodes(Binding));
112usingVariadicOperatorFunction =
bool(*)(
113 constDynTypedNode &DynNode, ASTMatchFinder *Finder,
114BoundNodesTreeBuilder *Builder, ArrayRef<DynTypedMatcher> InnerMatchers);
116template<VariadicOperatorFunction Func>
117classVariadicMatcher :
publicDynMatcherInterface {
119VariadicMatcher(std::vector<DynTypedMatcher> InnerMatchers)
120: InnerMatchers(
std::move(InnerMatchers)) {}
122 booldynMatches(
constDynTypedNode &DynNode, ASTMatchFinder *Finder,
123BoundNodesTreeBuilder *Builder)
const override{
124 return Func(DynNode, Finder, Builder, InnerMatchers);
128std::vector<DynTypedMatcher> InnerMatchers;
131classIdDynMatcher :
publicDynMatcherInterface {
133IdDynMatcher(StringRef ID,
134IntrusiveRefCntPtr<DynMatcherInterface> InnerMatcher)
135:
ID(
ID), InnerMatcher(
std::move(InnerMatcher)) {}
137 booldynMatches(
constDynTypedNode &DynNode, ASTMatchFinder *Finder,
138BoundNodesTreeBuilder *Builder)
const override{
139 bool Result= InnerMatcher->dynMatches(DynNode, Finder, Builder);
140 if(
Result) Builder->setBinding(ID, DynNode);
144std::optional<clang::TraversalKind>
TraversalKind()
const override{
145 returnInnerMatcher->TraversalKind();
149 conststd::string
ID;
150 constIntrusiveRefCntPtr<DynMatcherInterface> InnerMatcher;
154classTrueMatcherImpl :
publicDynMatcherInterface {
156TrueMatcherImpl() =
default;
158 booldynMatches(
constDynTypedNode &, ASTMatchFinder *,
159BoundNodesTreeBuilder *)
const override{
168classDynTraversalMatcherImpl :
publicDynMatcherInterface {
170 explicitDynTraversalMatcherImpl(
172IntrusiveRefCntPtr<DynMatcherInterface> InnerMatcher)
173: TK(TK), InnerMatcher(
std::move(InnerMatcher)) {}
175 booldynMatches(
constDynTypedNode &DynNode, ASTMatchFinder *Finder,
176BoundNodesTreeBuilder *Builder)
const override{
177 returnthis->InnerMatcher->dynMatches(DynNode, Finder, Builder);
180std::optional<clang::TraversalKind>
TraversalKind()
const override{
186IntrusiveRefCntPtr<DynMatcherInterface> InnerMatcher;
191boolASTMatchFinder::isTraversalIgnoringImplicitNodes()
const{
192 returngetASTContext().getParentMapContext().getTraversalKind() ==
197DynTypedMatcher::constructVariadic(DynTypedMatcher::VariadicOperator Op,
198ASTNodeKind SupportedKind,
199std::vector<DynTypedMatcher> InnerMatchers) {
200assert(!InnerMatchers.empty() &&
"Array must not be empty.");
201assert(llvm::all_of(InnerMatchers,
202[SupportedKind](
constDynTypedMatcher &M) {
203 returnM.canConvertTo(SupportedKind);
205 "InnerMatchers must be convertible to SupportedKind!");
211 autoRestrictKind = SupportedKind;
219 for(
auto&IM : InnerMatchers) {
223 returnDynTypedMatcher(
224SupportedKind, RestrictKind,
225 newVariadicMatcher<allOfVariadicOperator>(std::move(InnerMatchers)));
228 returnDynTypedMatcher(
229SupportedKind, RestrictKind,
230 newVariadicMatcher<anyOfVariadicOperator>(std::move(InnerMatchers)));
233 returnDynTypedMatcher(
234SupportedKind, RestrictKind,
235 newVariadicMatcher<eachOfVariadicOperator>(std::move(InnerMatchers)));
238 returnDynTypedMatcher(SupportedKind, RestrictKind,
239 newVariadicMatcher<optionallyVariadicOperator>(
240std::move(InnerMatchers)));
245 returnDynTypedMatcher(
246SupportedKind, RestrictKind,
247 newVariadicMatcher<notUnaryOperator>(std::move(InnerMatchers)));
249llvm_unreachable(
"Invalid Op value.");
253DynTypedMatcher::constructRestrictedWrapper(
constDynTypedMatcher &InnerMatcher,
254ASTNodeKind RestrictKind) {
255DynTypedMatcher
Copy= InnerMatcher;
256 Copy.RestrictKind = RestrictKind;
260DynTypedMatcher DynTypedMatcher::withTraversalKind(
TraversalKindTK) {
262 Copy.Implementation =
263 newDynTraversalMatcherImpl(TK, std::move(
Copy.Implementation));
267DynTypedMatcher DynTypedMatcher::trueMatcher(ASTNodeKind NodeKind) {
272 newTrueMatcherImpl();
273 returnDynTypedMatcher(NodeKind, NodeKind, Instance);
276boolDynTypedMatcher::canMatchNodesOfKind(ASTNodeKind
Kind)
const{
277 returnRestrictKind.isBaseOf(
Kind);
280DynTypedMatcher DynTypedMatcher::dynCastTo(
constASTNodeKind
Kind)
const{
287boolDynTypedMatcher::matches(
constDynTypedNode &DynNode,
288ASTMatchFinder *Finder,
289BoundNodesTreeBuilder *Builder)
const{
290TraversalKindScope RAII(Finder->getASTContext(),
291Implementation->TraversalKind());
293 if(Finder->isTraversalIgnoringImplicitNodes() &&
294Finder->IsMatchingInASTNodeNotSpelledInSource())
297 if(!Finder->isTraversalIgnoringImplicitNodes() &&
298Finder->IsMatchingInASTNodeNotAsIs())
302Finder->getASTContext().getParentMapContext().traverseIgnored(DynNode);
304 if(RestrictKind.isBaseOf(N.getNodeKind()) &&
305Implementation->dynMatches(N, Finder, Builder)) {
311Builder->removeBindings([](
constBoundNodesMap &) {
return true; });
315boolDynTypedMatcher::matchesNoKindCheck(
constDynTypedNode &DynNode,
316ASTMatchFinder *Finder,
317BoundNodesTreeBuilder *Builder)
const{
318TraversalKindScope raii(Finder->getASTContext(),
319Implementation->TraversalKind());
321 if(Finder->isTraversalIgnoringImplicitNodes() &&
322Finder->IsMatchingInASTNodeNotSpelledInSource())
325 if(!Finder->isTraversalIgnoringImplicitNodes() &&
326Finder->IsMatchingInASTNodeNotAsIs())
330Finder->getASTContext().getParentMapContext().traverseIgnored(DynNode);
332assert(RestrictKind.isBaseOf(N.getNodeKind()));
333 if(Implementation->dynMatches(N, Finder, Builder)) {
339Builder->removeBindings([](
constBoundNodesMap &) {
return true; });
343std::optional<DynTypedMatcher> DynTypedMatcher::tryBind(StringRef
ID)
const{
348 newIdDynMatcher(
ID, std::move(
Result.Implementation));
349 returnstd::move(
Result);
352boolDynTypedMatcher::canConvertTo(ASTNodeKind To)
const{
353 const autoFrom = getSupportedKind();
354 autoQualKind = ASTNodeKind::getFromNodeKind<QualType>();
355 autoTypeKind = ASTNodeKind::getFromNodeKind<Type>();
358 if(From.isSame(TypeKind) && To.isSame(QualKind))
return true;
360 returnFrom.isBaseOf(To);
363voidBoundNodesTreeBuilder::addMatch(
constBoundNodesTreeBuilder &
Other) {
368ASTMatchFinder *Finder,
369BoundNodesTreeBuilder *Builder,
371 if(InnerMatchers.size() != 1)
384BoundNodesTreeBuilder Discard(*Builder);
385 return!InnerMatchers[0].matches(DynNode, Finder, &Discard);
389ASTMatchFinder *Finder,
390BoundNodesTreeBuilder *Builder,
395 returnllvm::all_of(InnerMatchers, [&](
constDynTypedMatcher &InnerMatcher) {
396 returnInnerMatcher.matchesNoKindCheck(DynNode, Finder, Builder);
401ASTMatchFinder *Finder,
402BoundNodesTreeBuilder *Builder,
404BoundNodesTreeBuilder
Result;
405 boolMatched =
false;
406 for(
constDynTypedMatcher &InnerMatcher : InnerMatchers) {
407BoundNodesTreeBuilder BuilderInner(*Builder);
408 if(InnerMatcher.matches(DynNode, Finder, &BuilderInner)) {
410 Result.addMatch(BuilderInner);
413*Builder = std::move(
Result);
418ASTMatchFinder *Finder,
419BoundNodesTreeBuilder *Builder,
421 for(
constDynTypedMatcher &InnerMatcher : InnerMatchers) {
422BoundNodesTreeBuilder
Result= *Builder;
423 if(InnerMatcher.matches(DynNode, Finder, &
Result)) {
424*Builder = std::move(
Result);
433BoundNodesTreeBuilder *Builder,
435 if(InnerMatchers.size() != 1)
438BoundNodesTreeBuilder
Result(*Builder);
439 if(InnerMatchers[0].matches(DynNode, Finder, &
Result))
440*Builder = std::move(
Result);
446std::vector<std::string> Names;
447Names.reserve(NameRefs.size());
448 for(
auto*Name : NameRefs)
449Names.emplace_back(*Name);
454 returninternal::Matcher<NamedDecl>(
467HasOverloadOpNameMatcher
472HasNameMatcher::HasNameMatcher(std::vector<std::string> N)
473: UseUnqualifiedMatch(
474 llvm::all_of(N, [](StringRef Name) {
return!Name.contains(
"::"); })),
475Names(std::move(N)) {
477 for(StringRef Name : Names)
478assert(!Name.empty());
484 if(!Name.ends_with(Suffix))
486Name = Name.drop_back(Suffix.size());
488 if(!Name.ends_with(
"::"))
490Name = Name.drop_back(2);
499 if(
Node.getIdentifier())
500 return Node.getName();
502 if(
Node.getDeclName()) {
505llvm::raw_svector_ostream OS(Scratch);
510 return "(anonymous)";
515 if(
Node.getIdentifier()) {
516 return Node.getName();
519 return(
"(anonymous "+
Node.getKindName() +
")").toStringRef(Scratch);
524 return Node.isAnonymousNamespace() ?
"(anonymous namespace)":
Node.getName();
532Patterns.reserve(Names.size());
533 for(StringRef Name : Names)
534Patterns.push_back({Name, Name.starts_with(
"::")});
540 boolconsumeNameSuffix(StringRef NodeName,
boolCanSkip) {
548 for(
size_tI = 0,
E= Patterns.size(); I !=
E; ++I) {
549StringRef Pattern = Patterns[I].P;
550 if(ast_matchers::internal::consumeNameSuffix(Patterns[I].
P, NodeName))
551Patterns.push_back({Pattern, Patterns[I].IsFullyQualified});
554llvm::erase_if(Patterns, [&NodeName](
auto&Pattern) {
559 return!Patterns.empty();
565 boolfoundMatch(
boolAllowFullyQualified)
const{
566 returnllvm::any_of(Patterns, [&](
constPattern &Pattern) {
567 returnPattern.P.empty() &&
568(AllowFullyQualified || !Pattern.IsFullyQualified);
583boolHasNameMatcher::matchesNodeUnqualified(
constNamedDecl &
Node)
const{
584assert(UseUnqualifiedMatch);
587 returnllvm::any_of(Names, [&](StringRef Name) {
592boolHasNameMatcher::matchesNodeFullFast(
constNamedDecl &
Node)
const{
593PatternSet Patterns(Names);
610 constDeclContext *Ctx =
Node.getDeclContext();
612 if(Ctx->isFunctionOrMethod())
613 returnPatterns.foundMatch(
false);
615 for(; Ctx; Ctx = Ctx->getParent()) {
618 if(isa<LinkageSpecDecl>(Ctx))
620 if(!isa<NamedDecl>(Ctx))
622 if(Patterns.foundMatch(
false))
625 if(
const auto*ND = dyn_cast<NamespaceDecl>(Ctx)) {
627 if(Patterns.consumeNameSuffix(
getNodeName(*ND, Scratch),
628ND->isAnonymousNamespace() ||
633 if(
const auto*RD = dyn_cast<RecordDecl>(Ctx)) {
634 if(!isa<ClassTemplateSpecializationDecl>(Ctx)) {
635 if(Patterns.consumeNameSuffix(
getNodeName(*RD, Scratch),
645 returnmatchesNodeFullSlow(
Node);
648 returnPatterns.foundMatch(
true);
651boolHasNameMatcher::matchesNodeFullSlow(
constNamedDecl &
Node)
const{
652 const boolSkipUnwrittenCases[] = {
false,
true};
653 for(
boolSkipUnwritten : SkipUnwrittenCases) {
655llvm::raw_svector_ostream OS(NodeName);
657PrintingPolicy Policy =
Node.getASTContext().getPrintingPolicy();
658Policy.SuppressUnwrittenScope = SkipUnwritten;
659Policy.SuppressInlineNamespace =
662 Node.printQualifiedName(OS, Policy);
664 constStringRef
FullName= OS.str();
666 for(
constStringRef Pattern : Names) {
667 if(Pattern.starts_with(
"::")) {
670}
else if(
FullName.ends_with(Pattern) &&
671 FullName.drop_back(Pattern.size()).ends_with(
"::")) {
680boolHasNameMatcher::matchesNode(
constNamedDecl &
Node)
const{
681assert(matchesNodeFullFast(
Node) == matchesNodeFullSlow(
Node));
682 if(UseUnqualifiedMatch) {
683assert(matchesNodeUnqualified(
Node) == matchesNodeFullFast(
Node));
684 returnmatchesNodeUnqualified(
Node);
686 returnmatchesNodeFullFast(
Node);
703llvm::DenseSet<SourceLocation> &CheckedLocations) {
704 auto&
SM= Context.getSourceManager();
705 const LangOptions&LangOpts = Context.getLangOpts();
706 while(
Loc.isMacroID()) {
707 if(CheckedLocations.count(
Loc))
709CheckedLocations.insert(
Loc);
711 SM.getSLocEntry(
SM.getFileID(
Loc)).getExpansion();
715 if(std::optional<SourceLocation> ArgLoc =
718Context, CheckedLocations)) {
729std::optional<SourceLocation>
732llvm::DenseSet<SourceLocation> CheckedLocations;
738llvm::Regex::RegexFlags Flags,
740assert(!Regex.empty() &&
"Empty regex string");
741 autoSharedRegex = std::make_shared<llvm::Regex>(Regex, Flags);
743 if(!SharedRegex->isValid(Error)) {
744llvm::WithColor::error()
745<<
"building matcher '"<<
MatcherID<<
"': "<< Error <<
"\n";
746llvm::WithColor::note() <<
" input was '"<< Regex <<
"'\n";
752constinternal::VariadicDynCastAllOfMatcher<Stmt, ObjCAutoreleasePoolStmt>
754constinternal::VariadicDynCastAllOfMatcher<Decl, TranslationUnitDecl>
756constinternal::VariadicDynCastAllOfMatcher<Decl, TypedefDecl>
typedefDecl;
757constinternal::VariadicDynCastAllOfMatcher<Decl, TypedefNameDecl>
759constinternal::VariadicDynCastAllOfMatcher<Decl, TypeAliasDecl>
typeAliasDecl;
760constinternal::VariadicDynCastAllOfMatcher<Decl, TypeAliasTemplateDecl>
762constinternal::VariadicAllOfMatcher<Decl>
decl;
764constinternal::VariadicDynCastAllOfMatcher<Decl, BindingDecl>
bindingDecl;
765constinternal::VariadicDynCastAllOfMatcher<Decl, LinkageSpecDecl>
767constinternal::VariadicDynCastAllOfMatcher<Decl, NamedDecl>
namedDecl;
768constinternal::VariadicDynCastAllOfMatcher<Decl, LabelDecl>
labelDecl;
769constinternal::VariadicDynCastAllOfMatcher<Decl, NamespaceDecl>
namespaceDecl;
770constinternal::VariadicDynCastAllOfMatcher<Decl, NamespaceAliasDecl>
772constinternal::VariadicDynCastAllOfMatcher<Decl, RecordDecl>
recordDecl;
773constinternal::VariadicDynCastAllOfMatcher<Decl, CXXRecordDecl>
cxxRecordDecl;
774constinternal::VariadicDynCastAllOfMatcher<Decl, ClassTemplateDecl>
776constinternal::VariadicDynCastAllOfMatcher<
Decl,
779constinternal::VariadicDynCastAllOfMatcher<
782constinternal::VariadicDynCastAllOfMatcher<Decl, DeclaratorDecl>
784constinternal::VariadicDynCastAllOfMatcher<Decl, ParmVarDecl>
parmVarDecl;
785constinternal::VariadicDynCastAllOfMatcher<Decl, AccessSpecDecl>
792constinternal::VariadicDynCastAllOfMatcher<Decl, NonTypeTemplateParmDecl>
794constinternal::VariadicDynCastAllOfMatcher<Decl, TemplateTypeParmDecl>
796constinternal::VariadicDynCastAllOfMatcher<Decl, TemplateTemplateParmDecl>
800constinternal::VariadicAllOfMatcher<QualType>
qualType;
801constinternal::VariadicAllOfMatcher<Type>
type;
802constinternal::VariadicAllOfMatcher<TypeLoc>
typeLoc;
804constinternal::VariadicDynCastAllOfMatcher<TypeLoc, QualifiedTypeLoc>
806constinternal::VariadicDynCastAllOfMatcher<TypeLoc, PointerTypeLoc>
808constinternal::VariadicDynCastAllOfMatcher<TypeLoc, ReferenceTypeLoc>
810constinternal::VariadicDynCastAllOfMatcher<
TypeLoc,
813constinternal::VariadicDynCastAllOfMatcher<TypeLoc, ElaboratedTypeLoc>
816constinternal::VariadicDynCastAllOfMatcher<Stmt, UnaryExprOrTypeTraitExpr>
818constinternal::VariadicDynCastAllOfMatcher<Decl, ExportDecl>
exportDecl;
819constinternal::VariadicDynCastAllOfMatcher<Decl, ValueDecl>
valueDecl;
820constinternal::VariadicDynCastAllOfMatcher<Decl, CXXConstructorDecl>
822constinternal::VariadicDynCastAllOfMatcher<Decl, CXXDestructorDecl>
824constinternal::VariadicDynCastAllOfMatcher<Decl, EnumDecl>
enumDecl;
825constinternal::VariadicDynCastAllOfMatcher<Decl, EnumConstantDecl>
827constinternal::VariadicDynCastAllOfMatcher<Decl, TagDecl>
tagDecl;
828constinternal::VariadicDynCastAllOfMatcher<Decl, CXXMethodDecl>
cxxMethodDecl;
829constinternal::VariadicDynCastAllOfMatcher<Decl, CXXConversionDecl>
831constinternal::VariadicDynCastAllOfMatcher<Decl, ConceptDecl>
conceptDecl;
832constinternal::VariadicDynCastAllOfMatcher<Decl, VarDecl>
varDecl;
833constinternal::VariadicDynCastAllOfMatcher<Decl, FieldDecl>
fieldDecl;
834constinternal::VariadicDynCastAllOfMatcher<Decl, IndirectFieldDecl>
836constinternal::VariadicDynCastAllOfMatcher<Decl, FunctionDecl>
functionDecl;
837constinternal::VariadicDynCastAllOfMatcher<Decl, FunctionTemplateDecl>
839constinternal::VariadicDynCastAllOfMatcher<Decl, FriendDecl>
friendDecl;
840constinternal::VariadicAllOfMatcher<Stmt>
stmt;
841constinternal::VariadicDynCastAllOfMatcher<Stmt, DeclStmt>
declStmt;
842constinternal::VariadicDynCastAllOfMatcher<Stmt, MemberExpr>
memberExpr;
843constinternal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedMemberExpr>
845constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXDependentScopeMemberExpr>
847constinternal::VariadicDynCastAllOfMatcher<Stmt, CallExpr>
callExpr;
848constinternal::VariadicDynCastAllOfMatcher<Stmt, LambdaExpr>
lambdaExpr;
849constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXMemberCallExpr>
851constinternal::VariadicDynCastAllOfMatcher<Stmt, ObjCMessageExpr>
853constinternal::VariadicDynCastAllOfMatcher<Decl, ObjCInterfaceDecl>
855constinternal::VariadicDynCastAllOfMatcher<Decl, ObjCImplementationDecl>
857constinternal::VariadicDynCastAllOfMatcher<Decl, ObjCProtocolDecl>
859constinternal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryDecl>
861constinternal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryImplDecl>
863constinternal::VariadicDynCastAllOfMatcher<Decl, ObjCMethodDecl>
865constinternal::VariadicDynCastAllOfMatcher<Decl, BlockDecl>
867constinternal::VariadicDynCastAllOfMatcher<Decl, ObjCIvarDecl>
objcIvarDecl;
868constinternal::VariadicDynCastAllOfMatcher<Decl, ObjCPropertyDecl>
870constinternal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtThrowStmt>
872constinternal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtTryStmt>
objcTryStmt;
873constinternal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtCatchStmt>
875constinternal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtFinallyStmt>
877constinternal::VariadicDynCastAllOfMatcher<Stmt, ExprWithCleanups>
879constinternal::VariadicDynCastAllOfMatcher<Stmt, InitListExpr>
initListExpr;
880constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXStdInitializerListExpr>
882constinternal::VariadicDynCastAllOfMatcher<Stmt, ImplicitValueInitExpr>
884constinternal::VariadicDynCastAllOfMatcher<Stmt, ParenListExpr>
parenListExpr;
885constinternal::VariadicDynCastAllOfMatcher<Stmt, SubstNonTypeTemplateParmExpr>
887constinternal::VariadicDynCastAllOfMatcher<Decl, UsingDecl>
usingDecl;
888constinternal::VariadicDynCastAllOfMatcher<Decl, UsingEnumDecl>
usingEnumDecl;
889constinternal::VariadicDynCastAllOfMatcher<Decl, UsingDirectiveDecl>
891constinternal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedLookupExpr>
893constinternal::VariadicDynCastAllOfMatcher<Decl, UnresolvedUsingValueDecl>
895constinternal::VariadicDynCastAllOfMatcher<Decl, UnresolvedUsingTypenameDecl>
897constinternal::VariadicDynCastAllOfMatcher<Stmt, ConstantExpr>
constantExpr;
898constinternal::VariadicDynCastAllOfMatcher<Stmt, ParenExpr>
parenExpr;
899constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXConstructExpr>
901constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXUnresolvedConstructExpr>
903constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXThisExpr>
cxxThisExpr;
904constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXBindTemporaryExpr>
906constinternal::VariadicDynCastAllOfMatcher<Stmt, MaterializeTemporaryExpr>
908constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXNewExpr>
cxxNewExpr;
909constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXDeleteExpr>
cxxDeleteExpr;
910constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXNoexceptExpr>
912constinternal::VariadicDynCastAllOfMatcher<Stmt, ArraySubscriptExpr>
914constinternal::VariadicDynCastAllOfMatcher<Stmt, ArrayInitIndexExpr>
916constinternal::VariadicDynCastAllOfMatcher<Stmt, ArrayInitLoopExpr>
918constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXDefaultArgExpr>
920constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXOperatorCallExpr>
922constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXRewrittenBinaryOperator>
924constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXFoldExpr>
cxxFoldExpr;
925constinternal::VariadicDynCastAllOfMatcher<Stmt, Expr>
expr;
926constinternal::VariadicDynCastAllOfMatcher<Stmt, DeclRefExpr>
declRefExpr;
927constinternal::VariadicDynCastAllOfMatcher<Stmt, DependentScopeDeclRefExpr>
930constinternal::VariadicDynCastAllOfMatcher<Stmt, BlockExpr>
blockExpr;
931constinternal::VariadicDynCastAllOfMatcher<Stmt, IfStmt>
ifStmt;
932constinternal::VariadicDynCastAllOfMatcher<Stmt, ForStmt>
forStmt;
933constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXForRangeStmt>
935constinternal::VariadicDynCastAllOfMatcher<Stmt, WhileStmt>
whileStmt;
936constinternal::VariadicDynCastAllOfMatcher<Stmt, DoStmt>
doStmt;
937constinternal::VariadicDynCastAllOfMatcher<Stmt, BreakStmt>
breakStmt;
938constinternal::VariadicDynCastAllOfMatcher<Stmt, ContinueStmt>
continueStmt;
939constinternal::VariadicDynCastAllOfMatcher<Stmt, CoreturnStmt>
coreturnStmt;
940constinternal::VariadicDynCastAllOfMatcher<Stmt, ReturnStmt>
returnStmt;
941constinternal::VariadicDynCastAllOfMatcher<Stmt, GotoStmt>
gotoStmt;
942constinternal::VariadicDynCastAllOfMatcher<Stmt, LabelStmt>
labelStmt;
943constinternal::VariadicDynCastAllOfMatcher<Stmt, AddrLabelExpr>
addrLabelExpr;
944constinternal::VariadicDynCastAllOfMatcher<Stmt, SwitchStmt>
switchStmt;
945constinternal::VariadicDynCastAllOfMatcher<Stmt, SwitchCase>
switchCase;
946constinternal::VariadicDynCastAllOfMatcher<Stmt, CaseStmt>
caseStmt;
947constinternal::VariadicDynCastAllOfMatcher<Stmt, DefaultStmt>
defaultStmt;
948constinternal::VariadicDynCastAllOfMatcher<Stmt, CompoundStmt>
compoundStmt;
949constinternal::VariadicDynCastAllOfMatcher<Stmt, CoroutineBodyStmt>
951constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXCatchStmt>
cxxCatchStmt;
952constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXTryStmt>
cxxTryStmt;
953constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXThrowExpr>
cxxThrowExpr;
954constinternal::VariadicDynCastAllOfMatcher<Stmt, NullStmt>
nullStmt;
955constinternal::VariadicDynCastAllOfMatcher<Stmt, AsmStmt>
asmStmt;
956constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXBoolLiteralExpr>
958constinternal::VariadicDynCastAllOfMatcher<Stmt, StringLiteral>
stringLiteral;
960constinternal::VariadicDynCastAllOfMatcher<Stmt, CharacterLiteral>
962constinternal::VariadicDynCastAllOfMatcher<Stmt, IntegerLiteral>
964constinternal::VariadicDynCastAllOfMatcher<Stmt, FloatingLiteral>
floatLiteral;
966constinternal::VariadicDynCastAllOfMatcher<Stmt, FixedPointLiteral>
968constinternal::VariadicDynCastAllOfMatcher<Stmt, UserDefinedLiteral>
970constinternal::VariadicDynCastAllOfMatcher<Stmt, CompoundLiteralExpr>
972constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXNullPtrLiteralExpr>
974constinternal::VariadicDynCastAllOfMatcher<Stmt, ChooseExpr>
chooseExpr;
975constinternal::VariadicDynCastAllOfMatcher<Stmt, ConvertVectorExpr>
977constinternal::VariadicDynCastAllOfMatcher<Stmt, CoawaitExpr>
979constinternal::VariadicDynCastAllOfMatcher<Stmt, DependentCoawaitExpr>
981constinternal::VariadicDynCastAllOfMatcher<Stmt, CoyieldExpr>
983constinternal::VariadicDynCastAllOfMatcher<Stmt, GNUNullExpr>
gnuNullExpr;
984constinternal::VariadicDynCastAllOfMatcher<Stmt, GenericSelectionExpr>
986constinternal::VariadicDynCastAllOfMatcher<Stmt, AtomicExpr>
atomicExpr;
987constinternal::VariadicDynCastAllOfMatcher<Stmt, StmtExpr>
stmtExpr;
988constinternal::VariadicDynCastAllOfMatcher<Stmt, BinaryOperator>
993constinternal::MapAnyOfMatcher<CallExpr, CXXConstructExpr>
invocation;
994constinternal::VariadicDynCastAllOfMatcher<Stmt, UnaryOperator>
unaryOperator;
995constinternal::VariadicDynCastAllOfMatcher<Stmt, ConditionalOperator>
997constinternal::VariadicDynCastAllOfMatcher<Stmt, BinaryConditionalOperator>
999constinternal::VariadicDynCastAllOfMatcher<Stmt, OpaqueValueExpr>
1001constinternal::VariadicDynCastAllOfMatcher<Decl, StaticAssertDecl>
1003constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXReinterpretCastExpr>
1005constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXStaticCastExpr>
1007constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXDynamicCastExpr>
1009constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXConstCastExpr>
1011constinternal::VariadicDynCastAllOfMatcher<Stmt, CStyleCastExpr>
1013constinternal::VariadicDynCastAllOfMatcher<Stmt, ExplicitCastExpr>
1015constinternal::VariadicDynCastAllOfMatcher<Stmt, ImplicitCastExpr>
1017constinternal::VariadicDynCastAllOfMatcher<Stmt, CastExpr>
castExpr;
1018constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXFunctionalCastExpr>
1020constinternal::VariadicDynCastAllOfMatcher<Stmt, CXXTemporaryObjectExpr>
1022constinternal::VariadicDynCastAllOfMatcher<Stmt, PredefinedExpr>
1024constinternal::VariadicDynCastAllOfMatcher<Stmt, DesignatedInitExpr>
1026constinternal::VariadicOperatorMatcherFunc<
10272, std::numeric_limits<unsigned>::max()>
1028 eachOf= {internal::DynTypedMatcher::VO_EachOf};
1029constinternal::VariadicOperatorMatcherFunc<
10302, std::numeric_limits<unsigned>::max()>
1031 anyOf= {internal::DynTypedMatcher::VO_AnyOf};
1032constinternal::VariadicOperatorMatcherFunc<
10332, std::numeric_limits<unsigned>::max()>
1034 allOf= {internal::DynTypedMatcher::VO_AllOf};
1036internal::DynTypedMatcher::VO_Optionally};
1037constinternal::VariadicFunction<internal::Matcher<NamedDecl>, StringRef,
1038internal::hasAnyNameFunc>
1041constinternal::VariadicFunction<internal::HasOpNameMatcher, StringRef,
1042internal::hasAnyOperatorNameFunc>
1044constinternal::VariadicFunction<internal::HasOverloadOpNameMatcher, StringRef,
1045internal::hasAnyOverloadedOperatorNameFunc>
1047constinternal::VariadicFunction<internal::Matcher<ObjCMessageExpr>, StringRef,
1048internal::hasAnySelectorFunc>
1050constinternal::ArgumentAdaptingMatcherFunc<internal::HasMatcher>
has= {};
1051constinternal::ArgumentAdaptingMatcherFunc<internal::HasDescendantMatcher>
1053constinternal::ArgumentAdaptingMatcherFunc<internal::ForEachMatcher>
forEach=
1055constinternal::ArgumentAdaptingMatcherFunc<internal::ForEachDescendantMatcher>
1057constinternal::ArgumentAdaptingMatcherFunc<
1058internal::HasParentMatcher,
1059internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>,
1060internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>>
1062constinternal::ArgumentAdaptingMatcherFunc<
1063internal::HasAncestorMatcher,
1064internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>,
1065internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>>
1067constinternal::VariadicOperatorMatcherFunc<1, 1>
unless= {
1068internal::DynTypedMatcher::VO_UnaryNot};
1070constinternal::VariadicAllOfMatcher<NestedNameSpecifierLoc>
1072constinternal::VariadicAllOfMatcher<Attr>
attr;
1073constinternal::VariadicDynCastAllOfMatcher<Stmt, CUDAKernelCallExpr>
1125constinternal::VariadicDynCastAllOfMatcher<Stmt, OMPExecutableDirective>
1127constinternal::VariadicDynCastAllOfMatcher<OMPClause, OMPDefaultClause>
1129constinternal::VariadicDynCastAllOfMatcher<Decl, CXXDeductionGuideDecl>
Defines the clang::ASTContext interface.
DynTypedMatcher::MatcherIDType MatcherID
#define AST_POLYMORPHIC_SUPPORTED_TYPES(...)
Construct a type-list to be passed to the AST_POLYMORPHIC_MATCHER* macros.
#define AST_TYPELOC_TRAVERSE_MATCHER_DEF(MatcherName, ReturnTypesF)
#define AST_MATCHER_P(Type, DefineMatcher, ParamType, Param)
AST_MATCHER_P(Type, DefineMatcher, ParamType, Param) { ... } defines a single-parameter function name...
enum clang::sema::@1704::IndirectLocalPathEntry::EntryKind Kind
Defines the C++ template declaration subclasses.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
static ASTNodeKind getMostDerivedType(ASTNodeKind Kind1, ASTNodeKind Kind2)
Return the most derived type between Kind1 and Kind2.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
A builtin binary operation expression such as "x + y" or "x <= y".
Represents a path from a specific derived class (which is not represented as part of the path) to a p...
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
Represents a base class of a C++ class.
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.
Represents a class template specialization, which refers to a class template with a given set of temp...
Complex values, per C99 6.2.5p11.
Decl - This represents one declaration (or definition), e.g.
A dynamically typed AST node container.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
static unsigned getSpelling(const Token &Tok, const char *&Buffer, const SourceManager &SourceMgr, const LangOptions &LangOpts, bool *Invalid=nullptr)
getSpelling - This method is used to get the spelling of a token into a preallocated buffer,...
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.
An expression that sends a message to the given Objective-C object or class.
Represents a pointer to an Objective C object.
PointerType - C99 6.7.5.1 - Pointer Declarators.
Represents a struct/union/class.
Base for LValueReferenceType and RValueReferenceType.
Encodes a location in the source.
This class handles loading and caching of source files into memory.
Each ExpansionInfo encodes the expansion location - where the token was ultimately expanded,...
SourceLocation getExpansionLocStart() const
SourceLocation getSpellingLoc() const
bool isMacroArgExpansion() const
Base wrapper for a particular "section" of type source info.
Maps string IDs to AST nodes matched by parts of a matcher.
HasOverloadOpNameMatcher hasAnyOverloadedOperatorNameFunc(ArrayRef< const StringRef * > NameRefs)
static std::vector< std::string > vectorFromRefs(ArrayRef< const StringRef * > NameRefs)
std::shared_ptr< llvm::Regex > createAndVerifyRegex(StringRef Regex, llvm::Regex::RegexFlags Flags, StringRef MatcherID)
Matcher< ObjCMessageExpr > hasAnySelectorFunc(ArrayRef< const StringRef * > NameRefs)
static bool eachOfVariadicOperator(const DynTypedNode &DynNode, ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder, ArrayRef< DynTypedMatcher > InnerMatchers)
static bool isTokenAtLoc(const SourceManager &SM, const LangOptions &LangOpts, StringRef Text, SourceLocation Loc)
static StringRef getNodeName(const NamedDecl &Node, llvm::SmallString< 128 > &Scratch)
static bool anyOfVariadicOperator(const DynTypedNode &DynNode, ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder, ArrayRef< DynTypedMatcher > InnerMatchers)
static bool optionallyVariadicOperator(const DynTypedNode &DynNode, ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder, ArrayRef< DynTypedMatcher > InnerMatchers)
Matcher< NamedDecl > hasAnyNameFunc(ArrayRef< const StringRef * > NameRefs)
HasOpNameMatcher hasAnyOperatorNameFunc(ArrayRef< const StringRef * > NameRefs)
static bool notUnaryOperator(const DynTypedNode &DynNode, ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder, ArrayRef< DynTypedMatcher > InnerMatchers)
std::optional< SourceLocation > getExpansionLocOfMacro(StringRef MacroName, SourceLocation Loc, const ASTContext &Context)
static bool consumeNameSuffix(StringRef &FullName, StringRef Suffix)
bool matchesAnyBase(const CXXRecordDecl &Node, const Matcher< CXXBaseSpecifier > &BaseSpecMatcher, ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder)
static std::optional< SourceLocation > getExpansionLocOfMacroRecursive(StringRef MacroName, SourceLocation Loc, const ASTContext &Context, llvm::DenseSet< SourceLocation > &CheckedLocations)
static bool allOfVariadicOperator(const DynTypedNode &DynNode, ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder, ArrayRef< DynTypedMatcher > InnerMatchers)
const internal::VariadicDynCastAllOfMatcher< Stmt, FixedPointLiteral > fixedPointLiteral
Matches fixed point literals.
const internal::VariadicDynCastAllOfMatcher< Stmt, CStyleCastExpr > cStyleCastExpr
Matches a C-style cast expression.
const internal::VariadicDynCastAllOfMatcher< Decl, TagDecl > tagDecl
Matches tag declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXReinterpretCastExpr > cxxReinterpretCastExpr
Matches a reinterpret_cast expression.
const internal::VariadicDynCastAllOfMatcher< Decl, VarDecl > varDecl
Matches variable declarations.
const internal::VariadicDynCastAllOfMatcher< TypeLoc, ElaboratedTypeLoc > elaboratedTypeLoc
Matches C or C++ elaborated TypeLocs.
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 AstTypeMatcher< ElaboratedType > elaboratedType
Matches types specified with an elaborated type keyword or with a qualified name.
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.
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.
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.
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.
const internal::VariadicDynCastAllOfMatcher< Stmt, InitListExpr > initListExpr
Matches init list expressions.
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.
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< Stmt, ExplicitCastExpr > explicitCastExpr
Matches explicit cast expressions.
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.
const internal::VariadicAllOfMatcher< LambdaCapture > lambdaCapture
Matches lambda captures.
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.
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, 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).
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.
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.
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.
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.
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.
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.
const internal::VariadicDynCastAllOfMatcher< Stmt, CXXCatchStmt > cxxCatchStmt
Matches catch statements.
const internal::VariadicDynCastAllOfMatcher< Stmt, CastExpr > castExpr
Matches any cast nodes of Clang's AST.
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< 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.
TraversalKind
Defines how we descend a level in the AST when we pass through expressions.
@ TK_IgnoreUnlessSpelledInSource
Ignore AST nodes not written in the source.
@ Result
The result type of a method or function.
@ Other
Other implicit parameter.
Diagnostic wrappers for TextAPI types for error reporting.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4