clang 22.0.0git
RecursiveASTVisitor.h File Reference
#include "clang/AST/ASTConcept.h"
#include "clang/AST/Attr.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclBase.h"
#include "clang/AST/DeclCXX.h"
#include "clang/AST/DeclFriend.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/DeclOpenACC.h"
#include "clang/AST/DeclOpenMP.h"
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/DeclarationName.h"
#include "clang/AST/Expr.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/ExprConcepts.h"
#include "clang/AST/ExprObjC.h"
#include "clang/AST/ExprOpenMP.h"
#include "clang/AST/LambdaCapture.h"
#include "clang/AST/NestedNameSpecifier.h"
#include "clang/AST/OpenACCClause.h"
#include "clang/AST/OpenMPClause.h"
#include "clang/AST/Stmt.h"
#include "clang/AST/StmtCXX.h"
#include "clang/AST/StmtObjC.h"
#include "clang/AST/StmtOpenACC.h"
#include "clang/AST/StmtOpenMP.h"
#include "clang/AST/StmtSYCL.h"
#include "clang/AST/TemplateBase.h"
#include "clang/AST/TemplateName.h"
#include "clang/AST/Type.h"
#include "clang/AST/TypeLoc.h"
#include "clang/Basic/LLVM.h"
#include "clang/Basic/OpenMPKinds.h"
#include "clang/Basic/Specifiers.h"
#include "llvm/ADT/PointerIntPair.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Support/Casting.h"
#include <algorithm>
#include <cstddef>
#include <type_traits>
#include "clang/AST/AttrVisitor.inc"
#include "clang/AST/StmtNodes.inc"
#include "clang/AST/TypeNodes.inc"
#include "clang/AST/TypeLocNodes.def"
#include "clang/AST/DeclNodes.inc"
#include "llvm/Frontend/OpenMP/OMP.inc"

Go to the source code of this file.

Classes

struct  clang::detail::has_same_member_pointer_type< T, U >
struct  clang::detail::has_same_member_pointer_type< R(T::*)(P...), R(U::*)(P...)>
class  clang::RecursiveASTVisitor< Derived >
 A class that does preorder or postorder depth-first traversal on the entire Clang AST and visits each node. More...

Namespaces

namespace  clang
 The JSON file list parser is used to communicate input to InstallAPI.
namespace  clang::detail

Macros

#define TRY_TO(CALL_EXPR)
#define ATTR_VISITOR_DECLS_ONLY
#define TRAVERSE_STMT_BASE(NAME, CLASS, VAR, QUEUE)
#define TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S)
#define ABSTRACT_STMT(STMT)
#define STMT(CLASS, PARENT)
#define STMT(CLASS, PARENT)
#define ABSTRACT_TYPE(CLASS, BASE)
#define TYPE(CLASS, BASE)
#define TYPE(CLASS, BASE)
#define ABSTRACT_TYPELOC(CLASS, BASE)
#define TYPELOC(CLASS, BASE)
#define TYPE(CLASS, BASE)
#define ABSTRACT_DECL(DECL)
#define DECL(CLASS, BASE)
#define DECL(CLASS, BASE)
#define DEF_TRAVERSE_TMPL_INST(TMPLDECLKIND)
#define GEN_CLANG_CLAUSE_CLASS
#define CLAUSE_CLASS(Enum, Str, Class)
#define ABSTRACT_STMT(STMT)
#define STMT(CLASS, PARENT)
#define ABSTRACT_STMT(STMT)
#define STMT(CLASS, PARENT)
#define INITLISTEXPR(CLASS, PARENT)
#define ABSTRACT_TYPE(CLASS, BASE)
#define TYPE(CLASS, BASE)
#define ABSTRACT_TYPELOC(CLASS, BASE)
#define TYPELOC(CLASS, BASE)
#define VISITORCLASS   RecursiveASTVisitor
#define ABSTRACT_DECL(DECL)
#define DECL(CLASS, BASE)
#define DEF_TRAVERSE_TYPE(TYPE, CODE)
#define DEF_TRAVERSE_TYPELOC(TYPE, CODE)
#define DEF_TRAVERSE_DECL(DECL, CODE)
#define DEF_TRAVERSE_TMPL_DECL(TMPLDECLKIND)
#define DEF_TRAVERSE_TMPL_SPEC_DECL(TMPLDECLKIND, DECLKIND)
#define DEF_TRAVERSE_TMPL_PART_SPEC_DECL(TMPLDECLKIND, DECLKIND)
#define DEF_TRAVERSE_STMT(STMT, CODE)
#define GEN_CLANG_CLAUSE_CLASS
#define CLAUSE_CLASS(Enum, Str, Class)
#define CLAUSE_NO_CLASS(Enum, Str)

Functions

