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