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" 196e322c08b187ba93019732d2295c84c339813e0dRichard Smith#include "clang/AST/DeclLookups.h" 2055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/DeclObjC.h" 21d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko#include "clang/AST/DeclVisitor.h" 2255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/StmtVisitor.h" 23d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko#include "clang/Basic/Module.h" 24e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner#include "clang/Basic/SourceManager.h" 25806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar#include "llvm/Support/raw_ostream.h" 266000dace22f110d8768476989313e9d981d690d0Chris Lattnerusing namespace clang; 27acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkousing namespace clang::comments; 286000dace22f110d8768476989313e9d981d690d0Chris Lattner 296000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 3040b66a000dca59be61117558bb54f3880a77cd14Alexander Kornienko// ASTDumper Visitor 316000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 326000dace22f110d8768476989313e9d981d690d0Chris Lattner 336000dace22f110d8768476989313e9d981d690d0Chris Lattnernamespace { 347ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // Colors used for various parts of the AST dump 357ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 367ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu struct TerminalColor { 377ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu raw_ostream::Colors Color; 387ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu bool Bold; 397ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu }; 407ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 417ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // Decl kind names (VarDecl, FunctionDecl, etc) 427ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor DeclKindNameColor = { raw_ostream::GREEN, true }; 437ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // Attr names (CleanupAttr, GuardedByAttr, etc) 447ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor AttrColor = { raw_ostream::BLUE, true }; 457ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // Statement names (DeclStmt, ImplicitCastExpr, etc) 467ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor StmtColor = { raw_ostream::MAGENTA, true }; 477ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // Comment names (FullComment, ParagraphComment, TextComment, etc) 487ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor CommentColor = { raw_ostream::YELLOW, true }; 497ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 507ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // Type names (int, float, etc, plus user defined types) 517ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor TypeColor = { raw_ostream::GREEN, false }; 527ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 537ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // Pointer address 547ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor AddressColor = { raw_ostream::YELLOW, false }; 557ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // Source locations 567ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor LocationColor = { raw_ostream::YELLOW, false }; 577ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 587ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // lvalue/xvalue 597ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor ValueKindColor = { raw_ostream::CYAN, false }; 607ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // bitfield/objcproperty/objcsubscript/vectorcomponent 617ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor ObjectKindColor = { raw_ostream::CYAN, false }; 627ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 637ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // Null statements 647ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor NullColor = { raw_ostream::BLUE, false }; 657ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 66e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith // Undeserialized entities 67e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith static const TerminalColor UndeserializedColor = { raw_ostream::GREEN, true }; 68e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith 697ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // CastKind from CastExpr's 707ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor CastColor = { raw_ostream::RED, false }; 717ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 727ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // Value of the statement 737ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor ValueColor = { raw_ostream::CYAN, true }; 747ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu // Decl names 757ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu static const TerminalColor DeclNameColor = { raw_ostream::CYAN, true }; 767ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 77e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu // Indents ( `, -. | ) 78e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu static const TerminalColor IndentColor = { raw_ostream::BLUE, false }; 79e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 80d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko class ASTDumper 81ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko : public ConstDeclVisitor<ASTDumper>, public ConstStmtVisitor<ASTDumper>, 82acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko public ConstCommentVisitor<ASTDumper> { 835f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner raw_ostream &OS; 84acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko const CommandTraits *Traits; 85acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko const SourceManager *SM; 86cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek bool IsFirstLine; 871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 88e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu // Indicates whether more child are expected at the current tree depth 89e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu enum IndentType { IT_Child, IT_LastChild }; 90e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 91e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu /// Indents[i] indicates if another child exists at level i. 92e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu /// Used by Indent() to print the tree structure. 93e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu llvm::SmallVector<IndentType, 32> Indents; 94e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 95e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu /// Indicates that more children will be needed at this indent level. 96e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu /// If true, prevents lastChild() from marking the node as the last child. 97e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu /// This is used when there are multiple collections of children to be 98e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu /// dumped as well as during conditional node dumping. 99e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool MoreChildren; 100e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 10121c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko /// Keep track of the last location we print out so that we can 10221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko /// print out deltas from then on out. 103e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner const char *LastLocFilename; 104e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner unsigned LastLocLine; 105d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor 106acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko /// The \c FullComment parent of the comment being dumped. 107acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko const FullComment *FC; 108acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1097ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu bool ShowColors; 1107ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 111cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek class IndentScope { 11240b66a000dca59be61117558bb54f3880a77cd14Alexander Kornienko ASTDumper &Dumper; 113e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu // Preserve the Dumper's MoreChildren value from the previous IndentScope 114e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool MoreChildren; 115cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek public: 11640b66a000dca59be61117558bb54f3880a77cd14Alexander Kornienko IndentScope(ASTDumper &Dumper) : Dumper(Dumper) { 117e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu MoreChildren = Dumper.hasMoreChildren(); 118e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu Dumper.setMoreChildren(false); 119cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek Dumper.indent(); 120cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek } 121cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek ~IndentScope() { 122e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu Dumper.setMoreChildren(MoreChildren); 123cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek Dumper.unindent(); 124cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek } 125cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek }; 126cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek 1277ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu class ColorScope { 1287ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ASTDumper &Dumper; 1297ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu public: 1307ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope(ASTDumper &Dumper, TerminalColor Color) 1317ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu : Dumper(Dumper) { 1327ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu if (Dumper.ShowColors) 1337ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu Dumper.OS.changeColor(Color.Color, Color.Bold); 1347ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 1357ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ~ColorScope() { 1367ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu if (Dumper.ShowColors) 1377ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu Dumper.OS.resetColor(); 1387ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 1397ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu }; 1407ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 1416000dace22f110d8768476989313e9d981d690d0Chris Lattner public: 142acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko ASTDumper(raw_ostream &OS, const CommandTraits *Traits, 143acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko const SourceManager *SM) 14495f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith : OS(OS), Traits(Traits), SM(SM), IsFirstLine(true), MoreChildren(false), 14595f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith LastLocFilename(""), LastLocLine(~0U), FC(0), 1467ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ShowColors(SM && SM->getDiagnostics().getShowColors()) { } 1477ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 1487ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ASTDumper(raw_ostream &OS, const CommandTraits *Traits, 1497ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu const SourceManager *SM, bool ShowColors) 15095f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith : OS(OS), Traits(Traits), SM(SM), IsFirstLine(true), MoreChildren(false), 15195f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith LastLocFilename(""), LastLocLine(~0U), 152e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu ShowColors(ShowColors) { } 1531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15440b66a000dca59be61117558bb54f3880a77cd14Alexander Kornienko ~ASTDumper() { 155cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek OS << "\n"; 156cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek } 157cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek 158ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void dumpDecl(const Decl *D); 159ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void dumpStmt(const Stmt *S); 160acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void dumpFullComment(const FullComment *C); 1611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 162e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu // Formatting 16321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko void indent(); 16421c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko void unindent(); 165e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu void lastChild(); 166e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool hasMoreChildren(); 167e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu void setMoreChildren(bool Value); 168e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 169e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu // Utilities 170d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko void dumpPointer(const void *Ptr); 171d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko void dumpSourceRange(SourceRange R); 17221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko void dumpLocation(SourceLocation Loc); 173d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko void dumpBareType(QualType T); 17421c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko void dumpType(QualType T); 175ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko void dumpBareDeclRef(const Decl *Node); 176c939453846395abc860cdb0239784daf4df4fb54Alexander Kornienko void dumpDeclRef(const Decl *Node, const char *Label = 0); 177ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko void dumpName(const NamedDecl *D); 178e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool hasNodes(const DeclContext *DC); 179ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko void dumpDeclContext(const DeclContext *DC); 1806e322c08b187ba93019732d2295c84c339813e0dRichard Smith void dumpLookups(const DeclContext *DC); 181c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko void dumpAttr(const Attr *A); 182d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 183d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko // C++ Utilities 184d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko void dumpAccessSpecifier(AccessSpecifier AS); 185ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko void dumpCXXCtorInitializer(const CXXCtorInitializer *Init); 186ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko void dumpTemplateParameters(const TemplateParameterList *TPL); 187d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko void dumpTemplateArgumentListInfo(const TemplateArgumentListInfo &TALI); 188d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko void dumpTemplateArgumentLoc(const TemplateArgumentLoc &A); 189d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko void dumpTemplateArgumentList(const TemplateArgumentList &TAL); 190d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko void dumpTemplateArgument(const TemplateArgument &A, 191d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko SourceRange R = SourceRange()); 192d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 193d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko // Decls 194ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitLabelDecl(const LabelDecl *D); 195ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitTypedefDecl(const TypedefDecl *D); 196ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitEnumDecl(const EnumDecl *D); 197ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitRecordDecl(const RecordDecl *D); 198ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitEnumConstantDecl(const EnumConstantDecl *D); 199ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitIndirectFieldDecl(const IndirectFieldDecl *D); 200ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitFunctionDecl(const FunctionDecl *D); 201ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitFieldDecl(const FieldDecl *D); 202ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitVarDecl(const VarDecl *D); 203ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitFileScopeAsmDecl(const FileScopeAsmDecl *D); 204ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitImportDecl(const ImportDecl *D); 205d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 206d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko // C++ Decls 207ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitNamespaceDecl(const NamespaceDecl *D); 208ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitUsingDirectiveDecl(const UsingDirectiveDecl *D); 209ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitNamespaceAliasDecl(const NamespaceAliasDecl *D); 210ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitTypeAliasDecl(const TypeAliasDecl *D); 211ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitTypeAliasTemplateDecl(const TypeAliasTemplateDecl *D); 212ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitCXXRecordDecl(const CXXRecordDecl *D); 213ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitStaticAssertDecl(const StaticAssertDecl *D); 214ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitFunctionTemplateDecl(const FunctionTemplateDecl *D); 215ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitClassTemplateDecl(const ClassTemplateDecl *D); 216d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko void VisitClassTemplateSpecializationDecl( 217ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko const ClassTemplateSpecializationDecl *D); 218d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko void VisitClassTemplatePartialSpecializationDecl( 219ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko const ClassTemplatePartialSpecializationDecl *D); 220d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko void VisitClassScopeFunctionSpecializationDecl( 221ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko const ClassScopeFunctionSpecializationDecl *D); 222ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D); 223ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitNonTypeTemplateParmDecl(const NonTypeTemplateParmDecl *D); 224ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitTemplateTemplateParmDecl(const TemplateTemplateParmDecl *D); 225ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitUsingDecl(const UsingDecl *D); 226ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitUnresolvedUsingTypenameDecl(const UnresolvedUsingTypenameDecl *D); 227ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitUnresolvedUsingValueDecl(const UnresolvedUsingValueDecl *D); 228ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitUsingShadowDecl(const UsingShadowDecl *D); 229ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitLinkageSpecDecl(const LinkageSpecDecl *D); 230ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitAccessSpecDecl(const AccessSpecDecl *D); 231ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitFriendDecl(const FriendDecl *D); 232d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 233d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko // ObjC Decls 234ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCIvarDecl(const ObjCIvarDecl *D); 235ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCMethodDecl(const ObjCMethodDecl *D); 236ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCCategoryDecl(const ObjCCategoryDecl *D); 237ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCCategoryImplDecl(const ObjCCategoryImplDecl *D); 238ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCProtocolDecl(const ObjCProtocolDecl *D); 239ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCInterfaceDecl(const ObjCInterfaceDecl *D); 240ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCImplementationDecl(const ObjCImplementationDecl *D); 241ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCCompatibleAliasDecl(const ObjCCompatibleAliasDecl *D); 242ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCPropertyDecl(const ObjCPropertyDecl *D); 243ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D); 244ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitBlockDecl(const BlockDecl *D); 2451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // Stmts. 247ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitStmt(const Stmt *Node); 248ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitDeclStmt(const DeclStmt *Node); 249ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitAttributedStmt(const AttributedStmt *Node); 250ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitLabelStmt(const LabelStmt *Node); 251ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitGotoStmt(const GotoStmt *Node); 2521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // Exprs 254ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitExpr(const Expr *Node); 255ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitCastExpr(const CastExpr *Node); 256ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitDeclRefExpr(const DeclRefExpr *Node); 257ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitPredefinedExpr(const PredefinedExpr *Node); 258ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitCharacterLiteral(const CharacterLiteral *Node); 259ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitIntegerLiteral(const IntegerLiteral *Node); 260ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitFloatingLiteral(const FloatingLiteral *Node); 261ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitStringLiteral(const StringLiteral *Str); 262ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitUnaryOperator(const UnaryOperator *Node); 263ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *Node); 264ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitMemberExpr(const MemberExpr *Node); 265ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitExtVectorElementExpr(const ExtVectorElementExpr *Node); 266ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitBinaryOperator(const BinaryOperator *Node); 267ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitCompoundAssignOperator(const CompoundAssignOperator *Node); 268ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitAddrLabelExpr(const AddrLabelExpr *Node); 269ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitBlockExpr(const BlockExpr *Node); 270ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitOpaqueValueExpr(const OpaqueValueExpr *Node); 27117a1a72e70dcbd6257dde644c790a3013113174fChris Lattner 27217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // C++ 273ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitCXXNamedCastExpr(const CXXNamedCastExpr *Node); 274ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *Node); 275ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitCXXThisExpr(const CXXThisExpr *Node); 276ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitCXXFunctionalCastExpr(const CXXFunctionalCastExpr *Node); 277ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitCXXConstructExpr(const CXXConstructExpr *Node); 278ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *Node); 279211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith void VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *Node); 280ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitExprWithCleanups(const ExprWithCleanups *Node); 281ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitUnresolvedLookupExpr(const UnresolvedLookupExpr *Node); 282ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void dumpCXXTemporary(const CXXTemporary *Temporary); 2831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // ObjC 285ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCAtCatchStmt(const ObjCAtCatchStmt *Node); 286ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCEncodeExpr(const ObjCEncodeExpr *Node); 287ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCMessageExpr(const ObjCMessageExpr *Node); 288ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCBoxedExpr(const ObjCBoxedExpr *Node); 289ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCSelectorExpr(const ObjCSelectorExpr *Node); 290ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCProtocolExpr(const ObjCProtocolExpr *Node); 291ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr *Node); 292ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCSubscriptRefExpr(const ObjCSubscriptRefExpr *Node); 293ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCIvarRefExpr(const ObjCIvarRefExpr *Node); 294ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko void VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *Node); 295acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 296acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko // Comments. 297acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko const char *getCommandName(unsigned CommandID); 298acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void dumpComment(const Comment *C); 299acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 300acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko // Inline comments. 301acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void visitTextComment(const TextComment *C); 302acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void visitInlineCommandComment(const InlineCommandComment *C); 303acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void visitHTMLStartTagComment(const HTMLStartTagComment *C); 304acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void visitHTMLEndTagComment(const HTMLEndTagComment *C); 305acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 306acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko // Block comments. 307acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void visitBlockCommandComment(const BlockCommandComment *C); 308acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void visitParamCommandComment(const ParamCommandComment *C); 309acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void visitTParamCommandComment(const TParamCommandComment *C); 310acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void visitVerbatimBlockComment(const VerbatimBlockComment *C); 311acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void visitVerbatimBlockLineComment(const VerbatimBlockLineComment *C); 312acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko void visitVerbatimLineComment(const VerbatimLineComment *C); 3136000dace22f110d8768476989313e9d981d690d0Chris Lattner }; 3146000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3156000dace22f110d8768476989313e9d981d690d0Chris Lattner 3166000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 317e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner// Utilities 318e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//===----------------------------------------------------------------------===// 319e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 320e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// Print out the appropriate tree structure using the Indents vector. 321e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// Example of tree and the Indents vector at each level. 322e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// A { } 323e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// |-B { IT_Child } 324e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// | `-C { IT_Child, IT_LastChild } 325e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// `-D { IT_LastChild } 326e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// |-E { IT_LastChild, IT_Child } 327e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// `-F { IT_LastChild, IT_LastChild } 328e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// Type non-last element, last element 329e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// IT_Child "| " "|-" 330e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// IT_LastChild " " "`-" 33140b66a000dca59be61117558bb54f3880a77cd14Alexander Kornienkovoid ASTDumper::indent() { 33221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko if (IsFirstLine) 33321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko IsFirstLine = false; 33421c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko else 33521c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko OS << "\n"; 336e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 337e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu ColorScope Color(*this, IndentColor); 33809d19efaa147762f84aed55efa7930bb3616a4e5Craig Topper for (SmallVectorImpl<IndentType>::const_iterator I = Indents.begin(), 33909d19efaa147762f84aed55efa7930bb3616a4e5Craig Topper E = Indents.end(); 340e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu I != E; ++I) { 341e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu switch (*I) { 34295f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith case IT_Child: 34395f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith if (I == E - 1) 34495f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith OS << "|-"; 34595f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith else 34695f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith OS << "| "; 34795f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith continue; 34895f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith case IT_LastChild: 34995f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith if (I == E - 1) 35095f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith OS << "`-"; 35195f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith else 35295f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith OS << " "; 35395f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith continue; 354e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 35595f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith llvm_unreachable("Invalid IndentType"); 356e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 357e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu Indents.push_back(IT_Child); 35821c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko} 35921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 36040b66a000dca59be61117558bb54f3880a77cd14Alexander Kornienkovoid ASTDumper::unindent() { 361e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu Indents.pop_back(); 362e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu} 363e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 364e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// Call before each potential last child node is to be dumped. If MoreChildren 365e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// is false, then this is the last child, otherwise treat as a regular node. 366e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieuvoid ASTDumper::lastChild() { 367e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (!hasMoreChildren()) 368e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu Indents.back() = IT_LastChild; 369e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu} 370e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 371e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// MoreChildren should be set before calling another function that may print 372e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu// additional nodes to prevent conflicting final child nodes. 373e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieubool ASTDumper::hasMoreChildren() { 374e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu return MoreChildren; 375e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu} 376e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 377e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieuvoid ASTDumper::setMoreChildren(bool Value) { 378e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu MoreChildren = Value; 37921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko} 38021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 381d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpPointer(const void *Ptr) { 3827ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, AddressColor); 383d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' ' << Ptr; 384d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 385d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 38640b66a000dca59be61117558bb54f3880a77cd14Alexander Kornienkovoid ASTDumper::dumpLocation(SourceLocation Loc) { 3877ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, LocationColor); 388df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner SourceLocation SpellingLoc = SM->getSpellingLoc(Loc); 3891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 390e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // The general format we print out is filename:line:col, but we drop pieces 391e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // that haven't changed since the last loc printed. 392b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PresumedLoc PLoc = SM->getPresumedLoc(SpellingLoc); 393b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner 394cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor if (PLoc.isInvalid()) { 395cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor OS << "<invalid sloc>"; 396cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor return; 397cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor } 398cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor 399b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner if (strcmp(PLoc.getFilename(), LastLocFilename) != 0) { 400806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << PLoc.getFilename() << ':' << PLoc.getLine() 401806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << ':' << PLoc.getColumn(); 402b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner LastLocFilename = PLoc.getFilename(); 403b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner LastLocLine = PLoc.getLine(); 404b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner } else if (PLoc.getLine() != LastLocLine) { 405806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "line" << ':' << PLoc.getLine() 406806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << ':' << PLoc.getColumn(); 407b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner LastLocLine = PLoc.getLine(); 408e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } else { 409806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "col" << ':' << PLoc.getColumn(); 410e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } 411e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner} 412e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 413d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpSourceRange(SourceRange R) { 414e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // Can't translate locations if a SourceManager isn't available. 41521c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko if (!SM) 41621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko return; 4171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 418806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " <"; 41921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko dumpLocation(R.getBegin()); 420311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner if (R.getBegin() != R.getEnd()) { 421806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << ", "; 42221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko dumpLocation(R.getEnd()); 423e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } 424806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << ">"; 4251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 426e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // <t2.c:123:421[blah], t2.c:412:321> 427e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 428e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner} 429e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 430d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpBareType(QualType T) { 4317ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, TypeColor); 4327ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 43321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko SplitQualType T_split = T.split(); 43421c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko OS << "'" << QualType::getAsString(T_split) << "'"; 43521c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 43621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko if (!T.isNull()) { 43721c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko // If the type is sugared, also dump a (shallow) desugared type. 43821c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko SplitQualType D_split = T.getSplitDesugaredType(); 43921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko if (T_split != D_split) 44021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko OS << ":'" << QualType::getAsString(D_split) << "'"; 44121c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko } 44221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko} 44321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 444d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpType(QualType T) { 445d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' '; 446d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpBareType(T); 447d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 448d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 449ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpBareDeclRef(const Decl *D) { 4507ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu { 4517ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, DeclKindNameColor); 4527ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << D->getDeclKindName(); 4537ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 454d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpPointer(D); 45521c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 456ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) { 4577ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, DeclNameColor); 45817828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie OS << " '" << ND->getDeclName() << '\''; 45921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko } 46021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 461ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko if (const ValueDecl *VD = dyn_cast<ValueDecl>(D)) 46221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko dumpType(VD->getType()); 463d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 464d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 465ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpDeclRef(const Decl *D, const char *Label) { 466d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (!D) 467d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko return; 468d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 469d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko IndentScope Indent(*this); 470d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Label) 471d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << Label << ' '; 472d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpBareDeclRef(D); 473d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 474d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 475ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpName(const NamedDecl *ND) { 4767ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu if (ND->getDeclName()) { 4777ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, DeclNameColor); 478d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' ' << ND->getNameAsString(); 4797ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 480d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 481d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 482e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieubool ASTDumper::hasNodes(const DeclContext *DC) { 483e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (!DC) 484e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu return false; 485e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 486e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith return DC->hasExternalLexicalStorage() || 487e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith DC->noload_decls_begin() != DC->noload_decls_end(); 488e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu} 489e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 490ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpDeclContext(const DeclContext *DC) { 491d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (!DC) 492d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko return; 493e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith bool HasUndeserializedDecls = DC->hasExternalLexicalStorage(); 494e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith for (DeclContext::decl_iterator I = DC->noload_decls_begin(), E = DC->noload_decls_end(); 495e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu I != E; ++I) { 496e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu DeclContext::decl_iterator Next = I; 497e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu ++Next; 498e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith if (Next == E && !HasUndeserializedDecls) 499e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 500d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(*I); 501e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 502e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith if (HasUndeserializedDecls) { 503e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith lastChild(); 504e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith IndentScope Indent(*this); 505e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith ColorScope Color(*this, UndeserializedColor); 506e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith OS << "<undeserialized declarations>"; 507e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith } 508d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 509d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 5106e322c08b187ba93019732d2295c84c339813e0dRichard Smithvoid ASTDumper::dumpLookups(const DeclContext *DC) { 5116e322c08b187ba93019732d2295c84c339813e0dRichard Smith IndentScope Indent(*this); 5126e322c08b187ba93019732d2295c84c339813e0dRichard Smith 5136e322c08b187ba93019732d2295c84c339813e0dRichard Smith OS << "StoredDeclsMap "; 5146e322c08b187ba93019732d2295c84c339813e0dRichard Smith dumpBareDeclRef(cast<Decl>(DC)); 5156e322c08b187ba93019732d2295c84c339813e0dRichard Smith 5166e322c08b187ba93019732d2295c84c339813e0dRichard Smith const DeclContext *Primary = DC->getPrimaryContext(); 5176e322c08b187ba93019732d2295c84c339813e0dRichard Smith if (Primary != DC) { 5186e322c08b187ba93019732d2295c84c339813e0dRichard Smith OS << " primary"; 5196e322c08b187ba93019732d2295c84c339813e0dRichard Smith dumpPointer(cast<Decl>(Primary)); 5206e322c08b187ba93019732d2295c84c339813e0dRichard Smith } 5216e322c08b187ba93019732d2295c84c339813e0dRichard Smith 5226e322c08b187ba93019732d2295c84c339813e0dRichard Smith bool HasUndeserializedLookups = Primary->hasExternalVisibleStorage(); 5236e322c08b187ba93019732d2295c84c339813e0dRichard Smith 5246e322c08b187ba93019732d2295c84c339813e0dRichard Smith DeclContext::all_lookups_iterator I = Primary->noload_lookups_begin(), 5256e322c08b187ba93019732d2295c84c339813e0dRichard Smith E = Primary->noload_lookups_end(); 5266e322c08b187ba93019732d2295c84c339813e0dRichard Smith while (I != E) { 5276e322c08b187ba93019732d2295c84c339813e0dRichard Smith DeclarationName Name = I.getLookupName(); 5286e322c08b187ba93019732d2295c84c339813e0dRichard Smith DeclContextLookupResult R = *I++; 5296e322c08b187ba93019732d2295c84c339813e0dRichard Smith if (I == E && !HasUndeserializedLookups) 5306e322c08b187ba93019732d2295c84c339813e0dRichard Smith lastChild(); 5316e322c08b187ba93019732d2295c84c339813e0dRichard Smith 5326e322c08b187ba93019732d2295c84c339813e0dRichard Smith IndentScope Indent(*this); 5336e322c08b187ba93019732d2295c84c339813e0dRichard Smith OS << "DeclarationName "; 5346e322c08b187ba93019732d2295c84c339813e0dRichard Smith { 5356e322c08b187ba93019732d2295c84c339813e0dRichard Smith ColorScope Color(*this, DeclNameColor); 5366e322c08b187ba93019732d2295c84c339813e0dRichard Smith OS << '\'' << Name << '\''; 5376e322c08b187ba93019732d2295c84c339813e0dRichard Smith } 5386e322c08b187ba93019732d2295c84c339813e0dRichard Smith 5396e322c08b187ba93019732d2295c84c339813e0dRichard Smith for (DeclContextLookupResult::iterator RI = R.begin(), RE = R.end(); 5406e322c08b187ba93019732d2295c84c339813e0dRichard Smith RI != RE; ++RI) { 5416e322c08b187ba93019732d2295c84c339813e0dRichard Smith if (RI + 1 == RE) 5426e322c08b187ba93019732d2295c84c339813e0dRichard Smith lastChild(); 5436e322c08b187ba93019732d2295c84c339813e0dRichard Smith dumpDeclRef(*RI); 5446e322c08b187ba93019732d2295c84c339813e0dRichard Smith } 5456e322c08b187ba93019732d2295c84c339813e0dRichard Smith } 5466e322c08b187ba93019732d2295c84c339813e0dRichard Smith 5476e322c08b187ba93019732d2295c84c339813e0dRichard Smith if (HasUndeserializedLookups) { 5486e322c08b187ba93019732d2295c84c339813e0dRichard Smith lastChild(); 5496e322c08b187ba93019732d2295c84c339813e0dRichard Smith IndentScope Indent(*this); 5506e322c08b187ba93019732d2295c84c339813e0dRichard Smith ColorScope Color(*this, UndeserializedColor); 5516e322c08b187ba93019732d2295c84c339813e0dRichard Smith OS << "<undeserialized lookups>"; 5526e322c08b187ba93019732d2295c84c339813e0dRichard Smith } 5536e322c08b187ba93019732d2295c84c339813e0dRichard Smith} 5546e322c08b187ba93019732d2295c84c339813e0dRichard Smith 555c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienkovoid ASTDumper::dumpAttr(const Attr *A) { 556c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko IndentScope Indent(*this); 5577ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu { 5587ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, AttrColor); 5597ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu switch (A->getKind()) { 560c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko#define ATTR(X) case attr::X: OS << #X; break; 561c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko#include "clang/Basic/AttrList.inc" 5627ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu default: llvm_unreachable("unexpected attribute kind"); 5637ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 5647ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << "Attr"; 565c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko } 566c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko dumpPointer(A); 567c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko dumpSourceRange(A->getRange()); 568c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko#include "clang/AST/AttrDump.inc" 569c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko} 570c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko 5714a19052fe91c988885c722252ef03ce5f762a73cRichard Smithstatic Decl *getPreviousDeclImpl(...) { 5724a19052fe91c988885c722252ef03ce5f762a73cRichard Smith return 0; 5734a19052fe91c988885c722252ef03ce5f762a73cRichard Smith} 5744a19052fe91c988885c722252ef03ce5f762a73cRichard Smith 5754a19052fe91c988885c722252ef03ce5f762a73cRichard Smithtemplate<typename T> 5764a19052fe91c988885c722252ef03ce5f762a73cRichard Smithstatic const Decl *getPreviousDeclImpl(const Redeclarable<T> *D) { 5774a19052fe91c988885c722252ef03ce5f762a73cRichard Smith return D->getPreviousDecl(); 5784a19052fe91c988885c722252ef03ce5f762a73cRichard Smith} 5794a19052fe91c988885c722252ef03ce5f762a73cRichard Smith 5804a19052fe91c988885c722252ef03ce5f762a73cRichard Smith/// Get the previous declaration in the redeclaration chain for a declaration. 5814a19052fe91c988885c722252ef03ce5f762a73cRichard Smithstatic const Decl *getPreviousDecl(const Decl *D) { 5824a19052fe91c988885c722252ef03ce5f762a73cRichard Smith switch (D->getKind()) { 5834a19052fe91c988885c722252ef03ce5f762a73cRichard Smith#define DECL(DERIVED, BASE) \ 5844a19052fe91c988885c722252ef03ce5f762a73cRichard Smith case Decl::DERIVED: \ 5854a19052fe91c988885c722252ef03ce5f762a73cRichard Smith return getPreviousDeclImpl(cast<DERIVED##Decl>(D)); 5864a19052fe91c988885c722252ef03ce5f762a73cRichard Smith#define ABSTRACT_DECL(DECL) 5874a19052fe91c988885c722252ef03ce5f762a73cRichard Smith#include "clang/AST/DeclNodes.inc" 5884a19052fe91c988885c722252ef03ce5f762a73cRichard Smith } 5894a19052fe91c988885c722252ef03ce5f762a73cRichard Smith llvm_unreachable("Decl that isn't part of DeclNodes.inc!"); 5904a19052fe91c988885c722252ef03ce5f762a73cRichard Smith} 5914a19052fe91c988885c722252ef03ce5f762a73cRichard Smith 592d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===// 593d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko// C++ Utilities 594d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===// 595d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 596d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpAccessSpecifier(AccessSpecifier AS) { 597d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko switch (AS) { 598d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case AS_none: 599d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 600d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case AS_public: 601d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "public"; 602d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 603d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case AS_protected: 604d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "protected"; 605d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 606d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case AS_private: 607d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "private"; 608d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 609d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 610d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 611d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 612ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpCXXCtorInitializer(const CXXCtorInitializer *Init) { 613d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko IndentScope Indent(*this); 614d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "CXXCtorInitializer"; 615d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Init->isAnyMemberInitializer()) { 616d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' '; 617d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpBareDeclRef(Init->getAnyMember()); 618d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } else { 619d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(QualType(Init->getBaseClass(), 0)); 620d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 621d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(Init->getInit()); 622d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 623d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 624ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpTemplateParameters(const TemplateParameterList *TPL) { 625d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (!TPL) 626d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko return; 627d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 628ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko for (TemplateParameterList::const_iterator I = TPL->begin(), E = TPL->end(); 629d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko I != E; ++I) 630d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(*I); 631d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 632d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 633d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpTemplateArgumentListInfo( 634d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko const TemplateArgumentListInfo &TALI) { 635e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu for (unsigned i = 0, e = TALI.size(); i < e; ++i) { 636e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (i + 1 == e) 637e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 638d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateArgumentLoc(TALI[i]); 639e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 640d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 641d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 642d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpTemplateArgumentLoc(const TemplateArgumentLoc &A) { 643d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateArgument(A.getArgument(), A.getSourceRange()); 644d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 645d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 646d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpTemplateArgumentList(const TemplateArgumentList &TAL) { 647d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko for (unsigned i = 0, e = TAL.size(); i < e; ++i) 648d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateArgument(TAL[i]); 649d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 650d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 651d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpTemplateArgument(const TemplateArgument &A, SourceRange R) { 652d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko IndentScope Indent(*this); 653d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "TemplateArgument"; 654d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (R.isValid()) 655d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpSourceRange(R); 656d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 657d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko switch (A.getKind()) { 658d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TemplateArgument::Null: 659d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " null"; 660d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 661d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TemplateArgument::Type: 662d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " type"; 663e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 664d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(A.getAsType()); 665d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 666d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TemplateArgument::Declaration: 667d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " decl"; 668e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 669d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(A.getAsDecl()); 670d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 671d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TemplateArgument::NullPtr: 672d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " nullptr"; 673d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 674d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TemplateArgument::Integral: 675ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko OS << " integral " << A.getAsIntegral(); 676d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 677d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TemplateArgument::Template: 678d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " template "; 679d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko A.getAsTemplate().dump(OS); 680d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 681d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TemplateArgument::TemplateExpansion: 682d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " template expansion"; 683d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko A.getAsTemplateOrTemplatePattern().dump(OS); 684d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 685d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TemplateArgument::Expression: 686d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " expr"; 687e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 688d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(A.getAsExpr()); 689d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 690d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TemplateArgument::Pack: 691d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " pack"; 692d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko for (TemplateArgument::pack_iterator I = A.pack_begin(), E = A.pack_end(); 693e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu I != E; ++I) { 694e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 695e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 696d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateArgument(*I); 697e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 698d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 69921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko } 70021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko} 70121c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 702e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//===----------------------------------------------------------------------===// 70321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko// Decl dumping methods. 7046000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 7056000dace22f110d8768476989313e9d981d690d0Chris Lattner 706ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::dumpDecl(const Decl *D) { 707d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko IndentScope Indent(*this); 708d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 709d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (!D) { 7107ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, NullColor); 711d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "<<<NULL>>>"; 712d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko return; 713d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 714d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 7157ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu { 7167ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, DeclKindNameColor); 7177ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << D->getDeclKindName() << "Decl"; 7187ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 719d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpPointer(D); 7204a19052fe91c988885c722252ef03ce5f762a73cRichard Smith if (D->getLexicalDeclContext() != D->getDeclContext()) 7214a19052fe91c988885c722252ef03ce5f762a73cRichard Smith OS << " parent " << cast<Decl>(D->getDeclContext()); 7224a19052fe91c988885c722252ef03ce5f762a73cRichard Smith if (const Decl *Prev = getPreviousDecl(D)) 7234a19052fe91c988885c722252ef03ce5f762a73cRichard Smith OS << " prev " << Prev; 724d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpSourceRange(D->getSourceRange()); 725e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 726ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko bool HasAttrs = D->attr_begin() != D->attr_end(); 7270a74a4ccc4ecfe1a2792ab72c83815323d8fc914Richard Smith const FullComment *Comment = 7280a74a4ccc4ecfe1a2792ab72c83815323d8fc914Richard Smith D->getASTContext().getLocalCommentForDeclUncached(D); 729e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu // Decls within functions are visited by the body 730e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool HasDeclContext = !isa<FunctionDecl>(*D) && !isa<ObjCMethodDecl>(*D) && 731e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu hasNodes(dyn_cast<DeclContext>(D)); 732e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 7330a74a4ccc4ecfe1a2792ab72c83815323d8fc914Richard Smith setMoreChildren(HasAttrs || Comment || HasDeclContext); 734ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko ConstDeclVisitor<ASTDumper>::Visit(D); 735e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 7360a74a4ccc4ecfe1a2792ab72c83815323d8fc914Richard Smith setMoreChildren(Comment || HasDeclContext); 737ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (Decl::attr_iterator I = D->attr_begin(), E = D->attr_end(); 738ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 739ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko if (I + 1 == E) 740ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko lastChild(); 741ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko dumpAttr(*I); 742c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko } 743e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 744e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(HasDeclContext); 745e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 7460a74a4ccc4ecfe1a2792ab72c83815323d8fc914Richard Smith dumpFullComment(Comment); 747e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 748e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(false); 749e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (HasDeclContext) 7504a19052fe91c988885c722252ef03ce5f762a73cRichard Smith dumpDeclContext(cast<DeclContext>(D)); 751d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 752d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 753ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitLabelDecl(const LabelDecl *D) { 754d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 755d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 756d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 757ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitTypedefDecl(const TypedefDecl *D) { 758d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 759d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getUnderlyingType()); 760d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isModulePrivate()) 761d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " __module_private__"; 762d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 763d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 764ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitEnumDecl(const EnumDecl *D) { 765d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isScoped()) { 766d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isScopedUsingClassTag()) 767d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " class"; 768d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko else 769d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " struct"; 770d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 771d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 772d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isModulePrivate()) 773d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " __module_private__"; 774d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isFixed()) 775d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getIntegerType()); 776d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 777d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 778ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitRecordDecl(const RecordDecl *D) { 779d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' ' << D->getKindName(); 780d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 781d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isModulePrivate()) 782d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " __module_private__"; 783d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 784d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 785ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitEnumConstantDecl(const EnumConstantDecl *D) { 786d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 787d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getType()); 788ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko if (const Expr *Init = D->getInitExpr()) { 789e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 790d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(Init); 791e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 792d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 793d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 794ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitIndirectFieldDecl(const IndirectFieldDecl *D) { 795d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 796d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getType()); 797d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko for (IndirectFieldDecl::chain_iterator I = D->chain_begin(), 798ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = D->chain_end(); 799ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 800e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 801e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 802d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(*I); 803e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 804d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 805d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 806ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitFunctionDecl(const FunctionDecl *D) { 807d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 808d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getType()); 809d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 810d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola StorageClass SC = D->getStorageClass(); 811d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (SC != SC_None) 812d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' ' << VarDecl::getStorageClassSpecifierString(SC); 813d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isInlineSpecified()) 814d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " inline"; 815d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isVirtualAsWritten()) 816d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " virtual"; 817d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isModulePrivate()) 818d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " __module_private__"; 819d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 820d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isPure()) 821d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " pure"; 822d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko else if (D->isDeletedAsWritten()) 823d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " delete"; 824d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 825c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith if (const FunctionProtoType *FPT = D->getType()->getAs<FunctionProtoType>()) { 826c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo(); 827c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith switch (EPI.ExceptionSpecType) { 828c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith default: break; 829c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith case EST_Unevaluated: 830c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith OS << " noexcept-unevaluated " << EPI.ExceptionSpecDecl; 831c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith break; 832c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith case EST_Uninstantiated: 833c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith OS << " noexcept-uninstantiated " << EPI.ExceptionSpecTemplate; 834c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith break; 835c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith } 836c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith } 837c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith 838e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool OldMoreChildren = hasMoreChildren(); 839e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu const FunctionTemplateSpecializationInfo *FTSI = 840e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu D->getTemplateSpecializationInfo(); 841e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool HasTemplateSpecialization = FTSI; 842e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 843e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool HasNamedDecls = D->getDeclsInPrototypeScope().begin() != 844e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu D->getDeclsInPrototypeScope().end(); 845e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 846e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool HasFunctionDecls = D->param_begin() != D->param_end(); 847e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 848ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko const CXXConstructorDecl *C = dyn_cast<CXXConstructorDecl>(D); 849e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool HasCtorInitializers = C && C->init_begin() != C->init_end(); 850e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 851e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool HasDeclarationBody = D->doesThisDeclarationHaveABody(); 852e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 853e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(OldMoreChildren || HasNamedDecls || HasFunctionDecls || 854e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu HasCtorInitializers || HasDeclarationBody); 855e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (HasTemplateSpecialization) { 856e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 857d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateArgumentList(*FTSI->TemplateArguments); 858e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 859d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 860e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(OldMoreChildren || HasFunctionDecls || 861e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu HasCtorInitializers || HasDeclarationBody); 862cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko for (ArrayRef<NamedDecl *>::iterator 863d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko I = D->getDeclsInPrototypeScope().begin(), 864e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu E = D->getDeclsInPrototypeScope().end(); I != E; ++I) { 865e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 866e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 867d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(*I); 868e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 869d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 870e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(OldMoreChildren || HasCtorInitializers || HasDeclarationBody); 871ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (FunctionDecl::param_const_iterator I = D->param_begin(), 872ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = D->param_end(); 873e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu I != E; ++I) { 874e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 875e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 876d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(*I); 877e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 878e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 879e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(OldMoreChildren || HasDeclarationBody); 880e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (HasCtorInitializers) 881d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko for (CXXConstructorDecl::init_const_iterator I = C->init_begin(), 882ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = C->init_end(); 883ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 884e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 885e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 886d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpCXXCtorInitializer(*I); 887e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 888d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 889e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(OldMoreChildren); 890e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (HasDeclarationBody) { 891e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 892d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(D->getBody()); 893e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 894d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 895d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 896ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitFieldDecl(const FieldDecl *D) { 897d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 898d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getType()); 899d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isMutable()) 900d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " mutable"; 901d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isModulePrivate()) 902d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " __module_private__"; 903e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 904e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool OldMoreChildren = hasMoreChildren(); 905e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool IsBitField = D->isBitField(); 906e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu Expr *Init = D->getInClassInitializer(); 907e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool HasInit = Init; 908e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 909e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(OldMoreChildren || HasInit); 910e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (IsBitField) { 911e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 912d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(D->getBitWidth()); 913e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 914e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(OldMoreChildren); 915e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (HasInit) { 916e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 917d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(Init); 918e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 919d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 920d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 921ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitVarDecl(const VarDecl *D) { 922d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 923d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getType()); 924d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola StorageClass SC = D->getStorageClass(); 925d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (SC != SC_None) 926d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' ' << VarDecl::getStorageClassSpecifierString(SC); 92738afbc7361d861968232defaeaf8e302af75b5eeRichard Smith switch (D->getTLSKind()) { 92838afbc7361d861968232defaeaf8e302af75b5eeRichard Smith case VarDecl::TLS_None: break; 92938afbc7361d861968232defaeaf8e302af75b5eeRichard Smith case VarDecl::TLS_Static: OS << " tls"; break; 93038afbc7361d861968232defaeaf8e302af75b5eeRichard Smith case VarDecl::TLS_Dynamic: OS << " tls_dynamic"; break; 93138afbc7361d861968232defaeaf8e302af75b5eeRichard Smith } 932d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isModulePrivate()) 933d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " __module_private__"; 934d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isNRVOVariable()) 935d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " nrvo"; 936e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (D->hasInit()) { 937e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 938d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(D->getInit()); 939e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 940d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 941d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 942ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitFileScopeAsmDecl(const FileScopeAsmDecl *D) { 943e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 944d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(D->getAsmString()); 945d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 946d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 947ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitImportDecl(const ImportDecl *D) { 948d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' ' << D->getImportedModule()->getFullModuleName(); 949d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 950d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 951d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===// 952d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko// C++ Declarations 953d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===// 954d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 955ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitNamespaceDecl(const NamespaceDecl *D) { 956d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 957d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isInline()) 958d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " inline"; 959d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (!D->isOriginalNamespace()) 960d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getOriginalNamespace(), "original"); 961d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 962d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 963ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUsingDirectiveDecl(const UsingDirectiveDecl *D) { 964d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' '; 965d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpBareDeclRef(D->getNominatedNamespace()); 966d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 967d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 968ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitNamespaceAliasDecl(const NamespaceAliasDecl *D) { 969d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 970d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getAliasedNamespace()); 971d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 972d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 973ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitTypeAliasDecl(const TypeAliasDecl *D) { 974d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 975d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getUnderlyingType()); 976d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 977d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 978ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitTypeAliasTemplateDecl(const TypeAliasTemplateDecl *D) { 979d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 980d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateParameters(D->getTemplateParameters()); 981d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(D->getTemplatedDecl()); 982d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 983d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 984ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXRecordDecl(const CXXRecordDecl *D) { 985d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko VisitRecordDecl(D); 986d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (!D->isCompleteDefinition()) 987d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko return; 988d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 989ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (CXXRecordDecl::base_class_const_iterator I = D->bases_begin(), 990ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = D->bases_end(); 991ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 992d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko IndentScope Indent(*this); 993d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (I->isVirtual()) 994d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "virtual "; 995d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpAccessSpecifier(I->getAccessSpecifier()); 996d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(I->getType()); 997d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (I->isPackExpansion()) 998d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "..."; 999d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 1000d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1001d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1002ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitStaticAssertDecl(const StaticAssertDecl *D) { 1003d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(D->getAssertExpr()); 1004e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1005d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(D->getMessage()); 1006d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1007d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1008ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitFunctionTemplateDecl(const FunctionTemplateDecl *D) { 1009d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1010d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateParameters(D->getTemplateParameters()); 1011d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(D->getTemplatedDecl()); 1012e252a89fc1560ca4cda9a95e4ae05e2dc03ee78cDmitri Gribenko for (FunctionTemplateDecl::spec_iterator I = D->spec_begin(), 1013e252a89fc1560ca4cda9a95e4ae05e2dc03ee78cDmitri Gribenko E = D->spec_end(); 1014e252a89fc1560ca4cda9a95e4ae05e2dc03ee78cDmitri Gribenko I != E; ++I) { 1015e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu FunctionTemplateDecl::spec_iterator Next = I; 1016e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu ++Next; 1017e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (Next == E) 1018e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1019d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko switch (I->getTemplateSpecializationKind()) { 1020d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TSK_Undeclared: 1021d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TSK_ImplicitInstantiation: 1022d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TSK_ExplicitInstantiationDeclaration: 1023d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TSK_ExplicitInstantiationDefinition: 10244216ee1ed997b826470864182df34df1a350fcb7Dmitri Gribenko if (D == D->getCanonicalDecl()) 10254216ee1ed997b826470864182df34df1a350fcb7Dmitri Gribenko dumpDecl(*I); 10264216ee1ed997b826470864182df34df1a350fcb7Dmitri Gribenko else 10274216ee1ed997b826470864182df34df1a350fcb7Dmitri Gribenko dumpDeclRef(*I); 1028d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 1029d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TSK_ExplicitSpecialization: 1030d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(*I); 1031d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 1032d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 1033d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 1034d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1035d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1036ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitClassTemplateDecl(const ClassTemplateDecl *D) { 1037d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1038d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateParameters(D->getTemplateParameters()); 1039e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 1040e252a89fc1560ca4cda9a95e4ae05e2dc03ee78cDmitri Gribenko ClassTemplateDecl::spec_iterator I = D->spec_begin(); 1041e252a89fc1560ca4cda9a95e4ae05e2dc03ee78cDmitri Gribenko ClassTemplateDecl::spec_iterator E = D->spec_end(); 1042ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko if (I == E) 1043e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1044d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(D->getTemplatedDecl()); 1045ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (; I != E; ++I) { 1046e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu ClassTemplateDecl::spec_iterator Next = I; 1047e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu ++Next; 1048e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (Next == E) 1049e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1050d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko switch (I->getTemplateSpecializationKind()) { 1051d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TSK_Undeclared: 1052d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TSK_ImplicitInstantiation: 10534216ee1ed997b826470864182df34df1a350fcb7Dmitri Gribenko if (D == D->getCanonicalDecl()) 10544216ee1ed997b826470864182df34df1a350fcb7Dmitri Gribenko dumpDecl(*I); 10554216ee1ed997b826470864182df34df1a350fcb7Dmitri Gribenko else 10564216ee1ed997b826470864182df34df1a350fcb7Dmitri Gribenko dumpDeclRef(*I); 1057d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 1058d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TSK_ExplicitSpecialization: 1059d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TSK_ExplicitInstantiationDeclaration: 1060d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case TSK_ExplicitInstantiationDefinition: 1061d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(*I); 1062d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 10636000dace22f110d8768476989313e9d981d690d0Chris Lattner } 1064d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 1065d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 10661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1067d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::VisitClassTemplateSpecializationDecl( 1068ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko const ClassTemplateSpecializationDecl *D) { 1069d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko VisitCXXRecordDecl(D); 1070d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateArgumentList(D->getTemplateArgs()); 1071d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 10721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1073d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::VisitClassTemplatePartialSpecializationDecl( 1074ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko const ClassTemplatePartialSpecializationDecl *D) { 1075d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko VisitClassTemplateSpecializationDecl(D); 1076d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateParameters(D->getTemplateParameters()); 1077d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1078d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1079d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::VisitClassScopeFunctionSpecializationDecl( 1080ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko const ClassScopeFunctionSpecializationDecl *D) { 1081d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getSpecialization()); 1082d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->hasExplicitTemplateArgs()) 1083d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateArgumentListInfo(D->templateArgs()); 1084d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1085d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1086ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D) { 1087d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->wasDeclaredWithTypename()) 1088d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " typename"; 1089d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko else 1090d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " class"; 1091d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isParameterPack()) 1092d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " ..."; 1093d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1094d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->hasDefaultArgument()) 1095d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getDefaultArgument()); 1096d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1097d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1098ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitNonTypeTemplateParmDecl(const NonTypeTemplateParmDecl *D) { 1099d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getType()); 1100d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isParameterPack()) 1101d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " ..."; 1102d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1103d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->hasDefaultArgument()) 1104d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(D->getDefaultArgument()); 1105d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1106d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1107ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitTemplateTemplateParmDecl( 1108ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko const TemplateTemplateParmDecl *D) { 1109d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isParameterPack()) 1110d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " ..."; 1111d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1112d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateParameters(D->getTemplateParameters()); 1113d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->hasDefaultArgument()) 1114d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpTemplateArgumentLoc(D->getDefaultArgument()); 1115d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1116d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1117ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUsingDecl(const UsingDecl *D) { 1118d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' '; 1119d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy()); 1120d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << D->getNameAsString(); 1121d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1122d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1123ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUnresolvedUsingTypenameDecl( 1124ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko const UnresolvedUsingTypenameDecl *D) { 1125d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' '; 1126d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy()); 1127d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << D->getNameAsString(); 1128d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1129d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1130ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUnresolvedUsingValueDecl(const UnresolvedUsingValueDecl *D) { 1131d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' '; 1132d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy()); 1133d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << D->getNameAsString(); 1134d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getType()); 1135d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1136d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1137ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUsingShadowDecl(const UsingShadowDecl *D) { 1138d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' '; 1139d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpBareDeclRef(D->getTargetDecl()); 1140d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1141d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1142ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitLinkageSpecDecl(const LinkageSpecDecl *D) { 1143d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko switch (D->getLanguage()) { 1144d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case LinkageSpecDecl::lang_c: OS << " C"; break; 1145d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case LinkageSpecDecl::lang_cxx: OS << " C++"; break; 1146d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 1147d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1148d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1149ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitAccessSpecDecl(const AccessSpecDecl *D) { 1150d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' '; 1151d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpAccessSpecifier(D->getAccess()); 1152d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1153d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1154ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitFriendDecl(const FriendDecl *D) { 11554a19052fe91c988885c722252ef03ce5f762a73cRichard Smith lastChild(); 1156d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (TypeSourceInfo *T = D->getFriendType()) 1157d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(T->getType()); 1158d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko else 1159d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(D->getFriendDecl()); 1160d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1161d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1162d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===// 1163d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko// Obj-C Declarations 1164d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===// 1165d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1166ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCIvarDecl(const ObjCIvarDecl *D) { 1167d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1168d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getType()); 1169d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->getSynthesize()) 1170d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " synthesize"; 1171d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1172d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko switch (D->getAccessControl()) { 1173d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case ObjCIvarDecl::None: 1174d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " none"; 1175d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 1176d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case ObjCIvarDecl::Private: 1177d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " private"; 1178d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 1179d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case ObjCIvarDecl::Protected: 1180d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " protected"; 1181d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 1182d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case ObjCIvarDecl::Public: 1183d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " public"; 1184d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 1185d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko case ObjCIvarDecl::Package: 1186d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " package"; 1187d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko break; 1188d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 1189d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1190d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1191ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCMethodDecl(const ObjCMethodDecl *D) { 1192d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isInstanceMethod()) 1193d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " -"; 1194d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko else 1195d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " +"; 1196d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1197d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getResultType()); 1198d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1199e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool OldMoreChildren = hasMoreChildren(); 1200e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool IsVariadic = D->isVariadic(); 1201e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu bool HasBody = D->hasBody(); 1202e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu 1203e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(OldMoreChildren || IsVariadic || HasBody); 1204e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (D->isThisDeclarationADefinition()) { 1205e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1206d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclContext(D); 1207e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } else { 1208ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (ObjCMethodDecl::param_const_iterator I = D->param_begin(), 1209ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = D->param_end(); 1210ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 1211e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 1212e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1213d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(*I); 12146000dace22f110d8768476989313e9d981d690d0Chris Lattner } 12156000dace22f110d8768476989313e9d981d690d0Chris Lattner } 1216d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1217e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(OldMoreChildren || HasBody); 1218e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (IsVariadic) { 1219e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1220d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko IndentScope Indent(*this); 1221d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "..."; 1222d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 1223d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1224e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(OldMoreChildren); 1225e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (HasBody) { 1226e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1227d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(D->getBody()); 1228e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 1229d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1230d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1231ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCCategoryDecl(const ObjCCategoryDecl *D) { 1232d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1233d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getClassInterface()); 1234e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (D->protocol_begin() == D->protocol_end()) 1235e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1236d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getImplementation()); 1237d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko for (ObjCCategoryDecl::protocol_iterator I = D->protocol_begin(), 1238ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = D->protocol_end(); 1239ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 1240e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 1241e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1242d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(*I); 1243e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 1244d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1245d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1246ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCCategoryImplDecl(const ObjCCategoryImplDecl *D) { 1247d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1248d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getClassInterface()); 1249e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1250d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getCategoryDecl()); 1251d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1252d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1253ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCProtocolDecl(const ObjCProtocolDecl *D) { 1254d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1255d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko for (ObjCProtocolDecl::protocol_iterator I = D->protocol_begin(), 1256ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = D->protocol_end(); 1257ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 1258e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 1259e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1260d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(*I); 1261e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 1262d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1263d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1264ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCInterfaceDecl(const ObjCInterfaceDecl *D) { 1265d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1266d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getSuperClass(), "super"); 1267e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (D->protocol_begin() == D->protocol_end()) 1268e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1269d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getImplementation()); 1270d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko for (ObjCInterfaceDecl::protocol_iterator I = D->protocol_begin(), 1271ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = D->protocol_end(); 1272ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 1273e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 1274e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1275d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(*I); 1276e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 1277d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1278d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1279ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCImplementationDecl(const ObjCImplementationDecl *D) { 1280d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1281d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getSuperClass(), "super"); 1282e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (D->init_begin() == D->init_end()) 1283e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1284d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getClassInterface()); 1285ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (ObjCImplementationDecl::init_const_iterator I = D->init_begin(), 1286ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = D->init_end(); 1287ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 1288e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 1289e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1290d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpCXXCtorInitializer(*I); 1291e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 1292d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1293d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1294ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCCompatibleAliasDecl(const ObjCCompatibleAliasDecl *D) { 1295d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1296e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1297d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getClassInterface()); 1298d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1299d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1300ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCPropertyDecl(const ObjCPropertyDecl *D) { 1301d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D); 1302d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpType(D->getType()); 1303d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1304d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->getPropertyImplementation() == ObjCPropertyDecl::Required) 1305d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " required"; 1306d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko else if (D->getPropertyImplementation() == ObjCPropertyDecl::Optional) 1307d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " optional"; 1308d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1309d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko ObjCPropertyDecl::PropertyAttributeKind Attrs = D->getPropertyAttributes(); 1310d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Attrs != ObjCPropertyDecl::OBJC_PR_noattr) { 1311d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Attrs & ObjCPropertyDecl::OBJC_PR_readonly) 1312d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " readonly"; 1313d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Attrs & ObjCPropertyDecl::OBJC_PR_assign) 1314d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " assign"; 1315d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Attrs & ObjCPropertyDecl::OBJC_PR_readwrite) 1316d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " readwrite"; 1317d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Attrs & ObjCPropertyDecl::OBJC_PR_retain) 1318d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " retain"; 1319d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Attrs & ObjCPropertyDecl::OBJC_PR_copy) 1320d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " copy"; 1321d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Attrs & ObjCPropertyDecl::OBJC_PR_nonatomic) 1322d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " nonatomic"; 1323d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Attrs & ObjCPropertyDecl::OBJC_PR_atomic) 1324d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " atomic"; 1325d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Attrs & ObjCPropertyDecl::OBJC_PR_weak) 1326d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " weak"; 1327d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Attrs & ObjCPropertyDecl::OBJC_PR_strong) 1328d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " strong"; 1329d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (Attrs & ObjCPropertyDecl::OBJC_PR_unsafe_unretained) 1330d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " unsafe_unretained"; 1331e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (Attrs & ObjCPropertyDecl::OBJC_PR_getter) { 1332e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (!(Attrs & ObjCPropertyDecl::OBJC_PR_setter)) 1333e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1334d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getGetterMethodDecl(), "getter"); 1335e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 1336e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (Attrs & ObjCPropertyDecl::OBJC_PR_setter) { 1337e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1338d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getSetterMethodDecl(), "setter"); 1339e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 1340d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 1341d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1342d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1343ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D) { 1344d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpName(D->getPropertyDecl()); 1345d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize) 1346d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " synthesize"; 1347d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko else 1348d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " dynamic"; 1349d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getPropertyDecl()); 1350e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1351d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(D->getPropertyIvarDecl()); 1352d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 1353d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1354ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitBlockDecl(const BlockDecl *D) { 1355ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (BlockDecl::param_const_iterator I = D->param_begin(), E = D->param_end(); 1356d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko I != E; ++I) 1357d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(*I); 1358d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1359d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->isVariadic()) { 1360d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko IndentScope Indent(*this); 1361d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "..."; 1362d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 1363d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 1364d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (D->capturesCXXThis()) { 1365d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko IndentScope Indent(*this); 1366d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "capture this"; 1367d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 1368ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (BlockDecl::capture_iterator I = D->capture_begin(), E = D->capture_end(); 1369ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 1370d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko IndentScope Indent(*this); 1371d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "capture"; 1372d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (I->isByRef()) 1373d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " byref"; 1374d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (I->isNested()) 1375d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " nested"; 1376d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (I->getVariable()) { 1377d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ' '; 1378d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpBareDeclRef(I->getVariable()); 1379d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 1380d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko if (I->hasCopyExpr()) 1381d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(I->getCopyExpr()); 1382d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko } 1383e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1384d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpStmt(D->getBody()); 13856000dace22f110d8768476989313e9d981d690d0Chris Lattner} 13866000dace22f110d8768476989313e9d981d690d0Chris Lattner 1387d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko//===----------------------------------------------------------------------===// 138821c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko// Stmt dumping methods. 1389d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko//===----------------------------------------------------------------------===// 1390d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko 1391ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::dumpStmt(const Stmt *S) { 1392d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko IndentScope Indent(*this); 1393d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko 1394d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko if (!S) { 13957ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, NullColor); 1396d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko OS << "<<<NULL>>>"; 1397d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko return; 1398d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko } 1399d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko 1400ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko if (const DeclStmt *DS = dyn_cast<DeclStmt>(S)) { 1401d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitDeclStmt(DS); 1402d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko return; 1403d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko } 1404d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko 14057247c88d1e41514a41085f83ebf03dd5220e054aDavid Blaikie setMoreChildren(!S->children().empty()); 1406ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko ConstStmtVisitor<ASTDumper>::Visit(S); 1407e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu setMoreChildren(false); 1408ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (Stmt::const_child_range CI = S->children(); CI; ++CI) { 1409ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko Stmt::const_child_range Next = CI; 1410e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu ++Next; 1411e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (!Next) 1412e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1413d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko dumpStmt(*CI); 1414e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 1415d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko} 1416d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko 1417ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitStmt(const Stmt *Node) { 14187ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu { 14197ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, StmtColor); 14207ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << Node->getStmtClassName(); 14217ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 1422d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpPointer(Node); 1423d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpSourceRange(Node->getSourceRange()); 1424d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko} 1425d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko 1426ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitDeclStmt(const DeclStmt *Node) { 1427d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitStmt(Node); 1428ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (DeclStmt::const_decl_iterator I = Node->decl_begin(), 1429ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = Node->decl_end(); 1430e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu I != E; ++I) { 1431e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 1432e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1433d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(*I); 1434e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 14355399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek} 14365399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek 1437ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitAttributedStmt(const AttributedStmt *Node) { 1438c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko VisitStmt(Node); 1439ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (ArrayRef<const Attr *>::iterator I = Node->getAttrs().begin(), 1440ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = Node->getAttrs().end(); 1441ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 1442e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 1443e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1444c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko dumpAttr(*I); 1445e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 1446c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko} 1447c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko 1448ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitLabelStmt(const LabelStmt *Node) { 1449d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitStmt(Node); 1450806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " '" << Node->getName() << "'"; 14516000dace22f110d8768476989313e9d981d690d0Chris Lattner} 14526000dace22f110d8768476989313e9d981d690d0Chris Lattner 1453ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitGotoStmt(const GotoStmt *Node) { 1454d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitStmt(Node); 1455d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " '" << Node->getLabel()->getName() << "'"; 1456d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpPointer(Node->getLabel()); 14576000dace22f110d8768476989313e9d981d690d0Chris Lattner} 14586000dace22f110d8768476989313e9d981d690d0Chris Lattner 14596000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 146021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko// Expr dumping methods. 14616000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 14626000dace22f110d8768476989313e9d981d690d0Chris Lattner 1463ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitExpr(const Expr *Node) { 1464d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitStmt(Node); 146521c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko dumpType(Node->getType()); 146621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 14677ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu { 14687ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, ValueKindColor); 14697ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu switch (Node->getValueKind()) { 14707ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu case VK_RValue: 14717ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu break; 14727ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu case VK_LValue: 14737ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << " lvalue"; 14747ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu break; 14757ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu case VK_XValue: 14767ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << " xvalue"; 14777ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu break; 14787ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 147921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko } 148021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 14817ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu { 14827ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, ObjectKindColor); 14837ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu switch (Node->getObjectKind()) { 14847ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu case OK_Ordinary: 14857ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu break; 14867ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu case OK_BitField: 14877ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << " bitfield"; 14887ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu break; 14897ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu case OK_ObjCProperty: 14907ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << " objcproperty"; 14917ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu break; 14927ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu case OK_ObjCSubscript: 14937ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << " objcsubscript"; 14947ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu break; 14957ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu case OK_VectorComponent: 14967ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << " vectorcomponent"; 14977ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu break; 14987ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 149921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko } 15006000dace22f110d8768476989313e9d981d690d0Chris Lattner} 15016000dace22f110d8768476989313e9d981d690d0Chris Lattner 1502ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkostatic void dumpBasePath(raw_ostream &OS, const CastExpr *Node) { 1503f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall if (Node->path_empty()) 15045cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson return; 15055cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson 15065cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << " ("; 15075cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson bool First = true; 1508ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko for (CastExpr::path_const_iterator I = Node->path_begin(), 1509ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko E = Node->path_end(); 1510ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko I != E; ++I) { 15115cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson const CXXBaseSpecifier *Base = *I; 15125cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson if (!First) 15135cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << " -> "; 151421c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 15155cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson const CXXRecordDecl *RD = 15165cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl()); 151721c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 15185cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson if (Base->isVirtual()) 15195cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << "virtual "; 15205cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << RD->getName(); 15215cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson First = false; 15225cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson } 152321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 15245cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << ')'; 15255cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson} 15265cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson 1527ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCastExpr(const CastExpr *Node) { 1528d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 15297ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << " <"; 15307ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu { 15317ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, CastColor); 15327ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << Node->getCastKindName(); 15337ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 153421c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko dumpBasePath(OS, Node); 15355cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << ">"; 153627a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson} 153727a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson 1538ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitDeclRefExpr(const DeclRefExpr *Node) { 1539d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1540eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek 1541806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " "; 1542d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpBareDeclRef(Node->getDecl()); 15433aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth if (Node->getDecl() != Node->getFoundDecl()) { 15443aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth OS << " ("; 1545d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpBareDeclRef(Node->getFoundDecl()); 15463aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth OS << ")"; 15473aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth } 15486b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall} 15496b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall 1550ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUnresolvedLookupExpr(const UnresolvedLookupExpr *Node) { 1551d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 15529d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall OS << " ("; 155321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko if (!Node->requiresADL()) 155421c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko OS << "no "; 1555900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer OS << "ADL) = '" << Node->getName() << '\''; 15569d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall 15579d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall UnresolvedLookupExpr::decls_iterator 15589d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall I = Node->decls_begin(), E = Node->decls_end(); 155921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko if (I == E) 156021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko OS << " empty"; 15619d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall for (; I != E; ++I) 1562d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpPointer(*I); 15639d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall} 15649d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall 1565ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCIvarRefExpr(const ObjCIvarRefExpr *Node) { 1566d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 15673c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff 15687ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu { 15697ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, DeclKindNameColor); 15707ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << " " << Node->getDecl()->getDeclKindName() << "Decl"; 15717ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 15727ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << "='" << *Node->getDecl() << "'"; 1573d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpPointer(Node->getDecl()); 1574218543b10e81ea2269ef6ae34d2d8ddbdec54dbeSteve Naroff if (Node->isFreeIvar()) 1575806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " isFreeIvar"; 15763c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff} 15773c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff 1578ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitPredefinedExpr(const PredefinedExpr *Node) { 1579d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 15806000dace22f110d8768476989313e9d981d690d0Chris Lattner switch (Node->getIdentType()) { 1581b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("unknown case"); 1582806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case PredefinedExpr::Func: OS << " __func__"; break; 1583806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case PredefinedExpr::Function: OS << " __FUNCTION__"; break; 158421c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko case PredefinedExpr::LFunction: OS << " L__FUNCTION__"; break; 1585806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case PredefinedExpr::PrettyFunction: OS << " __PRETTY_FUNCTION__";break; 15866000dace22f110d8768476989313e9d981d690d0Chris Lattner } 15876000dace22f110d8768476989313e9d981d690d0Chris Lattner} 15886000dace22f110d8768476989313e9d981d690d0Chris Lattner 1589ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCharacterLiteral(const CharacterLiteral *Node) { 1590d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 15917ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, ValueColor); 159249cf8847ef4d9caebdd162d2a5d7d055333d8b5cRichard Trieu OS << " " << Node->getValue(); 15936000dace22f110d8768476989313e9d981d690d0Chris Lattner} 15946000dace22f110d8768476989313e9d981d690d0Chris Lattner 1595ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitIntegerLiteral(const IntegerLiteral *Node) { 1596d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 15976000dace22f110d8768476989313e9d981d690d0Chris Lattner 15986000dace22f110d8768476989313e9d981d690d0Chris Lattner bool isSigned = Node->getType()->isSignedIntegerType(); 15997ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, ValueColor); 1600806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getValue().toString(10, isSigned); 16016000dace22f110d8768476989313e9d981d690d0Chris Lattner} 160221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 1603ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitFloatingLiteral(const FloatingLiteral *Node) { 1604d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 16057ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, ValueColor); 1606806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getValueAsApproximateDouble(); 16076000dace22f110d8768476989313e9d981d690d0Chris Lattner} 16085d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner 1609ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitStringLiteral(const StringLiteral *Str) { 1610d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Str); 16117ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, ValueColor); 1612806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " "; 16138ab09da1faaa33b9fa78de59cc4e191bfe9907b5Richard Trieu Str->outputString(OS); 16146000dace22f110d8768476989313e9d981d690d0Chris Lattner} 161517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner 1616ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUnaryOperator(const UnaryOperator *Node) { 1617d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1618806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << (Node->isPostfix() ? "postfix" : "prefix") 1619806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << " '" << UnaryOperator::getOpcodeStr(Node->getOpcode()) << "'"; 16206000dace22f110d8768476989313e9d981d690d0Chris Lattner} 162121c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 1622ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUnaryExprOrTypeTraitExpr( 1623ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko const UnaryExprOrTypeTraitExpr *Node) { 1624d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1625f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne switch(Node->getKind()) { 1626f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_SizeOf: 1627d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " sizeof"; 1628f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne break; 1629f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_AlignOf: 1630d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " alignof"; 1631f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne break; 1632f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_VecStep: 1633d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " vec_step"; 1634f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne break; 1635f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne } 16360518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl if (Node->isArgumentType()) 163721c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko dumpType(Node->getArgumentType()); 16386000dace22f110d8768476989313e9d981d690d0Chris Lattner} 163913cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner 1640ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitMemberExpr(const MemberExpr *Node) { 1641d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1642d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " " << (Node->isArrow() ? "->" : ".") << *Node->getMemberDecl(); 1643d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpPointer(Node->getMemberDecl()); 16446000dace22f110d8768476989313e9d981d690d0Chris Lattner} 164521c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 1646ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitExtVectorElementExpr(const ExtVectorElementExpr *Node) { 1647d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1648806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getAccessor().getNameStart(); 16496000dace22f110d8768476989313e9d981d690d0Chris Lattner} 165021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 1651ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitBinaryOperator(const BinaryOperator *Node) { 1652d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1653806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode()) << "'"; 1654eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner} 165521c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 1656ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCompoundAssignOperator( 1657ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko const CompoundAssignOperator *Node) { 1658d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1659806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode()) 1660806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << "' ComputeLHSTy="; 1661d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpBareType(Node->getComputationLHSType()); 1662806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " ComputeResultTy="; 1663d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpBareType(Node->getComputationResultType()); 16646000dace22f110d8768476989313e9d981d690d0Chris Lattner} 16656000dace22f110d8768476989313e9d981d690d0Chris Lattner 1666ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitBlockExpr(const BlockExpr *Node) { 1667d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1668d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDecl(Node->getBlockDecl()); 16696b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall} 16706b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall 1671ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitOpaqueValueExpr(const OpaqueValueExpr *Node) { 1672d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 16734b9c2d235fb9449e249d74f48ecfec601650de93John McCall 1674e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (Expr *Source = Node->getSourceExpr()) { 1675e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1676d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko dumpStmt(Source); 1677e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 16784b9c2d235fb9449e249d74f48ecfec601650de93John McCall} 16794b9c2d235fb9449e249d74f48ecfec601650de93John McCall 16806000dace22f110d8768476989313e9d981d690d0Chris Lattner// GNU extensions. 16816000dace22f110d8768476989313e9d981d690d0Chris Lattner 1682ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitAddrLabelExpr(const AddrLabelExpr *Node) { 1683d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1684d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << " " << Node->getLabel()->getName(); 1685d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpPointer(Node->getLabel()); 16866000dace22f110d8768476989313e9d981d690d0Chris Lattner} 16876000dace22f110d8768476989313e9d981d690d0Chris Lattner 1688f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===// 1689f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner// C++ Expressions 1690f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===// 16916000dace22f110d8768476989313e9d981d690d0Chris Lattner 1692ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXNamedCastExpr(const CXXNamedCastExpr *Node) { 1693d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 169421c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko OS << " " << Node->getCastName() 1695806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << "<" << Node->getTypeAsWritten().getAsString() << ">" 16965cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson << " <" << Node->getCastKindName(); 169721c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko dumpBasePath(OS, Node); 16985cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << ">"; 16996000dace22f110d8768476989313e9d981d690d0Chris Lattner} 17006000dace22f110d8768476989313e9d981d690d0Chris Lattner 1701ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *Node) { 1702d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1703806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << (Node->getValue() ? "true" : "false"); 17046000dace22f110d8768476989313e9d981d690d0Chris Lattner} 17056000dace22f110d8768476989313e9d981d690d0Chris Lattner 1706ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXThisExpr(const CXXThisExpr *Node) { 1707d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1708806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " this"; 1709cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor} 1710cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor 1711ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXFunctionalCastExpr(const CXXFunctionalCastExpr *Node) { 1712d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1713cc2fca2ba2716293204901b8d2393428b965f12aEli Friedman OS << " functional cast to " << Node->getTypeAsWritten().getAsString() 1714cc2fca2ba2716293204901b8d2393428b965f12aEli Friedman << " <" << Node->getCastKindName() << ">"; 171549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 171649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 1717ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXConstructExpr(const CXXConstructExpr *Node) { 1718d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1719d4bbdfebe9bd13defa977a934bf73fc2ce3b2817John McCall CXXConstructorDecl *Ctor = Node->getConstructor(); 172021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko dumpType(Ctor->getType()); 17210eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson if (Node->isElidable()) 1722806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " elidable"; 1723f8cf0b028c7a5b632c3a711813cd44a9d9642537John McCall if (Node->requiresZeroInitialization()) 1724f8cf0b028c7a5b632c3a711813cd44a9d9642537John McCall OS << " zeroing"; 17250eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 17260eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 1727ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *Node) { 1728d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1729806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " "; 173021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko dumpCXXTemporary(Node->getTemporary()); 17310eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 17320eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 1733211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithvoid 1734211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard SmithASTDumper::VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *Node) { 1735211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith VisitExpr(Node); 1736211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith if (const ValueDecl *VD = Node->getExtendingDecl()) { 1737211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith OS << " extended by "; 1738211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith dumpBareDeclRef(VD); 1739211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith } 1740211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith} 1741211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 1742ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitExprWithCleanups(const ExprWithCleanups *Node) { 1743d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1744d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko for (unsigned i = 0, e = Node->getNumObjects(); i != e; ++i) 1745d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpDeclRef(Node->getObject(i), "cleanup"); 17460eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 17470eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 1748ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::dumpCXXTemporary(const CXXTemporary *Temporary) { 1749d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << "(CXXTemporary"; 1750d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpPointer(Temporary); 1751d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko OS << ")"; 17520eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 17530eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 17545508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===// 17555508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// Obj-C Expressions 17565508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===// 17575508518a2702b00be3b15a26d772bde968972f54Anders Carlsson 1758ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCMessageExpr(const ObjCMessageExpr *Node) { 1759d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1760806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " selector=" << Node->getSelector().getAsString(); 176104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor switch (Node->getReceiverKind()) { 176204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Instance: 176304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 176404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 176504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Class: 176604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor OS << " class="; 1767d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dumpBareType(Node->getClassReceiver()); 176804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 176904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 177004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperInstance: 177104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor OS << " super (instance)"; 177204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 177304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 177404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperClass: 177504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor OS << " super (class)"; 177604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 177704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 1778b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek} 1779b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek 1780ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCBoxedExpr(const ObjCBoxedExpr *Node) { 1781d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 178236faaddccf519231a3facd26495e895ba5a28776Argyrios Kyrtzidis OS << " selector=" << Node->getBoxingMethod()->getSelector().getAsString(); 178336faaddccf519231a3facd26495e895ba5a28776Argyrios Kyrtzidis} 178436faaddccf519231a3facd26495e895ba5a28776Argyrios Kyrtzidis 1785ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCAtCatchStmt(const ObjCAtCatchStmt *Node) { 1786d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitStmt(Node); 1787ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko if (const VarDecl *CatchParam = Node->getCatchParamDecl()) 1788d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko dumpDecl(CatchParam); 1789d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko else 17908f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor OS << " catch all"; 17918f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor} 17928f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor 1793ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCEncodeExpr(const ObjCEncodeExpr *Node) { 1794d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 179521c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko dumpType(Node->getEncodedType()); 1796f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson} 1797f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson 1798ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCSelectorExpr(const ObjCSelectorExpr *Node) { 1799d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 18001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1801806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getSelector().getAsString(); 1802b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian} 1803b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian 1804ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCProtocolExpr(const ObjCProtocolExpr *Node) { 1805d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 18061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 180721c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko OS << ' ' << *Node->getProtocol(); 1808390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian} 18097f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar 1810ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr *Node) { 1811d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 181212f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall if (Node->isImplicitProperty()) { 181399130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian OS << " Kind=MethodRef Getter=\""; 181499130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian if (Node->getImplicitPropertyGetter()) 181599130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian OS << Node->getImplicitPropertyGetter()->getSelector().getAsString(); 181699130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian else 181799130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian OS << "(null)"; 181899130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian 181999130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian OS << "\" Setter=\""; 182012f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall if (ObjCMethodDecl *Setter = Node->getImplicitPropertySetter()) 182112f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall OS << Setter->getSelector().getAsString(); 182212f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall else 182312f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall OS << "(null)"; 182412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall OS << "\""; 182512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall } else { 1826b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer OS << " Kind=PropertyRef Property=\"" << *Node->getExplicitProperty() <<'"'; 182712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall } 18281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18298ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian if (Node->isSuperReceiver()) 18308ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian OS << " super"; 1831b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis 1832b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis OS << " Messaging="; 1833b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis if (Node->isMessagingGetter() && Node->isMessagingSetter()) 1834b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis OS << "Getter&Setter"; 1835b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis else if (Node->isMessagingGetter()) 1836b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis OS << "Getter"; 1837b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis else if (Node->isMessagingSetter()) 1838b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis OS << "Setter"; 1839cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor} 1840cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor 1841ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCSubscriptRefExpr(const ObjCSubscriptRefExpr *Node) { 1842d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1843ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek if (Node->isArraySubscriptRefExpr()) 1844ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << " Kind=ArraySubscript GetterForArray=\""; 1845ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek else 1846ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << " Kind=DictionarySubscript GetterForDictionary=\""; 1847ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek if (Node->getAtIndexMethodDecl()) 1848ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << Node->getAtIndexMethodDecl()->getSelector().getAsString(); 1849ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek else 1850ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << "(null)"; 185121c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko 1852ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek if (Node->isArraySubscriptRefExpr()) 1853ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << "\" SetterForArray=\""; 1854ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek else 1855ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << "\" SetterForDictionary=\""; 1856ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek if (Node->setAtIndexMethodDecl()) 1857ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << Node->setAtIndexMethodDecl()->getSelector().getAsString(); 1858ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek else 1859ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << "(null)"; 1860ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek} 1861ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 1862ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *Node) { 1863d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 1864ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << " " << (Node->getValue() ? "__objc_yes" : "__objc_no"); 1865ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek} 1866ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 18676000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 1868acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko// Comments 1869acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko//===----------------------------------------------------------------------===// 1870acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1871acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkoconst char *ASTDumper::getCommandName(unsigned CommandID) { 1872acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (Traits) 1873acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko return Traits->getCommandInfo(CommandID)->Name; 1874acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko const CommandInfo *Info = CommandTraits::getBuiltinCommandInfo(CommandID); 1875acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (Info) 1876acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko return Info->Name; 1877acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko return "<not a builtin command>"; 1878acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1879acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1880acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::dumpFullComment(const FullComment *C) { 1881acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (!C) 1882acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko return; 1883acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1884acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko FC = C; 1885acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko dumpComment(C); 1886acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko FC = 0; 1887acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1888acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1889acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::dumpComment(const Comment *C) { 1890acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko IndentScope Indent(*this); 1891acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1892acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (!C) { 18937ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, NullColor); 1894acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << "<<<NULL>>>"; 1895acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko return; 1896acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko } 1897acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 18987ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu { 18997ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ColorScope Color(*this, CommentColor); 19007ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu OS << C->getCommentKindName(); 19017ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu } 1902acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko dumpPointer(C); 1903acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko dumpSourceRange(C->getSourceRange()); 1904acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko ConstCommentVisitor<ASTDumper>::visit(C); 1905acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko for (Comment::child_iterator I = C->child_begin(), E = C->child_end(); 1906e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu I != E; ++I) { 1907e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu if (I + 1 == E) 1908e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu lastChild(); 1909acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko dumpComment(*I); 1910e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu } 1911acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1912acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1913acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitTextComment(const TextComment *C) { 1914acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Text=\"" << C->getText() << "\""; 1915acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1916acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1917acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitInlineCommandComment(const InlineCommandComment *C) { 1918acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Name=\"" << getCommandName(C->getCommandID()) << "\""; 1919acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko switch (C->getRenderKind()) { 1920acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko case InlineCommandComment::RenderNormal: 1921acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " RenderNormal"; 1922acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko break; 1923acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko case InlineCommandComment::RenderBold: 1924acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " RenderBold"; 1925acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko break; 1926acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko case InlineCommandComment::RenderMonospaced: 1927acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " RenderMonospaced"; 1928acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko break; 1929acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko case InlineCommandComment::RenderEmphasized: 1930acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " RenderEmphasized"; 1931acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko break; 1932acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko } 1933acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1934acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko for (unsigned i = 0, e = C->getNumArgs(); i != e; ++i) 1935acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Arg[" << i << "]=\"" << C->getArgText(i) << "\""; 1936acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1937acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1938acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitHTMLStartTagComment(const HTMLStartTagComment *C) { 1939acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Name=\"" << C->getTagName() << "\""; 1940acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (C->getNumAttrs() != 0) { 1941acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Attrs: "; 1942acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko for (unsigned i = 0, e = C->getNumAttrs(); i != e; ++i) { 1943acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko const HTMLStartTagComment::Attribute &Attr = C->getAttr(i); 1944acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " \"" << Attr.Name << "=\"" << Attr.Value << "\""; 1945acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko } 1946acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko } 1947acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (C->isSelfClosing()) 1948acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " SelfClosing"; 1949acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1950acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1951acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitHTMLEndTagComment(const HTMLEndTagComment *C) { 1952acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Name=\"" << C->getTagName() << "\""; 1953acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1954acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1955acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitBlockCommandComment(const BlockCommandComment *C) { 1956acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Name=\"" << getCommandName(C->getCommandID()) << "\""; 1957acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko for (unsigned i = 0, e = C->getNumArgs(); i != e; ++i) 1958acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Arg[" << i << "]=\"" << C->getArgText(i) << "\""; 1959acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1960acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1961acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitParamCommandComment(const ParamCommandComment *C) { 1962acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " " << ParamCommandComment::getDirectionAsString(C->getDirection()); 1963acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1964acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (C->isDirectionExplicit()) 1965acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " explicitly"; 1966acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko else 1967acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " implicitly"; 1968acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1969acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (C->hasParamName()) { 1970acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (C->isParamIndexValid()) 1971acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Param=\"" << C->getParamName(FC) << "\""; 1972acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko else 1973acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Param=\"" << C->getParamNameAsWritten() << "\""; 1974acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko } 1975acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1976acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (C->isParamIndexValid()) 1977acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " ParamIndex=" << C->getParamIndex(); 1978acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1979acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1980acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitTParamCommandComment(const TParamCommandComment *C) { 1981acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (C->hasParamName()) { 1982acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (C->isPositionValid()) 1983acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Param=\"" << C->getParamName(FC) << "\""; 1984acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko else 1985acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Param=\"" << C->getParamNameAsWritten() << "\""; 1986acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko } 1987acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1988acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (C->isPositionValid()) { 1989acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Position=<"; 1990acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko for (unsigned i = 0, e = C->getDepth(); i != e; ++i) { 1991acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << C->getIndex(i); 1992acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko if (i != e - 1) 1993acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << ", "; 1994acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko } 1995acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << ">"; 1996acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko } 1997acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 1998acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 1999acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitVerbatimBlockComment(const VerbatimBlockComment *C) { 2000acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Name=\"" << getCommandName(C->getCommandID()) << "\"" 2001acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko " CloseName=\"" << C->getCloseName() << "\""; 2002acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 2003acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 2004acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitVerbatimBlockLineComment( 2005acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko const VerbatimBlockLineComment *C) { 2006acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Text=\"" << C->getText() << "\""; 2007acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 2008acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 2009acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitVerbatimLineComment(const VerbatimLineComment *C) { 2010acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko OS << " Text=\"" << C->getText() << "\""; 2011acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 2012acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 2013acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko//===----------------------------------------------------------------------===// 2014d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko// Decl method implementations 2015d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===// 2016d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 2017d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid Decl::dump() const { 2018d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko dump(llvm::errs()); 2019d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 2020d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 2021d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid Decl::dump(raw_ostream &OS) const { 2022acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko ASTDumper P(OS, &getASTContext().getCommentCommandTraits(), 2023acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko &getASTContext().getSourceManager()); 2024ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko P.dumpDecl(this); 2025d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko} 2026d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko 20277ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieuvoid Decl::dumpColor() const { 20287ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ASTDumper P(llvm::errs(), &getASTContext().getCommentCommandTraits(), 20297ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu &getASTContext().getSourceManager(), /*ShowColors*/true); 2030ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko P.dumpDecl(this); 20317ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu} 20326e322c08b187ba93019732d2295c84c339813e0dRichard Smith 20336e322c08b187ba93019732d2295c84c339813e0dRichard Smithvoid DeclContext::dumpLookups() const { 2034ab297ccbcc51d5197d4ddb4e99b7bc8868d38314Richard Smith dumpLookups(llvm::errs()); 2035ab297ccbcc51d5197d4ddb4e99b7bc8868d38314Richard Smith} 2036ab297ccbcc51d5197d4ddb4e99b7bc8868d38314Richard Smith 2037ab297ccbcc51d5197d4ddb4e99b7bc8868d38314Richard Smithvoid DeclContext::dumpLookups(raw_ostream &OS) const { 20386e322c08b187ba93019732d2295c84c339813e0dRichard Smith const DeclContext *DC = this; 20396e322c08b187ba93019732d2295c84c339813e0dRichard Smith while (!DC->isTranslationUnit()) 20406e322c08b187ba93019732d2295c84c339813e0dRichard Smith DC = DC->getParent(); 20416e322c08b187ba93019732d2295c84c339813e0dRichard Smith ASTContext &Ctx = cast<TranslationUnitDecl>(DC)->getASTContext(); 2042ab297ccbcc51d5197d4ddb4e99b7bc8868d38314Richard Smith ASTDumper P(OS, &Ctx.getCommentCommandTraits(), &Ctx.getSourceManager()); 20436e322c08b187ba93019732d2295c84c339813e0dRichard Smith P.dumpLookups(this); 20446e322c08b187ba93019732d2295c84c339813e0dRichard Smith} 20456e322c08b187ba93019732d2295c84c339813e0dRichard Smith 2046d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===// 20476000dace22f110d8768476989313e9d981d690d0Chris Lattner// Stmt method implementations 20486000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 20496000dace22f110d8768476989313e9d981d690d0Chris Lattner 2050e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattnervoid Stmt::dump(SourceManager &SM) const { 20519668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis dump(llvm::errs(), SM); 20529668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis} 20539668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis 20545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid Stmt::dump(raw_ostream &OS, SourceManager &SM) const { 2055acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko ASTDumper P(OS, 0, &SM); 2056ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko P.dumpStmt(this); 20570c727a35718556866a978f64ac549d9798735f08Chris Lattner} 20580c727a35718556866a978f64ac549d9798735f08Chris Lattner 20596000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dump() const { 2060acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko ASTDumper P(llvm::errs(), 0, 0); 2061ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko P.dumpStmt(this); 20626000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2063acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 20647ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieuvoid Stmt::dumpColor() const { 20657ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ASTDumper P(llvm::errs(), 0, 0, /*ShowColors*/true); 2066ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko P.dumpStmt(this); 20677ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu} 20687ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 2069acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko//===----------------------------------------------------------------------===// 2070acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko// Comment method implementations 2071acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko//===----------------------------------------------------------------------===// 2072acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 2073acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid Comment::dump() const { 2074acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko dump(llvm::errs(), 0, 0); 2075acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 2076acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 2077acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid Comment::dump(const ASTContext &Context) const { 2078acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko dump(llvm::errs(), &Context.getCommentCommandTraits(), 2079acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko &Context.getSourceManager()); 2080acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 2081acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko 208251ccafd66682ecbccc0a63364291dc7a8f6ec0f0Alexander Kornienkovoid Comment::dump(raw_ostream &OS, const CommandTraits *Traits, 2083acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko const SourceManager *SM) const { 2084acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko const FullComment *FC = dyn_cast<FullComment>(this); 2085acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko ASTDumper D(OS, Traits, SM); 2086acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko D.dumpFullComment(FC); 2087acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko} 20887ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu 20897ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieuvoid Comment::dumpColor() const { 20907ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu const FullComment *FC = dyn_cast<FullComment>(this); 20917ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu ASTDumper D(llvm::errs(), 0, 0, /*ShowColors*/true); 20927ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu D.dumpFullComment(FC); 20937ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu} 2094