template<typename FirstMethodPtrTy, typename SecondMethodPtrTy>
LLVM_ATTRIBUTE_ALWAYS_INLINE LLVM_ATTRIBUTE_NODEBUG auto clang::detail::isSameMethod (FirstMethodPtrTy FirstMethodPtr, SecondMethodPtrTy SecondMethodPtr) -> bool
 Returns true if and only if FirstMethodPtr and SecondMethodPtr are pointers to the same non-static member function.
 clang::DEF_TRAVERSE_TYPE (ComplexType, { TRY_TO(TraverseType(T->getElementType()));}) DEF_TRAVERSE_TYPE(PointerType
 clang::DEF_TRAVERSE_TYPE (BlockPointerType, { TRY_TO(TraverseType(T->getPointeeType()));}) DEF_TRAVERSE_TYPE(LValueReferenceType
 clang::DEF_TRAVERSE_TYPE (RValueReferenceType, { TRY_TO(TraverseType(T->getPointeeType()));}) DEF_TRAVERSE_TYPE(MemberPointerType
 clang::TRY_TO (TraverseNestedNameSpecifier(Qualifier))
 clang::TRY_TO (TraverseType(T->getPointeeType()))
 clang::DEF_TRAVERSE_TYPE (AdjustedType, { TRY_TO(TraverseType(T->getOriginalType()));}) DEF_TRAVERSE_TYPE(DecayedType
 clang::DEF_TRAVERSE_TYPE (ConstantArrayType, { TRY_TO(TraverseType(T->getElementType()));if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T->getSizeExpr())));}) DEF_TRAVERSE_TYPE(ArrayParameterType
 clang::if (T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
 clang::DEF_TRAVERSE_TYPE (IncompleteArrayType, { TRY_TO(TraverseType(T->getElementType()));}) DEF_TRAVERSE_TYPE(VariableArrayType
 clang::TRY_TO (TraverseStmt(T->getSizeExpr()))
 clang::DEF_TRAVERSE_TYPE (DependentSizedArrayType, { TRY_TO(TraverseType(T->getElementType()));if(T->getSizeExpr()) TRY_TO(TraverseStmt(T->getSizeExpr()));}) DEF_TRAVERSE_TYPE(DependentAddressSpaceType
 clang::DEF_TRAVERSE_TYPE (DependentVectorType, { if(T->getSizeExpr()) TRY_TO(TraverseStmt(T->getSizeExpr()));TRY_TO(TraverseType(T->getElementType()));}) DEF_TRAVERSE_TYPE(DependentSizedExtVectorType
 clang::TRY_TO (TraverseType(T->getElementType()))
 clang::DEF_TRAVERSE_TYPE (VectorType, { TRY_TO(TraverseType(T->getElementType()));}) DEF_TRAVERSE_TYPE(ExtVectorType
 clang::DEF_TRAVERSE_TYPE (ConstantMatrixType, { TRY_TO(TraverseType(T->getElementType()));}) DEF_TRAVERSE_TYPE(DependentSizedMatrixType
 clang::DEF_TRAVERSE_TYPE (FunctionNoProtoType, { TRY_TO(TraverseType(T->getReturnType()));}) DEF_TRAVERSE_TYPE(FunctionProtoType
 clang::for (const auto &A :T->param_types())
 clang::for (const auto &E :T->exceptions())
 clang::if (Expr *NE=T->getNoexceptExpr()) TRY_TO(TraverseStmt(NE))
 clang::DEF_TRAVERSE_TYPE (UsingType, { if(TraverseQualifier) TRY_TO(TraverseNestedNameSpecifier(T->getQualifier()));}) DEF_TRAVERSE_TYPE(UnresolvedUsingType
 clang::DEF_TRAVERSE_TYPE (TypedefType, { if(TraverseQualifier) TRY_TO(TraverseNestedNameSpecifier(T->getQualifier()));}) DEF_TRAVERSE_TYPE(TypeOfExprType
 clang::DEF_TRAVERSE_TYPE (TypeOfType, { TRY_TO(TraverseType(T->getUnmodifiedType()));}) DEF_TRAVERSE_TYPE(DecltypeType
 clang::DEF_TRAVERSE_TYPE (PackIndexingType, { TRY_TO(TraverseType(T->getPattern()));TRY_TO(TraverseStmt(T->getIndexExpr()));}) DEF_TRAVERSE_TYPE(UnaryTransformType
 clang::TRY_TO (TraverseType(T->getUnderlyingType()))
 clang::DEF_TRAVERSE_TYPE (AutoType, { TRY_TO(TraverseType(T->getDeducedType()));if(T->isConstrained()) { TRY_TO(TraverseTemplateArguments(T->getTypeConstraintArguments()));} }) DEF_TRAVERSE_TYPE(SubstTemplateTypeParmType
 clang::DEF_TRAVERSE_TYPE (SubstTemplateTypeParmPackType, { TRY_TO(TraverseSubstPackTypeHelper(T));}) DEF_TRAVERSE_TYPE(SubstBuiltinTemplatePackType
 clang::DEF_TRAVERSE_TYPE (AttributedType, { TRY_TO(TraverseType(T->getModifiedType()));}) DEF_TRAVERSE_TYPE(CountAttributedType
 clang::TRY_TO (TraverseType(T->desugar()))
 clang::DEF_TRAVERSE_TYPE (BTFTagAttributedType, { TRY_TO(TraverseType(T->getWrappedType()));}) DEF_TRAVERSE_TYPE(HLSLAttributedResourceType
 clang::DEF_TRAVERSE_TYPE (HLSLInlineSpirvType, { for(auto &Operand :T->getOperands()) { if(Operand.isConstant()||Operand.isType()) { TRY_TO(TraverseType(Operand.getResultType()));} } }) DEF_TRAVERSE_TYPE(ParenType
 clang::DEF_TRAVERSE_TYPE (MacroQualifiedType, { TRY_TO(TraverseType(T->getUnderlyingType()));}) template< typename Derived > bool RecursiveASTVisitor< Derived >
 clang::DEF_TRAVERSE_TYPE (EnumType, { TRY_TO(TraverseTagType(T, TraverseQualifier));}) DEF_TRAVERSE_TYPE(RecordType
 clang::DEF_TRAVERSE_TYPE (InjectedClassNameType, { TRY_TO(TraverseTagType(T, TraverseQualifier));}) DEF_TRAVERSE_TYPE(DependentNameType
 clang::DEF_TRAVERSE_TYPE (TemplateSpecializationType, { if(TraverseQualifier) { TRY_TO(TraverseTemplateName(T->getTemplateName()));} else { TRY_TO(TraverseTemplateName(TemplateName(T->getTemplateName().getAsTemplateDecl(true))));} TRY_TO(TraverseTemplateArguments(T->template_arguments()));}) DEF_TRAVERSE_TYPE(DeducedTemplateSpecializationType
 clang::DEF_TRAVERSE_TYPE (PackExpansionType, { TRY_TO(TraverseType(T->getPattern()));}) DEF_TRAVERSE_TYPE(ObjCObjectType
 clang::for (auto typeArg :T->getTypeArgsAsWritten())
 clang::DEF_TRAVERSE_TYPE (ObjCObjectPointerType, { TRY_TO(TraverseType(T->getPointeeType()));}) DEF_TRAVERSE_TYPE(AtomicType
 clang::DEF_TRAVERSE_TYPE (PipeType, { TRY_TO(TraverseType(T->getElementType()));}) DEF_TRAVERSE_TYPE(DependentBitIntType
 clang::DEF_TRAVERSE_TYPELOC (ComplexType, { TRY_TO(TraverseType(TL.getTypePtr() ->getElementType()));}) DEF_TRAVERSE_TYPELOC(PointerType
 clang::DEF_TRAVERSE_TYPELOC (BlockPointerType, { TRY_TO(TraverseTypeLoc(TL.getPointeeLoc()));}) DEF_TRAVERSE_TYPELOC(LValueReferenceType
 clang::DEF_TRAVERSE_TYPELOC (RValueReferenceType, { TRY_TO(TraverseTypeLoc(TL.getPointeeLoc()));}) DEF_TRAVERSE_TYPELOC(MemberPointerType
else clang::TRY_TO (TraverseNestedNameSpecifier(TL.getTypePtr() ->getQualifier()))
 clang::TRY_TO (TraverseTypeLoc(TL.getPointeeLoc()))
 clang::DEF_TRAVERSE_TYPELOC (AdjustedType, { TRY_TO(TraverseTypeLoc(TL.getOriginalLoc()));}) DEF_TRAVERSE_TYPELOC(DecayedType
 clang::DEF_TRAVERSE_TYPELOC (ConstantArrayType, { TRY_TO(TraverseTypeLoc(TL.getElementLoc()));TRY_TO(TraverseArrayTypeLocHelper(TL));}) DEF_TRAVERSE_TYPELOC(ArrayParameterType
 clang::TRY_TO (TraverseArrayTypeLocHelper(TL))
 clang::DEF_TRAVERSE_TYPELOC (IncompleteArrayType, { TRY_TO(TraverseTypeLoc(TL.getElementLoc()));TRY_TO(TraverseArrayTypeLocHelper(TL));}) DEF_TRAVERSE_TYPELOC(VariableArrayType
 clang::DEF_TRAVERSE_TYPELOC (DependentSizedArrayType, { TRY_TO(TraverseTypeLoc(TL.getElementLoc()));TRY_TO(TraverseArrayTypeLocHelper(TL));}) DEF_TRAVERSE_TYPELOC(DependentAddressSpaceType
 clang::TRY_TO (TraverseType(TL.getTypePtr() ->getPointeeType()))
 clang::DEF_TRAVERSE_TYPELOC (DependentSizedExtVectorType, { if(TL.getTypePtr() ->getSizeExpr()) TRY_TO(TraverseStmt(TL.getTypePtr() ->getSizeExpr()));TRY_TO(TraverseType(TL.getTypePtr() ->getElementType()));}) DEF_TRAVERSE_TYPELOC(VectorType
 clang::DEF_TRAVERSE_TYPELOC (DependentVectorType, { if(TL.getTypePtr() ->getSizeExpr()) TRY_TO(TraverseStmt(TL.getTypePtr() ->getSizeExpr()));TRY_TO(TraverseType(TL.getTypePtr() ->getElementType()));}) DEF_TRAVERSE_TYPELOC(ExtVectorType
 clang::DEF_TRAVERSE_TYPELOC (ConstantMatrixType, { TRY_TO(TraverseStmt(TL.getAttrRowOperand()));TRY_TO(TraverseStmt(TL.getAttrColumnOperand()));TRY_TO(TraverseType(TL.getTypePtr() ->getElementType()));}) DEF_TRAVERSE_TYPELOC(DependentSizedMatrixType
 clang::TRY_TO (TraverseStmt(TL.getAttrColumnOperand()))
 clang::TRY_TO (TraverseType(TL.getTypePtr() ->getElementType()))
 clang::DEF_TRAVERSE_TYPELOC (FunctionNoProtoType, { TRY_TO(TraverseTypeLoc(TL.getReturnLoc()));}) DEF_TRAVERSE_TYPELOC(FunctionProtoType
 clang::for (unsigned I=0, E=TL.getNumParams();I !=E;++I)
 clang::DEF_TRAVERSE_TYPELOC (UsingType, { if(NestedNameSpecifierLoc QualifierLoc=TL.getQualifierLoc();TraverseQualifier &&QualifierLoc) TRY_TO(TraverseNestedNameSpecifierLoc(QualifierLoc));}) DEF_TRAVERSE_TYPELOC(UnresolvedUsingType
 clang::DEF_TRAVERSE_TYPELOC (TypedefType, { if(NestedNameSpecifierLoc QualifierLoc=TL.getQualifierLoc();TraverseQualifier &&QualifierLoc) TRY_TO(TraverseNestedNameSpecifierLoc(QualifierLoc));}) DEF_TRAVERSE_TYPELOC(TypeOfExprType
 clang::DEF_TRAVERSE_TYPELOC (TypeOfType, { TRY_TO(TraverseTypeLoc(TL.getUnmodifiedTInfo() ->getTypeLoc()));}) DEF_TRAVERSE_TYPELOC(DecltypeType
 clang::DEF_TRAVERSE_TYPELOC (PackIndexingType, { TRY_TO(TraverseType(TL.getPattern()));TRY_TO(TraverseStmt(TL.getTypePtr() ->getIndexExpr()));}) DEF_TRAVERSE_TYPELOC(UnaryTransformType
 clang::DEF_TRAVERSE_TYPELOC (AutoType, { TRY_TO(TraverseType(TL.getTypePtr() ->getDeducedType()));if(TL.isConstrained()) { TRY_TO(TraverseConceptReference(TL.getConceptReference()));} }) DEF_TRAVERSE_TYPELOC(SubstTemplateTypeParmType
 clang::DEF_TRAVERSE_TYPELOC (SubstTemplateTypeParmPackType, { TRY_TO(TraverseSubstPackTypeLocHelper(TL));}) DEF_TRAVERSE_TYPELOC(SubstBuiltinTemplatePackType
 clang::DEF_TRAVERSE_TYPELOC (ParenType, { TRY_TO(TraverseTypeLoc(TL.getInnerLoc()));}) DEF_TRAVERSE_TYPELOC(MacroQualifiedType
 clang::DEF_TRAVERSE_TYPELOC (AttributedType, { TRY_TO(TraverseTypeLoc(TL.getModifiedLoc()));}) DEF_TRAVERSE_TYPELOC(CountAttributedType
 clang::DEF_TRAVERSE_TYPELOC (BTFTagAttributedType, { TRY_TO(TraverseTypeLoc(TL.getWrappedLoc()));}) DEF_TRAVERSE_TYPELOC(HLSLAttributedResourceType
 clang::DEF_TRAVERSE_TYPELOC (HLSLInlineSpirvType, { TRY_TO(TraverseType(TL.getType()));}) template< typename Derived > bool RecursiveASTVisitor< Derived >
 clang::DEF_TRAVERSE_TYPELOC (EnumType, { TRY_TO(TraverseTagTypeLoc(TL, TraverseQualifier));}) DEF_TRAVERSE_TYPELOC(RecordType
 clang::DEF_TRAVERSE_TYPELOC (InjectedClassNameType, { TRY_TO(TraverseTagTypeLoc(TL, TraverseQualifier));}) DEF_TRAVERSE_TYPELOC(DependentNameType
 clang::DEF_TRAVERSE_TYPELOC (TemplateSpecializationType, { if(TraverseQualifier) TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc()));TRY_TO(TraverseTemplateName(TemplateName(TL.getTypePtr() ->getTemplateName().getAsTemplateDecl(true))));for(unsigned I=0, E=TL.getNumArgs();I !=E;++I) { TRY_TO(TraverseTemplateArgumentLoc(TL.getArgLoc(I)));} }) DEF_TRAVERSE_TYPELOC(DeducedTemplateSpecializationType
 clang::TRY_TO (TraverseTemplateName(TemplateName(T->getTemplateName().getAsTemplateDecl(true))))
 clang::TRY_TO (TraverseType(T->getDeducedType()))
 clang::DEF_TRAVERSE_TYPELOC (PackExpansionType, { TRY_TO(TraverseTypeLoc(TL.getPatternLoc()));}) DEF_TRAVERSE_TYPELOC(ObjCTypeParamType

Variables

const FunctionProtoTypeclang::T = TL.getTypePtr()

Macro Definition Documentation

◆ ABSTRACT_DECL [1/2]

#define ABSTRACT_DECL ( DECL)

Definition at line 447 of file RecursiveASTVisitor.h.

◆ ABSTRACT_DECL [2/2]

#define ABSTRACT_DECL ( DECL)

Definition at line 447 of file RecursiveASTVisitor.h.

◆ ABSTRACT_STMT [1/3]

#define ABSTRACT_STMT ( STMT)

Definition at line 369 of file RecursiveASTVisitor.h.

◆ ABSTRACT_STMT [2/3]

#define ABSTRACT_STMT ( STMT)

Definition at line 369 of file RecursiveASTVisitor.h.

◆ ABSTRACT_STMT [3/3]

#define ABSTRACT_STMT ( STMT)

Definition at line 369 of file RecursiveASTVisitor.h.

◆ ABSTRACT_TYPE [1/2]

#define ABSTRACT_TYPE ( CLASS,
BASE )

Definition at line 391 of file RecursiveASTVisitor.h.

◆ ABSTRACT_TYPE [2/2]

#define ABSTRACT_TYPE ( CLASS,
BASE )

Definition at line 391 of file RecursiveASTVisitor.h.

◆ ABSTRACT_TYPELOC [1/2]

#define ABSTRACT_TYPELOC ( CLASS,
BASE )

Definition at line 413 of file RecursiveASTVisitor.h.

◆ ABSTRACT_TYPELOC [2/2]

#define ABSTRACT_TYPELOC ( CLASS,
BASE )

Definition at line 413 of file RecursiveASTVisitor.h.

◆ ATTR_VISITOR_DECLS_ONLY

#define ATTR_VISITOR_DECLS_ONLY

Definition at line 332 of file RecursiveASTVisitor.h.

◆ CLAUSE_CLASS [1/2]

#define CLAUSE_CLASS ( Enum,
Str,
Class )
Value:
bool Visit##Class(Class *C);

Definition at line 509 of file RecursiveASTVisitor.h.

◆ CLAUSE_CLASS [2/2]

#define CLAUSE_CLASS ( Enum,
Str,
Class )
Value:
case llvm::omp::Clause::Enum: \
TRY_TO(Visit##Class(static_cast<Class *>(C))); \
break;

Definition at line 509 of file RecursiveASTVisitor.h.

◆ CLAUSE_NO_CLASS

#define CLAUSE_NO_CLASS ( Enum,
Str )
Value:
case llvm::omp::Clause::Enum: \
break;

◆ DECL [1/3]

#define DECL ( CLASS,
BASE )
Value:
bool Traverse##CLASS##Decl(CLASS##Decl *D);

Definition at line 448 of file RecursiveASTVisitor.h.

◆ DECL [2/3]

#define DECL ( CLASS,
BASE )
Value:
bool WalkUpFrom##CLASS##Decl(CLASS##Decl *D) { \
TRY_TO(WalkUpFrom##BASE(D)); \
TRY_TO(Visit##CLASS##Decl(D)); \
return true; \
} \
bool Visit##CLASS##Decl(CLASS##Decl *D) { return true; }

Definition at line 448 of file RecursiveASTVisitor.h.

◆ DECL [3/3]

#define DECL ( CLASS,
BASE )
Value:
case Decl::CLASS: \
if (!getDerived().Traverse##CLASS##Decl(static_cast<CLASS##Decl *>(D))) \
return false; \
break;

Definition at line 448 of file RecursiveASTVisitor.h.

◆ DEF_TRAVERSE_DECL

#define DEF_TRAVERSE_DECL ( DECL,
CODE )
Value:
template <typename Derived> \
bool RecursiveASTVisitor<Derived>::Traverse##DECL(DECL *D) { \
bool ShouldVisitChildren = true; \
bool ReturnValue = true; \
if (!getDerived().shouldTraversePostOrder()) \
TRY_TO(WalkUpFrom##DECL(D)); \
{ CODE; } \
if (ReturnValue && ShouldVisitChildren) \
TRY_TO(TraverseDeclContextHelper(dyn_cast<DeclContext>(D))); \
if (ReturnValue) { \
/* Visit any attributes attached to this declaration. */ \
for (auto *I : D->attrs()) \
TRY_TO(getDerived().TraverseAttr(I)); \
} \
if (ReturnValue && getDerived().shouldTraversePostOrder()) \
TRY_TO(WalkUpFrom##DECL(D)); \
return ReturnValue; \
}
#define DECL(DERIVED, BASE)
Definition ASTFwd.h:20

◆ DEF_TRAVERSE_STMT

#define DEF_TRAVERSE_STMT ( STMT,
CODE )
Value:
template <typename Derived> \
bool RecursiveASTVisitor<Derived>::Traverse##STMT( \
STMT *S, DataRecursionQueue *Queue) { \
bool ShouldVisitChildren = true; \
bool ReturnValue = true; \
if (!getDerived().shouldTraversePostOrder()) \
TRY_TO(WalkUpFrom##STMT(S)); \
{ CODE; } \
if (ShouldVisitChildren) { \
for (Stmt * SubStmt : getDerived().getStmtChildren(S)) { \
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(SubStmt); \
} \
} \
/* Call WalkUpFrom if TRY_TO_TRAVERSE_OR_ENQUEUE_STMT has traversed the \
* children already. If TRY_TO_TRAVERSE_OR_ENQUEUE_STMT only enqueued the \
* children, PostVisitStmt will call WalkUpFrom after we are done visiting \
* children. */ \
if (!Queue && ReturnValue && getDerived().shouldTraversePostOrder()) { \
TRY_TO(WalkUpFrom##STMT(S)); \
} \
return ReturnValue; \
}
#define STMT(DERIVED, BASE)
Definition ASTFwd.h:23

◆ DEF_TRAVERSE_TMPL_DECL

#define DEF_TRAVERSE_TMPL_DECL ( TMPLDECLKIND)
Value:
DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplateDecl, { \
TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters())); \
TRY_TO(TraverseDecl(D->getTemplatedDecl())); \
\
/* By default, we do not traverse the instantiations of \
class templates since they do not appear in the user code. The \
following code optionally traverses them. \
\
We only traverse the class instantiations when we see the canonical \
declaration of the template, to ensure we only visit them once. */ \
if (getDerived().shouldVisitTemplateInstantiations() && \
D == D->getCanonicalDecl()) \
TRY_TO(TraverseTemplateInstantiations(D)); \
\
/* Note that getInstantiatedFromMemberTemplate() is just a link \
from a template instantiation back to the template from which \
it was instantiated, and thus should not be traversed. */ \
})
#define DEF_TRAVERSE_DECL(DECL, CODE)

◆ DEF_TRAVERSE_TMPL_INST

#define DEF_TRAVERSE_TMPL_INST ( TMPLDECLKIND)
Value:
bool TraverseTemplateInstantiations(TMPLDECLKIND##TemplateDecl *D);

Definition at line 466 of file RecursiveASTVisitor.h.

◆ DEF_TRAVERSE_TMPL_PART_SPEC_DECL

#define DEF_TRAVERSE_TMPL_PART_SPEC_DECL ( TMPLDECLKIND,
DECLKIND )
Value:
DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplatePartialSpecializationDecl, { \
/* The partial specialization. */ \
TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters())); \
/* The args that remains unspecialized. */ \
TRY_TO(TraverseTemplateArgumentLocsHelper( \
D->getTemplateArgsAsWritten()->getTemplateArgs(), \
D->getTemplateArgsAsWritten()->NumTemplateArgs)); \
\
/* Don't need the *TemplatePartialSpecializationHelper, even \
though that's our parent class -- we already visit all the \
template args here. */ \
TRY_TO(Traverse##DECLKIND##Helper(D)); \
\
/* Instantiations will have been visited with the primary template. */ \
})

◆ DEF_TRAVERSE_TMPL_SPEC_DECL

#define DEF_TRAVERSE_TMPL_SPEC_DECL ( TMPLDECLKIND,
DECLKIND )
Value:
DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplateSpecializationDecl, { \
/* For implicit instantiations ("set<int> x;"), we don't want to \
recurse at all, since the instatiated template isn't written in \
the source code anywhere. (Note the instatiated *type* -- \
set<int> -- is written, and will still get a callback of \
TemplateSpecializationType). For explicit instantiations \
("template set<int>;"), we do need a callback, since this \
is the only callback that's made for this instantiation. \
We use getTemplateArgsAsWritten() to distinguish. */ \
if (const auto *ArgsWritten = D->getTemplateArgsAsWritten()) { \
/* The args that remains unspecialized. */ \
TRY_TO(TraverseTemplateArgumentLocsHelper( \
ArgsWritten->getTemplateArgs(), ArgsWritten->NumTemplateArgs)); \
} \
\
if (getDerived().shouldVisitTemplateInstantiations() || \
D->getTemplateSpecializationKind() == TSK_ExplicitSpecialization) { \
/* Traverse base definition for explicit specializations */ \
TRY_TO(Traverse##DECLKIND##Helper(D)); \
} else { \
TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc())); \
\
/* Returning from here skips traversing the \
declaration context of the *TemplateSpecializationDecl \
(embedded in the DEF_TRAVERSE_DECL() macro) \
which contains the instantiated members of the template. */ \
return true; \
} \
})
bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc QualifierLoc)

◆ DEF_TRAVERSE_TYPE

#define DEF_TRAVERSE_TYPE ( TYPE,
CODE )
Value:
template <typename Derived> \
bool RecursiveASTVisitor<Derived>::Traverse##TYPE(TYPE *T, \
bool TraverseQualifier) { \
if (!getDerived().shouldTraversePostOrder()) \
TRY_TO(WalkUpFrom##TYPE(T)); \
{ \
CODE; \
} \
if (getDerived().shouldTraversePostOrder()) \
TRY_TO(WalkUpFrom##TYPE(T)); \
return true; \
}
#define TYPE(DERIVED, BASE)
Definition ASTFwd.h:26

Definition at line 983 of file RecursiveASTVisitor.h.

◆ DEF_TRAVERSE_TYPELOC

#define DEF_TRAVERSE_TYPELOC ( TYPE,
CODE )
Value:
template <typename Derived> \
bool RecursiveASTVisitor<Derived>::Traverse##TYPE##Loc( \
TYPE##Loc TL, bool TraverseQualifier) { \
if (!getDerived().shouldTraversePostOrder()) { \
TRY_TO(WalkUpFrom##TYPE##Loc(TL)); \
if (getDerived().shouldWalkTypesOfTypeLocs()) \
TRY_TO(WalkUpFrom##TYPE(const_cast<TYPE *>(TL.getTypePtr()))); \
} \
{ \
CODE; \
} \
if (getDerived().shouldTraversePostOrder()) { \
TRY_TO(WalkUpFrom##TYPE##Loc(TL)); \
if (getDerived().shouldWalkTypesOfTypeLocs()) \
TRY_TO(WalkUpFrom##TYPE(const_cast<TYPE *>(TL.getTypePtr()))); \
} \
return true; \
}

Definition at line 1255 of file RecursiveASTVisitor.h.

◆ GEN_CLANG_CLAUSE_CLASS [1/2]

#define GEN_CLANG_CLAUSE_CLASS

Definition at line 508 of file RecursiveASTVisitor.h.

◆ GEN_CLANG_CLAUSE_CLASS [2/2]

#define GEN_CLANG_CLAUSE_CLASS

Definition at line 508 of file RecursiveASTVisitor.h.

◆ INITLISTEXPR

#define INITLISTEXPR ( CLASS,
PARENT )
Value:
case Stmt::CLASS##Class: \
if (::clang::detail::isSameMethod(&RecursiveASTVisitor::Traverse##CLASS, \
&Derived::Traverse##CLASS)) { \
auto ILE = static_cast<CLASS *>(S); \
if (auto Syn = ILE->isSemanticForm() ? ILE->getSyntacticForm() : ILE) \
TRY_TO(WalkUpFrom##CLASS(Syn)); \
if (auto Sem = ILE->isSemanticForm() ? ILE : ILE->getSemanticForm()) \
TRY_TO(WalkUpFrom##CLASS(Sem)); \
} \
break;
LLVM_ATTRIBUTE_ALWAYS_INLINE LLVM_ATTRIBUTE_NODEBUG auto isSameMethod(FirstMethodPtrTy FirstMethodPtr, SecondMethodPtrTy SecondMethodPtr) -> bool
Returns true if and only if FirstMethodPtr and SecondMethodPtr are pointers to the same non-static me...

◆ STMT [1/4]

#define STMT ( CLASS,
PARENT )
Value:
bool Traverse##CLASS(CLASS *S, DataRecursionQueue *Queue = nullptr);

Definition at line 370 of file RecursiveASTVisitor.h.

◆ STMT [2/4]

#define STMT ( CLASS,
PARENT )
Value:
bool WalkUpFrom##CLASS(CLASS *S) { \
TRY_TO(WalkUpFrom##PARENT(S)); \
TRY_TO(Visit##CLASS(S)); \
return true; \
} \
bool Visit##CLASS(CLASS *S) { return true; }

Definition at line 370 of file RecursiveASTVisitor.h.

◆ STMT [3/4]

#define STMT ( CLASS,
PARENT )
Value:
case Stmt::CLASS##Class: \
return TRAVERSE_STMT_BASE(CLASS, CLASS, S, Queue);
#define TRAVERSE_STMT_BASE(NAME, CLASS, VAR, QUEUE)

Definition at line 370 of file RecursiveASTVisitor.h.

◆ STMT [4/4]

#define STMT ( CLASS,
PARENT )
Value:
case Stmt::CLASS##Class: \
if (::clang::detail::isSameMethod(&RecursiveASTVisitor::Traverse##CLASS, \
&Derived::Traverse##CLASS)) { \
TRY_TO(WalkUpFrom##CLASS(static_cast<CLASS *>(S))); \
} \
break;

Definition at line 370 of file RecursiveASTVisitor.h.

◆ TRAVERSE_STMT_BASE

#define TRAVERSE_STMT_BASE ( NAME,
CLASS,
VAR,
QUEUE )
Value:
decltype(&RecursiveASTVisitor::Traverse##NAME), \
decltype(&Derived::Traverse##NAME)>::value \
? static_cast<std::conditional_t< \
decltype(&RecursiveASTVisitor::Traverse##NAME), \
decltype(&Derived::Traverse##NAME)>::value, \
Derived &, RecursiveASTVisitor &>>(*this) \
.Traverse##NAME(static_cast<CLASS *>(VAR), QUEUE) \
: getDerived().Traverse##NAME(static_cast<CLASS *>(VAR)))

Definition at line 346 of file RecursiveASTVisitor.h.

◆ TRY_TO

#define TRY_TO ( CALL_EXPR)
Value:
do { \
if (!getDerived().CALL_EXPR) \
return false; \
} while (false)

Definition at line 62 of file RecursiveASTVisitor.h.

Referenced by clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPE(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::DEF_TRAVERSE_TYPELOC(), clang::for(), clang::for(), clang::for(), clang::for(), clang::extractapi::APISetVisitor< SymbolGraphSerializer >::getDerived(), clang::extractapi::APISetVisitor< SymbolGraphSerializer >::traverseAPISet(), clang::RecursiveASTVisitor< Derived >::TraverseConceptExprRequirement(), clang::RecursiveASTVisitor< Derived >::TraverseConstructorInitializer(), clang::RecursiveASTVisitor< Derived >::TraverseDeclarationNameInfo(), clang::RecursiveASTVisitor< Derived >::TraverseLambdaCapture(), clang::RecursiveASTVisitor< Derived >::TraverseNestedNameSpecifier(), clang::RecursiveASTVisitor< Derived >::TraverseNestedNameSpecifierLoc(), clang::RecursiveASTVisitor< Derived >::TraverseStmt(), clang::RecursiveASTVisitor< Derived >::TraverseTemplateArgumentLoc(), clang::RecursiveASTVisitor< Derived >::TraverseTemplateArguments(), clang::RecursiveASTVisitor< Derived >::TraverseTemplateName(), clang::RecursiveASTVisitor< Derived >::TraverseTypeConstraint(), and clang::extractapi::APISetVisitor< SymbolGraphSerializer >::walkUpFromAPIRecord().

◆ TRY_TO_TRAVERSE_OR_ENQUEUE_STMT

#define TRY_TO_TRAVERSE_OR_ENQUEUE_STMT ( S)
Value:
do { \
if (!TRAVERSE_STMT_BASE(Stmt, Stmt, S, Queue)) \
return false; \
} while (false)

Definition at line 361 of file RecursiveASTVisitor.h.

◆ TYPE [1/4]

#define TYPE ( CLASS,
BASE )
Value:
bool Traverse##CLASS##Type(CLASS##Type *T, bool TraverseQualifier);

Definition at line 392 of file RecursiveASTVisitor.h.

◆ TYPE [2/4]

#define TYPE ( CLASS,
BASE )
Value:
bool WalkUpFrom##CLASS##Type(CLASS##Type *T) { \
TRY_TO(WalkUpFrom##BASE(T)); \
TRY_TO(Visit##CLASS##Type(T)); \
return true; \
} \
bool Visit##CLASS##Type(CLASS##Type *T) { return true; }

Definition at line 392 of file RecursiveASTVisitor.h.

◆ TYPE [3/4]

#define TYPE ( CLASS,
BASE )
Value:
bool WalkUpFrom##CLASS##TypeLoc(CLASS##TypeLoc TL) { \
TRY_TO(WalkUpFrom##BASE##Loc(TL)); \
TRY_TO(Visit##CLASS##TypeLoc(TL)); \
return true; \
} \
bool Visit##CLASS##TypeLoc(CLASS##TypeLoc TL) { return true; }

Definition at line 392 of file RecursiveASTVisitor.h.

◆ TYPE [4/4]

#define TYPE ( CLASS,
BASE )
Value:
case Type::CLASS: \
return getDerived().Traverse##CLASS##Type( \
static_cast<CLASS##Type *>(const_cast<Type *>(T.getTypePtr())), \
TraverseQualifier);

Definition at line 392 of file RecursiveASTVisitor.h.

◆ TYPELOC [1/2]

#define TYPELOC ( CLASS,
BASE )
Value:
bool Traverse##CLASS##TypeLoc(CLASS##TypeLoc TL, bool TraverseQualifier);

Definition at line 414 of file RecursiveASTVisitor.h.

◆ TYPELOC [2/2]

#define TYPELOC ( CLASS,
BASE )
Value:
case TypeLoc::CLASS: \
return getDerived().Traverse##CLASS##TypeLoc(TL.castAs<CLASS##TypeLoc>(), \
TraverseQualifier);

Definition at line 414 of file RecursiveASTVisitor.h.

◆ VISITORCLASS

#define VISITORCLASS   RecursiveASTVisitor

Definition at line 744 of file RecursiveASTVisitor.h.