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