Go to the documentation of this file.
14 #ifndef LLVM_CLANG_AST_JSONNODEDUMPER_H
15 #define LLVM_CLANG_AST_JSONNODEDUMPER_H
27 #include "llvm/Support/JSON.h"
34 bool FirstChild =
true;
39 llvm::json::OStream
JOS;
43 template <
typename Fn>
void AddChild(Fn DoAddChild) {
58 while (!Pending.empty()) {
71 bool WasFirstChild = FirstChild;
72 auto DumpWithIndent = [=](
bool IsLastChild) {
74 JOS.attributeBegin(LabelStr);
79 unsigned Depth = Pending.size();
86 while (
Depth < Pending.size()) {
88 this->Pending.pop_back();
100 Pending.push_back(std::move(DumpWithIndent));
102 Pending.back()(
false);
103 Pending.back() = std::move(DumpWithIndent);
119 const comments::FullComment *>,
132 StringRef LastLocFilename, LastLocPresumedFilename;
133 unsigned LastLocLine, LastLocPresumedLine;
144 void attributeOnlyIfTrue(StringRef Key,
bool Value) {
149 void writeIncludeStack(
PresumedLoc Loc,
bool JustFirst =
false);
152 void writeBareSourceLocation(
SourceLocation Loc,
bool IsSpelling);
160 std::string createPointerRepresentation(
const void *Ptr);
161 llvm::json::Object createQualType(
QualType QT,
bool Desugar =
true);
162 llvm::json::Object createBareDeclRef(
const Decl *D);
163 void writeBareDeclRef(
const Decl *D);
164 llvm::json::Object createCXXRecordDefinitionData(
const CXXRecordDecl *RD);
167 llvm::json::Array createCastPath(
const CastExpr *
C);
169 void writePreviousDeclImpl(...) {}
171 template <
typename T>
void writePreviousDeclImpl(
const Mergeable<T> *D) {
172 const T *First = D->getFirstDecl();
174 JOS.attribute(
"firstRedecl", createPointerRepresentation(First));
177 template <
typename T>
void writePreviousDeclImpl(
const Redeclarable<T> *D) {
178 const T *Prev = D->getPreviousDecl();
180 JOS.attribute(
"previousDecl", createPointerRepresentation(Prev));
182 void addPreviousDeclaration(
const Decl *D);
184 StringRef getCommentCommandName(
unsigned CommandID)
const;
191 PrintPolicy(PrintPolicy), Traits(Traits), LastLocLine(0),
192 LastLocPresumedLine(0) {}
202 const Decl *From =
nullptr, StringRef
Label = {});
203 void Visit(
const CXXCtorInitializer *Init);
204 void Visit(
const OMPClause *
C);
205 void Visit(
const BlockDecl::Capture &
C);
207 void Visit(
const concepts::Requirement *R);
208 void Visit(
const APValue &
Value, QualType Ty);
332 const comments::FullComment *);
334 const comments::FullComment *);
336 const comments::FullComment *);
338 const comments::FullComment *);
340 const comments::FullComment *);
342 const comments::FullComment *FC);
344 const comments::FullComment *FC);
346 const comments::FullComment *);
349 const comments::FullComment *);
351 const comments::FullComment *);
357 template <
typename SpecializationDecl>
358 void writeTemplateDeclSpecialization(
const SpecializationDecl *SD,
359 bool DumpExplicitInst,
361 bool DumpedAny =
false;
362 for (
const auto *RedeclWithBadType : SD->redecls()) {
366 const auto *Redecl = dyn_cast<SpecializationDecl>(RedeclWithBadType);
371 assert(isa<CXXRecordDecl>(RedeclWithBadType) &&
372 "expected an injected-class-name");
376 switch (Redecl->getTemplateSpecializationKind()) {
379 if (!DumpExplicitInst)
385 NodeDumper.
AddChild([=] { NodeDumper.writeBareDeclRef(Redecl); });
397 NodeDumper.
AddChild([=] { NodeDumper.writeBareDeclRef(SD); });
400 template <
typename TemplateDecl>
401 void writeTemplateDecl(
const TemplateDecl *TD,
bool DumpExplicitInst) {
412 for (
const auto *Child : TD->specializations())
413 writeTemplateDeclSpecialization(Child, DumpExplicitInst,
421 : NodeDumper(OS, SrcMgr, Ctx, PrintPolicy, Traits) {}
426 writeTemplateDecl(FTD,
true);
429 writeTemplateDecl(CTD,
false);
432 writeTemplateDecl(VTD,
false);
438 #endif // LLVM_CLANG_AST_JSONNODEDUMPER_H
NamedDecl * getTemplatedDecl() const
Get the underlying, templated declaration.
void VisitUnaryTransformType(const UnaryTransformType *UTT)
void VisitLinkageSpecDecl(const LinkageSpecDecl *LSD)
void VisitFieldDecl(const FieldDecl *FD)
void VisitObjCIvarRefExpr(const ObjCIvarRefExpr *OIRE)
void VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *OBLE)
void visitVerbatimLineComment(const comments::VerbatimLineComment *C, const comments::FullComment *)
void VisitObjCSelectorExpr(const ObjCSelectorExpr *OSE)
void visitParamCommandComment(const comments::ParamCommandComment *C, const comments::FullComment *FC)
AssociationTy< true > ConstAssociation
void VisitObjCProtocolDecl(const ObjCProtocolDecl *D)
void VisitObjCBoxedExpr(const ObjCBoxedExpr *OBE)
A trivial tuple used to represent a source range.
void VisitUsingDecl(const UsingDecl *UD)
void dumpTemplateParameters(const TemplateParameterList *TPL)
void VisitTemplateTypeParmType(const TemplateTypeParmType *TTPT)
void VisitFloatingLiteral(const FloatingLiteral *FL)
void VisitObjCMessageExpr(const ObjCMessageExpr *OME)
void VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr *OPRE)
void VisitCXXNewExpr(const CXXNewExpr *NE)
void VisitTypedefType(const TypedefType *TT)
void VisitInjectedClassNameType(const InjectedClassNameType *ICNT)
Encodes a location in the source.
void VisitDependentSizedExtVectorType(const DependentSizedExtVectorType *VT)
void VisitObjCIvarDecl(const ObjCIvarDecl *D)
void VisitDeclRefExpr(const DeclRefExpr *DRE)
void VisitIntegralTemplateArgument(const TemplateArgument &TA)
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
void VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *ME)
A (possibly-)qualified type.
void VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *TTE)
void VisitNamedDecl(const NamedDecl *ND)
void VisitNamespaceDecl(const NamespaceDecl *ND)
void VisitTypeTemplateArgument(const TemplateArgument &TA)
void VisitCXXUnresolvedConstructExpr(const CXXUnresolvedConstructExpr *UCE)
void VisitFriendDecl(const FriendDecl *FD)
void VisitAccessSpecDecl(const AccessSpecDecl *ASD)
void VisitExpressionTemplateArgument(const TemplateArgument &TA)
void visitTextComment(const comments::TextComment *C, const comments::FullComment *)
JSONDumper(raw_ostream &OS, const SourceManager &SrcMgr, ASTContext &Ctx, const PrintingPolicy &PrintPolicy, const comments::CommandTraits *Traits)
Describes how types, statements, expressions, and declarations should be printed.
void VisitSizeOfPackExpr(const SizeOfPackExpr *SOPE)
void VisitMemberPointerType(const MemberPointerType *MPT)
void VisitDeclarationTemplateArgument(const TemplateArgument &TA)
void VisitWhileStmt(const WhileStmt *WS)
void VisitCXXConstructExpr(const CXXConstructExpr *CE)
JSONNodeDumper & doGetNodeDelegate()
void VisitUnaryOperator(const UnaryOperator *UO)
This class handles loading and caching of source files into memory.
void VisitTemplateExpansionTemplateArgument(const TemplateArgument &TA)
The base class of the type hierarchy.
void VisitUsingEnumDecl(const UsingEnumDecl *UED)
Declaration of a template function.
void VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D)
void VisitImplicitCastExpr(const ImplicitCastExpr *ICE)
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
void VisitSYCLUniqueStableNameExpr(const SYCLUniqueStableNameExpr *E)
A simple visitor class that helps create template argument visitors.
void VisitPredefinedExpr(const PredefinedExpr *PE)
void VisitObjCAtCatchStmt(const ObjCAtCatchStmt *OACS)
void VisitCompoundAssignOperator(const CompoundAssignOperator *CAO)
void AddChild(Fn DoAddChild)
Add a child of the current node. Calls DoAddChild without arguments.
void VisitAutoType(const AutoType *AT)
void VisitObjCTypeParamDecl(const ObjCTypeParamDecl *D)
void VisitPackExpansionType(const PackExpansionType *PET)
void VisitCharacterLiteral(const CharacterLiteral *CL)
void VisitObjCCompatibleAliasDecl(const ObjCCompatibleAliasDecl *D)
void VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
ASTNodeTraverser traverses the Clang AST for dumping purposes.
Represents a template argument.
void VisitObjCProtocolExpr(const ObjCProtocolExpr *OPE)
void VisitIntegerLiteral(const IntegerLiteral *IL)
void VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *BTE)
void VisitObjCInterfaceDecl(const ObjCInterfaceDecl *D)
void VisitIfStmt(const IfStmt *IS)
void VisitNonTypeTemplateParmDecl(const NonTypeTemplateParmDecl *D)
void VisitExprWithCleanups(const ExprWithCleanups *EWC)
void VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *MTE)
void VisitElaboratedType(const ElaboratedType *ET)
void VisitObjCEncodeExpr(const ObjCEncodeExpr *OEE)
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
void VisitTypeAliasDecl(const TypeAliasDecl *TAD)
void VisitObjCCategoryDecl(const ObjCCategoryDecl *D)
void VisitCaseStmt(const CaseStmt *CS)
void visitVerbatimBlockComment(const comments::VerbatimBlockComment *C, const comments::FullComment *)
void VisitArrayType(const ArrayType *AT)
void VisitRecordDecl(const RecordDecl *RD)
void VisitNullPtrTemplateArgument(const TemplateArgument &TA)
A simple visitor class that helps create attribute visitors.
void VisitFunctionProtoType(const FunctionProtoType *T)
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
void VisitTemplateSpecializationType(const TemplateSpecializationType *TST)
JSONNodeDumper(raw_ostream &OS, const SourceManager &SrcMgr, ASTContext &Ctx, const PrintingPolicy &PrintPolicy, const comments::CommandTraits *Traits)
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
void VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *BLE)
void VisitFixedPointLiteral(const FixedPointLiteral *FPL)
Represents a C++ struct/union/class.
void VisitObjCInterfaceType(const ObjCInterfaceType *OIT)
void VisitFunctionTemplateDecl(const FunctionTemplateDecl *FTD)
void VisitVectorType(const VectorType *VT)
void VisitBinaryOperator(const BinaryOperator *BO)
void Visit(const Attr *A)
Declaration of a class template.
A simple visitor class that helps create declaration visitors.
void VisitVarTemplateDecl(const VarTemplateDecl *VTD)
void VisitUsingDirectiveDecl(const UsingDirectiveDecl *UDD)
void VisitUnresolvedUsingType(const UnresolvedUsingType *UUT)
void visitHTMLStartTagComment(const comments::HTMLStartTagComment *C, const comments::FullComment *)
The base class of all kinds of template declarations (e.g., class, function, etc.).
void VisitUsingShadowDecl(const UsingShadowDecl *USD)
void AddChild(StringRef Label, Fn DoAddChild)
Add a child of the current node with an optional label.
void VisitMemberExpr(const MemberExpr *ME)
Decl - This represents one declaration (or definition), e.g.
void VisitVarDecl(const VarDecl *VD)
void VisitUnresolvedLookupExpr(const UnresolvedLookupExpr *ULE)
void visitInlineCommandComment(const comments::InlineCommandComment *C, const comments::FullComment *)
void VisitTemplateTemplateArgument(const TemplateArgument &TA)
void VisitCXXDeleteExpr(const CXXDeleteExpr *DE)
void Visit(const Decl *D)
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
ConstStmtVisitor - This class implements a simple visitor for Stmt subclasses.
void VisitBlockDecl(const BlockDecl *D)
void VisitObjCSubscriptRefExpr(const ObjCSubscriptRefExpr *OSRE)
void VisitTypedefDecl(const TypedefDecl *TD)
void VisitFunctionType(const FunctionType *T)
void visitTParamCommandComment(const comments::TParamCommandComment *C, const comments::FullComment *FC)
void VisitAddrLabelExpr(const AddrLabelExpr *ALE)
void VisitLabelStmt(const LabelStmt *LS)
void VisitConstantExpr(const ConstantExpr *CE)
void VisitInitListExpr(const InitListExpr *ILE)
void VisitGotoStmt(const GotoStmt *GS)
bool NE(InterpState &S, CodePtr OpPC)
NodeStreamer(raw_ostream &OS)
void VisitCastExpr(const CastExpr *CE)
void VisitRValueReferenceType(const ReferenceType *RT)
void VisitGenericSelectionExpr(const GenericSelectionExpr *GSE)
void VisitSwitchStmt(const SwitchStmt *SS)
void visitVerbatimBlockLineComment(const comments::VerbatimBlockLineComment *C, const comments::FullComment *)
Stmt - This represents one statement.
void VisitPackTemplateArgument(const TemplateArgument &TA)
void VisitMacroQualifiedType(const MacroQualifiedType *MQT)
void VisitRequiresExpr(const RequiresExpr *RE)
Represents a base class of a C++ class.
Attr - This represents one attribute.
void visitBlockCommandComment(const comments::BlockCommandComment *C, const comments::FullComment *)
void VisitTagType(const TagType *TT)
void VisitObjCCategoryImplDecl(const ObjCCategoryImplDecl *D)
void VisitObjCPropertyDecl(const ObjCPropertyDecl *D)
void VisitCXXTypeidExpr(const CXXTypeidExpr *CTE)
void VisitEnumConstantDecl(const EnumConstantDecl *ECD)
void VisitCallExpr(const CallExpr *CE)
void VisitCXXRecordDecl(const CXXRecordDecl *RD)
void VisitTemplateTemplateParmDecl(const TemplateTemplateParmDecl *D)
void VisitNamespaceAliasDecl(const NamespaceAliasDecl *NAD)
Represents an unpacked "presumed" location which can be presented to the user.
void VisitEnumDecl(const EnumDecl *ED)
void VisitConstantArrayType(const ConstantArrayType *CAT)
void VisitClassTemplateDecl(const ClassTemplateDecl *CTD)
Declaration of a variable template.
void visitHTMLEndTagComment(const comments::HTMLEndTagComment *C, const comments::FullComment *)
void VisitObjCMethodDecl(const ObjCMethodDecl *D)
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
void VisitNullTemplateArgument(const TemplateArgument &TA)
void VisitCXXThisExpr(const CXXThisExpr *TE)
void VisitObjCImplementationDecl(const ObjCImplementationDecl *D)
void VisitFunctionDecl(const FunctionDecl *FD)
void VisitStringLiteral(const StringLiteral *SL)