blob: 0873825ea4e2a92ea5e6f3622e0120fd7d834bbd [file] [log] [blame]
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001//===--- ASTDumper.cpp - Dumping implementation for ASTs ------------------===//
Chris Lattner6000dac2007-08-08 22:51:59 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner0bc735f2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner6000dac2007-08-08 22:51:59 +00007//
8//===----------------------------------------------------------------------===//
9//
Alexander Kornienko40b66a002012-12-13 13:59:55 +000010// This file implements the AST dump methods, which dump out the
Chris Lattner6000dac2007-08-08 22:51:59 +000011// AST in a form that exposes type details and other fields.
12//
13//===----------------------------------------------------------------------===//
14
Chandler Carruth55fc8732012-12-04 09:13:33 +000015#include "clang/AST/ASTContext.h"
Alexander Kornienkoc3cd2b02013-01-07 17:53:08 +000016#include "clang/AST/Attr.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000017#include "clang/AST/DeclCXX.h"
18#include "clang/AST/DeclObjC.h"
Alexander Kornienkod538ed92012-12-20 02:09:13 +000019#include "clang/AST/DeclVisitor.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000020#include "clang/AST/StmtVisitor.h"
Alexander Kornienkod538ed92012-12-20 02:09:13 +000021#include "clang/Basic/Module.h"
Chris Lattnere300c872007-08-30 06:17:34 +000022#include "clang/Basic/SourceManager.h"
Daniel Dunbar806c12e2009-12-03 09:13:13 +000023#include "llvm/Support/raw_ostream.h"
Chris Lattner6000dac2007-08-08 22:51:59 +000024using namespace clang;
25
26//===----------------------------------------------------------------------===//
Alexander Kornienko40b66a002012-12-13 13:59:55 +000027// ASTDumper Visitor
Chris Lattner6000dac2007-08-08 22:51:59 +000028//===----------------------------------------------------------------------===//
29
30namespace {
Alexander Kornienkod538ed92012-12-20 02:09:13 +000031 class ASTDumper
32 : public DeclVisitor<ASTDumper>, public StmtVisitor<ASTDumper> {
Chris Lattnere300c872007-08-30 06:17:34 +000033 SourceManager *SM;
Chris Lattner5f9e2722011-07-23 10:55:15 +000034 raw_ostream &OS;
Chris Lattner6000dac2007-08-08 22:51:59 +000035 unsigned IndentLevel;
Manuel Klimekcb7b45e2012-11-07 00:33:12 +000036 bool IsFirstLine;
Mike Stump1eb44332009-09-09 15:08:12 +000037
Alexander Kornienko21c8b192012-12-11 15:28:09 +000038 /// Keep track of the last location we print out so that we can
39 /// print out deltas from then on out.
Chris Lattnere300c872007-08-30 06:17:34 +000040 const char *LastLocFilename;
41 unsigned LastLocLine;
Douglas Gregord249e1d1f2009-05-29 20:38:28 +000042
Manuel Klimekcb7b45e2012-11-07 00:33:12 +000043 class IndentScope {
Alexander Kornienko40b66a002012-12-13 13:59:55 +000044 ASTDumper &Dumper;
Manuel Klimekcb7b45e2012-11-07 00:33:12 +000045 public:
Alexander Kornienko40b66a002012-12-13 13:59:55 +000046 IndentScope(ASTDumper &Dumper) : Dumper(Dumper) {
Manuel Klimekcb7b45e2012-11-07 00:33:12 +000047 Dumper.indent();
48 }
49 ~IndentScope() {
50 Dumper.unindent();
51 }
52 };
53
Chris Lattner6000dac2007-08-08 22:51:59 +000054 public:
Alexander Kornienko40b66a002012-12-13 13:59:55 +000055 ASTDumper(SourceManager *SM, raw_ostream &OS)
Dmitri Gribenko95f61902012-11-16 21:43:31 +000056 : SM(SM), OS(OS), IndentLevel(0), IsFirstLine(true),
57 LastLocFilename(""), LastLocLine(~0U) { }
Mike Stump1eb44332009-09-09 15:08:12 +000058
Alexander Kornienko40b66a002012-12-13 13:59:55 +000059 ~ASTDumper() {
Manuel Klimekcb7b45e2012-11-07 00:33:12 +000060 OS << "\n";
61 }
62
Alexander Kornienkod5bc3592012-12-11 15:20:44 +000063 void dumpDecl(Decl *D);
64 void dumpStmt(Stmt *S);
Mike Stump1eb44332009-09-09 15:08:12 +000065
Alexander Kornienko21c8b192012-12-11 15:28:09 +000066 // Utilities
67 void indent();
68 void unindent();
Alexander Kornienkod538ed92012-12-20 02:09:13 +000069 void dumpPointer(const void *Ptr);
70 void dumpSourceRange(SourceRange R);
Alexander Kornienko21c8b192012-12-11 15:28:09 +000071 void dumpLocation(SourceLocation Loc);
Alexander Kornienkod538ed92012-12-20 02:09:13 +000072 void dumpBareType(QualType T);
Alexander Kornienko21c8b192012-12-11 15:28:09 +000073 void dumpType(QualType T);
Alexander Kornienkoad7bb362012-12-20 11:08:38 +000074 void dumpBareDeclRef(const Decl *Node);
Alexander Kornienkoc9394532012-12-20 12:23:54 +000075 void dumpDeclRef(const Decl *Node, const char *Label = 0);
Alexander Kornienkoad7bb362012-12-20 11:08:38 +000076 void dumpName(const NamedDecl *D);
77 void dumpDeclContext(const DeclContext *DC);
Alexander Kornienkoc3cd2b02013-01-07 17:53:08 +000078 void dumpAttr(const Attr *A);
Alexander Kornienkod538ed92012-12-20 02:09:13 +000079
80 // C++ Utilities
81 void dumpAccessSpecifier(AccessSpecifier AS);
Alexander Kornienkoad7bb362012-12-20 11:08:38 +000082 void dumpCXXCtorInitializer(const CXXCtorInitializer *Init);
83 void dumpTemplateParameters(const TemplateParameterList *TPL);
Alexander Kornienkod538ed92012-12-20 02:09:13 +000084 void dumpTemplateArgumentListInfo(const TemplateArgumentListInfo &TALI);
85 void dumpTemplateArgumentLoc(const TemplateArgumentLoc &A);
86 void dumpTemplateArgumentList(const TemplateArgumentList &TAL);
87 void dumpTemplateArgument(const TemplateArgument &A,
88 SourceRange R = SourceRange());
89
90 // Decls
91 void VisitLabelDecl(LabelDecl *D);
92 void VisitTypedefDecl(TypedefDecl *D);
93 void VisitEnumDecl(EnumDecl *D);
94 void VisitRecordDecl(RecordDecl *D);
95 void VisitEnumConstantDecl(EnumConstantDecl *D);
96 void VisitIndirectFieldDecl(IndirectFieldDecl *D);
97 void VisitFunctionDecl(FunctionDecl *D);
98 void VisitFieldDecl(FieldDecl *D);
99 void VisitVarDecl(VarDecl *D);
100 void VisitFileScopeAsmDecl(FileScopeAsmDecl *D);
101 void VisitImportDecl(ImportDecl *D);
102
103 // C++ Decls
104 void VisitNamespaceDecl(NamespaceDecl *D);
105 void VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
106 void VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
107 void VisitTypeAliasDecl(TypeAliasDecl *D);
108 void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D);
109 void VisitCXXRecordDecl(CXXRecordDecl *D);
110 void VisitStaticAssertDecl(StaticAssertDecl *D);
111 void VisitFunctionTemplateDecl(FunctionTemplateDecl *D);
112 void VisitClassTemplateDecl(ClassTemplateDecl *D);
113 void VisitClassTemplateSpecializationDecl(
114 ClassTemplateSpecializationDecl *D);
115 void VisitClassTemplatePartialSpecializationDecl(
116 ClassTemplatePartialSpecializationDecl *D);
117 void VisitClassScopeFunctionSpecializationDecl(
118 ClassScopeFunctionSpecializationDecl *D);
119 void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
120 void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
121 void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
122 void VisitUsingDecl(UsingDecl *D);
123 void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);
124 void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
125 void VisitUsingShadowDecl(UsingShadowDecl *D);
126 void VisitLinkageSpecDecl(LinkageSpecDecl *D);
127 void VisitAccessSpecDecl(AccessSpecDecl *D);
128 void VisitFriendDecl(FriendDecl *D);
129
130 // ObjC Decls
131 void VisitObjCIvarDecl(ObjCIvarDecl *D);
132 void VisitObjCMethodDecl(ObjCMethodDecl *D);
133 void VisitObjCCategoryDecl(ObjCCategoryDecl *D);
134 void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
135 void VisitObjCProtocolDecl(ObjCProtocolDecl *D);
136 void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
137 void VisitObjCImplementationDecl(ObjCImplementationDecl *D);
138 void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D);
139 void VisitObjCPropertyDecl(ObjCPropertyDecl *D);
140 void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
141 void VisitBlockDecl(BlockDecl *D);
Mike Stump1eb44332009-09-09 15:08:12 +0000142
Chris Lattner17a1a722007-08-30 01:00:35 +0000143 // Stmts.
Chris Lattnerc5598cb2007-08-21 04:04:25 +0000144 void VisitStmt(Stmt *Node);
Ted Kremenek5399ce22007-12-12 06:59:42 +0000145 void VisitDeclStmt(DeclStmt *Node);
Alexander Kornienkoc3cd2b02013-01-07 17:53:08 +0000146 void VisitAttributedStmt(AttributedStmt *Node);
Chris Lattner17a1a722007-08-30 01:00:35 +0000147 void VisitLabelStmt(LabelStmt *Node);
148 void VisitGotoStmt(GotoStmt *Node);
Mike Stump1eb44332009-09-09 15:08:12 +0000149
Chris Lattner17a1a722007-08-30 01:00:35 +0000150 // Exprs
151 void VisitExpr(Expr *Node);
Anders Carlsson27a5b9b2009-08-22 23:33:40 +0000152 void VisitCastExpr(CastExpr *Node);
Chris Lattner17a1a722007-08-30 01:00:35 +0000153 void VisitDeclRefExpr(DeclRefExpr *Node);
Chris Lattnerd9f69102008-08-10 01:53:14 +0000154 void VisitPredefinedExpr(PredefinedExpr *Node);
Chris Lattner17a1a722007-08-30 01:00:35 +0000155 void VisitCharacterLiteral(CharacterLiteral *Node);
156 void VisitIntegerLiteral(IntegerLiteral *Node);
157 void VisitFloatingLiteral(FloatingLiteral *Node);
158 void VisitStringLiteral(StringLiteral *Str);
159 void VisitUnaryOperator(UnaryOperator *Node);
Peter Collingbournef4e3cfb2011-03-11 19:24:49 +0000160 void VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *Node);
Chris Lattner17a1a722007-08-30 01:00:35 +0000161 void VisitMemberExpr(MemberExpr *Node);
Nate Begeman213541a2008-04-18 23:10:10 +0000162 void VisitExtVectorElementExpr(ExtVectorElementExpr *Node);
Chris Lattner17a1a722007-08-30 01:00:35 +0000163 void VisitBinaryOperator(BinaryOperator *Node);
164 void VisitCompoundAssignOperator(CompoundAssignOperator *Node);
165 void VisitAddrLabelExpr(AddrLabelExpr *Node);
John McCall6b5a61b2011-02-07 10:33:21 +0000166 void VisitBlockExpr(BlockExpr *Node);
John McCall4b9c2d22011-11-06 09:01:30 +0000167 void VisitOpaqueValueExpr(OpaqueValueExpr *Node);
Chris Lattner17a1a722007-08-30 01:00:35 +0000168
169 // C++
Douglas Gregor49badde2008-10-27 19:41:14 +0000170 void VisitCXXNamedCastExpr(CXXNamedCastExpr *Node);
Chris Lattner17a1a722007-08-30 01:00:35 +0000171 void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node);
Douglas Gregorcd9b46e2008-11-04 14:56:14 +0000172 void VisitCXXThisExpr(CXXThisExpr *Node);
Douglas Gregor49badde2008-10-27 19:41:14 +0000173 void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node);
Anders Carlsson0eca1b62009-08-12 00:21:52 +0000174 void VisitCXXConstructExpr(CXXConstructExpr *Node);
175 void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node);
John McCall4765fa02010-12-06 08:20:24 +0000176 void VisitExprWithCleanups(ExprWithCleanups *Node);
John McCall9d5f35e2009-12-11 21:50:11 +0000177 void VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node);
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000178 void dumpCXXTemporary(CXXTemporary *Temporary);
Mike Stump1eb44332009-09-09 15:08:12 +0000179
Chris Lattner17a1a722007-08-30 01:00:35 +0000180 // ObjC
Douglas Gregor8f5e3dd2010-04-23 22:50:49 +0000181 void VisitObjCAtCatchStmt(ObjCAtCatchStmt *Node);
Chris Lattner17a1a722007-08-30 01:00:35 +0000182 void VisitObjCEncodeExpr(ObjCEncodeExpr *Node);
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000183 void VisitObjCMessageExpr(ObjCMessageExpr *Node);
184 void VisitObjCBoxedExpr(ObjCBoxedExpr *Node);
Fariborz Jahanianb62f6812007-10-16 20:40:23 +0000185 void VisitObjCSelectorExpr(ObjCSelectorExpr *Node);
Fariborz Jahanian390d50a2007-10-17 16:58:11 +0000186 void VisitObjCProtocolExpr(ObjCProtocolExpr *Node);
Daniel Dunbar7f8ea5c2008-08-30 05:35:15 +0000187 void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node);
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000188 void VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *Node);
Steve Naroff3c64d9e2008-03-12 13:19:12 +0000189 void VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node);
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000190 void VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *Node);
Chris Lattner6000dac2007-08-08 22:51:59 +0000191 };
192}
193
194//===----------------------------------------------------------------------===//
Chris Lattnere300c872007-08-30 06:17:34 +0000195// Utilities
196//===----------------------------------------------------------------------===//
197
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000198void ASTDumper::indent() {
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000199 if (IsFirstLine)
200 IsFirstLine = false;
201 else
202 OS << "\n";
203 OS.indent(IndentLevel * 2);
204 OS << "(";
205 IndentLevel++;
206}
207
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000208void ASTDumper::unindent() {
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000209 OS << ")";
210 IndentLevel--;
211}
212
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000213void ASTDumper::dumpPointer(const void *Ptr) {
214 OS << ' ' << Ptr;
215}
216
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000217void ASTDumper::dumpLocation(SourceLocation Loc) {
Chris Lattnerdf7c17a2009-01-16 07:00:02 +0000218 SourceLocation SpellingLoc = SM->getSpellingLoc(Loc);
Mike Stump1eb44332009-09-09 15:08:12 +0000219
Chris Lattnere300c872007-08-30 06:17:34 +0000220 // The general format we print out is filename:line:col, but we drop pieces
221 // that haven't changed since the last loc printed.
Chris Lattnerb9c3f962009-01-27 07:57:44 +0000222 PresumedLoc PLoc = SM->getPresumedLoc(SpellingLoc);
223
Douglas Gregorcb7b1e12010-11-12 07:15:47 +0000224 if (PLoc.isInvalid()) {
225 OS << "<invalid sloc>";
226 return;
227 }
228
Chris Lattnerb9c3f962009-01-27 07:57:44 +0000229 if (strcmp(PLoc.getFilename(), LastLocFilename) != 0) {
Daniel Dunbar806c12e2009-12-03 09:13:13 +0000230 OS << PLoc.getFilename() << ':' << PLoc.getLine()
231 << ':' << PLoc.getColumn();
Chris Lattnerb9c3f962009-01-27 07:57:44 +0000232 LastLocFilename = PLoc.getFilename();
233 LastLocLine = PLoc.getLine();
234 } else if (PLoc.getLine() != LastLocLine) {
Daniel Dunbar806c12e2009-12-03 09:13:13 +0000235 OS << "line" << ':' << PLoc.getLine()
236 << ':' << PLoc.getColumn();
Chris Lattnerb9c3f962009-01-27 07:57:44 +0000237 LastLocLine = PLoc.getLine();
Chris Lattnere300c872007-08-30 06:17:34 +0000238 } else {
Daniel Dunbar806c12e2009-12-03 09:13:13 +0000239 OS << "col" << ':' << PLoc.getColumn();
Chris Lattnere300c872007-08-30 06:17:34 +0000240 }
241}
242
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000243void ASTDumper::dumpSourceRange(SourceRange R) {
Chris Lattnere300c872007-08-30 06:17:34 +0000244 // Can't translate locations if a SourceManager isn't available.
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000245 if (!SM)
246 return;
Mike Stump1eb44332009-09-09 15:08:12 +0000247
Daniel Dunbar806c12e2009-12-03 09:13:13 +0000248 OS << " <";
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000249 dumpLocation(R.getBegin());
Chris Lattner311ff022007-10-16 22:36:42 +0000250 if (R.getBegin() != R.getEnd()) {
Daniel Dunbar806c12e2009-12-03 09:13:13 +0000251 OS << ", ";
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000252 dumpLocation(R.getEnd());
Chris Lattnere300c872007-08-30 06:17:34 +0000253 }
Daniel Dunbar806c12e2009-12-03 09:13:13 +0000254 OS << ">";
Mike Stump1eb44332009-09-09 15:08:12 +0000255
Chris Lattnere300c872007-08-30 06:17:34 +0000256 // <t2.c:123:421[blah], t2.c:412:321>
257
258}
259
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000260void ASTDumper::dumpBareType(QualType T) {
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000261 SplitQualType T_split = T.split();
262 OS << "'" << QualType::getAsString(T_split) << "'";
263
264 if (!T.isNull()) {
265 // If the type is sugared, also dump a (shallow) desugared type.
266 SplitQualType D_split = T.getSplitDesugaredType();
267 if (T_split != D_split)
268 OS << ":'" << QualType::getAsString(D_split) << "'";
269 }
270}
271
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000272void ASTDumper::dumpType(QualType T) {
273 OS << ' ';
274 dumpBareType(T);
275}
276
Alexander Kornienkoad7bb362012-12-20 11:08:38 +0000277void ASTDumper::dumpBareDeclRef(const Decl *D) {
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000278 OS << D->getDeclKindName();
279 dumpPointer(D);
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000280
Alexander Kornienkoad7bb362012-12-20 11:08:38 +0000281 if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000282 OS << " '";
283 ND->getDeclName().printName(OS);
284 OS << "'";
285 }
286
Alexander Kornienkoad7bb362012-12-20 11:08:38 +0000287 if (const ValueDecl *VD = dyn_cast<ValueDecl>(D))
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000288 dumpType(VD->getType());
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000289}
290
Alexander Kornienkoad7bb362012-12-20 11:08:38 +0000291void ASTDumper::dumpDeclRef(const Decl *D, const char *Label) {
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000292 if (!D)
293 return;
294
295 IndentScope Indent(*this);
296 if (Label)
297 OS << Label << ' ';
298 dumpBareDeclRef(D);
299}
300
Alexander Kornienkoad7bb362012-12-20 11:08:38 +0000301void ASTDumper::dumpName(const NamedDecl *ND) {
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000302 if (ND->getDeclName())
303 OS << ' ' << ND->getNameAsString();
304}
305
Alexander Kornienkoad7bb362012-12-20 11:08:38 +0000306void ASTDumper::dumpDeclContext(const DeclContext *DC) {
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000307 if (!DC)
308 return;
309 for (DeclContext::decl_iterator I = DC->decls_begin(), E = DC->decls_end();
310 I != E; ++I)
311 dumpDecl(*I);
312}
313
Alexander Kornienkoc3cd2b02013-01-07 17:53:08 +0000314void ASTDumper::dumpAttr(const Attr *A) {
315 IndentScope Indent(*this);
316 switch (A->getKind()) {
317#define ATTR(X) case attr::X: OS << #X; break;
318#include "clang/Basic/AttrList.inc"
319 default: llvm_unreachable("unexpected attribute kind");
320 }
321 OS << "Attr";
322 dumpPointer(A);
323 dumpSourceRange(A->getRange());
324#include "clang/AST/AttrDump.inc"
325}
326
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000327//===----------------------------------------------------------------------===//
328// C++ Utilities
329//===----------------------------------------------------------------------===//
330
331void ASTDumper::dumpAccessSpecifier(AccessSpecifier AS) {
332 switch (AS) {
333 case AS_none:
334 break;
335 case AS_public:
336 OS << "public";
337 break;
338 case AS_protected:
339 OS << "protected";
340 break;
341 case AS_private:
342 OS << "private";
343 break;
344 }
345}
346
Alexander Kornienkoad7bb362012-12-20 11:08:38 +0000347void ASTDumper::dumpCXXCtorInitializer(const CXXCtorInitializer *Init) {
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000348 IndentScope Indent(*this);
349 OS << "CXXCtorInitializer";
350 if (Init->isAnyMemberInitializer()) {
351 OS << ' ';
352 dumpBareDeclRef(Init->getAnyMember());
353 } else {
354 dumpType(QualType(Init->getBaseClass(), 0));
355 }
356 dumpStmt(Init->getInit());
357}
358
Alexander Kornienkoad7bb362012-12-20 11:08:38 +0000359void ASTDumper::dumpTemplateParameters(const TemplateParameterList *TPL) {
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000360 if (!TPL)
361 return;
362
Alexander Kornienkoad7bb362012-12-20 11:08:38 +0000363 for (TemplateParameterList::const_iterator I = TPL->begin(), E = TPL->end();
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000364 I != E; ++I)
365 dumpDecl(*I);
366}
367
368void ASTDumper::dumpTemplateArgumentListInfo(
369 const TemplateArgumentListInfo &TALI) {
370 for (unsigned i = 0, e = TALI.size(); i < e; ++i)
371 dumpTemplateArgumentLoc(TALI[i]);
372}
373
374void ASTDumper::dumpTemplateArgumentLoc(const TemplateArgumentLoc &A) {
375 dumpTemplateArgument(A.getArgument(), A.getSourceRange());
376}
377
378void ASTDumper::dumpTemplateArgumentList(const TemplateArgumentList &TAL) {
379 for (unsigned i = 0, e = TAL.size(); i < e; ++i)
380 dumpTemplateArgument(TAL[i]);
381}
382
383void ASTDumper::dumpTemplateArgument(const TemplateArgument &A, SourceRange R) {
384 IndentScope Indent(*this);
385 OS << "TemplateArgument";
386 if (R.isValid())
387 dumpSourceRange(R);
388
389 switch (A.getKind()) {
390 case TemplateArgument::Null:
391 OS << " null";
392 break;
393 case TemplateArgument::Type:
394 OS << " type";
395 dumpType(A.getAsType());
396 break;
397 case TemplateArgument::Declaration:
398 OS << " decl";
399 dumpDeclRef(A.getAsDecl());
400 break;
401 case TemplateArgument::NullPtr:
402 OS << " nullptr";
403 break;
404 case TemplateArgument::Integral:
Alexander Kornienkoad7bb362012-12-20 11:08:38 +0000405 OS << " integral " << A.getAsIntegral();
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000406 break;
407 case TemplateArgument::Template:
408 OS << " template ";
409 A.getAsTemplate().dump(OS);
410 break;
411 case TemplateArgument::TemplateExpansion:
412 OS << " template expansion";
413 A.getAsTemplateOrTemplatePattern().dump(OS);
414 break;
415 case TemplateArgument::Expression:
416 OS << " expr";
417 dumpStmt(A.getAsExpr());
418 break;
419 case TemplateArgument::Pack:
420 OS << " pack";
421 for (TemplateArgument::pack_iterator I = A.pack_begin(), E = A.pack_end();
422 I != E; ++I)
423 dumpTemplateArgument(*I);
424 break;
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000425 }
426}
427
Chris Lattnere300c872007-08-30 06:17:34 +0000428//===----------------------------------------------------------------------===//
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000429// Decl dumping methods.
Chris Lattner6000dac2007-08-08 22:51:59 +0000430//===----------------------------------------------------------------------===//
431
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000432void ASTDumper::dumpDecl(Decl *D) {
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000433 IndentScope Indent(*this);
Mike Stump1eb44332009-09-09 15:08:12 +0000434
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000435 if (!D) {
436 OS << "<<<NULL>>>";
437 return;
Chris Lattner6000dac2007-08-08 22:51:59 +0000438 }
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000439
440 OS << D->getDeclKindName() << "Decl";
441 dumpPointer(D);
442 dumpSourceRange(D->getSourceRange());
443 DeclVisitor<ASTDumper>::Visit(D);
Alexander Kornienkoc3cd2b02013-01-07 17:53:08 +0000444 if (D->hasAttrs()) {
445 for (AttrVec::const_iterator I = D->getAttrs().begin(),
446 E = D->getAttrs().end(); I != E; ++I)
447 dumpAttr(*I);
448 }
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000449 // Decls within functions are visited by the body
450 if (!isa<FunctionDecl>(*D) && !isa<ObjCMethodDecl>(*D))
451 dumpDeclContext(dyn_cast<DeclContext>(D));
452}
453
454void ASTDumper::VisitLabelDecl(LabelDecl *D) {
455 dumpName(D);
456}
457
458void ASTDumper::VisitTypedefDecl(TypedefDecl *D) {
459 dumpName(D);
460 dumpType(D->getUnderlyingType());
461 if (D->isModulePrivate())
462 OS << " __module_private__";
463}
464
465void ASTDumper::VisitEnumDecl(EnumDecl *D) {
466 if (D->isScoped()) {
467 if (D->isScopedUsingClassTag())
468 OS << " class";
469 else
470 OS << " struct";
471 }
472 dumpName(D);
473 if (D->isModulePrivate())
474 OS << " __module_private__";
475 if (D->isFixed())
476 dumpType(D->getIntegerType());
477}
478
479void ASTDumper::VisitRecordDecl(RecordDecl *D) {
480 OS << ' ' << D->getKindName();
481 dumpName(D);
482 if (D->isModulePrivate())
483 OS << " __module_private__";
484}
485
486void ASTDumper::VisitEnumConstantDecl(EnumConstantDecl *D) {
487 dumpName(D);
488 dumpType(D->getType());
489 if (Expr *Init = D->getInitExpr())
490 dumpStmt(Init);
491}
492
493void ASTDumper::VisitIndirectFieldDecl(IndirectFieldDecl *D) {
494 dumpName(D);
495 dumpType(D->getType());
496 for (IndirectFieldDecl::chain_iterator I = D->chain_begin(),
497 E = D->chain_end(); I != E; ++I)
498 dumpDeclRef(*I);
499}
500
501void ASTDumper::VisitFunctionDecl(FunctionDecl *D) {
502 dumpName(D);
503 dumpType(D->getType());
504
505 StorageClass SC = D->getStorageClassAsWritten();
506 if (SC != SC_None)
507 OS << ' ' << VarDecl::getStorageClassSpecifierString(SC);
508 if (D->isInlineSpecified())
509 OS << " inline";
510 if (D->isVirtualAsWritten())
511 OS << " virtual";
512 if (D->isModulePrivate())
513 OS << " __module_private__";
514
515 if (D->isPure())
516 OS << " pure";
517 else if (D->isDeletedAsWritten())
518 OS << " delete";
519
520 if (const FunctionTemplateSpecializationInfo *FTSI =
521 D->getTemplateSpecializationInfo())
522 dumpTemplateArgumentList(*FTSI->TemplateArguments);
523
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +0000524 for (ArrayRef<NamedDecl *>::iterator
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000525 I = D->getDeclsInPrototypeScope().begin(),
526 E = D->getDeclsInPrototypeScope().end(); I != E; ++I)
527 dumpDecl(*I);
528
529 for (FunctionDecl::param_iterator I = D->param_begin(), E = D->param_end();
530 I != E; ++I)
531 dumpDecl(*I);
532
533 if (CXXConstructorDecl *C = dyn_cast<CXXConstructorDecl>(D))
534 for (CXXConstructorDecl::init_const_iterator I = C->init_begin(),
535 E = C->init_end(); I != E; ++I)
536 dumpCXXCtorInitializer(*I);
537
538 if (D->doesThisDeclarationHaveABody())
539 dumpStmt(D->getBody());
540}
541
542void ASTDumper::VisitFieldDecl(FieldDecl *D) {
543 dumpName(D);
544 dumpType(D->getType());
545 if (D->isMutable())
546 OS << " mutable";
547 if (D->isModulePrivate())
548 OS << " __module_private__";
549 if (D->isBitField())
550 dumpStmt(D->getBitWidth());
551 if (Expr *Init = D->getInClassInitializer())
552 dumpStmt(Init);
553}
554
555void ASTDumper::VisitVarDecl(VarDecl *D) {
556 dumpName(D);
557 dumpType(D->getType());
558 StorageClass SC = D->getStorageClassAsWritten();
559 if (SC != SC_None)
560 OS << ' ' << VarDecl::getStorageClassSpecifierString(SC);
561 if (D->isThreadSpecified())
562 OS << " __thread";
563 if (D->isModulePrivate())
564 OS << " __module_private__";
565 if (D->isNRVOVariable())
566 OS << " nrvo";
567 if (D->hasInit())
568 dumpStmt(D->getInit());
569}
570
571void ASTDumper::VisitFileScopeAsmDecl(FileScopeAsmDecl *D) {
572 dumpStmt(D->getAsmString());
573}
574
575void ASTDumper::VisitImportDecl(ImportDecl *D) {
576 OS << ' ' << D->getImportedModule()->getFullModuleName();
577}
578
579//===----------------------------------------------------------------------===//
580// C++ Declarations
581//===----------------------------------------------------------------------===//
582
583void ASTDumper::VisitNamespaceDecl(NamespaceDecl *D) {
584 dumpName(D);
585 if (D->isInline())
586 OS << " inline";
587 if (!D->isOriginalNamespace())
588 dumpDeclRef(D->getOriginalNamespace(), "original");
589}
590
591void ASTDumper::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
592 OS << ' ';
593 dumpBareDeclRef(D->getNominatedNamespace());
594}
595
596void ASTDumper::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
597 dumpName(D);
598 dumpDeclRef(D->getAliasedNamespace());
599}
600
601void ASTDumper::VisitTypeAliasDecl(TypeAliasDecl *D) {
602 dumpName(D);
603 dumpType(D->getUnderlyingType());
604}
605
606void ASTDumper::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {
607 dumpName(D);
608 dumpTemplateParameters(D->getTemplateParameters());
609 dumpDecl(D->getTemplatedDecl());
610}
611
612void ASTDumper::VisitCXXRecordDecl(CXXRecordDecl *D) {
613 VisitRecordDecl(D);
614 if (!D->isCompleteDefinition())
615 return;
616
617 for (CXXRecordDecl::base_class_iterator I = D->bases_begin(),
618 E = D->bases_end(); I != E; ++I) {
619 IndentScope Indent(*this);
620 if (I->isVirtual())
621 OS << "virtual ";
622 dumpAccessSpecifier(I->getAccessSpecifier());
623 dumpType(I->getType());
624 if (I->isPackExpansion())
625 OS << "...";
626 }
627}
628
629void ASTDumper::VisitStaticAssertDecl(StaticAssertDecl *D) {
630 dumpStmt(D->getAssertExpr());
631 dumpStmt(D->getMessage());
632}
633
634void ASTDumper::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
635 dumpName(D);
636 dumpTemplateParameters(D->getTemplateParameters());
637 dumpDecl(D->getTemplatedDecl());
638 for (FunctionTemplateDecl::spec_iterator I = D->spec_begin(),
639 E = D->spec_end(); I != E; ++I) {
640 switch (I->getTemplateSpecializationKind()) {
641 case TSK_Undeclared:
642 case TSK_ImplicitInstantiation:
643 case TSK_ExplicitInstantiationDeclaration:
644 case TSK_ExplicitInstantiationDefinition:
645 dumpDecl(*I);
646 break;
647 case TSK_ExplicitSpecialization:
648 dumpDeclRef(*I);
649 break;
650 }
651 }
652}
653
654void ASTDumper::VisitClassTemplateDecl(ClassTemplateDecl *D) {
655 dumpName(D);
656 dumpTemplateParameters(D->getTemplateParameters());
657 dumpDecl(D->getTemplatedDecl());
658 for (ClassTemplateDecl::spec_iterator I = D->spec_begin(), E = D->spec_end();
659 I != E; ++I) {
660 switch (I->getTemplateSpecializationKind()) {
661 case TSK_Undeclared:
662 case TSK_ImplicitInstantiation:
663 dumpDecl(*I);
664 break;
665 case TSK_ExplicitSpecialization:
666 case TSK_ExplicitInstantiationDeclaration:
667 case TSK_ExplicitInstantiationDefinition:
668 dumpDeclRef(*I);
669 break;
670 }
671 }
672}
673
674void ASTDumper::VisitClassTemplateSpecializationDecl(
675 ClassTemplateSpecializationDecl *D) {
676 VisitCXXRecordDecl(D);
677 dumpTemplateArgumentList(D->getTemplateArgs());
678}
679
680void ASTDumper::VisitClassTemplatePartialSpecializationDecl(
681 ClassTemplatePartialSpecializationDecl *D) {
682 VisitClassTemplateSpecializationDecl(D);
683 dumpTemplateParameters(D->getTemplateParameters());
684}
685
686void ASTDumper::VisitClassScopeFunctionSpecializationDecl(
687 ClassScopeFunctionSpecializationDecl *D) {
688 dumpDeclRef(D->getSpecialization());
689 if (D->hasExplicitTemplateArgs())
690 dumpTemplateArgumentListInfo(D->templateArgs());
691}
692
693void ASTDumper::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
694 if (D->wasDeclaredWithTypename())
695 OS << " typename";
696 else
697 OS << " class";
698 if (D->isParameterPack())
699 OS << " ...";
700 dumpName(D);
701 if (D->hasDefaultArgument())
702 dumpType(D->getDefaultArgument());
703}
704
705void ASTDumper::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
706 dumpType(D->getType());
707 if (D->isParameterPack())
708 OS << " ...";
709 dumpName(D);
710 if (D->hasDefaultArgument())
711 dumpStmt(D->getDefaultArgument());
712}
713
714void ASTDumper::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
715 if (D->isParameterPack())
716 OS << " ...";
717 dumpName(D);
718 dumpTemplateParameters(D->getTemplateParameters());
719 if (D->hasDefaultArgument())
720 dumpTemplateArgumentLoc(D->getDefaultArgument());
721}
722
723void ASTDumper::VisitUsingDecl(UsingDecl *D) {
724 OS << ' ';
725 D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
726 OS << D->getNameAsString();
727}
728
729void
730ASTDumper::VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D) {
731 OS << ' ';
732 D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
733 OS << D->getNameAsString();
734}
735
736void ASTDumper::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {
737 OS << ' ';
738 D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
739 OS << D->getNameAsString();
740 dumpType(D->getType());
741}
742
743void ASTDumper::VisitUsingShadowDecl(UsingShadowDecl *D) {
744 OS << ' ';
745 dumpBareDeclRef(D->getTargetDecl());
746}
747
748void ASTDumper::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
749 switch (D->getLanguage()) {
750 case LinkageSpecDecl::lang_c: OS << " C"; break;
751 case LinkageSpecDecl::lang_cxx: OS << " C++"; break;
752 }
753}
754
755void ASTDumper::VisitAccessSpecDecl(AccessSpecDecl *D) {
756 OS << ' ';
757 dumpAccessSpecifier(D->getAccess());
758}
759
760void ASTDumper::VisitFriendDecl(FriendDecl *D) {
761 if (TypeSourceInfo *T = D->getFriendType())
762 dumpType(T->getType());
763 else
764 dumpDecl(D->getFriendDecl());
765}
766
767//===----------------------------------------------------------------------===//
768// Obj-C Declarations
769//===----------------------------------------------------------------------===//
770
771void ASTDumper::VisitObjCIvarDecl(ObjCIvarDecl *D) {
772 dumpName(D);
773 dumpType(D->getType());
774 if (D->getSynthesize())
775 OS << " synthesize";
776
777 switch (D->getAccessControl()) {
778 case ObjCIvarDecl::None:
779 OS << " none";
780 break;
781 case ObjCIvarDecl::Private:
782 OS << " private";
783 break;
784 case ObjCIvarDecl::Protected:
785 OS << " protected";
786 break;
787 case ObjCIvarDecl::Public:
788 OS << " public";
789 break;
790 case ObjCIvarDecl::Package:
791 OS << " package";
792 break;
793 }
794}
795
796void ASTDumper::VisitObjCMethodDecl(ObjCMethodDecl *D) {
797 if (D->isInstanceMethod())
798 OS << " -";
799 else
800 OS << " +";
801 dumpName(D);
802 dumpType(D->getResultType());
803
804 if (D->isThisDeclarationADefinition())
805 dumpDeclContext(D);
806 else {
807 for (ObjCMethodDecl::param_iterator I = D->param_begin(),
808 E = D->param_end(); I != E; ++I) {
809 dumpDecl(*I);
810 }
811 }
812
813 if (D->isVariadic()) {
814 IndentScope Indent(*this);
815 OS << "...";
816 }
817
818 if (D->hasBody())
819 dumpStmt(D->getBody());
820}
821
822void ASTDumper::VisitObjCCategoryDecl(ObjCCategoryDecl *D) {
823 dumpName(D);
824 dumpDeclRef(D->getClassInterface());
825 dumpDeclRef(D->getImplementation());
826 for (ObjCCategoryDecl::protocol_iterator I = D->protocol_begin(),
827 E = D->protocol_end(); I != E; ++I)
828 dumpDeclRef(*I);
829}
830
831void ASTDumper::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
832 dumpName(D);
833 dumpDeclRef(D->getClassInterface());
834 dumpDeclRef(D->getCategoryDecl());
835}
836
837void ASTDumper::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
838 dumpName(D);
839 for (ObjCProtocolDecl::protocol_iterator I = D->protocol_begin(),
840 E = D->protocol_end(); I != E; ++I)
841 dumpDeclRef(*I);
842}
843
844void ASTDumper::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
845 dumpName(D);
846 dumpDeclRef(D->getSuperClass(), "super");
847 dumpDeclRef(D->getImplementation());
848 for (ObjCInterfaceDecl::protocol_iterator I = D->protocol_begin(),
849 E = D->protocol_end(); I != E; ++I)
850 dumpDeclRef(*I);
851}
852
853void ASTDumper::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
854 dumpName(D);
855 dumpDeclRef(D->getSuperClass(), "super");
856 dumpDeclRef(D->getClassInterface());
857 for (ObjCImplementationDecl::init_iterator I = D->init_begin(),
858 E = D->init_end(); I != E; ++I)
859 dumpCXXCtorInitializer(*I);
860}
861
862void ASTDumper::VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D) {
863 dumpName(D);
864 dumpDeclRef(D->getClassInterface());
865}
866
867void ASTDumper::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
868 dumpName(D);
869 dumpType(D->getType());
870
871 if (D->getPropertyImplementation() == ObjCPropertyDecl::Required)
872 OS << " required";
873 else if (D->getPropertyImplementation() == ObjCPropertyDecl::Optional)
874 OS << " optional";
875
876 ObjCPropertyDecl::PropertyAttributeKind Attrs = D->getPropertyAttributes();
877 if (Attrs != ObjCPropertyDecl::OBJC_PR_noattr) {
878 if (Attrs & ObjCPropertyDecl::OBJC_PR_readonly)
879 OS << " readonly";
880 if (Attrs & ObjCPropertyDecl::OBJC_PR_assign)
881 OS << " assign";
882 if (Attrs & ObjCPropertyDecl::OBJC_PR_readwrite)
883 OS << " readwrite";
884 if (Attrs & ObjCPropertyDecl::OBJC_PR_retain)
885 OS << " retain";
886 if (Attrs & ObjCPropertyDecl::OBJC_PR_copy)
887 OS << " copy";
888 if (Attrs & ObjCPropertyDecl::OBJC_PR_nonatomic)
889 OS << " nonatomic";
890 if (Attrs & ObjCPropertyDecl::OBJC_PR_atomic)
891 OS << " atomic";
892 if (Attrs & ObjCPropertyDecl::OBJC_PR_weak)
893 OS << " weak";
894 if (Attrs & ObjCPropertyDecl::OBJC_PR_strong)
895 OS << " strong";
896 if (Attrs & ObjCPropertyDecl::OBJC_PR_unsafe_unretained)
897 OS << " unsafe_unretained";
898 if (Attrs & ObjCPropertyDecl::OBJC_PR_getter)
899 dumpDeclRef(D->getGetterMethodDecl(), "getter");
900 if (Attrs & ObjCPropertyDecl::OBJC_PR_setter)
901 dumpDeclRef(D->getSetterMethodDecl(), "setter");
902 }
903}
904
905void ASTDumper::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
906 dumpName(D->getPropertyDecl());
907 if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize)
908 OS << " synthesize";
909 else
910 OS << " dynamic";
911 dumpDeclRef(D->getPropertyDecl());
912 dumpDeclRef(D->getPropertyIvarDecl());
913}
914
915void ASTDumper::VisitBlockDecl(BlockDecl *D) {
916 for (BlockDecl::param_iterator I = D->param_begin(), E = D->param_end();
917 I != E; ++I)
918 dumpDecl(*I);
919
920 if (D->isVariadic()) {
921 IndentScope Indent(*this);
922 OS << "...";
923 }
924
925 if (D->capturesCXXThis()) {
926 IndentScope Indent(*this);
927 OS << "capture this";
928 }
929 for (BlockDecl::capture_iterator I = D->capture_begin(),
930 E = D->capture_end(); I != E; ++I) {
931 IndentScope Indent(*this);
932 OS << "capture";
933 if (I->isByRef())
934 OS << " byref";
935 if (I->isNested())
936 OS << " nested";
937 if (I->getVariable()) {
938 OS << ' ';
939 dumpBareDeclRef(I->getVariable());
940 }
941 if (I->hasCopyExpr())
942 dumpStmt(I->getCopyExpr());
943 }
944
945 dumpStmt(D->getBody());
Chris Lattner6000dac2007-08-08 22:51:59 +0000946}
947
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000948//===----------------------------------------------------------------------===//
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000949// Stmt dumping methods.
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000950//===----------------------------------------------------------------------===//
951
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000952void ASTDumper::dumpStmt(Stmt *S) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000953 IndentScope Indent(*this);
954
955 if (!S) {
956 OS << "<<<NULL>>>";
957 return;
958 }
959
960 if (DeclStmt *DS = dyn_cast<DeclStmt>(S)) {
961 VisitDeclStmt(DS);
962 return;
963 }
964
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000965 StmtVisitor<ASTDumper>::Visit(S);
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000966 for (Stmt::child_range CI = S->children(); CI; ++CI)
967 dumpStmt(*CI);
968}
969
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000970void ASTDumper::VisitStmt(Stmt *Node) {
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000971 OS << Node->getStmtClassName();
972 dumpPointer(Node);
973 dumpSourceRange(Node->getSourceRange());
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000974}
975
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000976void ASTDumper::VisitDeclStmt(DeclStmt *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000977 VisitStmt(Node);
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000978 for (DeclStmt::decl_iterator I = Node->decl_begin(), E = Node->decl_end();
979 I != E; ++I)
980 dumpDecl(*I);
Ted Kremenek5399ce22007-12-12 06:59:42 +0000981}
982
Alexander Kornienkoc3cd2b02013-01-07 17:53:08 +0000983void ASTDumper::VisitAttributedStmt(AttributedStmt *Node) {
984 VisitStmt(Node);
985 for (ArrayRef<const Attr*>::iterator I = Node->getAttrs().begin(),
986 E = Node->getAttrs().end(); I != E; ++I)
987 dumpAttr(*I);
988}
989
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000990void ASTDumper::VisitLabelStmt(LabelStmt *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000991 VisitStmt(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +0000992 OS << " '" << Node->getName() << "'";
Chris Lattner6000dac2007-08-08 22:51:59 +0000993}
994
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000995void ASTDumper::VisitGotoStmt(GotoStmt *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000996 VisitStmt(Node);
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000997 OS << " '" << Node->getLabel()->getName() << "'";
998 dumpPointer(Node->getLabel());
Chris Lattner6000dac2007-08-08 22:51:59 +0000999}
1000
Chris Lattner6000dac2007-08-08 22:51:59 +00001001//===----------------------------------------------------------------------===//
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001002// Expr dumping methods.
Chris Lattner6000dac2007-08-08 22:51:59 +00001003//===----------------------------------------------------------------------===//
1004
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001005void ASTDumper::VisitExpr(Expr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001006 VisitStmt(Node);
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001007 dumpType(Node->getType());
1008
1009 switch (Node->getValueKind()) {
1010 case VK_RValue:
1011 break;
1012 case VK_LValue:
1013 OS << " lvalue";
1014 break;
1015 case VK_XValue:
1016 OS << " xvalue";
1017 break;
1018 }
1019
1020 switch (Node->getObjectKind()) {
1021 case OK_Ordinary:
1022 break;
1023 case OK_BitField:
1024 OS << " bitfield";
1025 break;
1026 case OK_ObjCProperty:
1027 OS << " objcproperty";
1028 break;
1029 case OK_ObjCSubscript:
1030 OS << " objcsubscript";
1031 break;
1032 case OK_VectorComponent:
1033 OS << " vectorcomponent";
1034 break;
1035 }
Chris Lattner6000dac2007-08-08 22:51:59 +00001036}
1037
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001038static void dumpBasePath(raw_ostream &OS, CastExpr *Node) {
John McCallf871d0c2010-08-07 06:22:56 +00001039 if (Node->path_empty())
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001040 return;
1041
1042 OS << " (";
1043 bool First = true;
John McCallf871d0c2010-08-07 06:22:56 +00001044 for (CastExpr::path_iterator
1045 I = Node->path_begin(), E = Node->path_end(); I != E; ++I) {
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001046 const CXXBaseSpecifier *Base = *I;
1047 if (!First)
1048 OS << " -> ";
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001049
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001050 const CXXRecordDecl *RD =
1051 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001052
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001053 if (Base->isVirtual())
1054 OS << "virtual ";
1055 OS << RD->getName();
1056 First = false;
1057 }
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001058
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001059 OS << ')';
1060}
1061
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001062void ASTDumper::VisitCastExpr(CastExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001063 VisitExpr(Node);
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001064 OS << " <" << Node->getCastKindName();
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001065 dumpBasePath(OS, Node);
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001066 OS << ">";
Anders Carlsson27a5b9b2009-08-22 23:33:40 +00001067}
1068
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001069void ASTDumper::VisitDeclRefExpr(DeclRefExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001070 VisitExpr(Node);
Ted Kremenekeb641f92007-09-10 17:32:55 +00001071
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001072 OS << " ";
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001073 dumpBareDeclRef(Node->getDecl());
Chandler Carruth3aa81402011-05-01 23:48:14 +00001074 if (Node->getDecl() != Node->getFoundDecl()) {
1075 OS << " (";
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001076 dumpBareDeclRef(Node->getFoundDecl());
Chandler Carruth3aa81402011-05-01 23:48:14 +00001077 OS << ")";
1078 }
John McCall6b5a61b2011-02-07 10:33:21 +00001079}
1080
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001081void ASTDumper::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001082 VisitExpr(Node);
John McCall9d5f35e2009-12-11 21:50:11 +00001083 OS << " (";
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001084 if (!Node->requiresADL())
1085 OS << "no ";
Benjamin Kramer900fc632010-04-17 09:33:03 +00001086 OS << "ADL) = '" << Node->getName() << '\'';
John McCall9d5f35e2009-12-11 21:50:11 +00001087
1088 UnresolvedLookupExpr::decls_iterator
1089 I = Node->decls_begin(), E = Node->decls_end();
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001090 if (I == E)
1091 OS << " empty";
John McCall9d5f35e2009-12-11 21:50:11 +00001092 for (; I != E; ++I)
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001093 dumpPointer(*I);
John McCall9d5f35e2009-12-11 21:50:11 +00001094}
1095
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001096void ASTDumper::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001097 VisitExpr(Node);
Steve Naroff3c64d9e2008-03-12 13:19:12 +00001098
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001099 OS << " " << Node->getDecl()->getDeclKindName()
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001100 << "Decl='" << *Node->getDecl() << "'";
1101 dumpPointer(Node->getDecl());
Steve Naroff218543b2008-05-23 22:01:24 +00001102 if (Node->isFreeIvar())
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001103 OS << " isFreeIvar";
Steve Naroff3c64d9e2008-03-12 13:19:12 +00001104}
1105
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001106void ASTDumper::VisitPredefinedExpr(PredefinedExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001107 VisitExpr(Node);
Chris Lattner6000dac2007-08-08 22:51:59 +00001108 switch (Node->getIdentType()) {
David Blaikieb219cfc2011-09-23 05:06:16 +00001109 default: llvm_unreachable("unknown case");
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001110 case PredefinedExpr::Func: OS << " __func__"; break;
1111 case PredefinedExpr::Function: OS << " __FUNCTION__"; break;
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001112 case PredefinedExpr::LFunction: OS << " L__FUNCTION__"; break;
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001113 case PredefinedExpr::PrettyFunction: OS << " __PRETTY_FUNCTION__";break;
Chris Lattner6000dac2007-08-08 22:51:59 +00001114 }
1115}
1116
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001117void ASTDumper::VisitCharacterLiteral(CharacterLiteral *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001118 VisitExpr(Node);
Richard Trieu49cf8842011-11-03 23:56:23 +00001119 OS << " " << Node->getValue();
Chris Lattner6000dac2007-08-08 22:51:59 +00001120}
1121
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001122void ASTDumper::VisitIntegerLiteral(IntegerLiteral *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001123 VisitExpr(Node);
Chris Lattner6000dac2007-08-08 22:51:59 +00001124
1125 bool isSigned = Node->getType()->isSignedIntegerType();
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001126 OS << " " << Node->getValue().toString(10, isSigned);
Chris Lattner6000dac2007-08-08 22:51:59 +00001127}
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001128
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001129void ASTDumper::VisitFloatingLiteral(FloatingLiteral *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001130 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001131 OS << " " << Node->getValueAsApproximateDouble();
Chris Lattner6000dac2007-08-08 22:51:59 +00001132}
Chris Lattner5d661452007-08-26 03:42:43 +00001133
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001134void ASTDumper::VisitStringLiteral(StringLiteral *Str) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001135 VisitExpr(Str);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001136 OS << " ";
Richard Trieu8ab09da2012-06-13 20:25:24 +00001137 Str->outputString(OS);
Chris Lattner6000dac2007-08-08 22:51:59 +00001138}
Chris Lattner17a1a722007-08-30 01:00:35 +00001139
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001140void ASTDumper::VisitUnaryOperator(UnaryOperator *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001141 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001142 OS << " " << (Node->isPostfix() ? "postfix" : "prefix")
1143 << " '" << UnaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
Chris Lattner6000dac2007-08-08 22:51:59 +00001144}
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001145
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001146void ASTDumper::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001147 VisitExpr(Node);
Peter Collingbournef4e3cfb2011-03-11 19:24:49 +00001148 switch(Node->getKind()) {
1149 case UETT_SizeOf:
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001150 OS << " sizeof";
Peter Collingbournef4e3cfb2011-03-11 19:24:49 +00001151 break;
1152 case UETT_AlignOf:
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001153 OS << " alignof";
Peter Collingbournef4e3cfb2011-03-11 19:24:49 +00001154 break;
1155 case UETT_VecStep:
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001156 OS << " vec_step";
Peter Collingbournef4e3cfb2011-03-11 19:24:49 +00001157 break;
1158 }
Sebastian Redl05189992008-11-11 17:56:53 +00001159 if (Node->isArgumentType())
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001160 dumpType(Node->getArgumentType());
Chris Lattner6000dac2007-08-08 22:51:59 +00001161}
Chris Lattner13cb21f2007-08-09 17:35:30 +00001162
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001163void ASTDumper::VisitMemberExpr(MemberExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001164 VisitExpr(Node);
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001165 OS << " " << (Node->isArrow() ? "->" : ".") << *Node->getMemberDecl();
1166 dumpPointer(Node->getMemberDecl());
Chris Lattner6000dac2007-08-08 22:51:59 +00001167}
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001168
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001169void ASTDumper::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001170 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001171 OS << " " << Node->getAccessor().getNameStart();
Chris Lattner6000dac2007-08-08 22:51:59 +00001172}
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001173
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001174void ASTDumper::VisitBinaryOperator(BinaryOperator *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001175 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001176 OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
Chris Lattnereb14fe82007-08-25 02:00:02 +00001177}
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001178
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001179void ASTDumper::VisitCompoundAssignOperator(CompoundAssignOperator *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001180 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001181 OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode())
1182 << "' ComputeLHSTy=";
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001183 dumpBareType(Node->getComputationLHSType());
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001184 OS << " ComputeResultTy=";
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001185 dumpBareType(Node->getComputationResultType());
Chris Lattner6000dac2007-08-08 22:51:59 +00001186}
Chris Lattner6000dac2007-08-08 22:51:59 +00001187
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001188void ASTDumper::VisitBlockExpr(BlockExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001189 VisitExpr(Node);
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001190 dumpDecl(Node->getBlockDecl());
John McCall6b5a61b2011-02-07 10:33:21 +00001191}
1192
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001193void ASTDumper::VisitOpaqueValueExpr(OpaqueValueExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001194 VisitExpr(Node);
John McCall4b9c2d22011-11-06 09:01:30 +00001195
Manuel Klimekcb7b45e2012-11-07 00:33:12 +00001196 if (Expr *Source = Node->getSourceExpr())
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001197 dumpStmt(Source);
John McCall4b9c2d22011-11-06 09:01:30 +00001198}
1199
Chris Lattner6000dac2007-08-08 22:51:59 +00001200// GNU extensions.
1201
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001202void ASTDumper::VisitAddrLabelExpr(AddrLabelExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001203 VisitExpr(Node);
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001204 OS << " " << Node->getLabel()->getName();
1205 dumpPointer(Node->getLabel());
Chris Lattner6000dac2007-08-08 22:51:59 +00001206}
1207
Chris Lattnerf9e05812007-08-09 18:03:18 +00001208//===----------------------------------------------------------------------===//
1209// C++ Expressions
1210//===----------------------------------------------------------------------===//
Chris Lattner6000dac2007-08-08 22:51:59 +00001211
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001212void ASTDumper::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001213 VisitExpr(Node);
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001214 OS << " " << Node->getCastName()
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001215 << "<" << Node->getTypeAsWritten().getAsString() << ">"
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001216 << " <" << Node->getCastKindName();
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001217 dumpBasePath(OS, Node);
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001218 OS << ">";
Chris Lattner6000dac2007-08-08 22:51:59 +00001219}
1220
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001221void ASTDumper::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001222 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001223 OS << " " << (Node->getValue() ? "true" : "false");
Chris Lattner6000dac2007-08-08 22:51:59 +00001224}
1225
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001226void ASTDumper::VisitCXXThisExpr(CXXThisExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001227 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001228 OS << " this";
Douglas Gregorcd9b46e2008-11-04 14:56:14 +00001229}
1230
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001231void ASTDumper::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001232 VisitExpr(Node);
Eli Friedmancc2fca22011-09-02 17:38:59 +00001233 OS << " functional cast to " << Node->getTypeAsWritten().getAsString()
1234 << " <" << Node->getCastKindName() << ">";
Douglas Gregor49badde2008-10-27 19:41:14 +00001235}
1236
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001237void ASTDumper::VisitCXXConstructExpr(CXXConstructExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001238 VisitExpr(Node);
John McCalld4bbdfe2010-02-02 19:03:45 +00001239 CXXConstructorDecl *Ctor = Node->getConstructor();
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001240 dumpType(Ctor->getType());
Anders Carlsson0eca1b62009-08-12 00:21:52 +00001241 if (Node->isElidable())
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001242 OS << " elidable";
John McCallf8cf0b02010-08-07 06:38:55 +00001243 if (Node->requiresZeroInitialization())
1244 OS << " zeroing";
Anders Carlsson0eca1b62009-08-12 00:21:52 +00001245}
1246
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001247void ASTDumper::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001248 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001249 OS << " ";
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001250 dumpCXXTemporary(Node->getTemporary());
Anders Carlsson0eca1b62009-08-12 00:21:52 +00001251}
1252
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001253void ASTDumper::VisitExprWithCleanups(ExprWithCleanups *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001254 VisitExpr(Node);
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001255 for (unsigned i = 0, e = Node->getNumObjects(); i != e; ++i)
1256 dumpDeclRef(Node->getObject(i), "cleanup");
Anders Carlsson0eca1b62009-08-12 00:21:52 +00001257}
1258
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001259void ASTDumper::dumpCXXTemporary(CXXTemporary *Temporary) {
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001260 OS << "(CXXTemporary";
1261 dumpPointer(Temporary);
1262 OS << ")";
Anders Carlsson0eca1b62009-08-12 00:21:52 +00001263}
1264
Anders Carlsson55085182007-08-21 17:43:55 +00001265//===----------------------------------------------------------------------===//
1266// Obj-C Expressions
1267//===----------------------------------------------------------------------===//
1268
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001269void ASTDumper::VisitObjCMessageExpr(ObjCMessageExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001270 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001271 OS << " selector=" << Node->getSelector().getAsString();
Douglas Gregor04badcf2010-04-21 00:45:42 +00001272 switch (Node->getReceiverKind()) {
1273 case ObjCMessageExpr::Instance:
1274 break;
1275
1276 case ObjCMessageExpr::Class:
1277 OS << " class=";
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001278 dumpBareType(Node->getClassReceiver());
Douglas Gregor04badcf2010-04-21 00:45:42 +00001279 break;
1280
1281 case ObjCMessageExpr::SuperInstance:
1282 OS << " super (instance)";
1283 break;
1284
1285 case ObjCMessageExpr::SuperClass:
1286 OS << " super (class)";
1287 break;
1288 }
Ted Kremenekb3d914b2008-02-29 22:04:05 +00001289}
1290
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001291void ASTDumper::VisitObjCBoxedExpr(ObjCBoxedExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001292 VisitExpr(Node);
Argyrios Kyrtzidis36faadd2012-05-10 20:02:31 +00001293 OS << " selector=" << Node->getBoxingMethod()->getSelector().getAsString();
1294}
1295
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001296void ASTDumper::VisitObjCAtCatchStmt(ObjCAtCatchStmt *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001297 VisitStmt(Node);
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001298 if (VarDecl *CatchParam = Node->getCatchParamDecl())
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001299 dumpDecl(CatchParam);
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001300 else
Douglas Gregor8f5e3dd2010-04-23 22:50:49 +00001301 OS << " catch all";
Douglas Gregor8f5e3dd2010-04-23 22:50:49 +00001302}
1303
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001304void ASTDumper::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001305 VisitExpr(Node);
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001306 dumpType(Node->getEncodedType());
Anders Carlssonf9bcf012007-08-22 15:14:15 +00001307}
1308
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001309void ASTDumper::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001310 VisitExpr(Node);
Mike Stump1eb44332009-09-09 15:08:12 +00001311
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001312 OS << " " << Node->getSelector().getAsString();
Fariborz Jahanianb62f6812007-10-16 20:40:23 +00001313}
1314
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001315void ASTDumper::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001316 VisitExpr(Node);
Mike Stump1eb44332009-09-09 15:08:12 +00001317
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001318 OS << ' ' << *Node->getProtocol();
Fariborz Jahanian390d50a2007-10-17 16:58:11 +00001319}
Daniel Dunbar7f8ea5c2008-08-30 05:35:15 +00001320
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001321void ASTDumper::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001322 VisitExpr(Node);
John McCall12f78a62010-12-02 01:19:52 +00001323 if (Node->isImplicitProperty()) {
Fariborz Jahanian99130e52010-12-22 19:46:35 +00001324 OS << " Kind=MethodRef Getter=\"";
1325 if (Node->getImplicitPropertyGetter())
1326 OS << Node->getImplicitPropertyGetter()->getSelector().getAsString();
1327 else
1328 OS << "(null)";
1329
1330 OS << "\" Setter=\"";
John McCall12f78a62010-12-02 01:19:52 +00001331 if (ObjCMethodDecl *Setter = Node->getImplicitPropertySetter())
1332 OS << Setter->getSelector().getAsString();
1333 else
1334 OS << "(null)";
1335 OS << "\"";
1336 } else {
Benjamin Kramerb8989f22011-10-14 18:45:37 +00001337 OS << " Kind=PropertyRef Property=\"" << *Node->getExplicitProperty() <<'"';
John McCall12f78a62010-12-02 01:19:52 +00001338 }
Fariborz Jahanian5daf5702008-11-22 18:39:36 +00001339
Fariborz Jahanian8ac2d442010-10-14 16:04:05 +00001340 if (Node->isSuperReceiver())
1341 OS << " super";
Argyrios Kyrtzidisb085d892012-03-30 00:19:18 +00001342
1343 OS << " Messaging=";
1344 if (Node->isMessagingGetter() && Node->isMessagingSetter())
1345 OS << "Getter&Setter";
1346 else if (Node->isMessagingGetter())
1347 OS << "Getter";
1348 else if (Node->isMessagingSetter())
1349 OS << "Setter";
Douglas Gregorcd9b46e2008-11-04 14:56:14 +00001350}
1351
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001352void ASTDumper::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001353 VisitExpr(Node);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00001354 if (Node->isArraySubscriptRefExpr())
1355 OS << " Kind=ArraySubscript GetterForArray=\"";
1356 else
1357 OS << " Kind=DictionarySubscript GetterForDictionary=\"";
1358 if (Node->getAtIndexMethodDecl())
1359 OS << Node->getAtIndexMethodDecl()->getSelector().getAsString();
1360 else
1361 OS << "(null)";
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001362
Ted Kremenekebcb57a2012-03-06 20:05:56 +00001363 if (Node->isArraySubscriptRefExpr())
1364 OS << "\" SetterForArray=\"";
1365 else
1366 OS << "\" SetterForDictionary=\"";
1367 if (Node->setAtIndexMethodDecl())
1368 OS << Node->setAtIndexMethodDecl()->getSelector().getAsString();
1369 else
1370 OS << "(null)";
1371}
1372
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001373void ASTDumper::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001374 VisitExpr(Node);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00001375 OS << " " << (Node->getValue() ? "__objc_yes" : "__objc_no");
1376}
1377
Chris Lattner6000dac2007-08-08 22:51:59 +00001378//===----------------------------------------------------------------------===//
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001379// Decl method implementations
1380//===----------------------------------------------------------------------===//
1381
1382void Decl::dump() const {
1383 dump(llvm::errs());
1384}
1385
1386void Decl::dump(raw_ostream &OS) const {
1387 ASTDumper P(&getASTContext().getSourceManager(), OS);
1388 P.dumpDecl(const_cast<Decl*>(this));
1389}
1390
1391//===----------------------------------------------------------------------===//
Chris Lattner6000dac2007-08-08 22:51:59 +00001392// Stmt method implementations
1393//===----------------------------------------------------------------------===//
1394
Chris Lattnere300c872007-08-30 06:17:34 +00001395void Stmt::dump(SourceManager &SM) const {
Argyrios Kyrtzidis96680332010-08-09 10:54:31 +00001396 dump(llvm::errs(), SM);
1397}
1398
Chris Lattner5f9e2722011-07-23 10:55:15 +00001399void Stmt::dump(raw_ostream &OS, SourceManager &SM) const {
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001400 ASTDumper P(&SM, OS);
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001401 P.dumpStmt(const_cast<Stmt*>(this));
Chris Lattner0c727a32007-08-30 00:40:08 +00001402}
1403
Chris Lattner6000dac2007-08-08 22:51:59 +00001404void Stmt::dump() const {
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001405 ASTDumper P(0, llvm::errs());
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001406 P.dumpStmt(const_cast<Stmt*>(this));
Chris Lattner6000dac2007-08-08 22:51:59 +00001407}