blob: d90fd1b248cb75fc0692e48fec62975ca74f4c30 [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 Kornienkoad7bb362012-12-20 11:08:38 +000073 void dumpBareDeclRef(const Decl *Node);
74 void dumpDeclRef(const Decl *Node, const char *Label = NULL);
75 void dumpName(const NamedDecl *D);
76 void dumpDeclContext(const DeclContext *DC);
Alexander Kornienkod538ed92012-12-20 02:09:13 +000077
78 // C++ Utilities
79 void dumpAccessSpecifier(AccessSpecifier AS);
Alexander Kornienkoad7bb362012-12-20 11:08:38 +000080 void dumpCXXCtorInitializer(const CXXCtorInitializer *Init);
81 void dumpTemplateParameters(const TemplateParameterList *TPL);
Alexander Kornienkod538ed92012-12-20 02:09:13 +000082 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
Alexander Kornienkoad7bb362012-12-20 11:08:38 +0000274void ASTDumper::dumpBareDeclRef(const Decl *D) {
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000275 OS << D->getDeclKindName();
276 dumpPointer(D);
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000277
Alexander Kornienkoad7bb362012-12-20 11:08:38 +0000278 if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000279 OS << " '";
280 ND->getDeclName().printName(OS);
281 OS << "'";
282 }
283
Alexander Kornienkoad7bb362012-12-20 11:08:38 +0000284 if (const 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
Alexander Kornienkoad7bb362012-12-20 11:08:38 +0000288void ASTDumper::dumpDeclRef(const Decl *D, const char *Label) {
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000289 if (!D)
290 return;
291
292 IndentScope Indent(*this);
293 if (Label)
294 OS << Label << ' ';
295 dumpBareDeclRef(D);
296}
297
Alexander Kornienkoad7bb362012-12-20 11:08:38 +0000298void ASTDumper::dumpName(const NamedDecl *ND) {
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000299 if (ND->getDeclName())
300 OS << ' ' << ND->getNameAsString();
301}
302
Alexander Kornienkoad7bb362012-12-20 11:08:38 +0000303void ASTDumper::dumpDeclContext(const DeclContext *DC) {
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000304 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
Alexander Kornienkoad7bb362012-12-20 11:08:38 +0000331void ASTDumper::dumpCXXCtorInitializer(const CXXCtorInitializer *Init) {
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000332 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
Alexander Kornienkoad7bb362012-12-20 11:08:38 +0000343void ASTDumper::dumpTemplateParameters(const TemplateParameterList *TPL) {
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000344 if (!TPL)
345 return;
346
Alexander Kornienkoad7bb362012-12-20 11:08:38 +0000347 for (TemplateParameterList::const_iterator I = TPL->begin(), E = TPL->end();
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000348 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:
Alexander Kornienkoad7bb362012-12-20 11:08:38 +0000389 OS << " integral " << A.getAsIntegral();
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000390 break;
391 case TemplateArgument::Template:
392 OS << " template ";
393 A.getAsTemplate().dump(OS);
394 break;
395 case TemplateArgument::TemplateExpansion:
396 OS << " template expansion";
397 A.getAsTemplateOrTemplatePattern().dump(OS);
398 break;
399 case TemplateArgument::Expression:
400 OS << " expr";
401 dumpStmt(A.getAsExpr());
402 break;
403 case TemplateArgument::Pack:
404 OS << " pack";
405 for (TemplateArgument::pack_iterator I = A.pack_begin(), E = A.pack_end();
406 I != E; ++I)
407 dumpTemplateArgument(*I);
408 break;
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000409 }
410}
411
Chris Lattnere300c872007-08-30 06:17:34 +0000412//===----------------------------------------------------------------------===//
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000413// Decl dumping methods.
Chris Lattner6000dac2007-08-08 22:51:59 +0000414//===----------------------------------------------------------------------===//
415
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000416void ASTDumper::dumpDecl(Decl *D) {
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000417 IndentScope Indent(*this);
Mike Stump1eb44332009-09-09 15:08:12 +0000418
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000419 if (!D) {
420 OS << "<<<NULL>>>";
421 return;
Chris Lattner6000dac2007-08-08 22:51:59 +0000422 }
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000423
424 OS << D->getDeclKindName() << "Decl";
425 dumpPointer(D);
426 dumpSourceRange(D->getSourceRange());
427 DeclVisitor<ASTDumper>::Visit(D);
428 // Decls within functions are visited by the body
429 if (!isa<FunctionDecl>(*D) && !isa<ObjCMethodDecl>(*D))
430 dumpDeclContext(dyn_cast<DeclContext>(D));
431}
432
433void ASTDumper::VisitLabelDecl(LabelDecl *D) {
434 dumpName(D);
435}
436
437void ASTDumper::VisitTypedefDecl(TypedefDecl *D) {
438 dumpName(D);
439 dumpType(D->getUnderlyingType());
440 if (D->isModulePrivate())
441 OS << " __module_private__";
442}
443
444void ASTDumper::VisitEnumDecl(EnumDecl *D) {
445 if (D->isScoped()) {
446 if (D->isScopedUsingClassTag())
447 OS << " class";
448 else
449 OS << " struct";
450 }
451 dumpName(D);
452 if (D->isModulePrivate())
453 OS << " __module_private__";
454 if (D->isFixed())
455 dumpType(D->getIntegerType());
456}
457
458void ASTDumper::VisitRecordDecl(RecordDecl *D) {
459 OS << ' ' << D->getKindName();
460 dumpName(D);
461 if (D->isModulePrivate())
462 OS << " __module_private__";
463}
464
465void ASTDumper::VisitEnumConstantDecl(EnumConstantDecl *D) {
466 dumpName(D);
467 dumpType(D->getType());
468 if (Expr *Init = D->getInitExpr())
469 dumpStmt(Init);
470}
471
472void ASTDumper::VisitIndirectFieldDecl(IndirectFieldDecl *D) {
473 dumpName(D);
474 dumpType(D->getType());
475 for (IndirectFieldDecl::chain_iterator I = D->chain_begin(),
476 E = D->chain_end(); I != E; ++I)
477 dumpDeclRef(*I);
478}
479
480void ASTDumper::VisitFunctionDecl(FunctionDecl *D) {
481 dumpName(D);
482 dumpType(D->getType());
483
484 StorageClass SC = D->getStorageClassAsWritten();
485 if (SC != SC_None)
486 OS << ' ' << VarDecl::getStorageClassSpecifierString(SC);
487 if (D->isInlineSpecified())
488 OS << " inline";
489 if (D->isVirtualAsWritten())
490 OS << " virtual";
491 if (D->isModulePrivate())
492 OS << " __module_private__";
493
494 if (D->isPure())
495 OS << " pure";
496 else if (D->isDeletedAsWritten())
497 OS << " delete";
498
499 if (const FunctionTemplateSpecializationInfo *FTSI =
500 D->getTemplateSpecializationInfo())
501 dumpTemplateArgumentList(*FTSI->TemplateArguments);
502
503 for (llvm::ArrayRef<NamedDecl*>::iterator
504 I = D->getDeclsInPrototypeScope().begin(),
505 E = D->getDeclsInPrototypeScope().end(); I != E; ++I)
506 dumpDecl(*I);
507
508 for (FunctionDecl::param_iterator I = D->param_begin(), E = D->param_end();
509 I != E; ++I)
510 dumpDecl(*I);
511
512 if (CXXConstructorDecl *C = dyn_cast<CXXConstructorDecl>(D))
513 for (CXXConstructorDecl::init_const_iterator I = C->init_begin(),
514 E = C->init_end(); I != E; ++I)
515 dumpCXXCtorInitializer(*I);
516
517 if (D->doesThisDeclarationHaveABody())
518 dumpStmt(D->getBody());
519}
520
521void ASTDumper::VisitFieldDecl(FieldDecl *D) {
522 dumpName(D);
523 dumpType(D->getType());
524 if (D->isMutable())
525 OS << " mutable";
526 if (D->isModulePrivate())
527 OS << " __module_private__";
528 if (D->isBitField())
529 dumpStmt(D->getBitWidth());
530 if (Expr *Init = D->getInClassInitializer())
531 dumpStmt(Init);
532}
533
534void ASTDumper::VisitVarDecl(VarDecl *D) {
535 dumpName(D);
536 dumpType(D->getType());
537 StorageClass SC = D->getStorageClassAsWritten();
538 if (SC != SC_None)
539 OS << ' ' << VarDecl::getStorageClassSpecifierString(SC);
540 if (D->isThreadSpecified())
541 OS << " __thread";
542 if (D->isModulePrivate())
543 OS << " __module_private__";
544 if (D->isNRVOVariable())
545 OS << " nrvo";
546 if (D->hasInit())
547 dumpStmt(D->getInit());
548}
549
550void ASTDumper::VisitFileScopeAsmDecl(FileScopeAsmDecl *D) {
551 dumpStmt(D->getAsmString());
552}
553
554void ASTDumper::VisitImportDecl(ImportDecl *D) {
555 OS << ' ' << D->getImportedModule()->getFullModuleName();
556}
557
558//===----------------------------------------------------------------------===//
559// C++ Declarations
560//===----------------------------------------------------------------------===//
561
562void ASTDumper::VisitNamespaceDecl(NamespaceDecl *D) {
563 dumpName(D);
564 if (D->isInline())
565 OS << " inline";
566 if (!D->isOriginalNamespace())
567 dumpDeclRef(D->getOriginalNamespace(), "original");
568}
569
570void ASTDumper::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
571 OS << ' ';
572 dumpBareDeclRef(D->getNominatedNamespace());
573}
574
575void ASTDumper::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
576 dumpName(D);
577 dumpDeclRef(D->getAliasedNamespace());
578}
579
580void ASTDumper::VisitTypeAliasDecl(TypeAliasDecl *D) {
581 dumpName(D);
582 dumpType(D->getUnderlyingType());
583}
584
585void ASTDumper::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {
586 dumpName(D);
587 dumpTemplateParameters(D->getTemplateParameters());
588 dumpDecl(D->getTemplatedDecl());
589}
590
591void ASTDumper::VisitCXXRecordDecl(CXXRecordDecl *D) {
592 VisitRecordDecl(D);
593 if (!D->isCompleteDefinition())
594 return;
595
596 for (CXXRecordDecl::base_class_iterator I = D->bases_begin(),
597 E = D->bases_end(); I != E; ++I) {
598 IndentScope Indent(*this);
599 if (I->isVirtual())
600 OS << "virtual ";
601 dumpAccessSpecifier(I->getAccessSpecifier());
602 dumpType(I->getType());
603 if (I->isPackExpansion())
604 OS << "...";
605 }
606}
607
608void ASTDumper::VisitStaticAssertDecl(StaticAssertDecl *D) {
609 dumpStmt(D->getAssertExpr());
610 dumpStmt(D->getMessage());
611}
612
613void ASTDumper::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
614 dumpName(D);
615 dumpTemplateParameters(D->getTemplateParameters());
616 dumpDecl(D->getTemplatedDecl());
617 for (FunctionTemplateDecl::spec_iterator I = D->spec_begin(),
618 E = D->spec_end(); I != E; ++I) {
619 switch (I->getTemplateSpecializationKind()) {
620 case TSK_Undeclared:
621 case TSK_ImplicitInstantiation:
622 case TSK_ExplicitInstantiationDeclaration:
623 case TSK_ExplicitInstantiationDefinition:
624 dumpDecl(*I);
625 break;
626 case TSK_ExplicitSpecialization:
627 dumpDeclRef(*I);
628 break;
629 }
630 }
631}
632
633void ASTDumper::VisitClassTemplateDecl(ClassTemplateDecl *D) {
634 dumpName(D);
635 dumpTemplateParameters(D->getTemplateParameters());
636 dumpDecl(D->getTemplatedDecl());
637 for (ClassTemplateDecl::spec_iterator I = D->spec_begin(), E = D->spec_end();
638 I != E; ++I) {
639 switch (I->getTemplateSpecializationKind()) {
640 case TSK_Undeclared:
641 case TSK_ImplicitInstantiation:
642 dumpDecl(*I);
643 break;
644 case TSK_ExplicitSpecialization:
645 case TSK_ExplicitInstantiationDeclaration:
646 case TSK_ExplicitInstantiationDefinition:
647 dumpDeclRef(*I);
648 break;
649 }
650 }
651}
652
653void ASTDumper::VisitClassTemplateSpecializationDecl(
654 ClassTemplateSpecializationDecl *D) {
655 VisitCXXRecordDecl(D);
656 dumpTemplateArgumentList(D->getTemplateArgs());
657}
658
659void ASTDumper::VisitClassTemplatePartialSpecializationDecl(
660 ClassTemplatePartialSpecializationDecl *D) {
661 VisitClassTemplateSpecializationDecl(D);
662 dumpTemplateParameters(D->getTemplateParameters());
663}
664
665void ASTDumper::VisitClassScopeFunctionSpecializationDecl(
666 ClassScopeFunctionSpecializationDecl *D) {
667 dumpDeclRef(D->getSpecialization());
668 if (D->hasExplicitTemplateArgs())
669 dumpTemplateArgumentListInfo(D->templateArgs());
670}
671
672void ASTDumper::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
673 if (D->wasDeclaredWithTypename())
674 OS << " typename";
675 else
676 OS << " class";
677 if (D->isParameterPack())
678 OS << " ...";
679 dumpName(D);
680 if (D->hasDefaultArgument())
681 dumpType(D->getDefaultArgument());
682}
683
684void ASTDumper::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
685 dumpType(D->getType());
686 if (D->isParameterPack())
687 OS << " ...";
688 dumpName(D);
689 if (D->hasDefaultArgument())
690 dumpStmt(D->getDefaultArgument());
691}
692
693void ASTDumper::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
694 if (D->isParameterPack())
695 OS << " ...";
696 dumpName(D);
697 dumpTemplateParameters(D->getTemplateParameters());
698 if (D->hasDefaultArgument())
699 dumpTemplateArgumentLoc(D->getDefaultArgument());
700}
701
702void ASTDumper::VisitUsingDecl(UsingDecl *D) {
703 OS << ' ';
704 D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
705 OS << D->getNameAsString();
706}
707
708void
709ASTDumper::VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D) {
710 OS << ' ';
711 D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
712 OS << D->getNameAsString();
713}
714
715void ASTDumper::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {
716 OS << ' ';
717 D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
718 OS << D->getNameAsString();
719 dumpType(D->getType());
720}
721
722void ASTDumper::VisitUsingShadowDecl(UsingShadowDecl *D) {
723 OS << ' ';
724 dumpBareDeclRef(D->getTargetDecl());
725}
726
727void ASTDumper::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
728 switch (D->getLanguage()) {
729 case LinkageSpecDecl::lang_c: OS << " C"; break;
730 case LinkageSpecDecl::lang_cxx: OS << " C++"; break;
731 }
732}
733
734void ASTDumper::VisitAccessSpecDecl(AccessSpecDecl *D) {
735 OS << ' ';
736 dumpAccessSpecifier(D->getAccess());
737}
738
739void ASTDumper::VisitFriendDecl(FriendDecl *D) {
740 if (TypeSourceInfo *T = D->getFriendType())
741 dumpType(T->getType());
742 else
743 dumpDecl(D->getFriendDecl());
744}
745
746//===----------------------------------------------------------------------===//
747// Obj-C Declarations
748//===----------------------------------------------------------------------===//
749
750void ASTDumper::VisitObjCIvarDecl(ObjCIvarDecl *D) {
751 dumpName(D);
752 dumpType(D->getType());
753 if (D->getSynthesize())
754 OS << " synthesize";
755
756 switch (D->getAccessControl()) {
757 case ObjCIvarDecl::None:
758 OS << " none";
759 break;
760 case ObjCIvarDecl::Private:
761 OS << " private";
762 break;
763 case ObjCIvarDecl::Protected:
764 OS << " protected";
765 break;
766 case ObjCIvarDecl::Public:
767 OS << " public";
768 break;
769 case ObjCIvarDecl::Package:
770 OS << " package";
771 break;
772 }
773}
774
775void ASTDumper::VisitObjCMethodDecl(ObjCMethodDecl *D) {
776 if (D->isInstanceMethod())
777 OS << " -";
778 else
779 OS << " +";
780 dumpName(D);
781 dumpType(D->getResultType());
782
783 if (D->isThisDeclarationADefinition())
784 dumpDeclContext(D);
785 else {
786 for (ObjCMethodDecl::param_iterator I = D->param_begin(),
787 E = D->param_end(); I != E; ++I) {
788 dumpDecl(*I);
789 }
790 }
791
792 if (D->isVariadic()) {
793 IndentScope Indent(*this);
794 OS << "...";
795 }
796
797 if (D->hasBody())
798 dumpStmt(D->getBody());
799}
800
801void ASTDumper::VisitObjCCategoryDecl(ObjCCategoryDecl *D) {
802 dumpName(D);
803 dumpDeclRef(D->getClassInterface());
804 dumpDeclRef(D->getImplementation());
805 for (ObjCCategoryDecl::protocol_iterator I = D->protocol_begin(),
806 E = D->protocol_end(); I != E; ++I)
807 dumpDeclRef(*I);
808}
809
810void ASTDumper::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
811 dumpName(D);
812 dumpDeclRef(D->getClassInterface());
813 dumpDeclRef(D->getCategoryDecl());
814}
815
816void ASTDumper::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
817 dumpName(D);
818 for (ObjCProtocolDecl::protocol_iterator I = D->protocol_begin(),
819 E = D->protocol_end(); I != E; ++I)
820 dumpDeclRef(*I);
821}
822
823void ASTDumper::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
824 dumpName(D);
825 dumpDeclRef(D->getSuperClass(), "super");
826 dumpDeclRef(D->getImplementation());
827 for (ObjCInterfaceDecl::protocol_iterator I = D->protocol_begin(),
828 E = D->protocol_end(); I != E; ++I)
829 dumpDeclRef(*I);
830}
831
832void ASTDumper::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
833 dumpName(D);
834 dumpDeclRef(D->getSuperClass(), "super");
835 dumpDeclRef(D->getClassInterface());
836 for (ObjCImplementationDecl::init_iterator I = D->init_begin(),
837 E = D->init_end(); I != E; ++I)
838 dumpCXXCtorInitializer(*I);
839}
840
841void ASTDumper::VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D) {
842 dumpName(D);
843 dumpDeclRef(D->getClassInterface());
844}
845
846void ASTDumper::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
847 dumpName(D);
848 dumpType(D->getType());
849
850 if (D->getPropertyImplementation() == ObjCPropertyDecl::Required)
851 OS << " required";
852 else if (D->getPropertyImplementation() == ObjCPropertyDecl::Optional)
853 OS << " optional";
854
855 ObjCPropertyDecl::PropertyAttributeKind Attrs = D->getPropertyAttributes();
856 if (Attrs != ObjCPropertyDecl::OBJC_PR_noattr) {
857 if (Attrs & ObjCPropertyDecl::OBJC_PR_readonly)
858 OS << " readonly";
859 if (Attrs & ObjCPropertyDecl::OBJC_PR_assign)
860 OS << " assign";
861 if (Attrs & ObjCPropertyDecl::OBJC_PR_readwrite)
862 OS << " readwrite";
863 if (Attrs & ObjCPropertyDecl::OBJC_PR_retain)
864 OS << " retain";
865 if (Attrs & ObjCPropertyDecl::OBJC_PR_copy)
866 OS << " copy";
867 if (Attrs & ObjCPropertyDecl::OBJC_PR_nonatomic)
868 OS << " nonatomic";
869 if (Attrs & ObjCPropertyDecl::OBJC_PR_atomic)
870 OS << " atomic";
871 if (Attrs & ObjCPropertyDecl::OBJC_PR_weak)
872 OS << " weak";
873 if (Attrs & ObjCPropertyDecl::OBJC_PR_strong)
874 OS << " strong";
875 if (Attrs & ObjCPropertyDecl::OBJC_PR_unsafe_unretained)
876 OS << " unsafe_unretained";
877 if (Attrs & ObjCPropertyDecl::OBJC_PR_getter)
878 dumpDeclRef(D->getGetterMethodDecl(), "getter");
879 if (Attrs & ObjCPropertyDecl::OBJC_PR_setter)
880 dumpDeclRef(D->getSetterMethodDecl(), "setter");
881 }
882}
883
884void ASTDumper::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
885 dumpName(D->getPropertyDecl());
886 if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize)
887 OS << " synthesize";
888 else
889 OS << " dynamic";
890 dumpDeclRef(D->getPropertyDecl());
891 dumpDeclRef(D->getPropertyIvarDecl());
892}
893
894void ASTDumper::VisitBlockDecl(BlockDecl *D) {
895 for (BlockDecl::param_iterator I = D->param_begin(), E = D->param_end();
896 I != E; ++I)
897 dumpDecl(*I);
898
899 if (D->isVariadic()) {
900 IndentScope Indent(*this);
901 OS << "...";
902 }
903
904 if (D->capturesCXXThis()) {
905 IndentScope Indent(*this);
906 OS << "capture this";
907 }
908 for (BlockDecl::capture_iterator I = D->capture_begin(),
909 E = D->capture_end(); I != E; ++I) {
910 IndentScope Indent(*this);
911 OS << "capture";
912 if (I->isByRef())
913 OS << " byref";
914 if (I->isNested())
915 OS << " nested";
916 if (I->getVariable()) {
917 OS << ' ';
918 dumpBareDeclRef(I->getVariable());
919 }
920 if (I->hasCopyExpr())
921 dumpStmt(I->getCopyExpr());
922 }
923
924 dumpStmt(D->getBody());
Chris Lattner6000dac2007-08-08 22:51:59 +0000925}
926
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000927//===----------------------------------------------------------------------===//
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000928// Stmt dumping methods.
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000929//===----------------------------------------------------------------------===//
930
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000931void ASTDumper::dumpStmt(Stmt *S) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000932 IndentScope Indent(*this);
933
934 if (!S) {
935 OS << "<<<NULL>>>";
936 return;
937 }
938
939 if (DeclStmt *DS = dyn_cast<DeclStmt>(S)) {
940 VisitDeclStmt(DS);
941 return;
942 }
943
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000944 StmtVisitor<ASTDumper>::Visit(S);
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000945 for (Stmt::child_range CI = S->children(); CI; ++CI)
946 dumpStmt(*CI);
947}
948
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000949void ASTDumper::VisitStmt(Stmt *Node) {
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000950 OS << Node->getStmtClassName();
951 dumpPointer(Node);
952 dumpSourceRange(Node->getSourceRange());
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000953}
954
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000955void ASTDumper::VisitDeclStmt(DeclStmt *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000956 VisitStmt(Node);
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000957 for (DeclStmt::decl_iterator I = Node->decl_begin(), E = Node->decl_end();
958 I != E; ++I)
959 dumpDecl(*I);
Ted Kremenek5399ce22007-12-12 06:59:42 +0000960}
961
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000962void ASTDumper::VisitLabelStmt(LabelStmt *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000963 VisitStmt(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +0000964 OS << " '" << Node->getName() << "'";
Chris Lattner6000dac2007-08-08 22:51:59 +0000965}
966
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000967void ASTDumper::VisitGotoStmt(GotoStmt *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000968 VisitStmt(Node);
Alexander Kornienkod538ed92012-12-20 02:09:13 +0000969 OS << " '" << Node->getLabel()->getName() << "'";
970 dumpPointer(Node->getLabel());
Chris Lattner6000dac2007-08-08 22:51:59 +0000971}
972
Chris Lattner6000dac2007-08-08 22:51:59 +0000973//===----------------------------------------------------------------------===//
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000974// Expr dumping methods.
Chris Lattner6000dac2007-08-08 22:51:59 +0000975//===----------------------------------------------------------------------===//
976
Alexander Kornienko40b66a002012-12-13 13:59:55 +0000977void ASTDumper::VisitExpr(Expr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +0000978 VisitStmt(Node);
Alexander Kornienko21c8b192012-12-11 15:28:09 +0000979 dumpType(Node->getType());
980
981 switch (Node->getValueKind()) {
982 case VK_RValue:
983 break;
984 case VK_LValue:
985 OS << " lvalue";
986 break;
987 case VK_XValue:
988 OS << " xvalue";
989 break;
990 }
991
992 switch (Node->getObjectKind()) {
993 case OK_Ordinary:
994 break;
995 case OK_BitField:
996 OS << " bitfield";
997 break;
998 case OK_ObjCProperty:
999 OS << " objcproperty";
1000 break;
1001 case OK_ObjCSubscript:
1002 OS << " objcsubscript";
1003 break;
1004 case OK_VectorComponent:
1005 OS << " vectorcomponent";
1006 break;
1007 }
Chris Lattner6000dac2007-08-08 22:51:59 +00001008}
1009
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001010static void dumpBasePath(raw_ostream &OS, CastExpr *Node) {
John McCallf871d0c2010-08-07 06:22:56 +00001011 if (Node->path_empty())
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001012 return;
1013
1014 OS << " (";
1015 bool First = true;
John McCallf871d0c2010-08-07 06:22:56 +00001016 for (CastExpr::path_iterator
1017 I = Node->path_begin(), E = Node->path_end(); I != E; ++I) {
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001018 const CXXBaseSpecifier *Base = *I;
1019 if (!First)
1020 OS << " -> ";
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001021
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001022 const CXXRecordDecl *RD =
1023 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001024
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001025 if (Base->isVirtual())
1026 OS << "virtual ";
1027 OS << RD->getName();
1028 First = false;
1029 }
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001030
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001031 OS << ')';
1032}
1033
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001034void ASTDumper::VisitCastExpr(CastExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001035 VisitExpr(Node);
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001036 OS << " <" << Node->getCastKindName();
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001037 dumpBasePath(OS, Node);
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001038 OS << ">";
Anders Carlsson27a5b9b2009-08-22 23:33:40 +00001039}
1040
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001041void ASTDumper::VisitDeclRefExpr(DeclRefExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001042 VisitExpr(Node);
Ted Kremenekeb641f92007-09-10 17:32:55 +00001043
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001044 OS << " ";
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001045 dumpBareDeclRef(Node->getDecl());
Chandler Carruth3aa81402011-05-01 23:48:14 +00001046 if (Node->getDecl() != Node->getFoundDecl()) {
1047 OS << " (";
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001048 dumpBareDeclRef(Node->getFoundDecl());
Chandler Carruth3aa81402011-05-01 23:48:14 +00001049 OS << ")";
1050 }
John McCall6b5a61b2011-02-07 10:33:21 +00001051}
1052
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001053void ASTDumper::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001054 VisitExpr(Node);
John McCall9d5f35e2009-12-11 21:50:11 +00001055 OS << " (";
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001056 if (!Node->requiresADL())
1057 OS << "no ";
Benjamin Kramer900fc632010-04-17 09:33:03 +00001058 OS << "ADL) = '" << Node->getName() << '\'';
John McCall9d5f35e2009-12-11 21:50:11 +00001059
1060 UnresolvedLookupExpr::decls_iterator
1061 I = Node->decls_begin(), E = Node->decls_end();
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001062 if (I == E)
1063 OS << " empty";
John McCall9d5f35e2009-12-11 21:50:11 +00001064 for (; I != E; ++I)
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001065 dumpPointer(*I);
John McCall9d5f35e2009-12-11 21:50:11 +00001066}
1067
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001068void ASTDumper::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001069 VisitExpr(Node);
Steve Naroff3c64d9e2008-03-12 13:19:12 +00001070
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001071 OS << " " << Node->getDecl()->getDeclKindName()
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001072 << "Decl='" << *Node->getDecl() << "'";
1073 dumpPointer(Node->getDecl());
Steve Naroff218543b2008-05-23 22:01:24 +00001074 if (Node->isFreeIvar())
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001075 OS << " isFreeIvar";
Steve Naroff3c64d9e2008-03-12 13:19:12 +00001076}
1077
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001078void ASTDumper::VisitPredefinedExpr(PredefinedExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001079 VisitExpr(Node);
Chris Lattner6000dac2007-08-08 22:51:59 +00001080 switch (Node->getIdentType()) {
David Blaikieb219cfc2011-09-23 05:06:16 +00001081 default: llvm_unreachable("unknown case");
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001082 case PredefinedExpr::Func: OS << " __func__"; break;
1083 case PredefinedExpr::Function: OS << " __FUNCTION__"; break;
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001084 case PredefinedExpr::LFunction: OS << " L__FUNCTION__"; break;
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001085 case PredefinedExpr::PrettyFunction: OS << " __PRETTY_FUNCTION__";break;
Chris Lattner6000dac2007-08-08 22:51:59 +00001086 }
1087}
1088
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001089void ASTDumper::VisitCharacterLiteral(CharacterLiteral *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001090 VisitExpr(Node);
Richard Trieu49cf8842011-11-03 23:56:23 +00001091 OS << " " << Node->getValue();
Chris Lattner6000dac2007-08-08 22:51:59 +00001092}
1093
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001094void ASTDumper::VisitIntegerLiteral(IntegerLiteral *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001095 VisitExpr(Node);
Chris Lattner6000dac2007-08-08 22:51:59 +00001096
1097 bool isSigned = Node->getType()->isSignedIntegerType();
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001098 OS << " " << Node->getValue().toString(10, isSigned);
Chris Lattner6000dac2007-08-08 22:51:59 +00001099}
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001100
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001101void ASTDumper::VisitFloatingLiteral(FloatingLiteral *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001102 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001103 OS << " " << Node->getValueAsApproximateDouble();
Chris Lattner6000dac2007-08-08 22:51:59 +00001104}
Chris Lattner5d661452007-08-26 03:42:43 +00001105
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001106void ASTDumper::VisitStringLiteral(StringLiteral *Str) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001107 VisitExpr(Str);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001108 OS << " ";
Richard Trieu8ab09da2012-06-13 20:25:24 +00001109 Str->outputString(OS);
Chris Lattner6000dac2007-08-08 22:51:59 +00001110}
Chris Lattner17a1a722007-08-30 01:00:35 +00001111
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001112void ASTDumper::VisitUnaryOperator(UnaryOperator *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001113 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001114 OS << " " << (Node->isPostfix() ? "postfix" : "prefix")
1115 << " '" << UnaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
Chris Lattner6000dac2007-08-08 22:51:59 +00001116}
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001117
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001118void ASTDumper::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001119 VisitExpr(Node);
Peter Collingbournef4e3cfb2011-03-11 19:24:49 +00001120 switch(Node->getKind()) {
1121 case UETT_SizeOf:
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001122 OS << " sizeof";
Peter Collingbournef4e3cfb2011-03-11 19:24:49 +00001123 break;
1124 case UETT_AlignOf:
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001125 OS << " alignof";
Peter Collingbournef4e3cfb2011-03-11 19:24:49 +00001126 break;
1127 case UETT_VecStep:
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001128 OS << " vec_step";
Peter Collingbournef4e3cfb2011-03-11 19:24:49 +00001129 break;
1130 }
Sebastian Redl05189992008-11-11 17:56:53 +00001131 if (Node->isArgumentType())
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001132 dumpType(Node->getArgumentType());
Chris Lattner6000dac2007-08-08 22:51:59 +00001133}
Chris Lattner13cb21f2007-08-09 17:35:30 +00001134
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001135void ASTDumper::VisitMemberExpr(MemberExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001136 VisitExpr(Node);
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001137 OS << " " << (Node->isArrow() ? "->" : ".") << *Node->getMemberDecl();
1138 dumpPointer(Node->getMemberDecl());
Chris Lattner6000dac2007-08-08 22:51:59 +00001139}
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001140
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001141void ASTDumper::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001142 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001143 OS << " " << Node->getAccessor().getNameStart();
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::VisitBinaryOperator(BinaryOperator *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001147 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001148 OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
Chris Lattnereb14fe82007-08-25 02:00:02 +00001149}
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001150
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001151void ASTDumper::VisitCompoundAssignOperator(CompoundAssignOperator *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001152 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001153 OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode())
1154 << "' ComputeLHSTy=";
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001155 dumpBareType(Node->getComputationLHSType());
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001156 OS << " ComputeResultTy=";
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001157 dumpBareType(Node->getComputationResultType());
Chris Lattner6000dac2007-08-08 22:51:59 +00001158}
Chris Lattner6000dac2007-08-08 22:51:59 +00001159
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001160void ASTDumper::VisitBlockExpr(BlockExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001161 VisitExpr(Node);
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001162 dumpDecl(Node->getBlockDecl());
John McCall6b5a61b2011-02-07 10:33:21 +00001163}
1164
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001165void ASTDumper::VisitOpaqueValueExpr(OpaqueValueExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001166 VisitExpr(Node);
John McCall4b9c2d22011-11-06 09:01:30 +00001167
Manuel Klimekcb7b45e2012-11-07 00:33:12 +00001168 if (Expr *Source = Node->getSourceExpr())
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001169 dumpStmt(Source);
John McCall4b9c2d22011-11-06 09:01:30 +00001170}
1171
Chris Lattner6000dac2007-08-08 22:51:59 +00001172// GNU extensions.
1173
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001174void ASTDumper::VisitAddrLabelExpr(AddrLabelExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001175 VisitExpr(Node);
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001176 OS << " " << Node->getLabel()->getName();
1177 dumpPointer(Node->getLabel());
Chris Lattner6000dac2007-08-08 22:51:59 +00001178}
1179
Chris Lattnerf9e05812007-08-09 18:03:18 +00001180//===----------------------------------------------------------------------===//
1181// C++ Expressions
1182//===----------------------------------------------------------------------===//
Chris Lattner6000dac2007-08-08 22:51:59 +00001183
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001184void ASTDumper::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001185 VisitExpr(Node);
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001186 OS << " " << Node->getCastName()
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001187 << "<" << Node->getTypeAsWritten().getAsString() << ">"
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001188 << " <" << Node->getCastKindName();
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001189 dumpBasePath(OS, Node);
Anders Carlsson5cf86ba2010-04-24 19:06:50 +00001190 OS << ">";
Chris Lattner6000dac2007-08-08 22:51:59 +00001191}
1192
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001193void ASTDumper::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001194 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001195 OS << " " << (Node->getValue() ? "true" : "false");
Chris Lattner6000dac2007-08-08 22:51:59 +00001196}
1197
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001198void ASTDumper::VisitCXXThisExpr(CXXThisExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001199 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001200 OS << " this";
Douglas Gregorcd9b46e2008-11-04 14:56:14 +00001201}
1202
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001203void ASTDumper::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001204 VisitExpr(Node);
Eli Friedmancc2fca22011-09-02 17:38:59 +00001205 OS << " functional cast to " << Node->getTypeAsWritten().getAsString()
1206 << " <" << Node->getCastKindName() << ">";
Douglas Gregor49badde2008-10-27 19:41:14 +00001207}
1208
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001209void ASTDumper::VisitCXXConstructExpr(CXXConstructExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001210 VisitExpr(Node);
John McCalld4bbdfe2010-02-02 19:03:45 +00001211 CXXConstructorDecl *Ctor = Node->getConstructor();
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001212 dumpType(Ctor->getType());
Anders Carlsson0eca1b62009-08-12 00:21:52 +00001213 if (Node->isElidable())
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001214 OS << " elidable";
John McCallf8cf0b02010-08-07 06:38:55 +00001215 if (Node->requiresZeroInitialization())
1216 OS << " zeroing";
Anders Carlsson0eca1b62009-08-12 00:21:52 +00001217}
1218
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001219void ASTDumper::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001220 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001221 OS << " ";
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001222 dumpCXXTemporary(Node->getTemporary());
Anders Carlsson0eca1b62009-08-12 00:21:52 +00001223}
1224
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001225void ASTDumper::VisitExprWithCleanups(ExprWithCleanups *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001226 VisitExpr(Node);
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001227 for (unsigned i = 0, e = Node->getNumObjects(); i != e; ++i)
1228 dumpDeclRef(Node->getObject(i), "cleanup");
Anders Carlsson0eca1b62009-08-12 00:21:52 +00001229}
1230
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001231void ASTDumper::dumpCXXTemporary(CXXTemporary *Temporary) {
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001232 OS << "(CXXTemporary";
1233 dumpPointer(Temporary);
1234 OS << ")";
Anders Carlsson0eca1b62009-08-12 00:21:52 +00001235}
1236
Anders Carlsson55085182007-08-21 17:43:55 +00001237//===----------------------------------------------------------------------===//
1238// Obj-C Expressions
1239//===----------------------------------------------------------------------===//
1240
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001241void ASTDumper::VisitObjCMessageExpr(ObjCMessageExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001242 VisitExpr(Node);
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001243 OS << " selector=" << Node->getSelector().getAsString();
Douglas Gregor04badcf2010-04-21 00:45:42 +00001244 switch (Node->getReceiverKind()) {
1245 case ObjCMessageExpr::Instance:
1246 break;
1247
1248 case ObjCMessageExpr::Class:
1249 OS << " class=";
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001250 dumpBareType(Node->getClassReceiver());
Douglas Gregor04badcf2010-04-21 00:45:42 +00001251 break;
1252
1253 case ObjCMessageExpr::SuperInstance:
1254 OS << " super (instance)";
1255 break;
1256
1257 case ObjCMessageExpr::SuperClass:
1258 OS << " super (class)";
1259 break;
1260 }
Ted Kremenekb3d914b2008-02-29 22:04:05 +00001261}
1262
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001263void ASTDumper::VisitObjCBoxedExpr(ObjCBoxedExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001264 VisitExpr(Node);
Argyrios Kyrtzidis36faadd2012-05-10 20:02:31 +00001265 OS << " selector=" << Node->getBoxingMethod()->getSelector().getAsString();
1266}
1267
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001268void ASTDumper::VisitObjCAtCatchStmt(ObjCAtCatchStmt *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001269 VisitStmt(Node);
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001270 if (VarDecl *CatchParam = Node->getCatchParamDecl())
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001271 dumpDecl(CatchParam);
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001272 else
Douglas Gregor8f5e3dd2010-04-23 22:50:49 +00001273 OS << " catch all";
Douglas Gregor8f5e3dd2010-04-23 22:50:49 +00001274}
1275
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001276void ASTDumper::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001277 VisitExpr(Node);
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001278 dumpType(Node->getEncodedType());
Anders Carlssonf9bcf012007-08-22 15:14:15 +00001279}
1280
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001281void ASTDumper::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001282 VisitExpr(Node);
Mike Stump1eb44332009-09-09 15:08:12 +00001283
Daniel Dunbar806c12e2009-12-03 09:13:13 +00001284 OS << " " << Node->getSelector().getAsString();
Fariborz Jahanianb62f6812007-10-16 20:40:23 +00001285}
1286
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001287void ASTDumper::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001288 VisitExpr(Node);
Mike Stump1eb44332009-09-09 15:08:12 +00001289
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001290 OS << ' ' << *Node->getProtocol();
Fariborz Jahanian390d50a2007-10-17 16:58:11 +00001291}
Daniel Dunbar7f8ea5c2008-08-30 05:35:15 +00001292
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001293void ASTDumper::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001294 VisitExpr(Node);
John McCall12f78a62010-12-02 01:19:52 +00001295 if (Node->isImplicitProperty()) {
Fariborz Jahanian99130e52010-12-22 19:46:35 +00001296 OS << " Kind=MethodRef Getter=\"";
1297 if (Node->getImplicitPropertyGetter())
1298 OS << Node->getImplicitPropertyGetter()->getSelector().getAsString();
1299 else
1300 OS << "(null)";
1301
1302 OS << "\" Setter=\"";
John McCall12f78a62010-12-02 01:19:52 +00001303 if (ObjCMethodDecl *Setter = Node->getImplicitPropertySetter())
1304 OS << Setter->getSelector().getAsString();
1305 else
1306 OS << "(null)";
1307 OS << "\"";
1308 } else {
Benjamin Kramerb8989f22011-10-14 18:45:37 +00001309 OS << " Kind=PropertyRef Property=\"" << *Node->getExplicitProperty() <<'"';
John McCall12f78a62010-12-02 01:19:52 +00001310 }
Fariborz Jahanian5daf5702008-11-22 18:39:36 +00001311
Fariborz Jahanian8ac2d442010-10-14 16:04:05 +00001312 if (Node->isSuperReceiver())
1313 OS << " super";
Argyrios Kyrtzidisb085d892012-03-30 00:19:18 +00001314
1315 OS << " Messaging=";
1316 if (Node->isMessagingGetter() && Node->isMessagingSetter())
1317 OS << "Getter&Setter";
1318 else if (Node->isMessagingGetter())
1319 OS << "Getter";
1320 else if (Node->isMessagingSetter())
1321 OS << "Setter";
Douglas Gregorcd9b46e2008-11-04 14:56:14 +00001322}
1323
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001324void ASTDumper::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001325 VisitExpr(Node);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00001326 if (Node->isArraySubscriptRefExpr())
1327 OS << " Kind=ArraySubscript GetterForArray=\"";
1328 else
1329 OS << " Kind=DictionarySubscript GetterForDictionary=\"";
1330 if (Node->getAtIndexMethodDecl())
1331 OS << Node->getAtIndexMethodDecl()->getSelector().getAsString();
1332 else
1333 OS << "(null)";
Alexander Kornienko21c8b192012-12-11 15:28:09 +00001334
Ted Kremenekebcb57a2012-03-06 20:05:56 +00001335 if (Node->isArraySubscriptRefExpr())
1336 OS << "\" SetterForArray=\"";
1337 else
1338 OS << "\" SetterForDictionary=\"";
1339 if (Node->setAtIndexMethodDecl())
1340 OS << Node->setAtIndexMethodDecl()->getSelector().getAsString();
1341 else
1342 OS << "(null)";
1343}
1344
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001345void ASTDumper::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *Node) {
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001346 VisitExpr(Node);
Ted Kremenekebcb57a2012-03-06 20:05:56 +00001347 OS << " " << (Node->getValue() ? "__objc_yes" : "__objc_no");
1348}
1349
Chris Lattner6000dac2007-08-08 22:51:59 +00001350//===----------------------------------------------------------------------===//
Alexander Kornienkod538ed92012-12-20 02:09:13 +00001351// Decl method implementations
1352//===----------------------------------------------------------------------===//
1353
1354void Decl::dump() const {
1355 dump(llvm::errs());
1356}
1357
1358void Decl::dump(raw_ostream &OS) const {
1359 ASTDumper P(&getASTContext().getSourceManager(), OS);
1360 P.dumpDecl(const_cast<Decl*>(this));
1361}
1362
1363//===----------------------------------------------------------------------===//
Chris Lattner6000dac2007-08-08 22:51:59 +00001364// Stmt method implementations
1365//===----------------------------------------------------------------------===//
1366
Chris Lattnere300c872007-08-30 06:17:34 +00001367void Stmt::dump(SourceManager &SM) const {
Argyrios Kyrtzidis96680332010-08-09 10:54:31 +00001368 dump(llvm::errs(), SM);
1369}
1370
Chris Lattner5f9e2722011-07-23 10:55:15 +00001371void Stmt::dump(raw_ostream &OS, SourceManager &SM) const {
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001372 ASTDumper P(&SM, OS);
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001373 P.dumpStmt(const_cast<Stmt*>(this));
Chris Lattner0c727a32007-08-30 00:40:08 +00001374}
1375
Chris Lattner6000dac2007-08-08 22:51:59 +00001376void Stmt::dump() const {
Alexander Kornienko40b66a002012-12-13 13:59:55 +00001377 ASTDumper P(0, llvm::errs());
Alexander Kornienkod5bc3592012-12-11 15:20:44 +00001378 P.dumpStmt(const_cast<Stmt*>(this));
Chris Lattner6000dac2007-08-08 22:51:59 +00001379}