blob: 31331f1f9d308e0ccbd6036a1803b9308725122a [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"
16#include "clang/AST/DeclCXX.h"
17#include "clang/AST/DeclObjC.h"
Alexander Kornienkod538ed92012-12-20 02:09:13 +000018#include "clang/AST/DeclVisitor.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000019#include "clang/AST/StmtVisitor.h"
Alexander Kornienkod538ed92012-12-20 02:09:13 +000020#include "clang/Basic/Module.h"
Chris Lattnere300c872007-08-30 06:17:34 +000021#include "clang/Basic/SourceManager.h"
Daniel Dunbar806c12e2009-12-03 09:13:13 +000022#include "llvm/Support/raw_ostream.h"
Chris Lattner6000dac2007-08-08 22:51:59 +000023using namespace clang;
24
25//===----------------------------------------------------------------------===//
Alexander Kornienko40b66a002012-12-13 13:59:55 +000026// ASTDumper Visitor
Chris Lattner6000dac2007-08-08 22:51:59 +000027//===----------------------------------------------------------------------===//
28
29namespace {
Alexander Kornienkod538ed92012-12-20 02:09:13 +000030 class ASTDumper
31 : public DeclVisitor<ASTDumper>, public StmtVisitor<ASTDumper> {
Chris Lattnere300c872007-08-30 06:17:34 +000032 SourceManager *SM;
Chris Lattner5f9e2722011-07-23 10:55:15 +000033 raw_ostream &OS;
Chris Lattner6000dac2007-08-08 22:51:59 +000034 unsigned IndentLevel;
Manuel Klimekcb7b45e2012-11-07 00:33:12 +000035 bool IsFirstLine;
Mike Stump1eb44332009-09-09 15:08:12 +000036
Alexander Kornienko21c8b192012-12-11 15:28:09 +000037 /// Keep track of the last location we print out so that we can
38 /// print out deltas from then on out.
Chris Lattnere300c872007-08-30 06:17:34 +000039 const char *LastLocFilename;
40 unsigned LastLocLine;
Douglas Gregord249e1d1f2009-05-29 20:38:28 +000041
Manuel Klimekcb7b45e2012-11-07 00:33:12 +000042 class IndentScope {
Alexander Kornienko40b66a002012-12-13 13:59:55 +000043 ASTDumper &Dumper;
Manuel Klimekcb7b45e2012-11-07 00:33:12 +000044 public:
Alexander Kornienko40b66a002012-12-13 13:59:55 +000045 IndentScope(ASTDumper &Dumper) : Dumper(Dumper) {
Manuel Klimekcb7b45e2012-11-07 00:33:12 +000046 Dumper.indent();
47 }
48 ~IndentScope() {
49 Dumper.unindent();
50 }
51 };
52
Chris Lattner6000dac2007-08-08 22:51:59 +000053 public:
Alexander Kornienko40b66a002012-12-13 13:59:55 +000054 ASTDumper(SourceManager *SM, raw_ostream &OS)
Dmitri Gribenko95f61902012-11-16 21:43:31 +000055 : SM(SM), OS(OS), IndentLevel(0), IsFirstLine(true),
56 LastLocFilename(""), LastLocLine(~0U) { }
Mike Stump1eb44332009-09-09 15:08:12 +000057
Alexander Kornienko40b66a002012-12-13 13:59:55 +000058 ~ASTDumper() {
Manuel Klimekcb7b45e2012-11-07 00:33:12 +000059 OS << "\n";
60 }
61
Alexander Kornienkod5bc3592012-12-11 15:20:44 +000062 void dumpDecl(Decl *D);
63 void dumpStmt(Stmt *S);
Mike Stump1eb44332009-09-09 15:08:12 +000064
Alexander Kornienko21c8b192012-12-11 15:28:09 +000065 // Utilities
66 void indent();
67 void unindent();
Alexander Kornienkod538ed92012-12-20 02:09:13 +000068 void dumpPointer(const void *Ptr);
69 void dumpSourceRange(SourceRange R);
Alexander Kornienko21c8b192012-12-11 15:28:09 +000070 void dumpLocation(SourceLocation Loc);
Alexander Kornienkod538ed92012-12-20 02:09:13 +000071 void dumpBareType(QualType T);
Alexander Kornienko21c8b192012-12-11 15:28:09 +000072 void dumpType(QualType T);
Alexander Kornienkod538ed92012-12-20 02:09:13 +000073 void dumpBareDeclRef(Decl *node);
74 void dumpDeclRef(Decl *node, const char *Label = NULL);
75 void dumpName(NamedDecl *D);
76 void dumpDeclContext(DeclContext *DC);
77
78 // C++ Utilities
79 void dumpAccessSpecifier(AccessSpecifier AS);
80 void dumpCXXCtorInitializer(CXXCtorInitializer *Init);
81 void dumpTemplateParameters(TemplateParameterList *TPL);
82 void dumpTemplateArgumentListInfo(const TemplateArgumentListInfo &TALI);
83 void dumpTemplateArgumentLoc(const TemplateArgumentLoc &A);
84 void dumpTemplateArgumentList(const TemplateArgumentList &TAL);
85 void dumpTemplateArgument(const TemplateArgument &A,
86 SourceRange R = SourceRange());
87
88 // Decls
89 void VisitLabelDecl(LabelDecl *D);
90 void VisitTypedefDecl(TypedefDecl *D);
91 void VisitEnumDecl(EnumDecl *D);
92 void VisitRecordDecl(RecordDecl *D);
93 void VisitEnumConstantDecl(EnumConstantDecl *D);
94 void VisitIndirectFieldDecl(IndirectFieldDecl *D);
95 void VisitFunctionDecl(FunctionDecl *D);
96 void VisitFieldDecl(FieldDecl *D);
97 void VisitVarDecl(VarDecl *D);
98 void VisitFileScopeAsmDecl(FileScopeAsmDecl *D);
99 void VisitImportDecl(ImportDecl *D);
100
101 // C++ Decls
102 void VisitNamespaceDecl(NamespaceDecl *D);
103 void VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
104 void VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
105 void VisitTypeAliasDecl(TypeAliasDecl *D);
106 void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D);
107 void VisitCXXRecordDecl(CXXRecordDecl *D);
108 void VisitStaticAssertDecl(StaticAssertDecl *D);
109 void VisitFunctionTemplateDecl(FunctionTemplateDecl *D);
110 void VisitClassTemplateDecl(ClassTemplateDecl *D);
111 void VisitClassTemplateSpecializationDecl(
112 ClassTemplateSpecializationDecl *D);
113 void VisitClassTemplatePartialSpecializationDecl(
114 ClassTemplatePartialSpecializationDecl *D);
115 void VisitClassScopeFunctionSpecializationDecl(
116 ClassScopeFunctionSpecializationDecl *D);
117 void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
118 void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
119 void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
120 void VisitUsingDecl(UsingDecl *D);
121 void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);
122 void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
123 void VisitUsingShadowDecl(UsingShadowDecl *D);
124 void VisitLinkageSpecDecl(LinkageSpecDecl *D);
125 void VisitAccessSpecDecl(AccessSpecDecl *D);
126 void VisitFriendDecl(FriendDecl *D);
127
128 // ObjC Decls
129 void VisitObjCIvarDecl(ObjCIvarDecl *D);
130 void VisitObjCMethodDecl(ObjCMethodDecl *D);
131 void VisitObjCCategoryDecl(ObjCCategoryDecl *D);
132 void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
133 void VisitObjCProtocolDecl(ObjCProtocolDecl *D);
134 void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
135 void VisitObjCImplementationDecl(ObjCImplementationDecl *D);
136 void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D);
137 void VisitObjCPropertyDecl(ObjCPropertyDecl *D);
138 void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
139 void VisitBlockDecl(BlockDecl *D);
Mike Stump1eb44332009-09-09 15:08:12 +0000140
Chris Lattner17a1a722007-08-30 01:00:35 +0000141 // Stmts.
Chris Lattnerc5598cb2007-08-21 04:04:25 +0000142 void VisitStmt(Stmt *Node);
Ted Kremenek5399ce22007-12-12 06:59:42 +0000143 void VisitDeclStmt(DeclStmt *Node);
Chris Lattner17a1a722007-08-30 01:00:35 +0000144 void VisitLabelStmt(LabelStmt *Node);
145 void VisitGotoStmt(GotoStmt *Node);
Mike Stump1eb44332009-09-09 15:08:12 +0000146
Chris Lattner17a1a722007-08-30 01:00:35 +0000147 // Exprs
148 void VisitExpr(Expr *Node);
Anders Carlsson27a5b9b2009-08-22 23:33:40 +0000149 void VisitCastExpr(CastExpr *Node);
Chris Lattner17a1a722007-08-30 01:00:35 +0000150 void VisitDeclRefExpr(DeclRefExpr *Node);
Chris Lattnerd9f69102008-08-10 01:53:14 +0000151 void VisitPredefinedExpr(PredefinedExpr *Node);
Chris Lattner17a1a722007-08-30 01:00:35 +0000152 void VisitCharacterLiteral(CharacterLiteral *Node);
153 void VisitIntegerLiteral(IntegerLiteral *Node);
154 void VisitFloatingLiteral(FloatingLiteral *Node);
155 void VisitStringLiteral(StringLiteral *Str);
156 void VisitUnaryOperator(UnaryOperator *Node);
Peter Collingbournef4e3cfb2011-03-11 19:24:49 +0000157 void VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *Node);
Chris Lattner17a1a722007-08-30 01:00:35 +0000158 void VisitMemberExpr(MemberExpr *Node);
Nate Begeman213541a2008-04-18 23:10:10 +0000159 void VisitExtVectorElementExpr(ExtVectorElementExpr *Node);
Chris Lattner17a1a722007-08-30 01:00:35 +0000160 void VisitBinaryOperator(BinaryOperator *Node);
161 void VisitCompoundAssignOperator(CompoundAssignOperator *Node);
162 void VisitAddrLabelExpr(AddrLabelExpr *Node);
John McCall6b5a61b2011-02-07 10:33:21 +0000163 void VisitBlockExpr(BlockExpr *Node);
John McCall4b9c2d22011-11-06 09:01:30 +0000164 void VisitOpaqueValueExpr(OpaqueValueExpr *Node);
Chris Lattner17a1a722007-08-30 01:00:35 +0000165
166 // C++
Douglas Gregor49badde2008-10-27 19:41:14 +0000167 void VisitCXXNamedCastExpr(CXXNamedCastExpr *Node);
Chris Lattner17a1a722007-08-30 01:00:35 +0000168 void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node);
Douglas Gregorcd9b46e2008-11-04 14:56:14 +0000169 void VisitCXXThisExpr(CXXThisExpr *Node);
Douglas Gregor49badde2008-10-27 19:41:14 +0000170 void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node);
Anders Carlsson0eca1b62009-08-12 00:21:52 +0000171 void VisitCXXConstructExpr(CXXConstructExpr *Node);
172 void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node);
John McCall4765fa02010-12-06 08:20:24 +0000173 void VisitExprWithCleanups(ExprWithCleanups *Node);
John McCall9d5f35e2009-12-11 21:50:11 +0000174 void VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node);
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000175 void dumpCXXTemporary(CXXTemporary *Temporary);
Mike Stump1eb44332009-09-09 15:08:12 +0000176
Chris Lattner17a1a722007-08-30 01:00:35 +0000177 // ObjC
Douglas Gregor8f5e3dd2010-04-23 22:50:49 +0000178 void VisitObjCAtCatchStmt(ObjCAtCatchStmt *Node);
Chris Lattner17a1a722007-08-30 01:00:35 +0000179 void VisitObjCEncodeExpr(ObjCEncodeExpr *Node);
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000180 void VisitObjCMessageExpr(ObjCMessageExpr *Node);
181 void VisitObjCBoxedExpr(ObjCBoxedExpr *Node);
Fariborz Jahanianb62f6812007-10-16 20:40:23 +0000182 void VisitObjCSelectorExpr(ObjCSelectorExpr *Node);
Fariborz Jahanian390d50a2007-10-17 16:58:11 +0000183 void VisitObjCProtocolExpr(ObjCProtocolExpr *Node);
Daniel Dunbar7f8ea5c2008-08-30 05:35:15 +0000184 void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node);
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000185 void VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *Node);
Steve Naroff3c64d9e2008-03-12 13:19:12 +0000186 void VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node);
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000187 void VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *Node);
Chris Lattner6000dac2007-08-08 22:51:59 +0000188 };
189}
190
191//===----------------------------------------------------------------------===//
Chris Lattnere300c872007-08-30 06:17:34 +0000192// Utilities
193//===----------------------------------------------------------------------===//
194
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000195void ASTDumper::indent() {
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000196 if (IsFirstLine)
197 IsFirstLine = false;
198 else
199 OS << "\n";
200 OS.indent(IndentLevel * 2);
201 OS << "(";
202 IndentLevel++;
203}
204
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000205void ASTDumper::unindent() {
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000206 OS << ")";
207 IndentLevel--;
208}
209
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000210void ASTDumper::dumpPointer(const void *Ptr) {
211 OS << ' ' << Ptr;
212}
213
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000214void ASTDumper::dumpLocation(SourceLocation Loc) {
Chris Lattnerdf7c17a2009-01-16 07:00:02 +0000215 SourceLocation SpellingLoc = SM->getSpellingLoc(Loc);
Mike Stump1eb44332009-09-09 15:08:12 +0000216
Chris Lattnere300c872007-08-30 06:17:34 +0000217 // The general format we print out is filename:line:col, but we drop pieces
218 // that haven't changed since the last loc printed.
Chris Lattnerb9c3f962009-01-27 07:57:44 +0000219 PresumedLoc PLoc = SM->getPresumedLoc(SpellingLoc);
220
Douglas Gregorcb7b1e12010-11-12 07:15:47 +0000221 if (PLoc.isInvalid()) {
222 OS << "<invalid sloc>";
223 return;
224 }
225
Chris Lattnerb9c3f962009-01-27 07:57:44 +0000226 if (strcmp(PLoc.getFilename(), LastLocFilename) != 0) {
Daniel Dunbar806c12e2009-12-03 09:13:13 +0000227 OS << PLoc.getFilename() << ':' << PLoc.getLine()
228 << ':' << PLoc.getColumn();
Chris Lattnerb9c3f962009-01-27 07:57:44 +0000229 LastLocFilename = PLoc.getFilename();
230 LastLocLine = PLoc.getLine();
231 } else if (PLoc.getLine() != LastLocLine) {
Daniel Dunbar806c12e2009-12-03 09:13:13 +0000232 OS << "line" << ':' << PLoc.getLine()
233 << ':' << PLoc.getColumn();
Chris Lattnerb9c3f962009-01-27 07:57:44 +0000234 LastLocLine = PLoc.getLine();
Chris Lattnere300c872007-08-30 06:17:34 +0000235 } else {
Daniel Dunbar806c12e2009-12-03 09:13:13 +0000236 OS << "col" << ':' << PLoc.getColumn();
Chris Lattnere300c872007-08-30 06:17:34 +0000237 }
238}
239
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000240void ASTDumper::dumpSourceRange(SourceRange R) {
Chris Lattnere300c872007-08-30 06:17:34 +0000241 // Can't translate locations if a SourceManager isn't available.
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000242 if (!SM)
243 return;
Mike Stump1eb44332009-09-09 15:08:12 +0000244
Daniel Dunbar806c12e2009-12-03 09:13:13 +0000245 OS << " <";
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000246 dumpLocation(R.getBegin());
Chris Lattner311ff022007-10-16 22:36:42 +0000247 if (R.getBegin() != R.getEnd()) {
Daniel Dunbar806c12e2009-12-03 09:13:13 +0000248 OS << ", ";
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000249 dumpLocation(R.getEnd());
Chris Lattnere300c872007-08-30 06:17:34 +0000250 }
Daniel Dunbar806c12e2009-12-03 09:13:13 +0000251 OS << ">";
Mike Stump1eb44332009-09-09 15:08:12 +0000252
Chris Lattnere300c872007-08-30 06:17:34 +0000253 // <t2.c:123:421[blah], t2.c:412:321>
254
255}
256
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000257void ASTDumper::dumpBareType(QualType T) {
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000258 SplitQualType T_split = T.split();
259 OS << "'" << QualType::getAsString(T_split) << "'";
260
261 if (!T.isNull()) {
262 // If the type is sugared, also dump a (shallow) desugared type.
263 SplitQualType D_split = T.getSplitDesugaredType();
264 if (T_split != D_split)
265 OS << ":'" << QualType::getAsString(D_split) << "'";
266 }
267}
268
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000269void ASTDumper::dumpType(QualType T) {
270 OS << ' ';
271 dumpBareType(T);
272}
273
274void ASTDumper::dumpBareDeclRef(Decl *D) {
275 OS << D->getDeclKindName();
276 dumpPointer(D);
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000277
278 if (NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
279 OS << " '";
280 ND->getDeclName().printName(OS);
281 OS << "'";
282 }
283
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000284 if (ValueDecl *VD = dyn_cast<ValueDecl>(D))
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000285 dumpType(VD->getType());
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000286}
287
288void ASTDumper::dumpDeclRef(Decl *D, const char *Label) {
289 if (!D)
290 return;
291
292 IndentScope Indent(*this);
293 if (Label)
294 OS << Label << ' ';
295 dumpBareDeclRef(D);
296}
297
298void ASTDumper::dumpName(NamedDecl *ND) {
299 if (ND->getDeclName())
300 OS << ' ' << ND->getNameAsString();
301}
302
303void ASTDumper::dumpDeclContext(DeclContext *DC) {
304 if (!DC)
305 return;
306 for (DeclContext::decl_iterator I = DC->decls_begin(), E = DC->decls_end();
307 I != E; ++I)
308 dumpDecl(*I);
309}
310
311//===----------------------------------------------------------------------===//
312// C++ Utilities
313//===----------------------------------------------------------------------===//
314
315void ASTDumper::dumpAccessSpecifier(AccessSpecifier AS) {
316 switch (AS) {
317 case AS_none:
318 break;
319 case AS_public:
320 OS << "public";
321 break;
322 case AS_protected:
323 OS << "protected";
324 break;
325 case AS_private:
326 OS << "private";
327 break;
328 }
329}
330
331void ASTDumper::dumpCXXCtorInitializer(CXXCtorInitializer *Init) {
332 IndentScope Indent(*this);
333 OS << "CXXCtorInitializer";
334 if (Init->isAnyMemberInitializer()) {
335 OS << ' ';
336 dumpBareDeclRef(Init->getAnyMember());
337 } else {
338 dumpType(QualType(Init->getBaseClass(), 0));
339 }
340 dumpStmt(Init->getInit());
341}
342
343void ASTDumper::dumpTemplateParameters(TemplateParameterList *TPL) {
344 if (!TPL)
345 return;
346
347 for (TemplateParameterList::iterator I = TPL->begin(), E = TPL->end();
348 I != E; ++I)
349 dumpDecl(*I);
350}
351
352void ASTDumper::dumpTemplateArgumentListInfo(
353 const TemplateArgumentListInfo &TALI) {
354 for (unsigned i = 0, e = TALI.size(); i < e; ++i)
355 dumpTemplateArgumentLoc(TALI[i]);
356}
357
358void ASTDumper::dumpTemplateArgumentLoc(const TemplateArgumentLoc &A) {
359 dumpTemplateArgument(A.getArgument(), A.getSourceRange());
360}
361
362void ASTDumper::dumpTemplateArgumentList(const TemplateArgumentList &TAL) {
363 for (unsigned i = 0, e = TAL.size(); i < e; ++i)
364 dumpTemplateArgument(TAL[i]);
365}
366
367void ASTDumper::dumpTemplateArgument(const TemplateArgument &A, SourceRange R) {
368 IndentScope Indent(*this);
369 OS << "TemplateArgument";
370 if (R.isValid())
371 dumpSourceRange(R);
372
373 switch (A.getKind()) {
374 case TemplateArgument::Null:
375 OS << " null";
376 break;
377 case TemplateArgument::Type:
378 OS << " type";
379 dumpType(A.getAsType());
380 break;
381 case TemplateArgument::Declaration:
382 OS << " decl";
383 dumpDeclRef(A.getAsDecl());
384 break;
385 case TemplateArgument::NullPtr:
386 OS << " nullptr";
387 break;
388 case TemplateArgument::Integral:
389 OS << " integral";
390 OS << ' ' << A.getAsIntegral();
391 break;
392 case TemplateArgument::Template:
393 OS << " template ";
394 A.getAsTemplate().dump(OS);
395 break;
396 case TemplateArgument::TemplateExpansion:
397 OS << " template expansion";
398 A.getAsTemplateOrTemplatePattern().dump(OS);
399 break;
400 case TemplateArgument::Expression:
401 OS << " expr";
402 dumpStmt(A.getAsExpr());
403 break;
404 case TemplateArgument::Pack:
405 OS << " pack";
406 for (TemplateArgument::pack_iterator I = A.pack_begin(), E = A.pack_end();
407 I != E; ++I)
408 dumpTemplateArgument(*I);
409 break;
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000410 }
411}
412
Chris Lattnere300c872007-08-30 06:17:34 +0000413//===----------------------------------------------------------------------===//
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000414// Decl dumping methods.
Chris Lattner6000dac2007-08-08 22:51:59 +0000415//===----------------------------------------------------------------------===//
416
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000417void ASTDumper::dumpDecl(Decl *D) {
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000418 IndentScope Indent(*this);
Mike Stump1eb44332009-09-09 15:08:12 +0000419
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000420 if (!D) {
421 OS << "<<<NULL>>>";
422 return;
Chris Lattner6000dac2007-08-08 22:51:59 +0000423 }
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000424
425 OS << D->getDeclKindName() << "Decl";
426 dumpPointer(D);
427 dumpSourceRange(D->getSourceRange());
428 DeclVisitor<ASTDumper>::Visit(D);
429 // Decls within functions are visited by the body
430 if (!isa<FunctionDecl>(*D) && !isa<ObjCMethodDecl>(*D))
431 dumpDeclContext(dyn_cast<DeclContext>(D));
432}
433
434void ASTDumper::VisitLabelDecl(LabelDecl *D) {
435 dumpName(D);
436}
437
438void ASTDumper::VisitTypedefDecl(TypedefDecl *D) {
439 dumpName(D);
440 dumpType(D->getUnderlyingType());
441 if (D->isModulePrivate())
442 OS << " __module_private__";
443}
444
445void ASTDumper::VisitEnumDecl(EnumDecl *D) {
446 if (D->isScoped()) {
447 if (D->isScopedUsingClassTag())
448 OS << " class";
449 else
450 OS << " struct";
451 }
452 dumpName(D);
453 if (D->isModulePrivate())
454 OS << " __module_private__";
455 if (D->isFixed())
456 dumpType(D->getIntegerType());
457}
458
459void ASTDumper::VisitRecordDecl(RecordDecl *D) {
460 OS << ' ' << D->getKindName();
461 dumpName(D);
462 if (D->isModulePrivate())
463 OS << " __module_private__";
464}
465
466void ASTDumper::VisitEnumConstantDecl(EnumConstantDecl *D) {
467 dumpName(D);
468 dumpType(D->getType());
469 if (Expr *Init = D->getInitExpr())
470 dumpStmt(Init);
471}
472
473void ASTDumper::VisitIndirectFieldDecl(IndirectFieldDecl *D) {
474 dumpName(D);
475 dumpType(D->getType());
476 for (IndirectFieldDecl::chain_iterator I = D->chain_begin(),
477 E = D->chain_end(); I != E; ++I)
478 dumpDeclRef(*I);
479}
480
481void ASTDumper::VisitFunctionDecl(FunctionDecl *D) {
482 dumpName(D);
483 dumpType(D->getType());
484
485 StorageClass SC = D->getStorageClassAsWritten();
486 if (SC != SC_None)
487 OS << ' ' << VarDecl::getStorageClassSpecifierString(SC);
488 if (D->isInlineSpecified())
489 OS << " inline";
490 if (D->isVirtualAsWritten())
491 OS << " virtual";
492 if (D->isModulePrivate())
493 OS << " __module_private__";
494
495 if (D->isPure())
496 OS << " pure";
497 else if (D->isDeletedAsWritten())
498 OS << " delete";
499
500 if (const FunctionTemplateSpecializationInfo *FTSI =
501 D->getTemplateSpecializationInfo())
502 dumpTemplateArgumentList(*FTSI->TemplateArguments);
503
504 for (llvm::ArrayRef<NamedDecl*>::iterator
505 I = D->getDeclsInPrototypeScope().begin(),
506 E = D->getDeclsInPrototypeScope().end(); I != E; ++I)
507 dumpDecl(*I);
508
509 for (FunctionDecl::param_iterator I = D->param_begin(), E = D->param_end();
510 I != E; ++I)
511 dumpDecl(*I);
512
513 if (CXXConstructorDecl *C = dyn_cast<CXXConstructorDecl>(D))
514 for (CXXConstructorDecl::init_const_iterator I = C->init_begin(),
515 E = C->init_end(); I != E; ++I)
516 dumpCXXCtorInitializer(*I);
517
518 if (D->doesThisDeclarationHaveABody())
519 dumpStmt(D->getBody());
520}
521
522void ASTDumper::VisitFieldDecl(FieldDecl *D) {
523 dumpName(D);
524 dumpType(D->getType());
525 if (D->isMutable())
526 OS << " mutable";
527 if (D->isModulePrivate())
528 OS << " __module_private__";
529 if (D->isBitField())
530 dumpStmt(D->getBitWidth());
531 if (Expr *Init = D->getInClassInitializer())
532 dumpStmt(Init);
533}
534
535void ASTDumper::VisitVarDecl(VarDecl *D) {
536 dumpName(D);
537 dumpType(D->getType());
538 StorageClass SC = D->getStorageClassAsWritten();
539 if (SC != SC_None)
540 OS << ' ' << VarDecl::getStorageClassSpecifierString(SC);
541 if (D->isThreadSpecified())
542 OS << " __thread";
543 if (D->isModulePrivate())
544 OS << " __module_private__";
545 if (D->isNRVOVariable())
546 OS << " nrvo";
547 if (D->hasInit())
548 dumpStmt(D->getInit());
549}
550
551void ASTDumper::VisitFileScopeAsmDecl(FileScopeAsmDecl *D) {
552 dumpStmt(D->getAsmString());
553}
554
555void ASTDumper::VisitImportDecl(ImportDecl *D) {
556 OS << ' ' << D->getImportedModule()->getFullModuleName();
557}
558
559//===----------------------------------------------------------------------===//
560// C++ Declarations
561//===----------------------------------------------------------------------===//
562
563void ASTDumper::VisitNamespaceDecl(NamespaceDecl *D) {
564 dumpName(D);
565 if (D->isInline())
566 OS << " inline";
567 if (!D->isOriginalNamespace())
568 dumpDeclRef(D->getOriginalNamespace(), "original");
569}
570
571void ASTDumper::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
572 OS << ' ';
573 dumpBareDeclRef(D->getNominatedNamespace());
574}
575
576void ASTDumper::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
577 dumpName(D);
578 dumpDeclRef(D->getAliasedNamespace());
579}
580
581void ASTDumper::VisitTypeAliasDecl(TypeAliasDecl *D) {
582 dumpName(D);
583 dumpType(D->getUnderlyingType());
584}
585
586void ASTDumper::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {
587 dumpName(D);
588 dumpTemplateParameters(D->getTemplateParameters());
589 dumpDecl(D->getTemplatedDecl());
590}
591
592void ASTDumper::VisitCXXRecordDecl(CXXRecordDecl *D) {
593 VisitRecordDecl(D);
594 if (!D->isCompleteDefinition())
595 return;
596
597 for (CXXRecordDecl::base_class_iterator I = D->bases_begin(),
598 E = D->bases_end(); I != E; ++I) {
599 IndentScope Indent(*this);
600 if (I->isVirtual())
601 OS << "virtual ";
602 dumpAccessSpecifier(I->getAccessSpecifier());
603 dumpType(I->getType());
604 if (I->isPackExpansion())
605 OS << "...";
606 }
607}
608
609void ASTDumper::VisitStaticAssertDecl(StaticAssertDecl *D) {
610 dumpStmt(D->getAssertExpr());
611 dumpStmt(D->getMessage());
612}
613
614void ASTDumper::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
615 dumpName(D);
616 dumpTemplateParameters(D->getTemplateParameters());
617 dumpDecl(D->getTemplatedDecl());
618 for (FunctionTemplateDecl::spec_iterator I = D->spec_begin(),
619 E = D->spec_end(); I != E; ++I) {
620 switch (I->getTemplateSpecializationKind()) {
621 case TSK_Undeclared:
622 case TSK_ImplicitInstantiation:
623 case TSK_ExplicitInstantiationDeclaration:
624 case TSK_ExplicitInstantiationDefinition:
625 dumpDecl(*I);
626 break;
627 case TSK_ExplicitSpecialization:
628 dumpDeclRef(*I);
629 break;
630 }
631 }
632}
633
634void ASTDumper::VisitClassTemplateDecl(ClassTemplateDecl *D) {
635 dumpName(D);
636 dumpTemplateParameters(D->getTemplateParameters());
637 dumpDecl(D->getTemplatedDecl());
638 for (ClassTemplateDecl::spec_iterator I = D->spec_begin(), E = D->spec_end();
639 I != E; ++I) {
640 switch (I->getTemplateSpecializationKind()) {
641 case TSK_Undeclared:
642 case TSK_ImplicitInstantiation:
643 dumpDecl(*I);
644 break;
645 case TSK_ExplicitSpecialization:
646 case TSK_ExplicitInstantiationDeclaration:
647 case TSK_ExplicitInstantiationDefinition:
648 dumpDeclRef(*I);
649 break;
650 }
651 }
652}
653
654void ASTDumper::VisitClassTemplateSpecializationDecl(
655 ClassTemplateSpecializationDecl *D) {
656 VisitCXXRecordDecl(D);
657 dumpTemplateArgumentList(D->getTemplateArgs());
658}
659
660void ASTDumper::VisitClassTemplatePartialSpecializationDecl(
661 ClassTemplatePartialSpecializationDecl *D) {
662 VisitClassTemplateSpecializationDecl(D);
663 dumpTemplateParameters(D->getTemplateParameters());
664}
665
666void ASTDumper::VisitClassScopeFunctionSpecializationDecl(
667 ClassScopeFunctionSpecializationDecl *D) {
668 dumpDeclRef(D->getSpecialization());
669 if (D->hasExplicitTemplateArgs())
670 dumpTemplateArgumentListInfo(D->templateArgs());
671}
672
673void ASTDumper::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
674 if (D->wasDeclaredWithTypename())
675 OS << " typename";
676 else
677 OS << " class";
678 if (D->isParameterPack())
679 OS << " ...";
680 dumpName(D);
681 if (D->hasDefaultArgument())
682 dumpType(D->getDefaultArgument());
683}
684
685void ASTDumper::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
686 dumpType(D->getType());
687 if (D->isParameterPack())
688 OS << " ...";
689 dumpName(D);
690 if (D->hasDefaultArgument())
691 dumpStmt(D->getDefaultArgument());
692}
693
694void ASTDumper::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
695 if (D->isParameterPack())
696 OS << " ...";
697 dumpName(D);
698 dumpTemplateParameters(D->getTemplateParameters());
699 if (D->hasDefaultArgument())
700 dumpTemplateArgumentLoc(D->getDefaultArgument());
701}
702
703void ASTDumper::VisitUsingDecl(UsingDecl *D) {
704 OS << ' ';
705 D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
706 OS << D->getNameAsString();
707}
708
709void
710ASTDumper::VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D) {
711 OS << ' ';
712 D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
713 OS << D->getNameAsString();
714}
715
716void ASTDumper::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {
717 OS << ' ';
718 D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
719 OS << D->getNameAsString();
720 dumpType(D->getType());
721}
722
723void ASTDumper::VisitUsingShadowDecl(UsingShadowDecl *D) {
724 OS << ' ';
725 dumpBareDeclRef(D->getTargetDecl());
726}
727
728void ASTDumper::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
729 switch (D->getLanguage()) {
730 case LinkageSpecDecl::lang_c: OS << " C"; break;
731 case LinkageSpecDecl::lang_cxx: OS << " C++"; break;
732 }
733}
734
735void ASTDumper::VisitAccessSpecDecl(AccessSpecDecl *D) {
736 OS << ' ';
737 dumpAccessSpecifier(D->getAccess());
738}
739
740void ASTDumper::VisitFriendDecl(FriendDecl *D) {
741 if (TypeSourceInfo *T = D->getFriendType())
742 dumpType(T->getType());
743 else
744 dumpDecl(D->getFriendDecl());
745}
746
747//===----------------------------------------------------------------------===//
748// Obj-C Declarations
749//===----------------------------------------------------------------------===//
750
751void ASTDumper::VisitObjCIvarDecl(ObjCIvarDecl *D) {
752 dumpName(D);
753 dumpType(D->getType());
754 if (D->getSynthesize())
755 OS << " synthesize";
756
757 switch (D->getAccessControl()) {
758 case ObjCIvarDecl::None:
759 OS << " none";
760 break;
761 case ObjCIvarDecl::Private:
762 OS << " private";
763 break;
764 case ObjCIvarDecl::Protected:
765 OS << " protected";
766 break;
767 case ObjCIvarDecl::Public:
768 OS << " public";
769 break;
770 case ObjCIvarDecl::Package:
771 OS << " package";
772 break;
773 }
774}
775
776void ASTDumper::VisitObjCMethodDecl(ObjCMethodDecl *D) {
777 if (D->isInstanceMethod())
778 OS << " -";
779 else
780 OS << " +";
781 dumpName(D);
782 dumpType(D->getResultType());
783
784 if (D->isThisDeclarationADefinition())
785 dumpDeclContext(D);
786 else {
787 for (ObjCMethodDecl::param_iterator I = D->param_begin(),
788 E = D->param_end(); I != E; ++I) {
789 dumpDecl(*I);
790 }
791 }
792
793 if (D->isVariadic()) {
794 IndentScope Indent(*this);
795 OS << "...";
796 }
797
798 if (D->hasBody())
799 dumpStmt(D->getBody());
800}
801
802void ASTDumper::VisitObjCCategoryDecl(ObjCCategoryDecl *D) {
803 dumpName(D);
804 dumpDeclRef(D->getClassInterface());
805 dumpDeclRef(D->getImplementation());
806 for (ObjCCategoryDecl::protocol_iterator I = D->protocol_begin(),
807 E = D->protocol_end(); I != E; ++I)
808 dumpDeclRef(*I);
809}
810
811void ASTDumper::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
812 dumpName(D);
813 dumpDeclRef(D->getClassInterface());
814 dumpDeclRef(D->getCategoryDecl());
815}
816
817void ASTDumper::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
818 dumpName(D);
819 for (ObjCProtocolDecl::protocol_iterator I = D->protocol_begin(),
820 E = D->protocol_end(); I != E; ++I)
821 dumpDeclRef(*I);
822}
823
824void ASTDumper::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
825 dumpName(D);
826 dumpDeclRef(D->getSuperClass(), "super");
827 dumpDeclRef(D->getImplementation());
828 for (ObjCInterfaceDecl::protocol_iterator I = D->protocol_begin(),
829 E = D->protocol_end(); I != E; ++I)
830 dumpDeclRef(*I);
831}
832
833void ASTDumper::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
834 dumpName(D);
835 dumpDeclRef(D->getSuperClass(), "super");
836 dumpDeclRef(D->getClassInterface());
837 for (ObjCImplementationDecl::init_iterator I = D->init_begin(),
838 E = D->init_end(); I != E; ++I)
839 dumpCXXCtorInitializer(*I);
840}
841
842void ASTDumper::VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D) {
843 dumpName(D);
844 dumpDeclRef(D->getClassInterface());
845}
846
847void ASTDumper::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
848 dumpName(D);
849 dumpType(D->getType());
850
851 if (D->getPropertyImplementation() == ObjCPropertyDecl::Required)
852 OS << " required";
853 else if (D->getPropertyImplementation() == ObjCPropertyDecl::Optional)
854 OS << " optional";
855
856 ObjCPropertyDecl::PropertyAttributeKind Attrs = D->getPropertyAttributes();
857 if (Attrs != ObjCPropertyDecl::OBJC_PR_noattr) {
858 if (Attrs & ObjCPropertyDecl::OBJC_PR_readonly)
859 OS << " readonly";
860 if (Attrs & ObjCPropertyDecl::OBJC_PR_assign)
861 OS << " assign";
862 if (Attrs & ObjCPropertyDecl::OBJC_PR_readwrite)
863 OS << " readwrite";
864 if (Attrs & ObjCPropertyDecl::OBJC_PR_retain)
865 OS << " retain";
866 if (Attrs & ObjCPropertyDecl::OBJC_PR_copy)
867 OS << " copy";
868 if (Attrs & ObjCPropertyDecl::OBJC_PR_nonatomic)
869 OS << " nonatomic";
870 if (Attrs & ObjCPropertyDecl::OBJC_PR_atomic)
871 OS << " atomic";
872 if (Attrs & ObjCPropertyDecl::OBJC_PR_weak)
873 OS << " weak";
874 if (Attrs & ObjCPropertyDecl::OBJC_PR_strong)
875 OS << " strong";
876 if (Attrs & ObjCPropertyDecl::OBJC_PR_unsafe_unretained)
877 OS << " unsafe_unretained";
878 if (Attrs & ObjCPropertyDecl::OBJC_PR_getter)
879 dumpDeclRef(D->getGetterMethodDecl(), "getter");
880 if (Attrs & ObjCPropertyDecl::OBJC_PR_setter)
881 dumpDeclRef(D->getSetterMethodDecl(), "setter");
882 }
883}
884
885void ASTDumper::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
886 dumpName(D->getPropertyDecl());
887 if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize)
888 OS << " synthesize";
889 else
890 OS << " dynamic";
891 dumpDeclRef(D->getPropertyDecl());
892 dumpDeclRef(D->getPropertyIvarDecl());
893}
894
895void ASTDumper::VisitBlockDecl(BlockDecl *D) {
896 for (BlockDecl::param_iterator I = D->param_begin(), E = D->param_end();
897 I != E; ++I)
898 dumpDecl(*I);
899
900 if (D->isVariadic()) {
901 IndentScope Indent(*this);
902 OS << "...";
903 }
904
905 if (D->capturesCXXThis()) {
906 IndentScope Indent(*this);
907 OS << "capture this";
908 }
909 for (BlockDecl::capture_iterator I = D->capture_begin(),
910 E = D->capture_end(); I != E; ++I) {
911 IndentScope Indent(*this);
912 OS << "capture";
913 if (I->isByRef())
914 OS << " byref";
915 if (I->isNested())
916 OS << " nested";
917 if (I->getVariable()) {
918 OS << ' ';
919 dumpBareDeclRef(I->getVariable());
920 }
921 if (I->hasCopyExpr())
922 dumpStmt(I->getCopyExpr());
923 }
924
925 dumpStmt(D->getBody());
Chris Lattner6000dac2007-08-08 22:51:59 +0000926}
927
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000928//===----------------------------------------------------------------------===//
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000929// Stmt dumping methods.
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000930//===----------------------------------------------------------------------===//
931
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000932void ASTDumper::dumpStmt(Stmt *S) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000933 IndentScope Indent(*this);
934
935 if (!S) {
936 OS << "<<<NULL>>>";
937 return;
938 }
939
940 if (DeclStmt *DS = dyn_cast<DeclStmt>(S)) {
941 VisitDeclStmt(DS);
942 return;
943 }
944
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000945 StmtVisitor<ASTDumper>::Visit(S);
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000946 for (Stmt::child_range CI = S->children(); CI; ++CI)
947 dumpStmt(*CI);
948}
949
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000950void ASTDumper::VisitStmt(Stmt *Node) {
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000951 OS << Node->getStmtClassName();
952 dumpPointer(Node);
953 dumpSourceRange(Node->getSourceRange());
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000954}
955
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000956void ASTDumper::VisitDeclStmt(DeclStmt *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000957 VisitStmt(Node);
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000958 for (DeclStmt::decl_iterator I = Node->decl_begin(), E = Node->decl_end();
959 I != E; ++I)
960 dumpDecl(*I);
Ted Kremenek5399ce22007-12-12 06:59:42 +0000961}
962
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000963void ASTDumper::VisitLabelStmt(LabelStmt *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000964 VisitStmt(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +0000965 OS << " '" << Node->getName() << "'";
Chris Lattner6000dac2007-08-08 22:51:59 +0000966}
967
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000968void ASTDumper::VisitGotoStmt(GotoStmt *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000969 VisitStmt(Node);
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000970 OS << " '" << Node->getLabel()->getName() << "'";
971 dumpPointer(Node->getLabel());
Chris Lattner6000dac2007-08-08 22:51:59 +0000972}
973
Chris Lattner6000dac2007-08-08 22:51:59 +0000974//===----------------------------------------------------------------------===//
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000975// Expr dumping methods.
Chris Lattner6000dac2007-08-08 22:51:59 +0000976//===----------------------------------------------------------------------===//
977
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000978void ASTDumper::VisitExpr(Expr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000979 VisitStmt(Node);
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000980 dumpType(Node->getType());
981
982 switch (Node->getValueKind()) {
983 case VK_RValue:
984 break;
985 case VK_LValue:
986 OS << " lvalue";
987 break;
988 case VK_XValue:
989 OS << " xvalue";
990 break;
991 }
992
993 switch (Node->getObjectKind()) {
994 case OK_Ordinary:
995 break;
996 case OK_BitField:
997 OS << " bitfield";
998 break;
999 case OK_ObjCProperty:
1000 OS << " objcproperty";
1001 break;
1002 case OK_ObjCSubscript:
1003 OS << " objcsubscript";
1004 break;
1005 case OK_VectorComponent:
1006 OS << " vectorcomponent";
1007 break;
1008 }
Chris Lattner6000dac2007-08-08 22:51:59 +00001009}
1010
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001011static void dumpBasePath(raw_ostream &OS, CastExpr *Node) {
John McCallf871d0c2010-08-07 06:22:56 +00001012 if (Node->path_empty())
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001013 return;
1014
1015 OS << " (";
1016 bool First = true;
John McCallf871d0c2010-08-07 06:22:56 +00001017 for (CastExpr::path_iterator
1018 I = Node->path_begin(), E = Node->path_end(); I != E; ++I) {
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001019 const CXXBaseSpecifier *Base = *I;
1020 if (!First)
1021 OS << " -> ";
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001022
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001023 const CXXRecordDecl *RD =
1024 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001025
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001026 if (Base->isVirtual())
1027 OS << "virtual ";
1028 OS << RD->getName();
1029 First = false;
1030 }
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001031
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001032 OS << ')';
1033}
1034
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001035void ASTDumper::VisitCastExpr(CastExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001036 VisitExpr(Node);
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001037 OS << " <" << Node->getCastKindName();
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001038 dumpBasePath(OS, Node);
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001039 OS << ">";
Anders Carlsson27a5b9b2009-08-22 23:33:40 +00001040}
1041
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001042void ASTDumper::VisitDeclRefExpr(DeclRefExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001043 VisitExpr(Node);
Ted Kremenekeb641f92007-09-10 17:32:55 +00001044
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001045 OS << " ";
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001046 dumpBareDeclRef(Node->getDecl());
Chandler Carruth3aa81402011-05-01 23:48:14 +00001047 if (Node->getDecl() != Node->getFoundDecl()) {
1048 OS << " (";
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001049 dumpBareDeclRef(Node->getFoundDecl());
Chandler Carruth3aa81402011-05-01 23:48:14 +00001050 OS << ")";
1051 }
John McCall6b5a61b2011-02-07 10:33:21 +00001052}
1053
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001054void ASTDumper::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001055 VisitExpr(Node);
John McCall9d5f35e2009-12-11 21:50:11 +00001056 OS << " (";
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001057 if (!Node->requiresADL())
1058 OS << "no ";
Benjamin Kramer900fc632010-04-17 09:33:03 +00001059 OS << "ADL) = '" << Node->getName() << '\'';
John McCall9d5f35e2009-12-11 21:50:11 +00001060
1061 UnresolvedLookupExpr::decls_iterator
1062 I = Node->decls_begin(), E = Node->decls_end();
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001063 if (I == E)
1064 OS << " empty";
John McCall9d5f35e2009-12-11 21:50:11 +00001065 for (; I != E; ++I)
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001066 dumpPointer(*I);
John McCall9d5f35e2009-12-11 21:50:11 +00001067}
1068
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001069void ASTDumper::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001070 VisitExpr(Node);
Steve Naroff3c64d9e2008-03-12 13:19:12 +00001071
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001072 OS << " " << Node->getDecl()->getDeclKindName()
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001073 << "Decl='" << *Node->getDecl() << "'";
1074 dumpPointer(Node->getDecl());
Steve Naroff218543b2008-05-23 22:01:24 +00001075 if (Node->isFreeIvar())
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001076 OS << " isFreeIvar";
Steve Naroff3c64d9e2008-03-12 13:19:12 +00001077}
1078
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001079void ASTDumper::VisitPredefinedExpr(PredefinedExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001080 VisitExpr(Node);
Chris Lattner6000dac2007-08-08 22:51:59 +00001081 switch (Node->getIdentType()) {
David Blaikieb219cfc2011-09-23 05:06:16 +00001082 default: llvm_unreachable("unknown case");
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001083 case PredefinedExpr::Func: OS << " __func__"; break;
1084 case PredefinedExpr::Function: OS << " __FUNCTION__"; break;
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001085 case PredefinedExpr::LFunction: OS << " L__FUNCTION__"; break;
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001086 case PredefinedExpr::PrettyFunction: OS << " __PRETTY_FUNCTION__";break;
Chris Lattner6000dac2007-08-08 22:51:59 +00001087 }
1088}
1089
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001090void ASTDumper::VisitCharacterLiteral(CharacterLiteral *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001091 VisitExpr(Node);
Richard Trieu49cf8842011-11-03 23:56:23 +00001092 OS << " " << Node->getValue();
Chris Lattner6000dac2007-08-08 22:51:59 +00001093}
1094
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001095void ASTDumper::VisitIntegerLiteral(IntegerLiteral *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001096 VisitExpr(Node);
Chris Lattner6000dac2007-08-08 22:51:59 +00001097
1098 bool isSigned = Node->getType()->isSignedIntegerType();
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001099 OS << " " << Node->getValue().toString(10, isSigned);
Chris Lattner6000dac2007-08-08 22:51:59 +00001100}
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001101
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001102void ASTDumper::VisitFloatingLiteral(FloatingLiteral *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001103 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001104 OS << " " << Node->getValueAsApproximateDouble();
Chris Lattner6000dac2007-08-08 22:51:59 +00001105}
Chris Lattner5d661452007-08-26 03:42:43 +00001106
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001107void ASTDumper::VisitStringLiteral(StringLiteral *Str) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001108 VisitExpr(Str);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001109 OS << " ";
Richard Trieu8ab09da2012-06-13 20:25:24 +00001110 Str->outputString(OS);
Chris Lattner6000dac2007-08-08 22:51:59 +00001111}
Chris Lattner17a1a722007-08-30 01:00:35 +00001112
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001113void ASTDumper::VisitUnaryOperator(UnaryOperator *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001114 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001115 OS << " " << (Node->isPostfix() ? "postfix" : "prefix")
1116 << " '" << UnaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
Chris Lattner6000dac2007-08-08 22:51:59 +00001117}
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001118
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001119void ASTDumper::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001120 VisitExpr(Node);
Peter Collingbournef4e3cfb2011-03-11 19:24:49 +00001121 switch(Node->getKind()) {
1122 case UETT_SizeOf:
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001123 OS << " sizeof";
Peter Collingbournef4e3cfb2011-03-11 19:24:49 +00001124 break;
1125 case UETT_AlignOf:
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001126 OS << " alignof";
Peter Collingbournef4e3cfb2011-03-11 19:24:49 +00001127 break;
1128 case UETT_VecStep:
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001129 OS << " vec_step";
Peter Collingbournef4e3cfb2011-03-11 19:24:49 +00001130 break;
1131 }
Sebastian Redl05189992008-11-11 17:56:53 +00001132 if (Node->isArgumentType())
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001133 dumpType(Node->getArgumentType());
Chris Lattner6000dac2007-08-08 22:51:59 +00001134}
Chris Lattner13cb21f2007-08-09 17:35:30 +00001135
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001136void ASTDumper::VisitMemberExpr(MemberExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001137 VisitExpr(Node);
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001138 OS << " " << (Node->isArrow() ? "->" : ".") << *Node->getMemberDecl();
1139 dumpPointer(Node->getMemberDecl());
Chris Lattner6000dac2007-08-08 22:51:59 +00001140}
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001141
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001142void ASTDumper::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001143 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001144 OS << " " << Node->getAccessor().getNameStart();
Chris Lattner6000dac2007-08-08 22:51:59 +00001145}
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001146
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001147void ASTDumper::VisitBinaryOperator(BinaryOperator *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001148 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001149 OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
Chris Lattnereb14fe82007-08-25 02:00:02 +00001150}
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001151
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001152void ASTDumper::VisitCompoundAssignOperator(CompoundAssignOperator *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001153 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001154 OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode())
1155 << "' ComputeLHSTy=";
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001156 dumpBareType(Node->getComputationLHSType());
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001157 OS << " ComputeResultTy=";
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001158 dumpBareType(Node->getComputationResultType());
Chris Lattner6000dac2007-08-08 22:51:59 +00001159}
Chris Lattner6000dac2007-08-08 22:51:59 +00001160
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001161void ASTDumper::VisitBlockExpr(BlockExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001162 VisitExpr(Node);
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001163 dumpDecl(Node->getBlockDecl());
John McCall6b5a61b2011-02-07 10:33:21 +00001164}
1165
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001166void ASTDumper::VisitOpaqueValueExpr(OpaqueValueExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001167 VisitExpr(Node);
John McCall4b9c2d22011-11-06 09:01:30 +00001168
Manuel Klimekcb7b45e2012-11-07 00:33:12 +00001169 if (Expr *Source = Node->getSourceExpr())
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001170 dumpStmt(Source);
John McCall4b9c2d22011-11-06 09:01:30 +00001171}
1172
Chris Lattner6000dac2007-08-08 22:51:59 +00001173// GNU extensions.
1174
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001175void ASTDumper::VisitAddrLabelExpr(AddrLabelExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001176 VisitExpr(Node);
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001177 OS << " " << Node->getLabel()->getName();
1178 dumpPointer(Node->getLabel());
Chris Lattner6000dac2007-08-08 22:51:59 +00001179}
1180
Chris Lattnerf9e05812007-08-09 18:03:18 +00001181//===----------------------------------------------------------------------===//
1182// C++ Expressions
1183//===----------------------------------------------------------------------===//
Chris Lattner6000dac2007-08-08 22:51:59 +00001184
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001185void ASTDumper::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001186 VisitExpr(Node);
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001187 OS << " " << Node->getCastName()
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001188 << "<" << Node->getTypeAsWritten().getAsString() << ">"
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001189 << " <" << Node->getCastKindName();
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001190 dumpBasePath(OS, Node);
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001191 OS << ">";
Chris Lattner6000dac2007-08-08 22:51:59 +00001192}
1193
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001194void ASTDumper::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001195 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001196 OS << " " << (Node->getValue() ? "true" : "false");
Chris Lattner6000dac2007-08-08 22:51:59 +00001197}
1198
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001199void ASTDumper::VisitCXXThisExpr(CXXThisExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001200 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001201 OS << " this";
Douglas Gregorcd9b46e2008-11-04 14:56:14 +00001202}
1203
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001204void ASTDumper::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001205 VisitExpr(Node);
Eli Friedmancc2fca22011-09-02 17:38:59 +00001206 OS << " functional cast to " << Node->getTypeAsWritten().getAsString()
1207 << " <" << Node->getCastKindName() << ">";
Douglas Gregor49badde2008-10-27 19:41:14 +00001208}
1209
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001210void ASTDumper::VisitCXXConstructExpr(CXXConstructExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001211 VisitExpr(Node);
John McCalld4bbdfe2010-02-02 19:03:45 +00001212 CXXConstructorDecl *Ctor = Node->getConstructor();
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001213 dumpType(Ctor->getType());
Anders Carlsson0eca1b62009-08-12 00:21:52 +00001214 if (Node->isElidable())
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001215 OS << " elidable";
John McCallf8cf0b02010-08-07 06:38:55 +00001216 if (Node->requiresZeroInitialization())
1217 OS << " zeroing";
Anders Carlsson0eca1b62009-08-12 00:21:52 +00001218}
1219
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001220void ASTDumper::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001221 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001222 OS << " ";
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001223 dumpCXXTemporary(Node->getTemporary());
Anders Carlsson0eca1b62009-08-12 00:21:52 +00001224}
1225
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001226void ASTDumper::VisitExprWithCleanups(ExprWithCleanups *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001227 VisitExpr(Node);
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001228 for (unsigned i = 0, e = Node->getNumObjects(); i != e; ++i)
1229 dumpDeclRef(Node->getObject(i), "cleanup");
Anders Carlsson0eca1b62009-08-12 00:21:52 +00001230}
1231
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001232void ASTDumper::dumpCXXTemporary(CXXTemporary *Temporary) {
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001233 OS << "(CXXTemporary";
1234 dumpPointer(Temporary);
1235 OS << ")";
Anders Carlsson0eca1b62009-08-12 00:21:52 +00001236}
1237
Anders Carlsson55085182007-08-21 17:43:55 +00001238//===----------------------------------------------------------------------===//
1239// Obj-C Expressions
1240//===----------------------------------------------------------------------===//
1241
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001242void ASTDumper::VisitObjCMessageExpr(ObjCMessageExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001243 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001244 OS << " selector=" << Node->getSelector().getAsString();
Douglas Gregor04badcf2010-04-21 00:45:42 +00001245 switch (Node->getReceiverKind()) {
1246 case ObjCMessageExpr::Instance:
1247 break;
1248
1249 case ObjCMessageExpr::Class:
1250 OS << " class=";
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001251 dumpBareType(Node->getClassReceiver());
Douglas Gregor04badcf2010-04-21 00:45:42 +00001252 break;
1253
1254 case ObjCMessageExpr::SuperInstance:
1255 OS << " super (instance)";
1256 break;
1257
1258 case ObjCMessageExpr::SuperClass:
1259 OS << " super (class)";
1260 break;
1261 }
Ted Kremenekb3d914b2008-02-29 22:04:05 +00001262}
1263
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001264void ASTDumper::VisitObjCBoxedExpr(ObjCBoxedExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001265 VisitExpr(Node);
Argyrios Kyrtzidis36faadd2012-05-10 20:02:31 +00001266 OS << " selector=" << Node->getBoxingMethod()->getSelector().getAsString();
1267}
1268
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001269void ASTDumper::VisitObjCAtCatchStmt(ObjCAtCatchStmt *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001270 VisitStmt(Node);
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001271 if (VarDecl *CatchParam = Node->getCatchParamDecl())
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001272 dumpDecl(CatchParam);
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001273 else
Douglas Gregor8f5e3dd2010-04-23 22:50:49 +00001274 OS << " catch all";
Douglas Gregor8f5e3dd2010-04-23 22:50:49 +00001275}
1276
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001277void ASTDumper::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001278 VisitExpr(Node);
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001279 dumpType(Node->getEncodedType());
Anders Carlssonf9bcf012007-08-22 15:14:15 +00001280}
1281
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001282void ASTDumper::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001283 VisitExpr(Node);
Mike Stump1eb44332009-09-09 15:08:12 +00001284
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001285 OS << " " << Node->getSelector().getAsString();
Fariborz Jahanianb62f6812007-10-16 20:40:23 +00001286}
1287
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001288void ASTDumper::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001289 VisitExpr(Node);
Mike Stump1eb44332009-09-09 15:08:12 +00001290
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001291 OS << ' ' << *Node->getProtocol();
Fariborz Jahanian390d50a2007-10-17 16:58:11 +00001292}
Daniel Dunbar7f8ea5c2008-08-30 05:35:15 +00001293
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001294void ASTDumper::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001295 VisitExpr(Node);
John McCall12f78a62010-12-02 01:19:52 +00001296 if (Node->isImplicitProperty()) {
Fariborz Jahanian99130e52010-12-22 19:46:35 +00001297 OS << " Kind=MethodRef Getter=\"";
1298 if (Node->getImplicitPropertyGetter())
1299 OS << Node->getImplicitPropertyGetter()->getSelector().getAsString();
1300 else
1301 OS << "(null)";
1302
1303 OS << "\" Setter=\"";
John McCall12f78a62010-12-02 01:19:52 +00001304 if (ObjCMethodDecl *Setter = Node->getImplicitPropertySetter())
1305 OS << Setter->getSelector().getAsString();
1306 else
1307 OS << "(null)";
1308 OS << "\"";
1309 } else {
Benjamin Kramerb8989f22011-10-14 18:45:37 +00001310 OS << " Kind=PropertyRef Property=\"" << *Node->getExplicitProperty() <<'"';
John McCall12f78a62010-12-02 01:19:52 +00001311 }
Fariborz Jahanian5daf5702008-11-22 18:39:36 +00001312
Fariborz Jahanian8ac2d442010-10-14 16:04:05 +00001313 if (Node->isSuperReceiver())
1314 OS << " super";
Argyrios Kyrtzidisb085d892012-03-30 00:19:18 +00001315
1316 OS << " Messaging=";
1317 if (Node->isMessagingGetter() && Node->isMessagingSetter())
1318 OS << "Getter&Setter";
1319 else if (Node->isMessagingGetter())
1320 OS << "Getter";
1321 else if (Node->isMessagingSetter())
1322 OS << "Setter";
Douglas Gregorcd9b46e2008-11-04 14:56:14 +00001323}
1324
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001325void ASTDumper::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001326 VisitExpr(Node);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00001327 if (Node->isArraySubscriptRefExpr())
1328 OS << " Kind=ArraySubscript GetterForArray=\"";
1329 else
1330 OS << " Kind=DictionarySubscript GetterForDictionary=\"";
1331 if (Node->getAtIndexMethodDecl())
1332 OS << Node->getAtIndexMethodDecl()->getSelector().getAsString();
1333 else
1334 OS << "(null)";
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001335
Ted Kremenekebcb57a2012-03-06 20:05:56 +00001336 if (Node->isArraySubscriptRefExpr())
1337 OS << "\" SetterForArray=\"";
1338 else
1339 OS << "\" SetterForDictionary=\"";
1340 if (Node->setAtIndexMethodDecl())
1341 OS << Node->setAtIndexMethodDecl()->getSelector().getAsString();
1342 else
1343 OS << "(null)";
1344}
1345
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001346void ASTDumper::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001347 VisitExpr(Node);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00001348 OS << " " << (Node->getValue() ? "__objc_yes" : "__objc_no");
1349}
1350
Chris Lattner6000dac2007-08-08 22:51:59 +00001351//===----------------------------------------------------------------------===//
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001352// Decl method implementations
1353//===----------------------------------------------------------------------===//
1354
1355void Decl::dump() const {
1356 dump(llvm::errs());
1357}
1358
1359void Decl::dump(raw_ostream &OS) const {
1360 ASTDumper P(&getASTContext().getSourceManager(), OS);
1361 P.dumpDecl(const_cast<Decl*>(this));
1362}
1363
1364//===----------------------------------------------------------------------===//
Chris Lattner6000dac2007-08-08 22:51:59 +00001365// Stmt method implementations
1366//===----------------------------------------------------------------------===//
1367
Chris Lattnere300c872007-08-30 06:17:34 +00001368void Stmt::dump(SourceManager &SM) const {
Argyrios Kyrtzidis96680332010-08-09 10:54:31 +00001369 dump(llvm::errs(), SM);
1370}
1371
Chris Lattner5f9e2722011-07-23 10:55:15 +00001372void Stmt::dump(raw_ostream &OS, SourceManager &SM) const {
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001373 ASTDumper P(&SM, OS);
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001374 P.dumpStmt(const_cast<Stmt*>(this));
Chris Lattner0c727a32007-08-30 00:40:08 +00001375}
1376
Chris Lattner6000dac2007-08-08 22:51:59 +00001377void Stmt::dump() const {
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001378 ASTDumper P(0, llvm::errs());
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001379 P.dumpStmt(const_cast<Stmt*>(this));
Chris Lattner6000dac2007-08-08 22:51:59 +00001380}