ASTDumper.cpp revision e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8
140b66a000dca59be61117558bb54f3880a77cd14Alexander Kornienko//===--- ASTDumper.cpp - Dumping implementation for ASTs ------------------===// 26000dace22f110d8768476989313e9d981d690d0Chris Lattner// 36000dace22f110d8768476989313e9d981d690d0Chris Lattner// The LLVM Compiler Infrastructure 46000dace22f110d8768476989313e9d981d690d0Chris Lattner// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 76000dace22f110d8768476989313e9d981d690d0Chris Lattner// 86000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 96000dace22f110d8768476989313e9d981d690d0Chris Lattner// 1040b66a000dca59be61117558bb54f3880a77cd14Alexander Kornienko// This file implements the AST dump methods, which dump out the 116000dace22f110d8768476989313e9d981d690d0Chris Lattner// AST in a form that exposes type details and other fields. 126000dace22f110d8768476989313e9d981d690d0Chris Lattner// 136000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 146000dace22f110d8768476989313e9d981d690d0Chris Lattner 15478851c3ed6bd784e7377dffd8e57b200c1b9ba9Benjamin Kramer#include "clang/AST/ASTContext.h" 16c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko#include "clang/AST/Attr.h" 17acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko#include "clang/AST/CommentVisitor.h" 182a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor#include "clang/AST/DeclCXX.h" 1955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/DeclObjC.h" 20d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko#include "clang/AST/DeclVisitor.h" 2155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/StmtVisitor.h" 22d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko#include "clang/Basic/Module.h" 23e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner#include "clang/Basic/SourceManager.h" 24806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar#include "llvm/Support/raw_ostream.h" 256000dace22f110d8768476989313e9d981d690d0Chris Lattnerusing namespace clang; 26acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkousing namespace clang::comments; 276000dace22f110d8768476989313e9d981d690d0Chris Lattner 286000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 2940b66a000dca59be61117558bb54f3880a77cd14Alexander Kornienko// ASTDumper Visitor 306000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 316000dace22f110d8768476989313e9d981d690d0Chris Lattner 326000dace22f110d8768476989313e9d981d690d0Chris Lattnernamespace { 337ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // Colors used for various parts of the AST dump 347ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 357ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu struct TerminalColor { 367ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu raw_ostream::Colors Color; 377ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu bool Bold; 387ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu }; 397ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 407ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // Decl kind names (VarDecl, FunctionDecl, etc) 417ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor DeclKindNameColor = { raw_ostream::GREEN, true }; 427ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // Attr names (CleanupAttr, GuardedByAttr, etc) 437ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor AttrColor = { raw_ostream::BLUE, true }; 447ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // Statement names (DeclStmt, ImplicitCastExpr, etc) 457ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor StmtColor = { raw_ostream::MAGENTA, true }; 467ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // Comment names (FullComment, ParagraphComment, TextComment, etc) 477ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor CommentColor = { raw_ostream::YELLOW, true }; 487ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 497ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // Type names (int, float, etc, plus user defined types) 507ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor TypeColor = { raw_ostream::GREEN, false }; 517ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 527ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // Pointer address 537ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor AddressColor = { raw_ostream::YELLOW, false }; 547ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // Source locations 557ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor LocationColor = { raw_ostream::YELLOW, false }; 567ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 577ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // lvalue/xvalue 587ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor ValueKindColor = { raw_ostream::CYAN, false }; 597ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // bitfield/objcproperty/objcsubscript/vectorcomponent 607ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor ObjectKindColor = { raw_ostream::CYAN, false }; 617ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 627ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // Null statements 637ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor NullColor = { raw_ostream::BLUE, false }; 647ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 65e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith // Undeserialized entities 66e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith static const TerminalColor UndeserializedColor = { raw_ostream::GREEN, true }; 67e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith 687ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // CastKind from CastExpr's 697ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor CastColor = { raw_ostream::RED, false }; 707ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 717ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // Value of the statement 727ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor ValueColor = { raw_ostream::CYAN, true }; 737ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // Decl names 747ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor DeclNameColor = { raw_ostream::CYAN, true }; 757ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 76e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu // Indents ( `, -. | ) 77e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu static const TerminalColor IndentColor = { raw_ostream::BLUE, false }; 78e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 79d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko class ASTDumper 80ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko : public ConstDeclVisitor<ASTDumper>, public ConstStmtVisitor<ASTDumper>, 81acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko public ConstCommentVisitor<ASTDumper> { 825f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner raw_ostream &OS; 83acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko const CommandTraits *Traits; 84acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko const SourceManager *SM; 85cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek bool IsFirstLine; 861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 87e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu // Indicates whether more child are expected at the current tree depth 88e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu enum IndentType { IT_Child, IT_LastChild }; 89e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 90e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu /// Indents[i] indicates if another child exists at level i. 91e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu /// Used by Indent() to print the tree structure. 92e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu llvm::SmallVector<IndentType, 32> Indents; 93e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 94e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu /// Indicates that more children will be needed at this indent level. 95e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu /// If true, prevents lastChild() from marking the node as the last child. 96e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu /// This is used when there are multiple collections of children to be 97e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu /// dumped as well as during conditional node dumping. 98e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool MoreChildren; 99e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 10021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko /// Keep track of the last location we print out so that we can 10121c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko /// print out deltas from then on out. 102e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner const char *LastLocFilename; 103e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner unsigned LastLocLine; 104d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor 105acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko /// The \c FullComment parent of the comment being dumped. 106acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko const FullComment *FC; 107acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1087ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu bool ShowColors; 1097ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 110cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek class IndentScope { 11140b66a000dca59be61117558bb54f3880a77cd14Alexander Kornienko ASTDumper &Dumper; 112e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu // Preserve the Dumper's MoreChildren value from the previous IndentScope 113e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool MoreChildren; 114cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek public: 11540b66a000dca59be61117558bb54f3880a77cd14Alexander Kornienko IndentScope(ASTDumper &Dumper) : Dumper(Dumper) { 116e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu MoreChildren = Dumper.hasMoreChildren(); 117e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu Dumper.setMoreChildren(false); 118cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek Dumper.indent(); 119cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek } 120cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek ~IndentScope() { 121e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu Dumper.setMoreChildren(MoreChildren); 122cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek Dumper.unindent(); 123cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek } 124cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek }; 125cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek 1267ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu class ColorScope { 1277ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ASTDumper &Dumper; 1287ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu public: 1297ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope(ASTDumper &Dumper, TerminalColor Color) 1307ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu : Dumper(Dumper) { 1317ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu if (Dumper.ShowColors) 1327ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu Dumper.OS.changeColor(Color.Color, Color.Bold); 1337ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 1347ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ~ColorScope() { 1357ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu if (Dumper.ShowColors) 1367ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu Dumper.OS.resetColor(); 1377ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 1387ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu }; 1397ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 1406000dace22f110d8768476989313e9d981d690d0Chris Lattner public: 141acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko ASTDumper(raw_ostream &OS, const CommandTraits *Traits, 142acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko const SourceManager *SM) 14395f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith : OS(OS), Traits(Traits), SM(SM), IsFirstLine(true), MoreChildren(false), 14495f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith LastLocFilename(""), LastLocLine(~0U), FC(0), 1457ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ShowColors(SM && SM->getDiagnostics().getShowColors()) { } 1467ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 1477ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ASTDumper(raw_ostream &OS, const CommandTraits *Traits, 1487ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu const SourceManager *SM, bool ShowColors) 14995f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith : OS(OS), Traits(Traits), SM(SM), IsFirstLine(true), MoreChildren(false), 15095f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith LastLocFilename(""), LastLocLine(~0U), 151e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu ShowColors(ShowColors) { } 1521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15340b66a000dca59be61117558bb54f3880a77cd14Alexander Kornienko ~ASTDumper() { 154cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek OS << "\n"; 155cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek } 156cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek 157ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void dumpDecl(const Decl *D); 158ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void dumpStmt(const Stmt *S); 159acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void dumpFullComment(const FullComment *C); 1601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 161e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu // Formatting 16221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko void indent(); 16321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko void unindent(); 164e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu void lastChild(); 165e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool hasMoreChildren(); 166e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu void setMoreChildren(bool Value); 167e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 168e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu // Utilities 169d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko void dumpPointer(const void *Ptr); 170d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko void dumpSourceRange(SourceRange R); 17121c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko void dumpLocation(SourceLocation Loc); 172d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko void dumpBareType(QualType T); 17321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko void dumpType(QualType T); 174ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko void dumpBareDeclRef(const Decl *Node); 175c939453846395abc860cdb0239784daf4df4fb54Alexander Kornienko void dumpDeclRef(const Decl *Node, const char *Label = 0); 176ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko void dumpName(const NamedDecl *D); 177e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool hasNodes(const DeclContext *DC); 178ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko void dumpDeclContext(const DeclContext *DC); 179c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko void dumpAttr(const Attr *A); 180d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 181d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko // C++ Utilities 182d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko void dumpAccessSpecifier(AccessSpecifier AS); 183ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko void dumpCXXCtorInitializer(const CXXCtorInitializer *Init); 184ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko void dumpTemplateParameters(const TemplateParameterList *TPL); 185d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko void dumpTemplateArgumentListInfo(const TemplateArgumentListInfo &TALI); 186d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko void dumpTemplateArgumentLoc(const TemplateArgumentLoc &A); 187d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko void dumpTemplateArgumentList(const TemplateArgumentList &TAL); 188d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko void dumpTemplateArgument(const TemplateArgument &A, 189d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko SourceRange R = SourceRange()); 190d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 191d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko // Decls 192ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitLabelDecl(const LabelDecl *D); 193ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitTypedefDecl(const TypedefDecl *D); 194ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitEnumDecl(const EnumDecl *D); 195ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitRecordDecl(const RecordDecl *D); 196ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitEnumConstantDecl(const EnumConstantDecl *D); 197ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitIndirectFieldDecl(const IndirectFieldDecl *D); 198ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitFunctionDecl(const FunctionDecl *D); 199ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitFieldDecl(const FieldDecl *D); 200ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitVarDecl(const VarDecl *D); 201ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitFileScopeAsmDecl(const FileScopeAsmDecl *D); 202ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitImportDecl(const ImportDecl *D); 203d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 204d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko // C++ Decls 205ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitNamespaceDecl(const NamespaceDecl *D); 206ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitUsingDirectiveDecl(const UsingDirectiveDecl *D); 207ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitNamespaceAliasDecl(const NamespaceAliasDecl *D); 208ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitTypeAliasDecl(const TypeAliasDecl *D); 209ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitTypeAliasTemplateDecl(const TypeAliasTemplateDecl *D); 210ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitCXXRecordDecl(const CXXRecordDecl *D); 211ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitStaticAssertDecl(const StaticAssertDecl *D); 212ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitFunctionTemplateDecl(const FunctionTemplateDecl *D); 213ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitClassTemplateDecl(const ClassTemplateDecl *D); 214d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko void VisitClassTemplateSpecializationDecl( 215ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko const ClassTemplateSpecializationDecl *D); 216d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko void VisitClassTemplatePartialSpecializationDecl( 217ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko const ClassTemplatePartialSpecializationDecl *D); 218d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko void VisitClassScopeFunctionSpecializationDecl( 219ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko const ClassScopeFunctionSpecializationDecl *D); 220ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D); 221ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitNonTypeTemplateParmDecl(const NonTypeTemplateParmDecl *D); 222ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitTemplateTemplateParmDecl(const TemplateTemplateParmDecl *D); 223ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitUsingDecl(const UsingDecl *D); 224ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitUnresolvedUsingTypenameDecl(const UnresolvedUsingTypenameDecl *D); 225ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitUnresolvedUsingValueDecl(const UnresolvedUsingValueDecl *D); 226ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitUsingShadowDecl(const UsingShadowDecl *D); 227ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitLinkageSpecDecl(const LinkageSpecDecl *D); 228ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitAccessSpecDecl(const AccessSpecDecl *D); 229ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitFriendDecl(const FriendDecl *D); 230d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 231d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko // ObjC Decls 232ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCIvarDecl(const ObjCIvarDecl *D); 233ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCMethodDecl(const ObjCMethodDecl *D); 234ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCCategoryDecl(const ObjCCategoryDecl *D); 235ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCCategoryImplDecl(const ObjCCategoryImplDecl *D); 236ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCProtocolDecl(const ObjCProtocolDecl *D); 237ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCInterfaceDecl(const ObjCInterfaceDecl *D); 238ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCImplementationDecl(const ObjCImplementationDecl *D); 239ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCCompatibleAliasDecl(const ObjCCompatibleAliasDecl *D); 240ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCPropertyDecl(const ObjCPropertyDecl *D); 241ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D); 242ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitBlockDecl(const BlockDecl *D); 2431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // Stmts. 245ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitStmt(const Stmt *Node); 246ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitDeclStmt(const DeclStmt *Node); 247ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitAttributedStmt(const AttributedStmt *Node); 248ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitLabelStmt(const LabelStmt *Node); 249ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitGotoStmt(const GotoStmt *Node); 2501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25117a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // Exprs 252ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitExpr(const Expr *Node); 253ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitCastExpr(const CastExpr *Node); 254ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitDeclRefExpr(const DeclRefExpr *Node); 255ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitPredefinedExpr(const PredefinedExpr *Node); 256ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitCharacterLiteral(const CharacterLiteral *Node); 257ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitIntegerLiteral(const IntegerLiteral *Node); 258ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitFloatingLiteral(const FloatingLiteral *Node); 259ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitStringLiteral(const StringLiteral *Str); 260ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitUnaryOperator(const UnaryOperator *Node); 261ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *Node); 262ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitMemberExpr(const MemberExpr *Node); 263ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitExtVectorElementExpr(const ExtVectorElementExpr *Node); 264ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitBinaryOperator(const BinaryOperator *Node); 265ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitCompoundAssignOperator(const CompoundAssignOperator *Node); 266ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitAddrLabelExpr(const AddrLabelExpr *Node); 267ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitBlockExpr(const BlockExpr *Node); 268ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitOpaqueValueExpr(const OpaqueValueExpr *Node); 26917a1a72e70dcbd6257dde644c790a3013113174fChris Lattner 27017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // C++ 271ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitCXXNamedCastExpr(const CXXNamedCastExpr *Node); 272ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *Node); 273ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitCXXThisExpr(const CXXThisExpr *Node); 274ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitCXXFunctionalCastExpr(const CXXFunctionalCastExpr *Node); 275ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitCXXConstructExpr(const CXXConstructExpr *Node); 276ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *Node); 277ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitExprWithCleanups(const ExprWithCleanups *Node); 278ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitUnresolvedLookupExpr(const UnresolvedLookupExpr *Node); 279ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void dumpCXXTemporary(const CXXTemporary *Temporary); 2801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28117a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // ObjC 282ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCAtCatchStmt(const ObjCAtCatchStmt *Node); 283ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCEncodeExpr(const ObjCEncodeExpr *Node); 284ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCMessageExpr(const ObjCMessageExpr *Node); 285ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCBoxedExpr(const ObjCBoxedExpr *Node); 286ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCSelectorExpr(const ObjCSelectorExpr *Node); 287ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCProtocolExpr(const ObjCProtocolExpr *Node); 288ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr *Node); 289ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCSubscriptRefExpr(const ObjCSubscriptRefExpr *Node); 290ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCIvarRefExpr(const ObjCIvarRefExpr *Node); 291ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *Node); 292acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 293acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko // Comments. 294acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko const char *getCommandName(unsigned CommandID); 295acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void dumpComment(const Comment *C); 296acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 297acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko // Inline comments. 298acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void visitTextComment(const TextComment *C); 299acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void visitInlineCommandComment(const InlineCommandComment *C); 300acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void visitHTMLStartTagComment(const HTMLStartTagComment *C); 301acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void visitHTMLEndTagComment(const HTMLEndTagComment *C); 302acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 303acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko // Block comments. 304acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void visitBlockCommandComment(const BlockCommandComment *C); 305acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void visitParamCommandComment(const ParamCommandComment *C); 306acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void visitTParamCommandComment(const TParamCommandComment *C); 307acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void visitVerbatimBlockComment(const VerbatimBlockComment *C); 308acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void visitVerbatimBlockLineComment(const VerbatimBlockLineComment *C); 309acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void visitVerbatimLineComment(const VerbatimLineComment *C); 3106000dace22f110d8768476989313e9d981d690d0Chris Lattner }; 3116000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3126000dace22f110d8768476989313e9d981d690d0Chris Lattner 3136000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 314e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner// Utilities 315e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//===----------------------------------------------------------------------===// 316e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 317e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// Print out the appropriate tree structure using the Indents vector. 318e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// Example of tree and the Indents vector at each level. 319e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// A { } 320e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// |-B { IT_Child } 321e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// | `-C { IT_Child, IT_LastChild } 322e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// `-D { IT_LastChild } 323e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// |-E { IT_LastChild, IT_Child } 324e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// `-F { IT_LastChild, IT_LastChild } 325e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// Type non-last element, last element 326e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// IT_Child "| " "|-" 327e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// IT_LastChild " " "`-" 32840b66a000dca59be61117558bb54f3880a77cd14Alexander Kornienkovoid ASTDumper::indent() { 32921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko if (IsFirstLine) 33021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko IsFirstLine = false; 33121c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko else 33221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko OS << "\n"; 333e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 334e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu ColorScope Color(*this, IndentColor); 335ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (llvm::SmallVector<IndentType, 32>::const_iterator I = Indents.begin(), 336ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = Indents.end(); 337e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu I != E; ++I) { 338e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu switch (*I) { 33995f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith case IT_Child: 34095f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith if (I == E - 1) 34195f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith OS << "|-"; 34295f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith else 34395f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith OS << "| "; 34495f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith continue; 34595f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith case IT_LastChild: 34695f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith if (I == E - 1) 34795f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith OS << "`-"; 34895f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith else 34995f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith OS << " "; 35095f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith continue; 351e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 35295f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith llvm_unreachable("Invalid IndentType"); 353e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 354e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu Indents.push_back(IT_Child); 35521c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko} 35621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 35740b66a000dca59be61117558bb54f3880a77cd14Alexander Kornienkovoid ASTDumper::unindent() { 358e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu Indents.pop_back(); 359e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu} 360e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 361e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// Call before each potential last child node is to be dumped. If MoreChildren 362e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// is false, then this is the last child, otherwise treat as a regular node. 363e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieuvoid ASTDumper::lastChild() { 364e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (!hasMoreChildren()) 365e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu Indents.back() = IT_LastChild; 366e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu} 367e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 368e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// MoreChildren should be set before calling another function that may print 369e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// additional nodes to prevent conflicting final child nodes. 370e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieubool ASTDumper::hasMoreChildren() { 371e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu return MoreChildren; 372e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu} 373e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 374e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieuvoid ASTDumper::setMoreChildren(bool Value) { 375e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu MoreChildren = Value; 37621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko} 37721c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 378d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpPointer(const void *Ptr) { 3797ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, AddressColor); 380d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' ' << Ptr; 381d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 382d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 38340b66a000dca59be61117558bb54f3880a77cd14Alexander Kornienkovoid ASTDumper::dumpLocation(SourceLocation Loc) { 3847ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, LocationColor); 385df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner SourceLocation SpellingLoc = SM->getSpellingLoc(Loc); 3861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 387e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // The general format we print out is filename:line:col, but we drop pieces 388e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // that haven't changed since the last loc printed. 389b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PresumedLoc PLoc = SM->getPresumedLoc(SpellingLoc); 390b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner 391cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor if (PLoc.isInvalid()) { 392cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor OS << "<invalid sloc>"; 393cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor return; 394cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor } 395cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor 396b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner if (strcmp(PLoc.getFilename(), LastLocFilename) != 0) { 397806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << PLoc.getFilename() << ':' << PLoc.getLine() 398806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << ':' << PLoc.getColumn(); 399b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner LastLocFilename = PLoc.getFilename(); 400b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner LastLocLine = PLoc.getLine(); 401b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner } else if (PLoc.getLine() != LastLocLine) { 402806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "line" << ':' << PLoc.getLine() 403806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << ':' << PLoc.getColumn(); 404b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner LastLocLine = PLoc.getLine(); 405e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } else { 406806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "col" << ':' << PLoc.getColumn(); 407e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } 408e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner} 409e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 410d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpSourceRange(SourceRange R) { 411e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // Can't translate locations if a SourceManager isn't available. 41221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko if (!SM) 41321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko return; 4141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 415806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " <"; 41621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko dumpLocation(R.getBegin()); 417311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner if (R.getBegin() != R.getEnd()) { 418806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << ", "; 41921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko dumpLocation(R.getEnd()); 420e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } 421806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << ">"; 4221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 423e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // <t2.c:123:421[blah], t2.c:412:321> 424e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 425e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner} 426e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 427d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpBareType(QualType T) { 4287ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, TypeColor); 4297ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 43021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko SplitQualType T_split = T.split(); 43121c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko OS << "'" << QualType::getAsString(T_split) << "'"; 43221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 43321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko if (!T.isNull()) { 43421c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko // If the type is sugared, also dump a (shallow) desugared type. 43521c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko SplitQualType D_split = T.getSplitDesugaredType(); 43621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko if (T_split != D_split) 43721c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko OS << ":'" << QualType::getAsString(D_split) << "'"; 43821c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko } 43921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko} 44021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 441d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpType(QualType T) { 442d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' '; 443d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpBareType(T); 444d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 445d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 446ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpBareDeclRef(const Decl *D) { 4477ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu { 4487ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, DeclKindNameColor); 4497ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << D->getDeclKindName(); 4507ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 451d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpPointer(D); 45221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 453ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) { 4547ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, DeclNameColor); 45517828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie OS << " '" << ND->getDeclName() << '\''; 45621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko } 45721c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 458ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko if (const ValueDecl *VD = dyn_cast<ValueDecl>(D)) 45921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko dumpType(VD->getType()); 460d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 461d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 462ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpDeclRef(const Decl *D, const char *Label) { 463d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (!D) 464d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko return; 465d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 466d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko IndentScope Indent(*this); 467d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Label) 468d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << Label << ' '; 469d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpBareDeclRef(D); 470d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 471d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 472ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpName(const NamedDecl *ND) { 4737ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu if (ND->getDeclName()) { 4747ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, DeclNameColor); 475d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' ' << ND->getNameAsString(); 4767ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 477d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 478d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 479e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieubool ASTDumper::hasNodes(const DeclContext *DC) { 480e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (!DC) 481e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu return false; 482e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 483e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith return DC->hasExternalLexicalStorage() || 484e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith DC->noload_decls_begin() != DC->noload_decls_end(); 485e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu} 486e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 487ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpDeclContext(const DeclContext *DC) { 488d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (!DC) 489d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko return; 490e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith bool HasUndeserializedDecls = DC->hasExternalLexicalStorage(); 491e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith for (DeclContext::decl_iterator I = DC->noload_decls_begin(), E = DC->noload_decls_end(); 492e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu I != E; ++I) { 493e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu DeclContext::decl_iterator Next = I; 494e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu ++Next; 495e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith if (Next == E && !HasUndeserializedDecls) 496e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 497d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(*I); 498e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 499e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith if (HasUndeserializedDecls) { 500e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith lastChild(); 501e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith IndentScope Indent(*this); 502e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith ColorScope Color(*this, UndeserializedColor); 503e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith OS << "<undeserialized declarations>"; 504e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith } 505d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 506d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 507c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienkovoid ASTDumper::dumpAttr(const Attr *A) { 508c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko IndentScope Indent(*this); 5097ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu { 5107ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, AttrColor); 5117ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu switch (A->getKind()) { 512c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko#define ATTR(X) case attr::X: OS << #X; break; 513c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko#include "clang/Basic/AttrList.inc" 5147ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu default: llvm_unreachable("unexpected attribute kind"); 5157ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 5167ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << "Attr"; 517c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko } 518c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko dumpPointer(A); 519c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko dumpSourceRange(A->getRange()); 520c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko#include "clang/AST/AttrDump.inc" 521c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko} 522c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko 5234a19052fe91c988885c722252ef03ce5f762a73cRichard Smithstatic Decl *getPreviousDeclImpl(...) { 5244a19052fe91c988885c722252ef03ce5f762a73cRichard Smith return 0; 5254a19052fe91c988885c722252ef03ce5f762a73cRichard Smith} 5264a19052fe91c988885c722252ef03ce5f762a73cRichard Smith 5274a19052fe91c988885c722252ef03ce5f762a73cRichard Smithtemplate<typename T> 5284a19052fe91c988885c722252ef03ce5f762a73cRichard Smithstatic const Decl *getPreviousDeclImpl(const Redeclarable<T> *D) { 5294a19052fe91c988885c722252ef03ce5f762a73cRichard Smith return D->getPreviousDecl(); 5304a19052fe91c988885c722252ef03ce5f762a73cRichard Smith} 5314a19052fe91c988885c722252ef03ce5f762a73cRichard Smith 5324a19052fe91c988885c722252ef03ce5f762a73cRichard Smith/// Get the previous declaration in the redeclaration chain for a declaration. 5334a19052fe91c988885c722252ef03ce5f762a73cRichard Smithstatic const Decl *getPreviousDecl(const Decl *D) { 5344a19052fe91c988885c722252ef03ce5f762a73cRichard Smith switch (D->getKind()) { 5354a19052fe91c988885c722252ef03ce5f762a73cRichard Smith#define DECL(DERIVED, BASE) \ 5364a19052fe91c988885c722252ef03ce5f762a73cRichard Smith case Decl::DERIVED: \ 5374a19052fe91c988885c722252ef03ce5f762a73cRichard Smith return getPreviousDeclImpl(cast<DERIVED##Decl>(D)); 5384a19052fe91c988885c722252ef03ce5f762a73cRichard Smith#define ABSTRACT_DECL(DECL) 5394a19052fe91c988885c722252ef03ce5f762a73cRichard Smith#include "clang/AST/DeclNodes.inc" 5404a19052fe91c988885c722252ef03ce5f762a73cRichard Smith } 5414a19052fe91c988885c722252ef03ce5f762a73cRichard Smith llvm_unreachable("Decl that isn't part of DeclNodes.inc!"); 5424a19052fe91c988885c722252ef03ce5f762a73cRichard Smith} 5434a19052fe91c988885c722252ef03ce5f762a73cRichard Smith 544d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===// 545d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko// C++ Utilities 546d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===// 547d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 548d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpAccessSpecifier(AccessSpecifier AS) { 549d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko switch (AS) { 550d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case AS_none: 551d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 552d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case AS_public: 553d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "public"; 554d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 555d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case AS_protected: 556d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "protected"; 557d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 558d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case AS_private: 559d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "private"; 560d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 561d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 562d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 563d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 564ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpCXXCtorInitializer(const CXXCtorInitializer *Init) { 565d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko IndentScope Indent(*this); 566d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "CXXCtorInitializer"; 567d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Init->isAnyMemberInitializer()) { 568d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' '; 569d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpBareDeclRef(Init->getAnyMember()); 570d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } else { 571d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(QualType(Init->getBaseClass(), 0)); 572d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 573d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(Init->getInit()); 574d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 575d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 576ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpTemplateParameters(const TemplateParameterList *TPL) { 577d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (!TPL) 578d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko return; 579d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 580ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko for (TemplateParameterList::const_iterator I = TPL->begin(), E = TPL->end(); 581d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko I != E; ++I) 582d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(*I); 583d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 584d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 585d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpTemplateArgumentListInfo( 586d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko const TemplateArgumentListInfo &TALI) { 587e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu for (unsigned i = 0, e = TALI.size(); i < e; ++i) { 588e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (i + 1 == e) 589e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 590d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateArgumentLoc(TALI[i]); 591e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 592d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 593d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 594d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpTemplateArgumentLoc(const TemplateArgumentLoc &A) { 595d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateArgument(A.getArgument(), A.getSourceRange()); 596d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 597d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 598d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpTemplateArgumentList(const TemplateArgumentList &TAL) { 599d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko for (unsigned i = 0, e = TAL.size(); i < e; ++i) 600d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateArgument(TAL[i]); 601d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 602d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 603d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpTemplateArgument(const TemplateArgument &A, SourceRange R) { 604d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko IndentScope Indent(*this); 605d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "TemplateArgument"; 606d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (R.isValid()) 607d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpSourceRange(R); 608d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 609d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko switch (A.getKind()) { 610d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TemplateArgument::Null: 611d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " null"; 612d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 613d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TemplateArgument::Type: 614d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " type"; 615e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 616d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(A.getAsType()); 617d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 618d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TemplateArgument::Declaration: 619d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " decl"; 620e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 621d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(A.getAsDecl()); 622d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 623d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TemplateArgument::NullPtr: 624d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " nullptr"; 625d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 626d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TemplateArgument::Integral: 627ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko OS << " integral " << A.getAsIntegral(); 628d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 629d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TemplateArgument::Template: 630d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " template "; 631d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko A.getAsTemplate().dump(OS); 632d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 633d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TemplateArgument::TemplateExpansion: 634d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " template expansion"; 635d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko A.getAsTemplateOrTemplatePattern().dump(OS); 636d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 637d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TemplateArgument::Expression: 638d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " expr"; 639e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 640d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(A.getAsExpr()); 641d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 642d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TemplateArgument::Pack: 643d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " pack"; 644d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko for (TemplateArgument::pack_iterator I = A.pack_begin(), E = A.pack_end(); 645e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu I != E; ++I) { 646e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 647e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 648d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateArgument(*I); 649e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 650d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 65121c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko } 65221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko} 65321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 654e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//===----------------------------------------------------------------------===// 65521c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko// Decl dumping methods. 6566000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 6576000dace22f110d8768476989313e9d981d690d0Chris Lattner 658ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::dumpDecl(const Decl *D) { 659d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko IndentScope Indent(*this); 660d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 661d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (!D) { 6627ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, NullColor); 663d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "<<<NULL>>>"; 664d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko return; 665d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 666d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 6677ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu { 6687ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, DeclKindNameColor); 6697ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << D->getDeclKindName() << "Decl"; 6707ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 671d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpPointer(D); 6724a19052fe91c988885c722252ef03ce5f762a73cRichard Smith if (D->getLexicalDeclContext() != D->getDeclContext()) 6734a19052fe91c988885c722252ef03ce5f762a73cRichard Smith OS << " parent " << cast<Decl>(D->getDeclContext()); 6744a19052fe91c988885c722252ef03ce5f762a73cRichard Smith if (const Decl *Prev = getPreviousDecl(D)) 6754a19052fe91c988885c722252ef03ce5f762a73cRichard Smith OS << " prev " << Prev; 676d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpSourceRange(D->getSourceRange()); 677e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 678ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko bool HasAttrs = D->attr_begin() != D->attr_end(); 6790a74a4ccc4ecfe1a2792ab72c83815323d8fc914Richard Smith const FullComment *Comment = 6800a74a4ccc4ecfe1a2792ab72c83815323d8fc914Richard Smith D->getASTContext().getLocalCommentForDeclUncached(D); 681e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu // Decls within functions are visited by the body 682e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool HasDeclContext = !isa<FunctionDecl>(*D) && !isa<ObjCMethodDecl>(*D) && 683e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu hasNodes(dyn_cast<DeclContext>(D)); 684e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 6850a74a4ccc4ecfe1a2792ab72c83815323d8fc914Richard Smith setMoreChildren(HasAttrs || Comment || HasDeclContext); 686ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko ConstDeclVisitor<ASTDumper>::Visit(D); 687e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 6880a74a4ccc4ecfe1a2792ab72c83815323d8fc914Richard Smith setMoreChildren(Comment || HasDeclContext); 689ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (Decl::attr_iterator I = D->attr_begin(), E = D->attr_end(); 690ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 691ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko if (I + 1 == E) 692ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko lastChild(); 693ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko dumpAttr(*I); 694c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko } 695e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 696e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(HasDeclContext); 697e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 6980a74a4ccc4ecfe1a2792ab72c83815323d8fc914Richard Smith dumpFullComment(Comment); 699e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 700e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(false); 701e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (HasDeclContext) 7024a19052fe91c988885c722252ef03ce5f762a73cRichard Smith dumpDeclContext(cast<DeclContext>(D)); 703d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 704d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 705ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitLabelDecl(const LabelDecl *D) { 706d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 707d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 708d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 709ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitTypedefDecl(const TypedefDecl *D) { 710d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 711d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getUnderlyingType()); 712d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isModulePrivate()) 713d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " __module_private__"; 714d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 715d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 716ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitEnumDecl(const EnumDecl *D) { 717d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isScoped()) { 718d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isScopedUsingClassTag()) 719d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " class"; 720d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko else 721d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " struct"; 722d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 723d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 724d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isModulePrivate()) 725d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " __module_private__"; 726d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isFixed()) 727d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getIntegerType()); 728d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 729d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 730ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitRecordDecl(const RecordDecl *D) { 731d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' ' << D->getKindName(); 732d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 733d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isModulePrivate()) 734d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " __module_private__"; 735d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 736d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 737ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitEnumConstantDecl(const EnumConstantDecl *D) { 738d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 739d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getType()); 740ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko if (const Expr *Init = D->getInitExpr()) { 741e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 742d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(Init); 743e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 744d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 745d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 746ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitIndirectFieldDecl(const IndirectFieldDecl *D) { 747d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 748d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getType()); 749d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko for (IndirectFieldDecl::chain_iterator I = D->chain_begin(), 750ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = D->chain_end(); 751ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 752e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 753e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 754d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(*I); 755e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 756d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 757d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 758ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitFunctionDecl(const FunctionDecl *D) { 759d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 760d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getType()); 761d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 762d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola StorageClass SC = D->getStorageClass(); 763d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (SC != SC_None) 764d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' ' << VarDecl::getStorageClassSpecifierString(SC); 765d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isInlineSpecified()) 766d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " inline"; 767d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isVirtualAsWritten()) 768d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " virtual"; 769d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isModulePrivate()) 770d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " __module_private__"; 771d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 772d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isPure()) 773d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " pure"; 774d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko else if (D->isDeletedAsWritten()) 775d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " delete"; 776d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 777c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith if (const FunctionProtoType *FPT = D->getType()->getAs<FunctionProtoType>()) { 778c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo(); 779c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith switch (EPI.ExceptionSpecType) { 780c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith default: break; 781c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith case EST_Unevaluated: 782c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith OS << " noexcept-unevaluated " << EPI.ExceptionSpecDecl; 783c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith break; 784c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith case EST_Uninstantiated: 785c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith OS << " noexcept-uninstantiated " << EPI.ExceptionSpecTemplate; 786c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith break; 787c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith } 788c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith } 789c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith 790e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool OldMoreChildren = hasMoreChildren(); 791e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu const FunctionTemplateSpecializationInfo *FTSI = 792e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu D->getTemplateSpecializationInfo(); 793e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool HasTemplateSpecialization = FTSI; 794e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 795e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool HasNamedDecls = D->getDeclsInPrototypeScope().begin() != 796e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu D->getDeclsInPrototypeScope().end(); 797e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 798e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool HasFunctionDecls = D->param_begin() != D->param_end(); 799e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 800ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko const CXXConstructorDecl *C = dyn_cast<CXXConstructorDecl>(D); 801e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool HasCtorInitializers = C && C->init_begin() != C->init_end(); 802e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 803e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool HasDeclarationBody = D->doesThisDeclarationHaveABody(); 804e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 805e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(OldMoreChildren || HasNamedDecls || HasFunctionDecls || 806e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu HasCtorInitializers || HasDeclarationBody); 807e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (HasTemplateSpecialization) { 808e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 809d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateArgumentList(*FTSI->TemplateArguments); 810e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 811d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 812e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(OldMoreChildren || HasFunctionDecls || 813e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu HasCtorInitializers || HasDeclarationBody); 814cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko for (ArrayRef<NamedDecl *>::iterator 815d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko I = D->getDeclsInPrototypeScope().begin(), 816e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu E = D->getDeclsInPrototypeScope().end(); I != E; ++I) { 817e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 818e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 819d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(*I); 820e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 821d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 822e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(OldMoreChildren || HasCtorInitializers || HasDeclarationBody); 823ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (FunctionDecl::param_const_iterator I = D->param_begin(), 824ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = D->param_end(); 825e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu I != E; ++I) { 826e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 827e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 828d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(*I); 829e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 830e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 831e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(OldMoreChildren || HasDeclarationBody); 832e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (HasCtorInitializers) 833d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko for (CXXConstructorDecl::init_const_iterator I = C->init_begin(), 834ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = C->init_end(); 835ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 836e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 837e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 838d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpCXXCtorInitializer(*I); 839e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 840d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 841e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(OldMoreChildren); 842e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (HasDeclarationBody) { 843e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 844d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(D->getBody()); 845e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 846d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 847d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 848ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitFieldDecl(const FieldDecl *D) { 849d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 850d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getType()); 851d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isMutable()) 852d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " mutable"; 853d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isModulePrivate()) 854d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " __module_private__"; 855e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 856e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool OldMoreChildren = hasMoreChildren(); 857e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool IsBitField = D->isBitField(); 858e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu Expr *Init = D->getInClassInitializer(); 859e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool HasInit = Init; 860e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 861e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(OldMoreChildren || HasInit); 862e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (IsBitField) { 863e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 864d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(D->getBitWidth()); 865e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 866e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(OldMoreChildren); 867e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (HasInit) { 868e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 869d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(Init); 870e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 871d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 872d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 873ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitVarDecl(const VarDecl *D) { 874d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 875d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getType()); 876d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola StorageClass SC = D->getStorageClass(); 877d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (SC != SC_None) 878d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' ' << VarDecl::getStorageClassSpecifierString(SC); 87938afbc7361d861968232defaeaf8e302af75b5eeRichard Smith switch (D->getTLSKind()) { 88038afbc7361d861968232defaeaf8e302af75b5eeRichard Smith case VarDecl::TLS_None: break; 88138afbc7361d861968232defaeaf8e302af75b5eeRichard Smith case VarDecl::TLS_Static: OS << " tls"; break; 88238afbc7361d861968232defaeaf8e302af75b5eeRichard Smith case VarDecl::TLS_Dynamic: OS << " tls_dynamic"; break; 88338afbc7361d861968232defaeaf8e302af75b5eeRichard Smith } 884d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isModulePrivate()) 885d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " __module_private__"; 886d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isNRVOVariable()) 887d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " nrvo"; 888e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (D->hasInit()) { 889e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 890d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(D->getInit()); 891e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 892d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 893d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 894ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitFileScopeAsmDecl(const FileScopeAsmDecl *D) { 895e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 896d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(D->getAsmString()); 897d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 898d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 899ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitImportDecl(const ImportDecl *D) { 900d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' ' << D->getImportedModule()->getFullModuleName(); 901d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 902d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 903d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===// 904d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko// C++ Declarations 905d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===// 906d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 907ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitNamespaceDecl(const NamespaceDecl *D) { 908d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 909d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isInline()) 910d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " inline"; 911d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (!D->isOriginalNamespace()) 912d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getOriginalNamespace(), "original"); 913d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 914d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 915ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUsingDirectiveDecl(const UsingDirectiveDecl *D) { 916d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' '; 917d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpBareDeclRef(D->getNominatedNamespace()); 918d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 919d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 920ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitNamespaceAliasDecl(const NamespaceAliasDecl *D) { 921d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 922d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getAliasedNamespace()); 923d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 924d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 925ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitTypeAliasDecl(const TypeAliasDecl *D) { 926d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 927d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getUnderlyingType()); 928d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 929d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 930ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitTypeAliasTemplateDecl(const TypeAliasTemplateDecl *D) { 931d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 932d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateParameters(D->getTemplateParameters()); 933d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(D->getTemplatedDecl()); 934d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 935d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 936ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXRecordDecl(const CXXRecordDecl *D) { 937d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko VisitRecordDecl(D); 938d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (!D->isCompleteDefinition()) 939d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko return; 940d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 941ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (CXXRecordDecl::base_class_const_iterator I = D->bases_begin(), 942ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = D->bases_end(); 943ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 944d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko IndentScope Indent(*this); 945d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (I->isVirtual()) 946d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "virtual "; 947d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpAccessSpecifier(I->getAccessSpecifier()); 948d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(I->getType()); 949d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (I->isPackExpansion()) 950d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "..."; 951d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 952d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 953d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 954ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitStaticAssertDecl(const StaticAssertDecl *D) { 955d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(D->getAssertExpr()); 956e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 957d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(D->getMessage()); 958d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 959d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 960ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitFunctionTemplateDecl(const FunctionTemplateDecl *D) { 961d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 962d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateParameters(D->getTemplateParameters()); 963d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(D->getTemplatedDecl()); 964e252a89fc1560ca4cda9a95e4ae05e2dc03ee78cDmitri Gribenko for (FunctionTemplateDecl::spec_iterator I = D->spec_begin(), 965e252a89fc1560ca4cda9a95e4ae05e2dc03ee78cDmitri Gribenko E = D->spec_end(); 966e252a89fc1560ca4cda9a95e4ae05e2dc03ee78cDmitri Gribenko I != E; ++I) { 967e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu FunctionTemplateDecl::spec_iterator Next = I; 968e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu ++Next; 969e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (Next == E) 970e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 971d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko switch (I->getTemplateSpecializationKind()) { 972d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TSK_Undeclared: 973d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TSK_ImplicitInstantiation: 974d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TSK_ExplicitInstantiationDeclaration: 975d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TSK_ExplicitInstantiationDefinition: 9764216ee1ed997b826470864182df34df1a350fcb7Dmitri Gribenko if (D == D->getCanonicalDecl()) 9774216ee1ed997b826470864182df34df1a350fcb7Dmitri Gribenko dumpDecl(*I); 9784216ee1ed997b826470864182df34df1a350fcb7Dmitri Gribenko else 9794216ee1ed997b826470864182df34df1a350fcb7Dmitri Gribenko dumpDeclRef(*I); 980d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 981d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TSK_ExplicitSpecialization: 982d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(*I); 983d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 984d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 985d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 986d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 987d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 988ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitClassTemplateDecl(const ClassTemplateDecl *D) { 989d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 990d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateParameters(D->getTemplateParameters()); 991e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 992e252a89fc1560ca4cda9a95e4ae05e2dc03ee78cDmitri Gribenko ClassTemplateDecl::spec_iterator I = D->spec_begin(); 993e252a89fc1560ca4cda9a95e4ae05e2dc03ee78cDmitri Gribenko ClassTemplateDecl::spec_iterator E = D->spec_end(); 994ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko if (I == E) 995e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 996d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(D->getTemplatedDecl()); 997ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (; I != E; ++I) { 998e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu ClassTemplateDecl::spec_iterator Next = I; 999e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu ++Next; 1000e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (Next == E) 1001e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1002d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko switch (I->getTemplateSpecializationKind()) { 1003d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TSK_Undeclared: 1004d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TSK_ImplicitInstantiation: 10054216ee1ed997b826470864182df34df1a350fcb7Dmitri Gribenko if (D == D->getCanonicalDecl()) 10064216ee1ed997b826470864182df34df1a350fcb7Dmitri Gribenko dumpDecl(*I); 10074216ee1ed997b826470864182df34df1a350fcb7Dmitri Gribenko else 10084216ee1ed997b826470864182df34df1a350fcb7Dmitri Gribenko dumpDeclRef(*I); 1009d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 1010d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TSK_ExplicitSpecialization: 1011d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TSK_ExplicitInstantiationDeclaration: 1012d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TSK_ExplicitInstantiationDefinition: 1013d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(*I); 1014d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 10156000dace22f110d8768476989313e9d981d690d0Chris Lattner } 1016d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 1017d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 10181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1019d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::VisitClassTemplateSpecializationDecl( 1020ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko const ClassTemplateSpecializationDecl *D) { 1021d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko VisitCXXRecordDecl(D); 1022d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateArgumentList(D->getTemplateArgs()); 1023d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 10241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1025d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::VisitClassTemplatePartialSpecializationDecl( 1026ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko const ClassTemplatePartialSpecializationDecl *D) { 1027d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko VisitClassTemplateSpecializationDecl(D); 1028d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateParameters(D->getTemplateParameters()); 1029d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1030d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1031d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::VisitClassScopeFunctionSpecializationDecl( 1032ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko const ClassScopeFunctionSpecializationDecl *D) { 1033d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getSpecialization()); 1034d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->hasExplicitTemplateArgs()) 1035d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateArgumentListInfo(D->templateArgs()); 1036d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1037d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1038ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D) { 1039d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->wasDeclaredWithTypename()) 1040d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " typename"; 1041d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko else 1042d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " class"; 1043d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isParameterPack()) 1044d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " ..."; 1045d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1046d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->hasDefaultArgument()) 1047d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getDefaultArgument()); 1048d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1049d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1050ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitNonTypeTemplateParmDecl(const NonTypeTemplateParmDecl *D) { 1051d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getType()); 1052d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isParameterPack()) 1053d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " ..."; 1054d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1055d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->hasDefaultArgument()) 1056d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(D->getDefaultArgument()); 1057d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1058d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1059ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitTemplateTemplateParmDecl( 1060ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko const TemplateTemplateParmDecl *D) { 1061d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isParameterPack()) 1062d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " ..."; 1063d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1064d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateParameters(D->getTemplateParameters()); 1065d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->hasDefaultArgument()) 1066d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateArgumentLoc(D->getDefaultArgument()); 1067d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1068d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1069ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUsingDecl(const UsingDecl *D) { 1070d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' '; 1071d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy()); 1072d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << D->getNameAsString(); 1073d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1074d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1075ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUnresolvedUsingTypenameDecl( 1076ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko const UnresolvedUsingTypenameDecl *D) { 1077d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' '; 1078d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy()); 1079d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << D->getNameAsString(); 1080d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1081d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1082ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUnresolvedUsingValueDecl(const UnresolvedUsingValueDecl *D) { 1083d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' '; 1084d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy()); 1085d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << D->getNameAsString(); 1086d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getType()); 1087d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1088d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1089ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUsingShadowDecl(const UsingShadowDecl *D) { 1090d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' '; 1091d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpBareDeclRef(D->getTargetDecl()); 1092d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1093d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1094ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitLinkageSpecDecl(const LinkageSpecDecl *D) { 1095d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko switch (D->getLanguage()) { 1096d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case LinkageSpecDecl::lang_c: OS << " C"; break; 1097d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case LinkageSpecDecl::lang_cxx: OS << " C++"; break; 1098d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 1099d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1100d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1101ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitAccessSpecDecl(const AccessSpecDecl *D) { 1102d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' '; 1103d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpAccessSpecifier(D->getAccess()); 1104d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1105d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1106ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitFriendDecl(const FriendDecl *D) { 11074a19052fe91c988885c722252ef03ce5f762a73cRichard Smith lastChild(); 1108d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (TypeSourceInfo *T = D->getFriendType()) 1109d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(T->getType()); 1110d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko else 1111d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(D->getFriendDecl()); 1112d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1113d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1114d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===// 1115d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko// Obj-C Declarations 1116d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===// 1117d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1118ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCIvarDecl(const ObjCIvarDecl *D) { 1119d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1120d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getType()); 1121d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->getSynthesize()) 1122d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " synthesize"; 1123d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1124d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko switch (D->getAccessControl()) { 1125d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case ObjCIvarDecl::None: 1126d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " none"; 1127d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 1128d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case ObjCIvarDecl::Private: 1129d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " private"; 1130d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 1131d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case ObjCIvarDecl::Protected: 1132d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " protected"; 1133d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 1134d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case ObjCIvarDecl::Public: 1135d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " public"; 1136d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 1137d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case ObjCIvarDecl::Package: 1138d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " package"; 1139d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 1140d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 1141d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1142d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1143ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCMethodDecl(const ObjCMethodDecl *D) { 1144d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isInstanceMethod()) 1145d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " -"; 1146d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko else 1147d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " +"; 1148d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1149d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getResultType()); 1150d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1151e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool OldMoreChildren = hasMoreChildren(); 1152e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool IsVariadic = D->isVariadic(); 1153e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool HasBody = D->hasBody(); 1154e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 1155e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(OldMoreChildren || IsVariadic || HasBody); 1156e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (D->isThisDeclarationADefinition()) { 1157e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1158d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclContext(D); 1159e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } else { 1160ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (ObjCMethodDecl::param_const_iterator I = D->param_begin(), 1161ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = D->param_end(); 1162ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 1163e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 1164e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1165d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(*I); 11666000dace22f110d8768476989313e9d981d690d0Chris Lattner } 11676000dace22f110d8768476989313e9d981d690d0Chris Lattner } 1168d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1169e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(OldMoreChildren || HasBody); 1170e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (IsVariadic) { 1171e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1172d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko IndentScope Indent(*this); 1173d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "..."; 1174d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 1175d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1176e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(OldMoreChildren); 1177e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (HasBody) { 1178e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1179d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(D->getBody()); 1180e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 1181d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1182d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1183ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCCategoryDecl(const ObjCCategoryDecl *D) { 1184d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1185d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getClassInterface()); 1186e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (D->protocol_begin() == D->protocol_end()) 1187e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1188d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getImplementation()); 1189d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko for (ObjCCategoryDecl::protocol_iterator I = D->protocol_begin(), 1190ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = D->protocol_end(); 1191ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 1192e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 1193e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1194d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(*I); 1195e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 1196d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1197d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1198ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCCategoryImplDecl(const ObjCCategoryImplDecl *D) { 1199d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1200d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getClassInterface()); 1201e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1202d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getCategoryDecl()); 1203d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1204d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1205ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCProtocolDecl(const ObjCProtocolDecl *D) { 1206d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1207d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko for (ObjCProtocolDecl::protocol_iterator I = D->protocol_begin(), 1208ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = D->protocol_end(); 1209ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 1210e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 1211e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1212d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(*I); 1213e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 1214d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1215d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1216ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCInterfaceDecl(const ObjCInterfaceDecl *D) { 1217d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1218d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getSuperClass(), "super"); 1219e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (D->protocol_begin() == D->protocol_end()) 1220e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1221d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getImplementation()); 1222d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko for (ObjCInterfaceDecl::protocol_iterator I = D->protocol_begin(), 1223ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = D->protocol_end(); 1224ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 1225e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 1226e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1227d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(*I); 1228e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 1229d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1230d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1231ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCImplementationDecl(const ObjCImplementationDecl *D) { 1232d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1233d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getSuperClass(), "super"); 1234e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (D->init_begin() == D->init_end()) 1235e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1236d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getClassInterface()); 1237ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (ObjCImplementationDecl::init_const_iterator I = D->init_begin(), 1238ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = D->init_end(); 1239ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 1240e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 1241e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1242d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpCXXCtorInitializer(*I); 1243e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 1244d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1245d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1246ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCCompatibleAliasDecl(const ObjCCompatibleAliasDecl *D) { 1247d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1248e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1249d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getClassInterface()); 1250d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1251d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1252ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCPropertyDecl(const ObjCPropertyDecl *D) { 1253d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1254d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getType()); 1255d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1256d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->getPropertyImplementation() == ObjCPropertyDecl::Required) 1257d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " required"; 1258d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko else if (D->getPropertyImplementation() == ObjCPropertyDecl::Optional) 1259d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " optional"; 1260d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1261d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko ObjCPropertyDecl::PropertyAttributeKind Attrs = D->getPropertyAttributes(); 1262d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Attrs != ObjCPropertyDecl::OBJC_PR_noattr) { 1263d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Attrs & ObjCPropertyDecl::OBJC_PR_readonly) 1264d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " readonly"; 1265d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Attrs & ObjCPropertyDecl::OBJC_PR_assign) 1266d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " assign"; 1267d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Attrs & ObjCPropertyDecl::OBJC_PR_readwrite) 1268d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " readwrite"; 1269d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Attrs & ObjCPropertyDecl::OBJC_PR_retain) 1270d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " retain"; 1271d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Attrs & ObjCPropertyDecl::OBJC_PR_copy) 1272d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " copy"; 1273d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Attrs & ObjCPropertyDecl::OBJC_PR_nonatomic) 1274d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " nonatomic"; 1275d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Attrs & ObjCPropertyDecl::OBJC_PR_atomic) 1276d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " atomic"; 1277d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Attrs & ObjCPropertyDecl::OBJC_PR_weak) 1278d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " weak"; 1279d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Attrs & ObjCPropertyDecl::OBJC_PR_strong) 1280d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " strong"; 1281d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Attrs & ObjCPropertyDecl::OBJC_PR_unsafe_unretained) 1282d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " unsafe_unretained"; 1283e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (Attrs & ObjCPropertyDecl::OBJC_PR_getter) { 1284e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (!(Attrs & ObjCPropertyDecl::OBJC_PR_setter)) 1285e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1286d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getGetterMethodDecl(), "getter"); 1287e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 1288e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (Attrs & ObjCPropertyDecl::OBJC_PR_setter) { 1289e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1290d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getSetterMethodDecl(), "setter"); 1291e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 1292d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 1293d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1294d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1295ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D) { 1296d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D->getPropertyDecl()); 1297d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize) 1298d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " synthesize"; 1299d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko else 1300d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " dynamic"; 1301d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getPropertyDecl()); 1302e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1303d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getPropertyIvarDecl()); 1304d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1305d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1306ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitBlockDecl(const BlockDecl *D) { 1307ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (BlockDecl::param_const_iterator I = D->param_begin(), E = D->param_end(); 1308d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko I != E; ++I) 1309d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(*I); 1310d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1311d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isVariadic()) { 1312d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko IndentScope Indent(*this); 1313d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "..."; 1314d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 1315d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1316d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->capturesCXXThis()) { 1317d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko IndentScope Indent(*this); 1318d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "capture this"; 1319d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 1320ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (BlockDecl::capture_iterator I = D->capture_begin(), E = D->capture_end(); 1321ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 1322d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko IndentScope Indent(*this); 1323d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "capture"; 1324d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (I->isByRef()) 1325d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " byref"; 1326d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (I->isNested()) 1327d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " nested"; 1328d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (I->getVariable()) { 1329d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' '; 1330d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpBareDeclRef(I->getVariable()); 1331d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 1332d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (I->hasCopyExpr()) 1333d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(I->getCopyExpr()); 1334d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 1335e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1336d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(D->getBody()); 13376000dace22f110d8768476989313e9d981d690d0Chris Lattner} 13386000dace22f110d8768476989313e9d981d690d0Chris Lattner 1339d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko//===----------------------------------------------------------------------===// 134021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko// Stmt dumping methods. 1341d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko//===----------------------------------------------------------------------===// 1342d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko 1343ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::dumpStmt(const Stmt *S) { 1344d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko IndentScope Indent(*this); 1345d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko 1346d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko if (!S) { 13477ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, NullColor); 1348d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko OS << "<<<NULL>>>"; 1349d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko return; 1350d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko } 1351d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko 1352ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko if (const DeclStmt *DS = dyn_cast<DeclStmt>(S)) { 1353d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitDeclStmt(DS); 1354d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko return; 1355d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko } 1356d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko 13577247c88d1e41514a41085f83ebf03dd5220e054aDavid Blaikie setMoreChildren(!S->children().empty()); 1358ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko ConstStmtVisitor<ASTDumper>::Visit(S); 1359e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(false); 1360ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (Stmt::const_child_range CI = S->children(); CI; ++CI) { 1361ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko Stmt::const_child_range Next = CI; 1362e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu ++Next; 1363e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (!Next) 1364e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1365d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko dumpStmt(*CI); 1366e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 1367d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko} 1368d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko 1369ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitStmt(const Stmt *Node) { 13707ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu { 13717ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, StmtColor); 13727ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << Node->getStmtClassName(); 13737ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 1374d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpPointer(Node); 1375d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpSourceRange(Node->getSourceRange()); 1376d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko} 1377d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko 1378ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitDeclStmt(const DeclStmt *Node) { 1379d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitStmt(Node); 1380ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (DeclStmt::const_decl_iterator I = Node->decl_begin(), 1381ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = Node->decl_end(); 1382e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu I != E; ++I) { 1383e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 1384e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1385d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(*I); 1386e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 13875399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek} 13885399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek 1389ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitAttributedStmt(const AttributedStmt *Node) { 1390c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko VisitStmt(Node); 1391ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (ArrayRef<const Attr *>::iterator I = Node->getAttrs().begin(), 1392ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = Node->getAttrs().end(); 1393ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 1394e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 1395e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1396c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko dumpAttr(*I); 1397e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 1398c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko} 1399c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko 1400ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitLabelStmt(const LabelStmt *Node) { 1401d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitStmt(Node); 1402806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " '" << Node->getName() << "'"; 14036000dace22f110d8768476989313e9d981d690d0Chris Lattner} 14046000dace22f110d8768476989313e9d981d690d0Chris Lattner 1405ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitGotoStmt(const GotoStmt *Node) { 1406d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitStmt(Node); 1407d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " '" << Node->getLabel()->getName() << "'"; 1408d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpPointer(Node->getLabel()); 14096000dace22f110d8768476989313e9d981d690d0Chris Lattner} 14106000dace22f110d8768476989313e9d981d690d0Chris Lattner 14116000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 141221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko// Expr dumping methods. 14136000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 14146000dace22f110d8768476989313e9d981d690d0Chris Lattner 1415ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitExpr(const Expr *Node) { 1416d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitStmt(Node); 141721c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko dumpType(Node->getType()); 141821c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 14197ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu { 14207ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, ValueKindColor); 14217ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu switch (Node->getValueKind()) { 14227ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu case VK_RValue: 14237ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu break; 14247ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu case VK_LValue: 14257ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << " lvalue"; 14267ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu break; 14277ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu case VK_XValue: 14287ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << " xvalue"; 14297ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu break; 14307ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 143121c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko } 143221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 14337ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu { 14347ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, ObjectKindColor); 14357ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu switch (Node->getObjectKind()) { 14367ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu case OK_Ordinary: 14377ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu break; 14387ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu case OK_BitField: 14397ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << " bitfield"; 14407ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu break; 14417ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu case OK_ObjCProperty: 14427ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << " objcproperty"; 14437ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu break; 14447ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu case OK_ObjCSubscript: 14457ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << " objcsubscript"; 14467ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu break; 14477ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu case OK_VectorComponent: 14487ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << " vectorcomponent"; 14497ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu break; 14507ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 145121c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko } 14526000dace22f110d8768476989313e9d981d690d0Chris Lattner} 14536000dace22f110d8768476989313e9d981d690d0Chris Lattner 1454ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkostatic void dumpBasePath(raw_ostream &OS, const CastExpr *Node) { 1455f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall if (Node->path_empty()) 14565cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson return; 14575cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson 14585cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << " ("; 14595cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson bool First = true; 1460ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (CastExpr::path_const_iterator I = Node->path_begin(), 1461ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = Node->path_end(); 1462ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 14635cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson const CXXBaseSpecifier *Base = *I; 14645cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson if (!First) 14655cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << " -> "; 146621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 14675cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson const CXXRecordDecl *RD = 14685cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl()); 146921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 14705cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson if (Base->isVirtual()) 14715cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << "virtual "; 14725cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << RD->getName(); 14735cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson First = false; 14745cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson } 147521c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 14765cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << ')'; 14775cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson} 14785cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson 1479ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCastExpr(const CastExpr *Node) { 1480d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 14817ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << " <"; 14827ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu { 14837ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, CastColor); 14847ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << Node->getCastKindName(); 14857ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 148621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko dumpBasePath(OS, Node); 14875cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << ">"; 148827a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson} 148927a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson 1490ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitDeclRefExpr(const DeclRefExpr *Node) { 1491d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1492eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek 1493806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " "; 1494d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpBareDeclRef(Node->getDecl()); 14953aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth if (Node->getDecl() != Node->getFoundDecl()) { 14963aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth OS << " ("; 1497d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpBareDeclRef(Node->getFoundDecl()); 14983aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth OS << ")"; 14993aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth } 15006b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall} 15016b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall 1502ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUnresolvedLookupExpr(const UnresolvedLookupExpr *Node) { 1503d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 15049d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall OS << " ("; 150521c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko if (!Node->requiresADL()) 150621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko OS << "no "; 1507900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer OS << "ADL) = '" << Node->getName() << '\''; 15089d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall 15099d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall UnresolvedLookupExpr::decls_iterator 15109d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall I = Node->decls_begin(), E = Node->decls_end(); 151121c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko if (I == E) 151221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko OS << " empty"; 15139d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall for (; I != E; ++I) 1514d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpPointer(*I); 15159d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall} 15169d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall 1517ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCIvarRefExpr(const ObjCIvarRefExpr *Node) { 1518d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 15193c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff 15207ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu { 15217ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, DeclKindNameColor); 15227ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << " " << Node->getDecl()->getDeclKindName() << "Decl"; 15237ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 15247ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << "='" << *Node->getDecl() << "'"; 1525d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpPointer(Node->getDecl()); 1526218543b10e81ea2269ef6ae34d2d8ddbdec54dbeSteve Naroff if (Node->isFreeIvar()) 1527806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " isFreeIvar"; 15283c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff} 15293c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff 1530ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitPredefinedExpr(const PredefinedExpr *Node) { 1531d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 15326000dace22f110d8768476989313e9d981d690d0Chris Lattner switch (Node->getIdentType()) { 1533b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("unknown case"); 1534806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case PredefinedExpr::Func: OS << " __func__"; break; 1535806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case PredefinedExpr::Function: OS << " __FUNCTION__"; break; 153621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko case PredefinedExpr::LFunction: OS << " L__FUNCTION__"; break; 1537806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case PredefinedExpr::PrettyFunction: OS << " __PRETTY_FUNCTION__";break; 15386000dace22f110d8768476989313e9d981d690d0Chris Lattner } 15396000dace22f110d8768476989313e9d981d690d0Chris Lattner} 15406000dace22f110d8768476989313e9d981d690d0Chris Lattner 1541ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCharacterLiteral(const CharacterLiteral *Node) { 1542d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 15437ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, ValueColor); 154449cf8847ef4d9caebdd162d2a5d7d055333d8b5cRichard Trieu OS << " " << Node->getValue(); 15456000dace22f110d8768476989313e9d981d690d0Chris Lattner} 15466000dace22f110d8768476989313e9d981d690d0Chris Lattner 1547ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitIntegerLiteral(const IntegerLiteral *Node) { 1548d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 15496000dace22f110d8768476989313e9d981d690d0Chris Lattner 15506000dace22f110d8768476989313e9d981d690d0Chris Lattner bool isSigned = Node->getType()->isSignedIntegerType(); 15517ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, ValueColor); 1552806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getValue().toString(10, isSigned); 15536000dace22f110d8768476989313e9d981d690d0Chris Lattner} 155421c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 1555ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitFloatingLiteral(const FloatingLiteral *Node) { 1556d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 15577ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, ValueColor); 1558806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getValueAsApproximateDouble(); 15596000dace22f110d8768476989313e9d981d690d0Chris Lattner} 15605d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner 1561ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitStringLiteral(const StringLiteral *Str) { 1562d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Str); 15637ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, ValueColor); 1564806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " "; 15658ab09da1faaa33b9fa78de59cc4e191bfe9907b5Richard Trieu Str->outputString(OS); 15666000dace22f110d8768476989313e9d981d690d0Chris Lattner} 156717a1a72e70dcbd6257dde644c790a3013113174fChris Lattner 1568ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUnaryOperator(const UnaryOperator *Node) { 1569d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1570806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << (Node->isPostfix() ? "postfix" : "prefix") 1571806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << " '" << UnaryOperator::getOpcodeStr(Node->getOpcode()) << "'"; 15726000dace22f110d8768476989313e9d981d690d0Chris Lattner} 157321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 1574ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUnaryExprOrTypeTraitExpr( 1575ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko const UnaryExprOrTypeTraitExpr *Node) { 1576d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1577f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne switch(Node->getKind()) { 1578f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_SizeOf: 1579d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " sizeof"; 1580f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne break; 1581f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_AlignOf: 1582d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " alignof"; 1583f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne break; 1584f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_VecStep: 1585d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " vec_step"; 1586f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne break; 1587f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne } 15880518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl if (Node->isArgumentType()) 158921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko dumpType(Node->getArgumentType()); 15906000dace22f110d8768476989313e9d981d690d0Chris Lattner} 159113cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner 1592ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitMemberExpr(const MemberExpr *Node) { 1593d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1594d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " " << (Node->isArrow() ? "->" : ".") << *Node->getMemberDecl(); 1595d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpPointer(Node->getMemberDecl()); 15966000dace22f110d8768476989313e9d981d690d0Chris Lattner} 159721c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 1598ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitExtVectorElementExpr(const ExtVectorElementExpr *Node) { 1599d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1600806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getAccessor().getNameStart(); 16016000dace22f110d8768476989313e9d981d690d0Chris Lattner} 160221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 1603ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitBinaryOperator(const BinaryOperator *Node) { 1604d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1605806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode()) << "'"; 1606eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner} 160721c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 1608ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCompoundAssignOperator( 1609ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko const CompoundAssignOperator *Node) { 1610d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1611806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode()) 1612806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << "' ComputeLHSTy="; 1613d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpBareType(Node->getComputationLHSType()); 1614806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " ComputeResultTy="; 1615d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpBareType(Node->getComputationResultType()); 16166000dace22f110d8768476989313e9d981d690d0Chris Lattner} 16176000dace22f110d8768476989313e9d981d690d0Chris Lattner 1618ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitBlockExpr(const BlockExpr *Node) { 1619d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1620d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(Node->getBlockDecl()); 16216b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall} 16226b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall 1623ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitOpaqueValueExpr(const OpaqueValueExpr *Node) { 1624d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 16254b9c2d235fb9449e249d74f48ecfec601650de93John McCall 1626e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (Expr *Source = Node->getSourceExpr()) { 1627e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1628d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko dumpStmt(Source); 1629e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 16304b9c2d235fb9449e249d74f48ecfec601650de93John McCall} 16314b9c2d235fb9449e249d74f48ecfec601650de93John McCall 16326000dace22f110d8768476989313e9d981d690d0Chris Lattner// GNU extensions. 16336000dace22f110d8768476989313e9d981d690d0Chris Lattner 1634ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitAddrLabelExpr(const AddrLabelExpr *Node) { 1635d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1636d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " " << Node->getLabel()->getName(); 1637d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpPointer(Node->getLabel()); 16386000dace22f110d8768476989313e9d981d690d0Chris Lattner} 16396000dace22f110d8768476989313e9d981d690d0Chris Lattner 1640f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===// 1641f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner// C++ Expressions 1642f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===// 16436000dace22f110d8768476989313e9d981d690d0Chris Lattner 1644ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXNamedCastExpr(const CXXNamedCastExpr *Node) { 1645d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 164621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko OS << " " << Node->getCastName() 1647806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << "<" << Node->getTypeAsWritten().getAsString() << ">" 16485cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson << " <" << Node->getCastKindName(); 164921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko dumpBasePath(OS, Node); 16505cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << ">"; 16516000dace22f110d8768476989313e9d981d690d0Chris Lattner} 16526000dace22f110d8768476989313e9d981d690d0Chris Lattner 1653ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *Node) { 1654d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1655806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << (Node->getValue() ? "true" : "false"); 16566000dace22f110d8768476989313e9d981d690d0Chris Lattner} 16576000dace22f110d8768476989313e9d981d690d0Chris Lattner 1658ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXThisExpr(const CXXThisExpr *Node) { 1659d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1660806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " this"; 1661cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor} 1662cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor 1663ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXFunctionalCastExpr(const CXXFunctionalCastExpr *Node) { 1664d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1665cc2fca2ba2716293204901b8d2393428b965f12aEli Friedman OS << " functional cast to " << Node->getTypeAsWritten().getAsString() 1666cc2fca2ba2716293204901b8d2393428b965f12aEli Friedman << " <" << Node->getCastKindName() << ">"; 166749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 166849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 1669ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXConstructExpr(const CXXConstructExpr *Node) { 1670d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1671d4bbdfebe9bd13defa977a934bf73fc2ce3b2817John McCall CXXConstructorDecl *Ctor = Node->getConstructor(); 167221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko dumpType(Ctor->getType()); 16730eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson if (Node->isElidable()) 1674806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " elidable"; 1675f8cf0b028c7a5b632c3a711813cd44a9d9642537John McCall if (Node->requiresZeroInitialization()) 1676f8cf0b028c7a5b632c3a711813cd44a9d9642537John McCall OS << " zeroing"; 16770eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 16780eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 1679ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *Node) { 1680d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1681806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " "; 168221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko dumpCXXTemporary(Node->getTemporary()); 16830eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 16840eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 1685ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitExprWithCleanups(const ExprWithCleanups *Node) { 1686d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1687d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko for (unsigned i = 0, e = Node->getNumObjects(); i != e; ++i) 1688d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(Node->getObject(i), "cleanup"); 16890eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 16900eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 1691ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::dumpCXXTemporary(const CXXTemporary *Temporary) { 1692d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "(CXXTemporary"; 1693d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpPointer(Temporary); 1694d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ")"; 16950eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 16960eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 16975508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===// 16985508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// Obj-C Expressions 16995508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===// 17005508518a2702b00be3b15a26d772bde968972f54Anders Carlsson 1701ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCMessageExpr(const ObjCMessageExpr *Node) { 1702d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1703806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " selector=" << Node->getSelector().getAsString(); 170404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor switch (Node->getReceiverKind()) { 170504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Instance: 170604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 170704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 170804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Class: 170904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor OS << " class="; 1710d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpBareType(Node->getClassReceiver()); 171104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 171204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 171304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperInstance: 171404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor OS << " super (instance)"; 171504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 171604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 171704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperClass: 171804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor OS << " super (class)"; 171904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 172004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 1721b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek} 1722b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek 1723ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCBoxedExpr(const ObjCBoxedExpr *Node) { 1724d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 172536faaddccf519231a3facd26495e895ba5a28776Argyrios Kyrtzidis OS << " selector=" << Node->getBoxingMethod()->getSelector().getAsString(); 172636faaddccf519231a3facd26495e895ba5a28776Argyrios Kyrtzidis} 172736faaddccf519231a3facd26495e895ba5a28776Argyrios Kyrtzidis 1728ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCAtCatchStmt(const ObjCAtCatchStmt *Node) { 1729d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitStmt(Node); 1730ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko if (const VarDecl *CatchParam = Node->getCatchParamDecl()) 1731d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko dumpDecl(CatchParam); 1732d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko else 17338f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor OS << " catch all"; 17348f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor} 17358f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor 1736ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCEncodeExpr(const ObjCEncodeExpr *Node) { 1737d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 173821c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko dumpType(Node->getEncodedType()); 1739f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson} 1740f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson 1741ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCSelectorExpr(const ObjCSelectorExpr *Node) { 1742d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 17431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1744806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getSelector().getAsString(); 1745b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian} 1746b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian 1747ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCProtocolExpr(const ObjCProtocolExpr *Node) { 1748d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 17491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 175021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko OS << ' ' << *Node->getProtocol(); 1751390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian} 17527f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar 1753ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr *Node) { 1754d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 175512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall if (Node->isImplicitProperty()) { 175699130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian OS << " Kind=MethodRef Getter=\""; 175799130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian if (Node->getImplicitPropertyGetter()) 175899130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian OS << Node->getImplicitPropertyGetter()->getSelector().getAsString(); 175999130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian else 176099130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian OS << "(null)"; 176199130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian 176299130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian OS << "\" Setter=\""; 176312f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall if (ObjCMethodDecl *Setter = Node->getImplicitPropertySetter()) 176412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall OS << Setter->getSelector().getAsString(); 176512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall else 176612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall OS << "(null)"; 176712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall OS << "\""; 176812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall } else { 1769b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer OS << " Kind=PropertyRef Property=\"" << *Node->getExplicitProperty() <<'"'; 177012f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall } 17711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17728ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian if (Node->isSuperReceiver()) 17738ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian OS << " super"; 1774b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis 1775b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis OS << " Messaging="; 1776b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis if (Node->isMessagingGetter() && Node->isMessagingSetter()) 1777b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis OS << "Getter&Setter"; 1778b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis else if (Node->isMessagingGetter()) 1779b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis OS << "Getter"; 1780b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis else if (Node->isMessagingSetter()) 1781b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis OS << "Setter"; 1782cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor} 1783cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor 1784ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCSubscriptRefExpr(const ObjCSubscriptRefExpr *Node) { 1785d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1786ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek if (Node->isArraySubscriptRefExpr()) 1787ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << " Kind=ArraySubscript GetterForArray=\""; 1788ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek else 1789ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << " Kind=DictionarySubscript GetterForDictionary=\""; 1790ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek if (Node->getAtIndexMethodDecl()) 1791ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << Node->getAtIndexMethodDecl()->getSelector().getAsString(); 1792ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek else 1793ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << "(null)"; 179421c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 1795ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek if (Node->isArraySubscriptRefExpr()) 1796ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << "\" SetterForArray=\""; 1797ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek else 1798ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << "\" SetterForDictionary=\""; 1799ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek if (Node->setAtIndexMethodDecl()) 1800ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << Node->setAtIndexMethodDecl()->getSelector().getAsString(); 1801ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek else 1802ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << "(null)"; 1803ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek} 1804ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 1805ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *Node) { 1806d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1807ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << " " << (Node->getValue() ? "__objc_yes" : "__objc_no"); 1808ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek} 1809ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 18106000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 1811acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko// Comments 1812acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko//===----------------------------------------------------------------------===// 1813acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1814acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkoconst char *ASTDumper::getCommandName(unsigned CommandID) { 1815acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (Traits) 1816acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko return Traits->getCommandInfo(CommandID)->Name; 1817acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko const CommandInfo *Info = CommandTraits::getBuiltinCommandInfo(CommandID); 1818acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (Info) 1819acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko return Info->Name; 1820acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko return "<not a builtin command>"; 1821acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1822acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1823acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::dumpFullComment(const FullComment *C) { 1824acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (!C) 1825acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko return; 1826acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1827acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko FC = C; 1828acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko dumpComment(C); 1829acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko FC = 0; 1830acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1831acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1832acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::dumpComment(const Comment *C) { 1833acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko IndentScope Indent(*this); 1834acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1835acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (!C) { 18367ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, NullColor); 1837acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << "<<<NULL>>>"; 1838acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko return; 1839acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko } 1840acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 18417ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu { 18427ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, CommentColor); 18437ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << C->getCommentKindName(); 18447ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 1845acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko dumpPointer(C); 1846acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko dumpSourceRange(C->getSourceRange()); 1847acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko ConstCommentVisitor<ASTDumper>::visit(C); 1848acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko for (Comment::child_iterator I = C->child_begin(), E = C->child_end(); 1849e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu I != E; ++I) { 1850e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 1851e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1852acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko dumpComment(*I); 1853e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 1854acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1855acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1856acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitTextComment(const TextComment *C) { 1857acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Text=\"" << C->getText() << "\""; 1858acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1859acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1860acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitInlineCommandComment(const InlineCommandComment *C) { 1861acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Name=\"" << getCommandName(C->getCommandID()) << "\""; 1862acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko switch (C->getRenderKind()) { 1863acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko case InlineCommandComment::RenderNormal: 1864acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " RenderNormal"; 1865acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko break; 1866acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko case InlineCommandComment::RenderBold: 1867acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " RenderBold"; 1868acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko break; 1869acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko case InlineCommandComment::RenderMonospaced: 1870acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " RenderMonospaced"; 1871acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko break; 1872acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko case InlineCommandComment::RenderEmphasized: 1873acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " RenderEmphasized"; 1874acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko break; 1875acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko } 1876acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1877acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko for (unsigned i = 0, e = C->getNumArgs(); i != e; ++i) 1878acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Arg[" << i << "]=\"" << C->getArgText(i) << "\""; 1879acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1880acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1881acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitHTMLStartTagComment(const HTMLStartTagComment *C) { 1882acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Name=\"" << C->getTagName() << "\""; 1883acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (C->getNumAttrs() != 0) { 1884acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Attrs: "; 1885acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko for (unsigned i = 0, e = C->getNumAttrs(); i != e; ++i) { 1886acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko const HTMLStartTagComment::Attribute &Attr = C->getAttr(i); 1887acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " \"" << Attr.Name << "=\"" << Attr.Value << "\""; 1888acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko } 1889acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko } 1890acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (C->isSelfClosing()) 1891acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " SelfClosing"; 1892acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1893acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1894acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitHTMLEndTagComment(const HTMLEndTagComment *C) { 1895acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Name=\"" << C->getTagName() << "\""; 1896acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1897acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1898acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitBlockCommandComment(const BlockCommandComment *C) { 1899acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Name=\"" << getCommandName(C->getCommandID()) << "\""; 1900acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko for (unsigned i = 0, e = C->getNumArgs(); i != e; ++i) 1901acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Arg[" << i << "]=\"" << C->getArgText(i) << "\""; 1902acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1903acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1904acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitParamCommandComment(const ParamCommandComment *C) { 1905acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " " << ParamCommandComment::getDirectionAsString(C->getDirection()); 1906acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1907acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (C->isDirectionExplicit()) 1908acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " explicitly"; 1909acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko else 1910acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " implicitly"; 1911acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1912acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (C->hasParamName()) { 1913acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (C->isParamIndexValid()) 1914acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Param=\"" << C->getParamName(FC) << "\""; 1915acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko else 1916acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Param=\"" << C->getParamNameAsWritten() << "\""; 1917acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko } 1918acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1919acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (C->isParamIndexValid()) 1920acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " ParamIndex=" << C->getParamIndex(); 1921acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1922acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1923acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitTParamCommandComment(const TParamCommandComment *C) { 1924acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (C->hasParamName()) { 1925acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (C->isPositionValid()) 1926acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Param=\"" << C->getParamName(FC) << "\""; 1927acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko else 1928acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Param=\"" << C->getParamNameAsWritten() << "\""; 1929acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko } 1930acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1931acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (C->isPositionValid()) { 1932acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Position=<"; 1933acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko for (unsigned i = 0, e = C->getDepth(); i != e; ++i) { 1934acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << C->getIndex(i); 1935acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (i != e - 1) 1936acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << ", "; 1937acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko } 1938acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << ">"; 1939acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko } 1940acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1941acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1942acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitVerbatimBlockComment(const VerbatimBlockComment *C) { 1943acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Name=\"" << getCommandName(C->getCommandID()) << "\"" 1944acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko " CloseName=\"" << C->getCloseName() << "\""; 1945acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1946acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1947acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitVerbatimBlockLineComment( 1948acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko const VerbatimBlockLineComment *C) { 1949acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Text=\"" << C->getText() << "\""; 1950acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1951acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1952acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitVerbatimLineComment(const VerbatimLineComment *C) { 1953acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Text=\"" << C->getText() << "\""; 1954acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1955acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1956acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko//===----------------------------------------------------------------------===// 1957d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko// Decl method implementations 1958d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===// 1959d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1960d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid Decl::dump() const { 1961d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dump(llvm::errs()); 1962d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1963d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1964d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid Decl::dump(raw_ostream &OS) const { 1965acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko ASTDumper P(OS, &getASTContext().getCommentCommandTraits(), 1966acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko &getASTContext().getSourceManager()); 1967ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko P.dumpDecl(this); 1968d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1969d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 19707ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieuvoid Decl::dumpColor() const { 19717ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ASTDumper P(llvm::errs(), &getASTContext().getCommentCommandTraits(), 19727ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu &getASTContext().getSourceManager(), /*ShowColors*/true); 1973ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko P.dumpDecl(this); 19747ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu} 1975d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===// 19766000dace22f110d8768476989313e9d981d690d0Chris Lattner// Stmt method implementations 19776000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 19786000dace22f110d8768476989313e9d981d690d0Chris Lattner 1979e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattnervoid Stmt::dump(SourceManager &SM) const { 19809668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis dump(llvm::errs(), SM); 19819668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis} 19829668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis 19835f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid Stmt::dump(raw_ostream &OS, SourceManager &SM) const { 1984acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko ASTDumper P(OS, 0, &SM); 1985ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko P.dumpStmt(this); 19860c727a35718556866a978f64ac549d9798735f08Chris Lattner} 19870c727a35718556866a978f64ac549d9798735f08Chris Lattner 19886000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dump() const { 1989acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko ASTDumper P(llvm::errs(), 0, 0); 1990ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko P.dumpStmt(this); 19916000dace22f110d8768476989313e9d981d690d0Chris Lattner} 1992acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 19937ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieuvoid Stmt::dumpColor() const { 19947ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ASTDumper P(llvm::errs(), 0, 0, /*ShowColors*/true); 1995ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko P.dumpStmt(this); 19967ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu} 19977ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 1998acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko//===----------------------------------------------------------------------===// 1999acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko// Comment method implementations 2000acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko//===----------------------------------------------------------------------===// 2001acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 2002acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid Comment::dump() const { 2003acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko dump(llvm::errs(), 0, 0); 2004acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 2005acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 2006acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid Comment::dump(const ASTContext &Context) const { 2007acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko dump(llvm::errs(), &Context.getCommentCommandTraits(), 2008acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko &Context.getSourceManager()); 2009acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 2010acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 201151ccafd66682ecbccc0a63364291dc7a8f6ec0f0Alexander Kornienkovoid Comment::dump(raw_ostream &OS, const CommandTraits *Traits, 2012acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko const SourceManager *SM) const { 2013acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko const FullComment *FC = dyn_cast<FullComment>(this); 2014acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko ASTDumper D(OS, Traits, SM); 2015acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko D.dumpFullComment(FC); 2016acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 20177ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 20187ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieuvoid Comment::dumpColor() const { 20197ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu const FullComment *FC = dyn_cast<FullComment>(this); 20207ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ASTDumper D(llvm::errs(), 0, 0, /*ShowColors*/true); 20217ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu D.dumpFullComment(FC); 20227ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu} 2023