140b66a000dca59be61117558bb54f3880a77cd14Alexander Kornienko//===--- ASTDumper.cpp - Dumping implementation for ASTs ------------------===//
26000dace22f110d8768476989313e9d981d690d0Chris Lattner//
36000dace22f110d8768476989313e9d981d690d0Chris Lattner//                     The LLVM Compiler Infrastructure
46000dace22f110d8768476989313e9d981d690d0Chris Lattner//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
76000dace22f110d8768476989313e9d981d690d0Chris Lattner//
86000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
96000dace22f110d8768476989313e9d981d690d0Chris Lattner//
1040b66a000dca59be61117558bb54f3880a77cd14Alexander Kornienko// This file implements the AST dump methods, which dump out the
116000dace22f110d8768476989313e9d981d690d0Chris Lattner// AST in a form that exposes type details and other fields.
126000dace22f110d8768476989313e9d981d690d0Chris Lattner//
136000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
146000dace22f110d8768476989313e9d981d690d0Chris Lattner
15478851c3ed6bd784e7377dffd8e57b200c1b9ba9Benjamin Kramer#include "clang/AST/ASTContext.h"
16c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko#include "clang/AST/Attr.h"
17acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko#include "clang/AST/CommentVisitor.h"
182a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor#include "clang/AST/DeclCXX.h"
196e322c08b187ba93019732d2295c84c339813e0dRichard Smith#include "clang/AST/DeclLookups.h"
2055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/DeclObjC.h"
21d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko#include "clang/AST/DeclVisitor.h"
2255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/StmtVisitor.h"
23176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "clang/AST/TypeVisitor.h"
24d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko#include "clang/Basic/Module.h"
25e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner#include "clang/Basic/SourceManager.h"
26806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar#include "llvm/Support/raw_ostream.h"
276000dace22f110d8768476989313e9d981d690d0Chris Lattnerusing namespace clang;
28acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkousing namespace clang::comments;
296000dace22f110d8768476989313e9d981d690d0Chris Lattner
306000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
3140b66a000dca59be61117558bb54f3880a77cd14Alexander Kornienko// ASTDumper Visitor
326000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
336000dace22f110d8768476989313e9d981d690d0Chris Lattner
346000dace22f110d8768476989313e9d981d690d0Chris Lattnernamespace  {
357ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // Colors used for various parts of the AST dump
36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Do not use bold yellow for any text.  It is hard to read on white screens.
377ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
387ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  struct TerminalColor {
397ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    raw_ostream::Colors Color;
407ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    bool Bold;
417ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  };
427ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Red           - CastColor
44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Green         - TypeColor
45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Bold Green    - DeclKindNameColor, UndeserializedColor
46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Yellow        - AddressColor, LocationColor
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Blue          - CommentColor, NullColor, IndentColor
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Bold Blue     - AttrColor
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Bold Magenta  - StmtColor
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Cyan          - ValueKindColor, ObjectKindColor
51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Bold Cyan     - ValueColor, DeclNameColor
52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
537ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // Decl kind names (VarDecl, FunctionDecl, etc)
547ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor DeclKindNameColor = { raw_ostream::GREEN, true };
557ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // Attr names (CleanupAttr, GuardedByAttr, etc)
567ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor AttrColor = { raw_ostream::BLUE, true };
577ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // Statement names (DeclStmt, ImplicitCastExpr, etc)
587ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor StmtColor = { raw_ostream::MAGENTA, true };
597ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // Comment names (FullComment, ParagraphComment, TextComment, etc)
60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static const TerminalColor CommentColor = { raw_ostream::BLUE, false };
617ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
627ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // Type names (int, float, etc, plus user defined types)
637ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor TypeColor = { raw_ostream::GREEN, false };
647ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
657ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // Pointer address
667ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor AddressColor = { raw_ostream::YELLOW, false };
677ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // Source locations
687ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor LocationColor = { raw_ostream::YELLOW, false };
697ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
707ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // lvalue/xvalue
717ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor ValueKindColor = { raw_ostream::CYAN, false };
727ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // bitfield/objcproperty/objcsubscript/vectorcomponent
737ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor ObjectKindColor = { raw_ostream::CYAN, false };
747ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
757ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // Null statements
767ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor NullColor = { raw_ostream::BLUE, false };
777ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
78e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith  // Undeserialized entities
79e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith  static const TerminalColor UndeserializedColor = { raw_ostream::GREEN, true };
80e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith
817ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // CastKind from CastExpr's
827ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor CastColor = { raw_ostream::RED, false };
837ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
847ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // Value of the statement
857ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor ValueColor = { raw_ostream::CYAN, true };
867ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // Decl names
877ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor DeclNameColor = { raw_ostream::CYAN, true };
887ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
89e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu  // Indents ( `, -. | )
90e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu  static const TerminalColor IndentColor = { raw_ostream::BLUE, false };
91e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu
92d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  class ASTDumper
93ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko      : public ConstDeclVisitor<ASTDumper>, public ConstStmtVisitor<ASTDumper>,
94176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        public ConstCommentVisitor<ASTDumper>, public TypeVisitor<ASTDumper> {
955f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    raw_ostream &OS;
96acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    const CommandTraits *Traits;
97acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    const SourceManager *SM;
981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
99176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    /// Pending[i] is an action to dump an entity at level i.
100176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    llvm::SmallVector<std::function<void(bool isLastChild)>, 32> Pending;
101e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu
102176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    /// Indicates whether we're at the top level.
103176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    bool TopLevel;
104e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu
105176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    /// Indicates if we're handling the first child after entering a new depth.
106176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    bool FirstChild;
107176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
108176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    /// Prefix for currently-being-dumped entity.
109176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    std::string Prefix;
110e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu
11121c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    /// Keep track of the last location we print out so that we can
11221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    /// print out deltas from then on out.
113e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    const char *LastLocFilename;
114e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    unsigned LastLocLine;
115d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor
116acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    /// The \c FullComment parent of the comment being dumped.
117acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    const FullComment *FC;
118acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
1197ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    bool ShowColors;
1207ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
121176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    /// Dump a child of the current node.
122176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<typename Fn> void dumpChild(Fn doDumpChild) {
123176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      // If we're at the top level, there's nothing interesting to do; just
124176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      // run the dumper.
125176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (TopLevel) {
126176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        TopLevel = false;
127176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        doDumpChild();
128176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        while (!Pending.empty()) {
129176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          Pending.back()(true);
130176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          Pending.pop_back();
131176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        }
132176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        Prefix.clear();
133176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << "\n";
134176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        TopLevel = true;
135176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        return;
136cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek      }
137176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
138176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      const FullComment *OrigFC = FC;
139176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      auto dumpWithIndent = [this, doDumpChild, OrigFC](bool isLastChild) {
140176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        // Print out the appropriate tree structure and work out the prefix for
141176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        // children of this node. For instance:
142176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //
143176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //   A        Prefix = ""
144176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //   |-B      Prefix = "| "
145176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //   | `-C    Prefix = "|   "
146176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //   `-D      Prefix = "  "
147176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //     |-E    Prefix = "  | "
148176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //     `-F    Prefix = "    "
149176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //   G        Prefix = ""
150176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //
151176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        // Note that the first level gets no prefix.
152176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        {
153176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          OS << '\n';
154176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          ColorScope Color(*this, IndentColor);
155176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          OS << Prefix << (isLastChild ? '`' : '|') << '-';
156176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          this->Prefix.push_back(isLastChild ? ' ' : '|');
157176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          this->Prefix.push_back(' ');
158176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        }
159176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
160176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        FirstChild = true;
161176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        unsigned Depth = Pending.size();
162176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
163176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        FC = OrigFC;
164176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        doDumpChild();
165176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
166176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        // If any children are left, they're the last at their nesting level.
167176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        // Dump those ones out now.
168176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        while (Depth < Pending.size()) {
169176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          Pending.back()(true);
170176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          this->Pending.pop_back();
171176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        }
172176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
173176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        // Restore the old prefix.
174176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        this->Prefix.resize(Prefix.size() - 2);
175176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      };
176176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
177176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (FirstChild) {
178176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        Pending.push_back(std::move(dumpWithIndent));
179176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      } else {
180176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        Pending.back()(false);
181176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        Pending.back() = std::move(dumpWithIndent);
182cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek      }
183176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      FirstChild = false;
184176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
185cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek
1867ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    class ColorScope {
1877ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      ASTDumper &Dumper;
1887ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    public:
1897ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      ColorScope(ASTDumper &Dumper, TerminalColor Color)
1907ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu        : Dumper(Dumper) {
1917ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu        if (Dumper.ShowColors)
1927ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu          Dumper.OS.changeColor(Color.Color, Color.Bold);
1937ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      }
1947ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      ~ColorScope() {
1957ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu        if (Dumper.ShowColors)
1967ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu          Dumper.OS.resetColor();
1977ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      }
1987ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    };
1997ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
2006000dace22f110d8768476989313e9d981d690d0Chris Lattner  public:
201acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    ASTDumper(raw_ostream &OS, const CommandTraits *Traits,
202acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko              const SourceManager *SM)
203176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : OS(OS), Traits(Traits), SM(SM), TopLevel(true), FirstChild(true),
2046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        LastLocFilename(""), LastLocLine(~0U), FC(nullptr),
2057ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu        ShowColors(SM && SM->getDiagnostics().getShowColors()) { }
2067ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
2077ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    ASTDumper(raw_ostream &OS, const CommandTraits *Traits,
2087ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu              const SourceManager *SM, bool ShowColors)
209176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : OS(OS), Traits(Traits), SM(SM), TopLevel(true), FirstChild(true),
21095f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith        LastLocFilename(""), LastLocLine(~0U),
211e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu        ShowColors(ShowColors) { }
2121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
213ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void dumpDecl(const Decl *D);
214ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void dumpStmt(const Stmt *S);
215acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void dumpFullComment(const FullComment *C);
2161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
217e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu    // Utilities
218d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    void dumpPointer(const void *Ptr);
219d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    void dumpSourceRange(SourceRange R);
22021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    void dumpLocation(SourceLocation Loc);
221176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void dumpBareType(QualType T, bool Desugar = true);
22221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    void dumpType(QualType T);
223176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void dumpTypeAsChild(QualType T);
224176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void dumpTypeAsChild(const Type *T);
225ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko    void dumpBareDeclRef(const Decl *Node);
2266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    void dumpDeclRef(const Decl *Node, const char *Label = nullptr);
227ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko    void dumpName(const NamedDecl *D);
228e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu    bool hasNodes(const DeclContext *DC);
229ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko    void dumpDeclContext(const DeclContext *DC);
230176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void dumpLookups(const DeclContext *DC, bool DumpDecls);
231c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko    void dumpAttr(const Attr *A);
232d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
233d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    // C++ Utilities
234d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    void dumpAccessSpecifier(AccessSpecifier AS);
235ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko    void dumpCXXCtorInitializer(const CXXCtorInitializer *Init);
236ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko    void dumpTemplateParameters(const TemplateParameterList *TPL);
237d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    void dumpTemplateArgumentListInfo(const TemplateArgumentListInfo &TALI);
238d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    void dumpTemplateArgumentLoc(const TemplateArgumentLoc &A);
239d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    void dumpTemplateArgumentList(const TemplateArgumentList &TAL);
240d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    void dumpTemplateArgument(const TemplateArgument &A,
241d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko                              SourceRange R = SourceRange());
242d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
243176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // Types
244176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitComplexType(const ComplexType *T) {
245176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getElementType());
246176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
247176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitPointerType(const PointerType *T) {
248176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getPointeeType());
249176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
250176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitBlockPointerType(const BlockPointerType *T) {
251176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getPointeeType());
252176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
253176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitReferenceType(const ReferenceType *T) {
254176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getPointeeType());
255176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
256176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitRValueReferenceType(const ReferenceType *T) {
257176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (T->isSpelledAsLValue())
258176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << " written as lvalue reference";
259176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      VisitReferenceType(T);
260176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
261176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitMemberPointerType(const MemberPointerType *T) {
262176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getClass());
263176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getPointeeType());
264176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
265176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitArrayType(const ArrayType *T) {
266176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      switch (T->getSizeModifier()) {
267176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case ArrayType::Normal: break;
268176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case ArrayType::Static: OS << " static"; break;
269176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case ArrayType::Star: OS << " *"; break;
270176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      }
271176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " " << T->getIndexTypeQualifiers().getAsString();
272176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getElementType());
273176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
274176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitConstantArrayType(const ConstantArrayType *T) {
275176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " " << T->getSize();
276176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      VisitArrayType(T);
277176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
278176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitVariableArrayType(const VariableArrayType *T) {
279176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " ";
280176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpSourceRange(T->getBracketsRange());
281176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      VisitArrayType(T);
282176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpStmt(T->getSizeExpr());
283176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
284176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitDependentSizedArrayType(const DependentSizedArrayType *T) {
285176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      VisitArrayType(T);
286176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " ";
287176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpSourceRange(T->getBracketsRange());
288176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpStmt(T->getSizeExpr());
289176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
290176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitDependentSizedExtVectorType(
291176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        const DependentSizedExtVectorType *T) {
292176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " ";
293176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpLocation(T->getAttributeLoc());
294176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getElementType());
295176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpStmt(T->getSizeExpr());
296176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
297176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitVectorType(const VectorType *T) {
298176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      switch (T->getVectorKind()) {
299176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case VectorType::GenericVector: break;
300176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case VectorType::AltiVecVector: OS << " altivec"; break;
301176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case VectorType::AltiVecPixel: OS << " altivec pixel"; break;
302176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case VectorType::AltiVecBool: OS << " altivec bool"; break;
303176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case VectorType::NeonVector: OS << " neon"; break;
304176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case VectorType::NeonPolyVector: OS << " neon poly"; break;
305176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      }
306176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " " << T->getNumElements();
307176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getElementType());
308176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
309176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitFunctionType(const FunctionType *T) {
310176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      auto EI = T->getExtInfo();
311176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (EI.getNoReturn()) OS << " noreturn";
312176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (EI.getProducesResult()) OS << " produces_result";
313176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (EI.getHasRegParm()) OS << " regparm " << EI.getRegParm();
314176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " " << FunctionType::getNameForCallConv(EI.getCC());
315176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getReturnType());
316176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
317176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitFunctionProtoType(const FunctionProtoType *T) {
318176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      auto EPI = T->getExtProtoInfo();
319176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (EPI.HasTrailingReturn) OS << " trailing_return";
320176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (T->isConst()) OS << " const";
321176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (T->isVolatile()) OS << " volatile";
322176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (T->isRestrict()) OS << " restrict";
323176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      switch (EPI.RefQualifier) {
324176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case RQ_None: break;
325176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case RQ_LValue: OS << " &"; break;
326176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case RQ_RValue: OS << " &&"; break;
327176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      }
328176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      // FIXME: Exception specification.
329176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      // FIXME: Consumed parameters.
330176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      VisitFunctionType(T);
331176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      for (QualType PT : T->getParamTypes())
332176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        dumpTypeAsChild(PT);
333176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (EPI.Variadic)
334176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        dumpChild([=] { OS << "..."; });
335176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
336176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitUnresolvedUsingType(const UnresolvedUsingType *T) {
337176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpDeclRef(T->getDecl());
338176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
339176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitTypedefType(const TypedefType *T) {
340176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpDeclRef(T->getDecl());
341176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
342176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitTypeOfExprType(const TypeOfExprType *T) {
343176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpStmt(T->getUnderlyingExpr());
344176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
345176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitDecltypeType(const DecltypeType *T) {
346176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpStmt(T->getUnderlyingExpr());
347176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
348176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitUnaryTransformType(const UnaryTransformType *T) {
349176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      switch (T->getUTTKind()) {
350176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      case UnaryTransformType::EnumUnderlyingType:
351176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << " underlying_type";
352176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        break;
353176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      }
354176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getBaseType());
355176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
356176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitTagType(const TagType *T) {
357176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpDeclRef(T->getDecl());
358176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
359176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitAttributedType(const AttributedType *T) {
360176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      // FIXME: AttrKind
361176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getModifiedType());
362176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
363176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitTemplateTypeParmType(const TemplateTypeParmType *T) {
364176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " depth " << T->getDepth() << " index " << T->getIndex();
365176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (T->isParameterPack()) OS << " pack";
366176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpDeclRef(T->getDecl());
367176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
368176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitSubstTemplateTypeParmType(const SubstTemplateTypeParmType *T) {
369176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getReplacedParameter());
370176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
371176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitSubstTemplateTypeParmPackType(
372176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        const SubstTemplateTypeParmPackType *T) {
373176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getReplacedParameter());
374176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTemplateArgument(T->getArgumentPack());
375176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
376176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitAutoType(const AutoType *T) {
377176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (T->isDecltypeAuto()) OS << " decltype(auto)";
378176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (!T->isDeduced())
379176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << " undeduced";
380176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
381176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitTemplateSpecializationType(const TemplateSpecializationType *T) {
382176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (T->isTypeAlias()) OS << " alias";
383176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " "; T->getTemplateName().dump(OS);
384176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      for (auto &Arg : *T)
385176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        dumpTemplateArgument(Arg);
386176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (T->isTypeAlias())
387176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        dumpTypeAsChild(T->getAliasedType());
388176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
389176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitInjectedClassNameType(const InjectedClassNameType *T) {
390176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpDeclRef(T->getDecl());
391176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
392176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitObjCInterfaceType(const ObjCInterfaceType *T) {
393176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpDeclRef(T->getDecl());
394176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
395176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitObjCObjectPointerType(const ObjCObjectPointerType *T) {
396176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getPointeeType());
397176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
398176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitAtomicType(const AtomicType *T) {
399176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getValueType());
400176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
401176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitAdjustedType(const AdjustedType *T) {
402176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getOriginalType());
403176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
404176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitPackExpansionType(const PackExpansionType *T) {
405176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (auto N = T->getNumExpansions()) OS << " expansions " << *N;
406176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (!T->isSugared())
407176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        dumpTypeAsChild(T->getPattern());
408176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
409176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // FIXME: ElaboratedType, DependentNameType,
410176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // DependentTemplateSpecializationType, ObjCObjectType
411176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
412d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    // Decls
413ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitLabelDecl(const LabelDecl *D);
414ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitTypedefDecl(const TypedefDecl *D);
415ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitEnumDecl(const EnumDecl *D);
416ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitRecordDecl(const RecordDecl *D);
417ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitEnumConstantDecl(const EnumConstantDecl *D);
418ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitIndirectFieldDecl(const IndirectFieldDecl *D);
419ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitFunctionDecl(const FunctionDecl *D);
420ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitFieldDecl(const FieldDecl *D);
421ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitVarDecl(const VarDecl *D);
422ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitFileScopeAsmDecl(const FileScopeAsmDecl *D);
423ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitImportDecl(const ImportDecl *D);
424d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
425d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    // C++ Decls
426ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitNamespaceDecl(const NamespaceDecl *D);
427ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitUsingDirectiveDecl(const UsingDirectiveDecl *D);
428ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitNamespaceAliasDecl(const NamespaceAliasDecl *D);
429ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitTypeAliasDecl(const TypeAliasDecl *D);
430ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitTypeAliasTemplateDecl(const TypeAliasTemplateDecl *D);
431ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitCXXRecordDecl(const CXXRecordDecl *D);
432ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitStaticAssertDecl(const StaticAssertDecl *D);
433651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename SpecializationDecl>
434176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitTemplateDeclSpecialization(const SpecializationDecl *D,
435651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                         bool DumpExplicitInst,
436651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                         bool DumpRefOnly);
437651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename TemplateDecl>
438651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void VisitTemplateDecl(const TemplateDecl *D, bool DumpExplicitInst);
439ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitFunctionTemplateDecl(const FunctionTemplateDecl *D);
440ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitClassTemplateDecl(const ClassTemplateDecl *D);
441d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    void VisitClassTemplateSpecializationDecl(
442ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko        const ClassTemplateSpecializationDecl *D);
443d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    void VisitClassTemplatePartialSpecializationDecl(
444ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko        const ClassTemplatePartialSpecializationDecl *D);
445d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    void VisitClassScopeFunctionSpecializationDecl(
446ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko        const ClassScopeFunctionSpecializationDecl *D);
44771687a01e3f634f9be26a29006380f1cf10a31caRichard Smith    void VisitVarTemplateDecl(const VarTemplateDecl *D);
44871687a01e3f634f9be26a29006380f1cf10a31caRichard Smith    void VisitVarTemplateSpecializationDecl(
44971687a01e3f634f9be26a29006380f1cf10a31caRichard Smith        const VarTemplateSpecializationDecl *D);
45071687a01e3f634f9be26a29006380f1cf10a31caRichard Smith    void VisitVarTemplatePartialSpecializationDecl(
45171687a01e3f634f9be26a29006380f1cf10a31caRichard Smith        const VarTemplatePartialSpecializationDecl *D);
452ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D);
453ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitNonTypeTemplateParmDecl(const NonTypeTemplateParmDecl *D);
454ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitTemplateTemplateParmDecl(const TemplateTemplateParmDecl *D);
455ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitUsingDecl(const UsingDecl *D);
456ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitUnresolvedUsingTypenameDecl(const UnresolvedUsingTypenameDecl *D);
457ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitUnresolvedUsingValueDecl(const UnresolvedUsingValueDecl *D);
458ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitUsingShadowDecl(const UsingShadowDecl *D);
459ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitLinkageSpecDecl(const LinkageSpecDecl *D);
460ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitAccessSpecDecl(const AccessSpecDecl *D);
461ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitFriendDecl(const FriendDecl *D);
462d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
463d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    // ObjC Decls
464ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCIvarDecl(const ObjCIvarDecl *D);
465ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCMethodDecl(const ObjCMethodDecl *D);
466ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCCategoryDecl(const ObjCCategoryDecl *D);
467ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCCategoryImplDecl(const ObjCCategoryImplDecl *D);
468ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCProtocolDecl(const ObjCProtocolDecl *D);
469ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCInterfaceDecl(const ObjCInterfaceDecl *D);
470ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCImplementationDecl(const ObjCImplementationDecl *D);
471ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCCompatibleAliasDecl(const ObjCCompatibleAliasDecl *D);
472ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCPropertyDecl(const ObjCPropertyDecl *D);
473ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D);
474ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitBlockDecl(const BlockDecl *D);
4751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    // Stmts.
477ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitStmt(const Stmt *Node);
478ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitDeclStmt(const DeclStmt *Node);
479ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitAttributedStmt(const AttributedStmt *Node);
480ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitLabelStmt(const LabelStmt *Node);
481ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitGotoStmt(const GotoStmt *Node);
4820aae289e10b3efd484ecc023eb0fad873346754cPavel Labath    void VisitCXXCatchStmt(const CXXCatchStmt *Node);
4831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    // Exprs
485ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitExpr(const Expr *Node);
486ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitCastExpr(const CastExpr *Node);
487ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitDeclRefExpr(const DeclRefExpr *Node);
488ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitPredefinedExpr(const PredefinedExpr *Node);
489ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitCharacterLiteral(const CharacterLiteral *Node);
490ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitIntegerLiteral(const IntegerLiteral *Node);
491ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitFloatingLiteral(const FloatingLiteral *Node);
492ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitStringLiteral(const StringLiteral *Str);
493c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    void VisitInitListExpr(const InitListExpr *ILE);
494ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitUnaryOperator(const UnaryOperator *Node);
495ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *Node);
496ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitMemberExpr(const MemberExpr *Node);
497ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitExtVectorElementExpr(const ExtVectorElementExpr *Node);
498ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitBinaryOperator(const BinaryOperator *Node);
499ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitCompoundAssignOperator(const CompoundAssignOperator *Node);
500ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitAddrLabelExpr(const AddrLabelExpr *Node);
501ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitBlockExpr(const BlockExpr *Node);
502ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitOpaqueValueExpr(const OpaqueValueExpr *Node);
50317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner
50417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    // C++
505ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitCXXNamedCastExpr(const CXXNamedCastExpr *Node);
506ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *Node);
507ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitCXXThisExpr(const CXXThisExpr *Node);
508ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitCXXFunctionalCastExpr(const CXXFunctionalCastExpr *Node);
509ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitCXXConstructExpr(const CXXConstructExpr *Node);
510ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *Node);
5113ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    void VisitCXXNewExpr(const CXXNewExpr *Node);
5123ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    void VisitCXXDeleteExpr(const CXXDeleteExpr *Node);
513211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith    void VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *Node);
514ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitExprWithCleanups(const ExprWithCleanups *Node);
515ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitUnresolvedLookupExpr(const UnresolvedLookupExpr *Node);
516ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void dumpCXXTemporary(const CXXTemporary *Temporary);
517fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali    void VisitLambdaExpr(const LambdaExpr *Node) {
518fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali      VisitExpr(Node);
519fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali      dumpDecl(Node->getLambdaClass());
520fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali    }
5210e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    void VisitSizeOfPackExpr(const SizeOfPackExpr *Node);
5221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    // ObjC
524ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCAtCatchStmt(const ObjCAtCatchStmt *Node);
525ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCEncodeExpr(const ObjCEncodeExpr *Node);
526ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCMessageExpr(const ObjCMessageExpr *Node);
527ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCBoxedExpr(const ObjCBoxedExpr *Node);
528ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCSelectorExpr(const ObjCSelectorExpr *Node);
529ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCProtocolExpr(const ObjCProtocolExpr *Node);
530ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr *Node);
531ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCSubscriptRefExpr(const ObjCSubscriptRefExpr *Node);
532ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCIvarRefExpr(const ObjCIvarRefExpr *Node);
533ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *Node);
534acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
535acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    // Comments.
536acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    const char *getCommandName(unsigned CommandID);
537acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void dumpComment(const Comment *C);
538acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
539acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    // Inline comments.
540acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void visitTextComment(const TextComment *C);
541acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void visitInlineCommandComment(const InlineCommandComment *C);
542acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void visitHTMLStartTagComment(const HTMLStartTagComment *C);
543acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void visitHTMLEndTagComment(const HTMLEndTagComment *C);
544acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
545acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    // Block comments.
546acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void visitBlockCommandComment(const BlockCommandComment *C);
547acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void visitParamCommandComment(const ParamCommandComment *C);
548acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void visitTParamCommandComment(const TParamCommandComment *C);
549acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void visitVerbatimBlockComment(const VerbatimBlockComment *C);
550acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void visitVerbatimBlockLineComment(const VerbatimBlockLineComment *C);
551acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void visitVerbatimLineComment(const VerbatimLineComment *C);
5526000dace22f110d8768476989313e9d981d690d0Chris Lattner  };
5536000dace22f110d8768476989313e9d981d690d0Chris Lattner}
5546000dace22f110d8768476989313e9d981d690d0Chris Lattner
5556000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
556e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//  Utilities
557e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//===----------------------------------------------------------------------===//
558e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
559d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpPointer(const void *Ptr) {
5607ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  ColorScope Color(*this, AddressColor);
561d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << ' ' << Ptr;
562d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
563d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
56440b66a000dca59be61117558bb54f3880a77cd14Alexander Kornienkovoid ASTDumper::dumpLocation(SourceLocation Loc) {
5656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!SM)
5666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return;
5676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
5687ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  ColorScope Color(*this, LocationColor);
569df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner  SourceLocation SpellingLoc = SM->getSpellingLoc(Loc);
5701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
571e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  // The general format we print out is filename:line:col, but we drop pieces
572e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  // that haven't changed since the last loc printed.
573b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner  PresumedLoc PLoc = SM->getPresumedLoc(SpellingLoc);
574b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner
575cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor  if (PLoc.isInvalid()) {
576cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    OS << "<invalid sloc>";
577cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    return;
578cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor  }
579cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor
580b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner  if (strcmp(PLoc.getFilename(), LastLocFilename) != 0) {
581806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << PLoc.getFilename() << ':' << PLoc.getLine()
582806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar       << ':' << PLoc.getColumn();
583b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    LastLocFilename = PLoc.getFilename();
584b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    LastLocLine = PLoc.getLine();
585b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner  } else if (PLoc.getLine() != LastLocLine) {
586806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << "line" << ':' << PLoc.getLine()
587806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar       << ':' << PLoc.getColumn();
588b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    LastLocLine = PLoc.getLine();
589e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  } else {
590806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << "col" << ':' << PLoc.getColumn();
591e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  }
592e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner}
593e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
594d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpSourceRange(SourceRange R) {
595e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  // Can't translate locations if a SourceManager isn't available.
59621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  if (!SM)
59721c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    return;
5981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
599806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " <";
60021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  dumpLocation(R.getBegin());
601311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner  if (R.getBegin() != R.getEnd()) {
602806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << ", ";
60321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    dumpLocation(R.getEnd());
604e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  }
605806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << ">";
6061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
607e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  // <t2.c:123:421[blah], t2.c:412:321>
608e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
609e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner}
610e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
611176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid ASTDumper::dumpBareType(QualType T, bool Desugar) {
6127ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  ColorScope Color(*this, TypeColor);
613176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
61421c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  SplitQualType T_split = T.split();
61521c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  OS << "'" << QualType::getAsString(T_split) << "'";
61621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
617176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (Desugar && !T.isNull()) {
61821c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    // If the type is sugared, also dump a (shallow) desugared type.
61921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    SplitQualType D_split = T.getSplitDesugaredType();
62021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    if (T_split != D_split)
62121c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko      OS << ":'" << QualType::getAsString(D_split) << "'";
62221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  }
62321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko}
62421c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
625d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpType(QualType T) {
626d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << ' ';
627d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpBareType(T);
628d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
629d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
630176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid ASTDumper::dumpTypeAsChild(QualType T) {
631176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  SplitQualType SQT = T.split();
632176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (!SQT.Quals.hasQualifiers())
633176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return dumpTypeAsChild(SQT.Ty);
634176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
635176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpChild([=] {
636176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    OS << "QualType";
637176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpPointer(T.getAsOpaquePtr());
638176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    OS << " ";
639176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpBareType(T, false);
640176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    OS << " " << T.split().Quals.getAsString();
641176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpTypeAsChild(T.split().Ty);
642176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  });
643176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
644176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
645176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid ASTDumper::dumpTypeAsChild(const Type *T) {
646176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpChild([=] {
647176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (!T) {
648176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ColorScope Color(*this, NullColor);
649176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << "<<<NULL>>>";
650176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return;
651176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
652176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
653176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    {
654176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ColorScope Color(*this, TypeColor);
655176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << T->getTypeClassName() << "Type";
656176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
657176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpPointer(T);
658176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    OS << " ";
659176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpBareType(QualType(T, 0), false);
660176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
661176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    QualType SingleStepDesugar =
662176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        T->getLocallyUnqualifiedSingleStepDesugaredType();
663176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (SingleStepDesugar != QualType(T, 0))
664176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " sugar";
665176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (T->isDependentType())
666176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " dependent";
667176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    else if (T->isInstantiationDependentType())
668176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " instantiation_dependent";
669176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (T->isVariablyModifiedType())
670176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " variably_modified";
671176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (T->containsUnexpandedParameterPack())
672176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " contains_unexpanded_pack";
673176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (T->isFromAST())
674176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " imported";
675176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
676176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    TypeVisitor<ASTDumper>::Visit(T);
677176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
678176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (SingleStepDesugar != QualType(T, 0))
679176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(SingleStepDesugar);
680176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  });
681176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
682176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
683ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpBareDeclRef(const Decl *D) {
6847ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  {
6857ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    ColorScope Color(*this, DeclKindNameColor);
6867ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    OS << D->getDeclKindName();
6877ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  }
688d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpPointer(D);
68921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
690ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko  if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
6917ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    ColorScope Color(*this, DeclNameColor);
69217828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    OS << " '" << ND->getDeclName() << '\'';
69321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  }
69421c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
695ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko  if (const ValueDecl *VD = dyn_cast<ValueDecl>(D))
69621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    dumpType(VD->getType());
697d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
698d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
699ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpDeclRef(const Decl *D, const char *Label) {
700d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (!D)
701d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    return;
702d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
703176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpChild([=]{
704176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (Label)
705176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << Label << ' ';
706176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpBareDeclRef(D);
707176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  });
708d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
709d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
710ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpName(const NamedDecl *ND) {
7117ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  if (ND->getDeclName()) {
7127ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    ColorScope Color(*this, DeclNameColor);
713d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << ' ' << ND->getNameAsString();
7147ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  }
715d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
716d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
717e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieubool ASTDumper::hasNodes(const DeclContext *DC) {
718e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu  if (!DC)
719e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu    return false;
720e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu
721e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith  return DC->hasExternalLexicalStorage() ||
722e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith         DC->noload_decls_begin() != DC->noload_decls_end();
723e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu}
724e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu
725ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpDeclContext(const DeclContext *DC) {
726d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (!DC)
727d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    return;
728651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
729651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *D : DC->noload_decls())
730176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpDecl(D);
731651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
732651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (DC->hasExternalLexicalStorage()) {
733176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpChild([=]{
734176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ColorScope Color(*this, UndeserializedColor);
735176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << "<undeserialized declarations>";
736176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    });
737e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith  }
738d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
739d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
740176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid ASTDumper::dumpLookups(const DeclContext *DC, bool DumpDecls) {
741176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpChild([=] {
742176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    OS << "StoredDeclsMap ";
743176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpBareDeclRef(cast<Decl>(DC));
7446e322c08b187ba93019732d2295c84c339813e0dRichard Smith
745176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    const DeclContext *Primary = DC->getPrimaryContext();
746176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (Primary != DC) {
747176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " primary";
748176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpPointer(cast<Decl>(Primary));
749176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
7506e322c08b187ba93019732d2295c84c339813e0dRichard Smith
751176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    bool HasUndeserializedLookups = Primary->hasExternalVisibleStorage();
7526e322c08b187ba93019732d2295c84c339813e0dRichard Smith
753176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    DeclContext::all_lookups_iterator I = Primary->noload_lookups_begin(),
754176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                      E = Primary->noload_lookups_end();
755176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    while (I != E) {
756176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      DeclarationName Name = I.getLookupName();
757176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      DeclContextLookupResult R = *I++;
7586e322c08b187ba93019732d2295c84c339813e0dRichard Smith
759176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpChild([=] {
760176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << "DeclarationName ";
761176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        {
762176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          ColorScope Color(*this, DeclNameColor);
763176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          OS << '\'' << Name << '\'';
764176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        }
7656e322c08b187ba93019732d2295c84c339813e0dRichard Smith
766176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        for (DeclContextLookupResult::iterator RI = R.begin(), RE = R.end();
767176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines             RI != RE; ++RI) {
768176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          dumpChild([=] {
769176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            dumpBareDeclRef(*RI);
770176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
771176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            if ((*RI)->isHidden())
772176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines              OS << " hidden";
773176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
774176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            // If requested, dump the redecl chain for this lookup.
775176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            if (DumpDecls) {
776176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines              // Dump earliest decl first.
777176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines              std::function<void(Decl *)> DumpWithPrev = [&](Decl *D) {
778176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                if (Decl *Prev = D->getPreviousDecl())
779176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  DumpWithPrev(Prev);
780176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                dumpDecl(D);
781176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines              };
782176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines              DumpWithPrev(*RI);
783176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            }
784176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          });
785176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        }
786176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      });
7876e322c08b187ba93019732d2295c84c339813e0dRichard Smith    }
7886e322c08b187ba93019732d2295c84c339813e0dRichard Smith
789176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (HasUndeserializedLookups) {
790176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpChild([=] {
791176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        ColorScope Color(*this, UndeserializedColor);
792176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << "<undeserialized lookups>";
793176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      });
7946e322c08b187ba93019732d2295c84c339813e0dRichard Smith    }
795176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  });
7966e322c08b187ba93019732d2295c84c339813e0dRichard Smith}
7976e322c08b187ba93019732d2295c84c339813e0dRichard Smith
798c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienkovoid ASTDumper::dumpAttr(const Attr *A) {
799176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpChild([=] {
800176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    {
801176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ColorScope Color(*this, AttrColor);
802651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
803176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      switch (A->getKind()) {
804c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko#define ATTR(X) case attr::X: OS << #X; break;
805c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko#include "clang/Basic/AttrList.inc"
806176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      default:
807176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        llvm_unreachable("unexpected attribute kind");
808176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      }
809176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << "Attr";
8107ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    }
811176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpPointer(A);
812176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpSourceRange(A->getRange());
813176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (A->isInherited())
814176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " Inherited";
815176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (A->isImplicit())
816176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " Implicit";
817c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#include "clang/AST/AttrDump.inc"
818176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  });
819c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko}
820c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko
821c5042885480aa8b06e7b792247257846dfdddd80Richard Smithstatic void dumpPreviousDeclImpl(raw_ostream &OS, ...) {}
822c5042885480aa8b06e7b792247257846dfdddd80Richard Smith
823c5042885480aa8b06e7b792247257846dfdddd80Richard Smithtemplate<typename T>
824c5042885480aa8b06e7b792247257846dfdddd80Richard Smithstatic void dumpPreviousDeclImpl(raw_ostream &OS, const Mergeable<T> *D) {
825bc6509175e1ce5cc1b48d1b97ac8d23d8b74167cRafael Espindola  const T *First = D->getFirstDecl();
826c5042885480aa8b06e7b792247257846dfdddd80Richard Smith  if (First != D)
827c5042885480aa8b06e7b792247257846dfdddd80Richard Smith    OS << " first " << First;
8284a19052fe91c988885c722252ef03ce5f762a73cRichard Smith}
8294a19052fe91c988885c722252ef03ce5f762a73cRichard Smith
8304a19052fe91c988885c722252ef03ce5f762a73cRichard Smithtemplate<typename T>
831c5042885480aa8b06e7b792247257846dfdddd80Richard Smithstatic void dumpPreviousDeclImpl(raw_ostream &OS, const Redeclarable<T> *D) {
832c5042885480aa8b06e7b792247257846dfdddd80Richard Smith  const T *Prev = D->getPreviousDecl();
833c5042885480aa8b06e7b792247257846dfdddd80Richard Smith  if (Prev)
834c5042885480aa8b06e7b792247257846dfdddd80Richard Smith    OS << " prev " << Prev;
8354a19052fe91c988885c722252ef03ce5f762a73cRichard Smith}
8364a19052fe91c988885c722252ef03ce5f762a73cRichard Smith
837c5042885480aa8b06e7b792247257846dfdddd80Richard Smith/// Dump the previous declaration in the redeclaration chain for a declaration,
838c5042885480aa8b06e7b792247257846dfdddd80Richard Smith/// if any.
839c5042885480aa8b06e7b792247257846dfdddd80Richard Smithstatic void dumpPreviousDecl(raw_ostream &OS, const Decl *D) {
8404a19052fe91c988885c722252ef03ce5f762a73cRichard Smith  switch (D->getKind()) {
8414a19052fe91c988885c722252ef03ce5f762a73cRichard Smith#define DECL(DERIVED, BASE) \
8424a19052fe91c988885c722252ef03ce5f762a73cRichard Smith  case Decl::DERIVED: \
843c5042885480aa8b06e7b792247257846dfdddd80Richard Smith    return dumpPreviousDeclImpl(OS, cast<DERIVED##Decl>(D));
8444a19052fe91c988885c722252ef03ce5f762a73cRichard Smith#define ABSTRACT_DECL(DECL)
8454a19052fe91c988885c722252ef03ce5f762a73cRichard Smith#include "clang/AST/DeclNodes.inc"
8464a19052fe91c988885c722252ef03ce5f762a73cRichard Smith  }
8474a19052fe91c988885c722252ef03ce5f762a73cRichard Smith  llvm_unreachable("Decl that isn't part of DeclNodes.inc!");
8484a19052fe91c988885c722252ef03ce5f762a73cRichard Smith}
8494a19052fe91c988885c722252ef03ce5f762a73cRichard Smith
850d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===//
851d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//  C++ Utilities
852d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===//
853d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
854d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpAccessSpecifier(AccessSpecifier AS) {
855d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  switch (AS) {
856d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  case AS_none:
857d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    break;
858d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  case AS_public:
859d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << "public";
860d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    break;
861d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  case AS_protected:
862d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << "protected";
863d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    break;
864d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  case AS_private:
865d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << "private";
866d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    break;
867d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  }
868d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
869d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
870ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpCXXCtorInitializer(const CXXCtorInitializer *Init) {
871176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpChild([=] {
872176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    OS << "CXXCtorInitializer";
873176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (Init->isAnyMemberInitializer()) {
874176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << ' ';
875176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpBareDeclRef(Init->getAnyMember());
876176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    } else if (Init->isBaseInitializer()) {
877176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpType(QualType(Init->getBaseClass(), 0));
878176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    } else if (Init->isDelegatingInitializer()) {
879176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpType(Init->getTypeSourceInfo()->getType());
880176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    } else {
881176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      llvm_unreachable("Unknown initializer type");
882176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
883176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpStmt(Init->getInit());
884176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  });
885d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
886d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
887ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpTemplateParameters(const TemplateParameterList *TPL) {
888d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (!TPL)
889d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    return;
890d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
891ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko  for (TemplateParameterList::const_iterator I = TPL->begin(), E = TPL->end();
892d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko       I != E; ++I)
893d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpDecl(*I);
894d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
895d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
896d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpTemplateArgumentListInfo(
897d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    const TemplateArgumentListInfo &TALI) {
898176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (unsigned i = 0, e = TALI.size(); i < e; ++i)
899d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpTemplateArgumentLoc(TALI[i]);
900d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
901d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
902d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpTemplateArgumentLoc(const TemplateArgumentLoc &A) {
903d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpTemplateArgument(A.getArgument(), A.getSourceRange());
904d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
905d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
906d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpTemplateArgumentList(const TemplateArgumentList &TAL) {
907d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  for (unsigned i = 0, e = TAL.size(); i < e; ++i)
908d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpTemplateArgument(TAL[i]);
909d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
910d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
911d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpTemplateArgument(const TemplateArgument &A, SourceRange R) {
912176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpChild([=] {
913176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    OS << "TemplateArgument";
914176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (R.isValid())
915176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpSourceRange(R);
916176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
917176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    switch (A.getKind()) {
918176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case TemplateArgument::Null:
919176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " null";
920176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
921176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case TemplateArgument::Type:
922176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " type";
923176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpType(A.getAsType());
924176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
925176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case TemplateArgument::Declaration:
926176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " decl";
927176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpDeclRef(A.getAsDecl());
928176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
929176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case TemplateArgument::NullPtr:
930176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " nullptr";
931176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
932176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case TemplateArgument::Integral:
933176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " integral " << A.getAsIntegral();
934176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
935176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case TemplateArgument::Template:
936176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " template ";
937176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      A.getAsTemplate().dump(OS);
938176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
939176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case TemplateArgument::TemplateExpansion:
940176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " template expansion";
941176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      A.getAsTemplateOrTemplatePattern().dump(OS);
942176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
943176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case TemplateArgument::Expression:
944176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " expr";
945176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpStmt(A.getAsExpr());
946176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
947176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case TemplateArgument::Pack:
948176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " pack";
949176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      for (TemplateArgument::pack_iterator I = A.pack_begin(), E = A.pack_end();
950176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines           I != E; ++I)
951176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        dumpTemplateArgument(*I);
952176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
953e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu    }
954176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  });
95521c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko}
95621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
957e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//===----------------------------------------------------------------------===//
95821c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko//  Decl dumping methods.
9596000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
9606000dace22f110d8768476989313e9d981d690d0Chris Lattner
961ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::dumpDecl(const Decl *D) {
962176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpChild([=] {
963176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (!D) {
964176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ColorScope Color(*this, NullColor);
965176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << "<<<NULL>>>";
966176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return;
967176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
968d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
969176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    {
970176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ColorScope Color(*this, DeclKindNameColor);
971176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << D->getDeclKindName() << "Decl";
972176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
973176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpPointer(D);
974176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (D->getLexicalDeclContext() != D->getDeclContext())
975176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " parent " << cast<Decl>(D->getDeclContext());
976176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpPreviousDecl(OS, D);
977176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpSourceRange(D->getSourceRange());
978176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    OS << ' ';
979176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpLocation(D->getLocation());
980176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (Module *M = D->getOwningModule())
981176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " in " << M->getFullModuleName();
982176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (const NamedDecl *ND = dyn_cast<NamedDecl>(D))
983176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (ND->isHidden())
984176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << " hidden";
985176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (D->isImplicit())
986176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " implicit";
987176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (D->isUsed())
988176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " used";
989176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    else if (D->isThisDeclarationReferenced())
990176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " referenced";
991176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (D->isInvalidDecl())
992176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " invalid";
9930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
9940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      if (FD->isConstexpr())
9950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines        OS << " constexpr";
9960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
997d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
998176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ConstDeclVisitor<ASTDumper>::Visit(D);
999e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu
1000176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    for (Decl::attr_iterator I = D->attr_begin(), E = D->attr_end(); I != E;
1001176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines         ++I)
1002176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpAttr(*I);
1003e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu
1004176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (const FullComment *Comment =
1005176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            D->getASTContext().getLocalCommentForDeclUncached(D))
1006176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpFullComment(Comment);
1007176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1008176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // Decls within functions are visited by the body.
1009176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (!isa<FunctionDecl>(*D) && !isa<ObjCMethodDecl>(*D) &&
1010176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        hasNodes(dyn_cast<DeclContext>(D)))
1011176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpDeclContext(cast<DeclContext>(D));
1012176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  });
1013d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1014d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1015ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitLabelDecl(const LabelDecl *D) {
1016d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1017d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1018d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1019ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitTypedefDecl(const TypedefDecl *D) {
1020d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1021d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpType(D->getUnderlyingType());
1022d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isModulePrivate())
1023d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " __module_private__";
1024d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1025d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1026ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitEnumDecl(const EnumDecl *D) {
1027d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isScoped()) {
1028d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    if (D->isScopedUsingClassTag())
1029d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " class";
1030d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    else
1031d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " struct";
1032d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  }
1033d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1034d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isModulePrivate())
1035d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " __module_private__";
1036d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isFixed())
1037d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpType(D->getIntegerType());
1038d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1039d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1040ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitRecordDecl(const RecordDecl *D) {
1041d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << ' ' << D->getKindName();
1042d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1043d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isModulePrivate())
1044d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " __module_private__";
1045bb6b5e40b6ea0e512eebd4bdc9d635076ed279f7Richard Smith  if (D->isCompleteDefinition())
1046bb6b5e40b6ea0e512eebd4bdc9d635076ed279f7Richard Smith    OS << " definition";
1047d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1048d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1049ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitEnumConstantDecl(const EnumConstantDecl *D) {
1050d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1051d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpType(D->getType());
1052176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (const Expr *Init = D->getInitExpr())
1053d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpStmt(Init);
1054d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1055d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1056ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitIndirectFieldDecl(const IndirectFieldDecl *D) {
1057d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1058d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpType(D->getType());
1059651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1060651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *Child : D->chain())
1061176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpDeclRef(Child);
1062d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1063d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1064ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitFunctionDecl(const FunctionDecl *D) {
1065d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1066d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpType(D->getType());
1067d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1068d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola  StorageClass SC = D->getStorageClass();
1069d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (SC != SC_None)
1070d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << ' ' << VarDecl::getStorageClassSpecifierString(SC);
1071d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isInlineSpecified())
1072d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " inline";
1073d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isVirtualAsWritten())
1074d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " virtual";
1075d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isModulePrivate())
1076d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " __module_private__";
1077d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1078d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isPure())
1079d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " pure";
1080d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  else if (D->isDeletedAsWritten())
1081d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " delete";
1082d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1083c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith  if (const FunctionProtoType *FPT = D->getType()->getAs<FunctionProtoType>()) {
1084c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith    FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
1085176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    switch (EPI.ExceptionSpec.Type) {
1086c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith    default: break;
1087c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith    case EST_Unevaluated:
1088176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " noexcept-unevaluated " << EPI.ExceptionSpec.SourceDecl;
1089c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith      break;
1090c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith    case EST_Uninstantiated:
1091176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " noexcept-uninstantiated " << EPI.ExceptionSpec.SourceTemplate;
1092c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith      break;
1093c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith    }
1094c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith  }
1095c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith
1096176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (const FunctionTemplateSpecializationInfo *FTSI =
1097176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          D->getTemplateSpecializationInfo())
1098d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpTemplateArgumentList(*FTSI->TemplateArguments);
1099d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1100cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  for (ArrayRef<NamedDecl *>::iterator
1101d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko       I = D->getDeclsInPrototypeScope().begin(),
1102176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines       E = D->getDeclsInPrototypeScope().end(); I != E; ++I)
1103d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpDecl(*I);
1104d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
11050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  if (!D->param_begin() && D->getNumParams())
11060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    dumpChild([=] { OS << "<<NULL params x " << D->getNumParams() << ">>"; });
11070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  else
11080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    for (FunctionDecl::param_const_iterator I = D->param_begin(),
11090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                                            E = D->param_end();
11100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines         I != E; ++I)
11110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      dumpDecl(*I);
1112176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1113176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (const CXXConstructorDecl *C = dyn_cast<CXXConstructorDecl>(D))
1114d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    for (CXXConstructorDecl::init_const_iterator I = C->init_begin(),
1115ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko                                                 E = C->init_end();
1116176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines         I != E; ++I)
1117d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      dumpCXXCtorInitializer(*I);
1118d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1119176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (D->doesThisDeclarationHaveABody())
1120d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpStmt(D->getBody());
1121d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1122d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1123ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitFieldDecl(const FieldDecl *D) {
1124d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1125d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpType(D->getType());
1126d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isMutable())
1127d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " mutable";
1128d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isModulePrivate())
1129d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " __module_private__";
1130e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu
1131176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (D->isBitField())
1132d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpStmt(D->getBitWidth());
1133176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (Expr *Init = D->getInClassInitializer())
1134d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpStmt(Init);
1135d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1136d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1137ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitVarDecl(const VarDecl *D) {
1138d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1139d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpType(D->getType());
1140d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola  StorageClass SC = D->getStorageClass();
1141d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (SC != SC_None)
1142d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << ' ' << VarDecl::getStorageClassSpecifierString(SC);
114338afbc7361d861968232defaeaf8e302af75b5eeRichard Smith  switch (D->getTLSKind()) {
114438afbc7361d861968232defaeaf8e302af75b5eeRichard Smith  case VarDecl::TLS_None: break;
114538afbc7361d861968232defaeaf8e302af75b5eeRichard Smith  case VarDecl::TLS_Static: OS << " tls"; break;
114638afbc7361d861968232defaeaf8e302af75b5eeRichard Smith  case VarDecl::TLS_Dynamic: OS << " tls_dynamic"; break;
114738afbc7361d861968232defaeaf8e302af75b5eeRichard Smith  }
1148d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isModulePrivate())
1149d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " __module_private__";
1150d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isNRVOVariable())
1151d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " nrvo";
1152e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu  if (D->hasInit()) {
1153176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    switch (D->getInitStyle()) {
1154176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case VarDecl::CInit: OS << " cinit"; break;
1155176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case VarDecl::CallInit: OS << " callinit"; break;
1156176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case VarDecl::ListInit: OS << " listinit"; break;
1157176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
1158d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpStmt(D->getInit());
1159e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu  }
1160d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1161d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1162ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitFileScopeAsmDecl(const FileScopeAsmDecl *D) {
1163d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpStmt(D->getAsmString());
1164d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1165d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1166ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitImportDecl(const ImportDecl *D) {
1167d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << ' ' << D->getImportedModule()->getFullModuleName();
1168d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1169d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1170d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===//
1171d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko// C++ Declarations
1172d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===//
1173d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1174ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitNamespaceDecl(const NamespaceDecl *D) {
1175d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1176d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isInline())
1177d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " inline";
1178d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (!D->isOriginalNamespace())
1179d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpDeclRef(D->getOriginalNamespace(), "original");
1180d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1181d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1182ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUsingDirectiveDecl(const UsingDirectiveDecl *D) {
1183d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << ' ';
1184d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpBareDeclRef(D->getNominatedNamespace());
1185d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1186d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1187ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitNamespaceAliasDecl(const NamespaceAliasDecl *D) {
1188d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1189d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getAliasedNamespace());
1190d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1191d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1192ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitTypeAliasDecl(const TypeAliasDecl *D) {
1193d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1194d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpType(D->getUnderlyingType());
1195d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1196d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1197ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitTypeAliasTemplateDecl(const TypeAliasTemplateDecl *D) {
1198d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1199d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpTemplateParameters(D->getTemplateParameters());
1200d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDecl(D->getTemplatedDecl());
1201d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1202d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1203ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXRecordDecl(const CXXRecordDecl *D) {
1204d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  VisitRecordDecl(D);
1205d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (!D->isCompleteDefinition())
1206d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    return;
1207d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1208651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (const auto &I : D->bases()) {
1209176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpChild([=] {
1210176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (I.isVirtual())
1211176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << "virtual ";
1212176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpAccessSpecifier(I.getAccessSpecifier());
1213176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpType(I.getType());
1214176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (I.isPackExpansion())
1215176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << "...";
1216176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    });
1217d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  }
1218d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1219d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1220ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitStaticAssertDecl(const StaticAssertDecl *D) {
1221d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpStmt(D->getAssertExpr());
1222d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpStmt(D->getMessage());
1223d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1224d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1225651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<typename SpecializationDecl>
1226176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid ASTDumper::VisitTemplateDeclSpecialization(const SpecializationDecl *D,
1227651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                                bool DumpExplicitInst,
1228651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                                bool DumpRefOnly) {
1229651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool DumpedAny = false;
1230651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *RedeclWithBadType : D->redecls()) {
1231651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // FIXME: The redecls() range sometimes has elements of a less-specific
1232651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // type. (In particular, ClassTemplateSpecializationDecl::redecls() gives
1233651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // us TagDecls, and should give CXXRecordDecls).
1234651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    auto *Redecl = dyn_cast<SpecializationDecl>(RedeclWithBadType);
1235651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!Redecl) {
1236651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // Found the injected-class-name for a class template. This will be dumped
1237651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // as part of its surrounding class so we don't need to dump it here.
1238651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      assert(isa<CXXRecordDecl>(RedeclWithBadType) &&
1239651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines             "expected an injected-class-name");
1240651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      continue;
1241651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
1242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1243651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    switch (Redecl->getTemplateSpecializationKind()) {
1244d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    case TSK_ExplicitInstantiationDeclaration:
1245d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    case TSK_ExplicitInstantiationDefinition:
1246651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (!DumpExplicitInst)
1247651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        break;
1248651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // Fall through.
1249651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case TSK_Undeclared:
1250651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case TSK_ImplicitInstantiation:
1251176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (DumpRefOnly)
1252176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        dumpDeclRef(Redecl);
1253176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      else
1254176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        dumpDecl(Redecl);
1255651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      DumpedAny = true;
1256d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      break;
1257d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    case TSK_ExplicitSpecialization:
1258d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      break;
1259d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    }
1260d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  }
1261651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1262651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Ensure we dump at least one decl for each specialization.
1263651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!DumpedAny)
1264176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpDeclRef(D);
1265d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1266d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1267651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<typename TemplateDecl>
1268651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid ASTDumper::VisitTemplateDecl(const TemplateDecl *D,
1269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                  bool DumpExplicitInst) {
1270d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1271d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpTemplateParameters(D->getTemplateParameters());
1272e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu
1273176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpDecl(D->getTemplatedDecl());
1274651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1275651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *Child : D->specializations())
1276176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    VisitTemplateDeclSpecialization(Child, DumpExplicitInst,
1277651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                    !D->isCanonicalDecl());
1278651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1279651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1280651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid ASTDumper::VisitFunctionTemplateDecl(const FunctionTemplateDecl *D) {
1281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: We don't add a declaration of a function template specialization
1282651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // to its context when it's explicitly instantiated, so dump explicit
1283651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // instantiations when we dump the template itself.
1284651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  VisitTemplateDecl(D, true);
1285651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1286651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1287651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid ASTDumper::VisitClassTemplateDecl(const ClassTemplateDecl *D) {
1288651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  VisitTemplateDecl(D, false);
1289d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
12901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1291d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::VisitClassTemplateSpecializationDecl(
1292ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    const ClassTemplateSpecializationDecl *D) {
1293d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  VisitCXXRecordDecl(D);
1294d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpTemplateArgumentList(D->getTemplateArgs());
1295d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
12961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1297d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::VisitClassTemplatePartialSpecializationDecl(
1298ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    const ClassTemplatePartialSpecializationDecl *D) {
1299d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  VisitClassTemplateSpecializationDecl(D);
1300d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpTemplateParameters(D->getTemplateParameters());
1301d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1302d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1303d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::VisitClassScopeFunctionSpecializationDecl(
1304ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    const ClassScopeFunctionSpecializationDecl *D) {
1305d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getSpecialization());
1306d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->hasExplicitTemplateArgs())
1307d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpTemplateArgumentListInfo(D->templateArgs());
1308d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1309d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
131071687a01e3f634f9be26a29006380f1cf10a31caRichard Smithvoid ASTDumper::VisitVarTemplateDecl(const VarTemplateDecl *D) {
1311651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  VisitTemplateDecl(D, false);
131271687a01e3f634f9be26a29006380f1cf10a31caRichard Smith}
131371687a01e3f634f9be26a29006380f1cf10a31caRichard Smith
131471687a01e3f634f9be26a29006380f1cf10a31caRichard Smithvoid ASTDumper::VisitVarTemplateSpecializationDecl(
131571687a01e3f634f9be26a29006380f1cf10a31caRichard Smith    const VarTemplateSpecializationDecl *D) {
131671687a01e3f634f9be26a29006380f1cf10a31caRichard Smith  dumpTemplateArgumentList(D->getTemplateArgs());
131771687a01e3f634f9be26a29006380f1cf10a31caRichard Smith  VisitVarDecl(D);
131871687a01e3f634f9be26a29006380f1cf10a31caRichard Smith}
131971687a01e3f634f9be26a29006380f1cf10a31caRichard Smith
132071687a01e3f634f9be26a29006380f1cf10a31caRichard Smithvoid ASTDumper::VisitVarTemplatePartialSpecializationDecl(
132171687a01e3f634f9be26a29006380f1cf10a31caRichard Smith    const VarTemplatePartialSpecializationDecl *D) {
132271687a01e3f634f9be26a29006380f1cf10a31caRichard Smith  dumpTemplateParameters(D->getTemplateParameters());
132371687a01e3f634f9be26a29006380f1cf10a31caRichard Smith  VisitVarTemplateSpecializationDecl(D);
132471687a01e3f634f9be26a29006380f1cf10a31caRichard Smith}
132571687a01e3f634f9be26a29006380f1cf10a31caRichard Smith
1326ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D) {
1327d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->wasDeclaredWithTypename())
1328d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " typename";
1329d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  else
1330d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " class";
1331d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isParameterPack())
1332d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " ...";
1333d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1334176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (D->hasDefaultArgument())
1335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    dumpTemplateArgument(D->getDefaultArgument());
1336d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1337d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1338ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitNonTypeTemplateParmDecl(const NonTypeTemplateParmDecl *D) {
1339d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpType(D->getType());
1340d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isParameterPack())
1341d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " ...";
1342d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1343176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (D->hasDefaultArgument())
1344651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    dumpTemplateArgument(D->getDefaultArgument());
1345d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1346d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1347ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitTemplateTemplateParmDecl(
1348ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    const TemplateTemplateParmDecl *D) {
1349d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isParameterPack())
1350d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " ...";
1351d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1352d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpTemplateParameters(D->getTemplateParameters());
1353176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (D->hasDefaultArgument())
1354d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpTemplateArgumentLoc(D->getDefaultArgument());
1355d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1356d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1357ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUsingDecl(const UsingDecl *D) {
1358d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << ' ';
1359d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
1360d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << D->getNameAsString();
1361d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1362d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1363ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUnresolvedUsingTypenameDecl(
1364ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    const UnresolvedUsingTypenameDecl *D) {
1365d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << ' ';
1366d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
1367d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << D->getNameAsString();
1368d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1369d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1370ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUnresolvedUsingValueDecl(const UnresolvedUsingValueDecl *D) {
1371d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << ' ';
1372d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
1373d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << D->getNameAsString();
1374d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpType(D->getType());
1375d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1376d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1377ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUsingShadowDecl(const UsingShadowDecl *D) {
1378d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << ' ';
1379d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpBareDeclRef(D->getTargetDecl());
1380d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1381d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1382ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitLinkageSpecDecl(const LinkageSpecDecl *D) {
1383d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  switch (D->getLanguage()) {
1384d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  case LinkageSpecDecl::lang_c: OS << " C"; break;
1385d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  case LinkageSpecDecl::lang_cxx: OS << " C++"; break;
1386d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  }
1387d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1388d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1389ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitAccessSpecDecl(const AccessSpecDecl *D) {
1390d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << ' ';
1391d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpAccessSpecifier(D->getAccess());
1392d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1393d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1394ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitFriendDecl(const FriendDecl *D) {
1395d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (TypeSourceInfo *T = D->getFriendType())
1396d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpType(T->getType());
1397d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  else
1398d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpDecl(D->getFriendDecl());
1399d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1400d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1401d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===//
1402d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko// Obj-C Declarations
1403d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===//
1404d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1405ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCIvarDecl(const ObjCIvarDecl *D) {
1406d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1407d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpType(D->getType());
1408d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->getSynthesize())
1409d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " synthesize";
1410d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1411d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  switch (D->getAccessControl()) {
1412d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  case ObjCIvarDecl::None:
1413d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " none";
1414d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    break;
1415d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  case ObjCIvarDecl::Private:
1416d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " private";
1417d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    break;
1418d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  case ObjCIvarDecl::Protected:
1419d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " protected";
1420d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    break;
1421d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  case ObjCIvarDecl::Public:
1422d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " public";
1423d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    break;
1424d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  case ObjCIvarDecl::Package:
1425d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " package";
1426d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    break;
1427d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  }
1428d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1429d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1430ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCMethodDecl(const ObjCMethodDecl *D) {
1431d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isInstanceMethod())
1432d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " -";
1433d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  else
1434d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " +";
1435d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1436651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  dumpType(D->getReturnType());
1437d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1438e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu  if (D->isThisDeclarationADefinition()) {
1439d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpDeclContext(D);
1440e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu  } else {
1441ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    for (ObjCMethodDecl::param_const_iterator I = D->param_begin(),
1442ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko                                              E = D->param_end();
1443176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines         I != E; ++I)
1444d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      dumpDecl(*I);
14456000dace22f110d8768476989313e9d981d690d0Chris Lattner  }
1446d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1447176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (D->isVariadic())
1448176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpChild([=] { OS << "..."; });
1449d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1450176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (D->hasBody())
1451d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpStmt(D->getBody());
1452d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1453d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1454ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCCategoryDecl(const ObjCCategoryDecl *D) {
1455d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1456d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getClassInterface());
1457d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getImplementation());
1458d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  for (ObjCCategoryDecl::protocol_iterator I = D->protocol_begin(),
1459ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko                                           E = D->protocol_end();
1460176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines       I != E; ++I)
1461d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpDeclRef(*I);
1462d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1463d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1464ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCCategoryImplDecl(const ObjCCategoryImplDecl *D) {
1465d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1466d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getClassInterface());
1467d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getCategoryDecl());
1468d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1469d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1470ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCProtocolDecl(const ObjCProtocolDecl *D) {
1471d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1472651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1473651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *Child : D->protocols())
1474176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpDeclRef(Child);
1475d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1476d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1477ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCInterfaceDecl(const ObjCInterfaceDecl *D) {
1478d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1479d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getSuperClass(), "super");
1480651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1481176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpDeclRef(D->getImplementation());
1482651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *Child : D->protocols())
1483176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpDeclRef(Child);
1484d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1485d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1486ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCImplementationDecl(const ObjCImplementationDecl *D) {
1487d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1488d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getSuperClass(), "super");
1489d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getClassInterface());
1490ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  for (ObjCImplementationDecl::init_const_iterator I = D->init_begin(),
1491ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko                                                   E = D->init_end();
1492176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines       I != E; ++I)
1493d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpCXXCtorInitializer(*I);
1494d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1495d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1496ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCCompatibleAliasDecl(const ObjCCompatibleAliasDecl *D) {
1497d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1498d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getClassInterface());
1499d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1500d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1501ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCPropertyDecl(const ObjCPropertyDecl *D) {
1502d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1503d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpType(D->getType());
1504d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1505d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->getPropertyImplementation() == ObjCPropertyDecl::Required)
1506d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " required";
1507d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  else if (D->getPropertyImplementation() == ObjCPropertyDecl::Optional)
1508d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " optional";
1509d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1510d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  ObjCPropertyDecl::PropertyAttributeKind Attrs = D->getPropertyAttributes();
1511d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (Attrs != ObjCPropertyDecl::OBJC_PR_noattr) {
1512d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    if (Attrs & ObjCPropertyDecl::OBJC_PR_readonly)
1513d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " readonly";
1514d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    if (Attrs & ObjCPropertyDecl::OBJC_PR_assign)
1515d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " assign";
1516d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    if (Attrs & ObjCPropertyDecl::OBJC_PR_readwrite)
1517d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " readwrite";
1518d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    if (Attrs & ObjCPropertyDecl::OBJC_PR_retain)
1519d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " retain";
1520d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    if (Attrs & ObjCPropertyDecl::OBJC_PR_copy)
1521d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " copy";
1522d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    if (Attrs & ObjCPropertyDecl::OBJC_PR_nonatomic)
1523d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " nonatomic";
1524d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    if (Attrs & ObjCPropertyDecl::OBJC_PR_atomic)
1525d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " atomic";
1526d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    if (Attrs & ObjCPropertyDecl::OBJC_PR_weak)
1527d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " weak";
1528d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    if (Attrs & ObjCPropertyDecl::OBJC_PR_strong)
1529d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " strong";
1530d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    if (Attrs & ObjCPropertyDecl::OBJC_PR_unsafe_unretained)
1531d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " unsafe_unretained";
1532176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (Attrs & ObjCPropertyDecl::OBJC_PR_getter)
1533d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      dumpDeclRef(D->getGetterMethodDecl(), "getter");
1534176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (Attrs & ObjCPropertyDecl::OBJC_PR_setter)
1535d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      dumpDeclRef(D->getSetterMethodDecl(), "setter");
1536d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  }
1537d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1538d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1539ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D) {
1540d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D->getPropertyDecl());
1541d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize)
1542d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " synthesize";
1543d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  else
1544d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " dynamic";
1545d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getPropertyDecl());
1546d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getPropertyIvarDecl());
1547d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1548d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1549ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitBlockDecl(const BlockDecl *D) {
1550651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto I : D->params())
1551651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    dumpDecl(I);
1552d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1553176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (D->isVariadic())
1554176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpChild([=]{ OS << "..."; });
1555176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1556176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (D->capturesCXXThis())
1557176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpChild([=]{ OS << "capture this"; });
1558d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1559651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (const auto &I : D->captures()) {
1560176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpChild([=] {
1561176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << "capture";
1562176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (I.isByRef())
1563176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << " byref";
1564176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (I.isNested())
1565176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << " nested";
1566176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (I.getVariable()) {
1567176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << ' ';
1568176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        dumpBareDeclRef(I.getVariable());
1569176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      }
1570176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (I.hasCopyExpr())
1571176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        dumpStmt(I.getCopyExpr());
1572176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    });
1573d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  }
1574d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpStmt(D->getBody());
15756000dace22f110d8768476989313e9d981d690d0Chris Lattner}
15766000dace22f110d8768476989313e9d981d690d0Chris Lattner
1577d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko//===----------------------------------------------------------------------===//
157821c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko//  Stmt dumping methods.
1579d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko//===----------------------------------------------------------------------===//
1580d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko
1581ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::dumpStmt(const Stmt *S) {
1582176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpChild([=] {
1583176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (!S) {
1584176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ColorScope Color(*this, NullColor);
1585176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << "<<<NULL>>>";
1586176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return;
1587176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
1588d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko
1589176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (const DeclStmt *DS = dyn_cast<DeclStmt>(S)) {
1590176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      VisitDeclStmt(DS);
1591176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return;
1592176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
1593d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko
1594176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ConstStmtVisitor<ASTDumper>::Visit(S);
1595d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko
1596176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    for (Stmt::const_child_range CI = S->children(); CI; ++CI)
1597176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpStmt(*CI);
1598176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  });
1599d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko}
1600d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko
1601ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitStmt(const Stmt *Node) {
16027ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  {
16037ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    ColorScope Color(*this, StmtColor);
16047ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    OS << Node->getStmtClassName();
16057ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  }
1606d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpPointer(Node);
1607d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpSourceRange(Node->getSourceRange());
1608d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko}
1609d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko
1610ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitDeclStmt(const DeclStmt *Node) {
1611d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitStmt(Node);
1612ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  for (DeclStmt::const_decl_iterator I = Node->decl_begin(),
1613ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko                                     E = Node->decl_end();
1614176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines       I != E; ++I)
1615d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpDecl(*I);
16165399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek}
16175399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek
1618ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitAttributedStmt(const AttributedStmt *Node) {
1619c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko  VisitStmt(Node);
1620ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  for (ArrayRef<const Attr *>::iterator I = Node->getAttrs().begin(),
1621ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko                                        E = Node->getAttrs().end();
1622176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines       I != E; ++I)
1623c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko    dumpAttr(*I);
1624c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko}
1625c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko
1626ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitLabelStmt(const LabelStmt *Node) {
1627d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitStmt(Node);
1628806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " '" << Node->getName() << "'";
16296000dace22f110d8768476989313e9d981d690d0Chris Lattner}
16306000dace22f110d8768476989313e9d981d690d0Chris Lattner
1631ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitGotoStmt(const GotoStmt *Node) {
1632d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitStmt(Node);
1633d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << " '" << Node->getLabel()->getName() << "'";
1634d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpPointer(Node->getLabel());
16356000dace22f110d8768476989313e9d981d690d0Chris Lattner}
16366000dace22f110d8768476989313e9d981d690d0Chris Lattner
16370aae289e10b3efd484ecc023eb0fad873346754cPavel Labathvoid ASTDumper::VisitCXXCatchStmt(const CXXCatchStmt *Node) {
16380aae289e10b3efd484ecc023eb0fad873346754cPavel Labath  VisitStmt(Node);
16390aae289e10b3efd484ecc023eb0fad873346754cPavel Labath  dumpDecl(Node->getExceptionDecl());
16400aae289e10b3efd484ecc023eb0fad873346754cPavel Labath}
16410aae289e10b3efd484ecc023eb0fad873346754cPavel Labath
16426000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
164321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko//  Expr dumping methods.
16446000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
16456000dace22f110d8768476989313e9d981d690d0Chris Lattner
1646ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitExpr(const Expr *Node) {
1647d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitStmt(Node);
164821c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  dumpType(Node->getType());
164921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
16507ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  {
16517ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    ColorScope Color(*this, ValueKindColor);
16527ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    switch (Node->getValueKind()) {
16537ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    case VK_RValue:
16547ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      break;
16557ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    case VK_LValue:
16567ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      OS << " lvalue";
16577ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      break;
16587ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    case VK_XValue:
16597ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      OS << " xvalue";
16607ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      break;
16617ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    }
166221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  }
166321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
16647ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  {
16657ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    ColorScope Color(*this, ObjectKindColor);
16667ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    switch (Node->getObjectKind()) {
16677ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    case OK_Ordinary:
16687ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      break;
16697ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    case OK_BitField:
16707ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      OS << " bitfield";
16717ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      break;
16727ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    case OK_ObjCProperty:
16737ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      OS << " objcproperty";
16747ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      break;
16757ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    case OK_ObjCSubscript:
16767ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      OS << " objcsubscript";
16777ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      break;
16787ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    case OK_VectorComponent:
16797ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      OS << " vectorcomponent";
16807ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      break;
16817ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    }
168221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  }
16836000dace22f110d8768476989313e9d981d690d0Chris Lattner}
16846000dace22f110d8768476989313e9d981d690d0Chris Lattner
1685ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkostatic void dumpBasePath(raw_ostream &OS, const CastExpr *Node) {
1686f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  if (Node->path_empty())
16875cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    return;
16885cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson
16895cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson  OS << " (";
16905cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson  bool First = true;
1691ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  for (CastExpr::path_const_iterator I = Node->path_begin(),
1692ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko                                     E = Node->path_end();
1693ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko       I != E; ++I) {
16945cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    const CXXBaseSpecifier *Base = *I;
16955cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    if (!First)
16965cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson      OS << " -> ";
169721c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
16985cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    const CXXRecordDecl *RD =
16995cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
170021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
17015cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    if (Base->isVirtual())
17025cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson      OS << "virtual ";
17035cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    OS << RD->getName();
17045cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    First = false;
17055cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson  }
170621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
17075cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson  OS << ')';
17085cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson}
17095cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson
1710ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCastExpr(const CastExpr *Node) {
1711d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
17127ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  OS << " <";
17137ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  {
17147ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    ColorScope Color(*this, CastColor);
17157ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    OS << Node->getCastKindName();
17167ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  }
171721c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  dumpBasePath(OS, Node);
17185cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson  OS << ">";
171927a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson}
172027a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson
1721ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitDeclRefExpr(const DeclRefExpr *Node) {
1722d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
1723eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek
1724806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " ";
1725d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpBareDeclRef(Node->getDecl());
17263aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth  if (Node->getDecl() != Node->getFoundDecl()) {
17273aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth    OS << " (";
1728d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpBareDeclRef(Node->getFoundDecl());
17293aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth    OS << ")";
17303aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth  }
17316b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall}
17326b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall
1733ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUnresolvedLookupExpr(const UnresolvedLookupExpr *Node) {
1734d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
17359d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall  OS << " (";
173621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  if (!Node->requiresADL())
173721c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    OS << "no ";
1738900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer  OS << "ADL) = '" << Node->getName() << '\'';
17399d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall
17409d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall  UnresolvedLookupExpr::decls_iterator
17419d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall    I = Node->decls_begin(), E = Node->decls_end();
174221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  if (I == E)
174321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    OS << " empty";
17449d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall  for (; I != E; ++I)
1745d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpPointer(*I);
17469d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall}
17479d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall
1748ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCIvarRefExpr(const ObjCIvarRefExpr *Node) {
1749d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
17503c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff
17517ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  {
17527ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    ColorScope Color(*this, DeclKindNameColor);
17537ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    OS << " " << Node->getDecl()->getDeclKindName() << "Decl";
17547ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  }
17557ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  OS << "='" << *Node->getDecl() << "'";
1756d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpPointer(Node->getDecl());
1757218543b10e81ea2269ef6ae34d2d8ddbdec54dbeSteve Naroff  if (Node->isFreeIvar())
1758806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << " isFreeIvar";
17593c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff}
17603c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff
1761ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitPredefinedExpr(const PredefinedExpr *Node) {
1762d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
1763176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  OS << " " << PredefinedExpr::getIdentTypeName(Node->getIdentType());
17646000dace22f110d8768476989313e9d981d690d0Chris Lattner}
17656000dace22f110d8768476989313e9d981d690d0Chris Lattner
1766ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCharacterLiteral(const CharacterLiteral *Node) {
1767d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
17687ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  ColorScope Color(*this, ValueColor);
176949cf8847ef4d9caebdd162d2a5d7d055333d8b5cRichard Trieu  OS << " " << Node->getValue();
17706000dace22f110d8768476989313e9d981d690d0Chris Lattner}
17716000dace22f110d8768476989313e9d981d690d0Chris Lattner
1772ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitIntegerLiteral(const IntegerLiteral *Node) {
1773d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
17746000dace22f110d8768476989313e9d981d690d0Chris Lattner
17756000dace22f110d8768476989313e9d981d690d0Chris Lattner  bool isSigned = Node->getType()->isSignedIntegerType();
17767ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  ColorScope Color(*this, ValueColor);
1777806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " " << Node->getValue().toString(10, isSigned);
17786000dace22f110d8768476989313e9d981d690d0Chris Lattner}
177921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
1780ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitFloatingLiteral(const FloatingLiteral *Node) {
1781d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
17827ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  ColorScope Color(*this, ValueColor);
1783806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " " << Node->getValueAsApproximateDouble();
17846000dace22f110d8768476989313e9d981d690d0Chris Lattner}
17855d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner
1786ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitStringLiteral(const StringLiteral *Str) {
1787d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Str);
17887ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  ColorScope Color(*this, ValueColor);
1789806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " ";
17908ab09da1faaa33b9fa78de59cc4e191bfe9907b5Richard Trieu  Str->outputString(OS);
17916000dace22f110d8768476989313e9d981d690d0Chris Lattner}
179217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner
1793c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid ASTDumper::VisitInitListExpr(const InitListExpr *ILE) {
1794c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  VisitExpr(ILE);
1795c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  if (auto *Filler = ILE->getArrayFiller()) {
1796176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpChild([=] {
1797176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << "array filler";
1798176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpStmt(Filler);
1799176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    });
1800c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
1801c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  if (auto *Field = ILE->getInitializedFieldInUnion()) {
1802c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    OS << " field ";
1803c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    dumpBareDeclRef(Field);
1804c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
1805c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
1806c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
1807ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUnaryOperator(const UnaryOperator *Node) {
1808d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
1809806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " " << (Node->isPostfix() ? "postfix" : "prefix")
1810806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar     << " '" << UnaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
18116000dace22f110d8768476989313e9d981d690d0Chris Lattner}
181221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
1813ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUnaryExprOrTypeTraitExpr(
1814ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    const UnaryExprOrTypeTraitExpr *Node) {
1815d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
1816f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  switch(Node->getKind()) {
1817f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case UETT_SizeOf:
1818d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " sizeof";
1819f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    break;
1820f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case UETT_AlignOf:
1821d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " alignof";
1822f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    break;
1823f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case UETT_VecStep:
1824d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " vec_step";
1825f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    break;
1826f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  }
18270518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  if (Node->isArgumentType())
182821c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    dumpType(Node->getArgumentType());
18296000dace22f110d8768476989313e9d981d690d0Chris Lattner}
183013cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner
1831ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitMemberExpr(const MemberExpr *Node) {
1832d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
1833d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << " " << (Node->isArrow() ? "->" : ".") << *Node->getMemberDecl();
1834d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpPointer(Node->getMemberDecl());
18356000dace22f110d8768476989313e9d981d690d0Chris Lattner}
183621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
1837ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitExtVectorElementExpr(const ExtVectorElementExpr *Node) {
1838d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
1839806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " " << Node->getAccessor().getNameStart();
18406000dace22f110d8768476989313e9d981d690d0Chris Lattner}
184121c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
1842ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitBinaryOperator(const BinaryOperator *Node) {
1843d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
1844806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
1845eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner}
184621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
1847ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCompoundAssignOperator(
1848ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    const CompoundAssignOperator *Node) {
1849d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
1850806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode())
1851806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar     << "' ComputeLHSTy=";
1852d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpBareType(Node->getComputationLHSType());
1853806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " ComputeResultTy=";
1854d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpBareType(Node->getComputationResultType());
18556000dace22f110d8768476989313e9d981d690d0Chris Lattner}
18566000dace22f110d8768476989313e9d981d690d0Chris Lattner
1857ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitBlockExpr(const BlockExpr *Node) {
1858d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
1859d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDecl(Node->getBlockDecl());
18606b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall}
18616b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall
1862ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitOpaqueValueExpr(const OpaqueValueExpr *Node) {
1863d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
18644b9c2d235fb9449e249d74f48ecfec601650de93John McCall
1865176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (Expr *Source = Node->getSourceExpr())
1866d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko    dumpStmt(Source);
18674b9c2d235fb9449e249d74f48ecfec601650de93John McCall}
18684b9c2d235fb9449e249d74f48ecfec601650de93John McCall
18696000dace22f110d8768476989313e9d981d690d0Chris Lattner// GNU extensions.
18706000dace22f110d8768476989313e9d981d690d0Chris Lattner
1871ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitAddrLabelExpr(const AddrLabelExpr *Node) {
1872d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
1873d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << " " << Node->getLabel()->getName();
1874d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpPointer(Node->getLabel());
18756000dace22f110d8768476989313e9d981d690d0Chris Lattner}
18766000dace22f110d8768476989313e9d981d690d0Chris Lattner
1877f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===//
1878f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner// C++ Expressions
1879f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===//
18806000dace22f110d8768476989313e9d981d690d0Chris Lattner
1881ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXNamedCastExpr(const CXXNamedCastExpr *Node) {
1882d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
188321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  OS << " " << Node->getCastName()
1884806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar     << "<" << Node->getTypeAsWritten().getAsString() << ">"
18855cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson     << " <" << Node->getCastKindName();
188621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  dumpBasePath(OS, Node);
18875cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson  OS << ">";
18886000dace22f110d8768476989313e9d981d690d0Chris Lattner}
18896000dace22f110d8768476989313e9d981d690d0Chris Lattner
1890ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *Node) {
1891d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
1892806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " " << (Node->getValue() ? "true" : "false");
18936000dace22f110d8768476989313e9d981d690d0Chris Lattner}
18946000dace22f110d8768476989313e9d981d690d0Chris Lattner
1895ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXThisExpr(const CXXThisExpr *Node) {
1896d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
1897806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " this";
1898cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor}
1899cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor
1900ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXFunctionalCastExpr(const CXXFunctionalCastExpr *Node) {
1901d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
1902cc2fca2ba2716293204901b8d2393428b965f12aEli Friedman  OS << " functional cast to " << Node->getTypeAsWritten().getAsString()
1903cc2fca2ba2716293204901b8d2393428b965f12aEli Friedman     << " <" << Node->getCastKindName() << ">";
190449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
190549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
1906ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXConstructExpr(const CXXConstructExpr *Node) {
1907d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
1908d4bbdfebe9bd13defa977a934bf73fc2ce3b2817John McCall  CXXConstructorDecl *Ctor = Node->getConstructor();
190921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  dumpType(Ctor->getType());
19100eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson  if (Node->isElidable())
1911806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << " elidable";
1912f8cf0b028c7a5b632c3a711813cd44a9d9642537John McCall  if (Node->requiresZeroInitialization())
1913f8cf0b028c7a5b632c3a711813cd44a9d9642537John McCall    OS << " zeroing";
19140eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson}
19150eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson
1916ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *Node) {
1917d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
1918806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " ";
191921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  dumpCXXTemporary(Node->getTemporary());
19200eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson}
19210eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson
19223ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarvoid ASTDumper::VisitCXXNewExpr(const CXXNewExpr *Node) {
19233ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  VisitExpr(Node);
19243ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  if (Node->isGlobalNew())
19253ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    OS << " global";
19263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  if (Node->isArray())
19273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    OS << " array";
19283ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  if (Node->getOperatorNew()) {
19293ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    OS << ' ';
19303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    dumpBareDeclRef(Node->getOperatorNew());
19313ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
19323ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // We could dump the deallocation function used in case of error, but it's
19333ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // usually not that interesting.
19343ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar}
19353ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
19363ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarvoid ASTDumper::VisitCXXDeleteExpr(const CXXDeleteExpr *Node) {
19373ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  VisitExpr(Node);
19383ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  if (Node->isGlobalDelete())
19393ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    OS << " global";
19403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  if (Node->isArrayForm())
19413ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    OS << " array";
19423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  if (Node->getOperatorDelete()) {
19433ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    OS << ' ';
19443ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    dumpBareDeclRef(Node->getOperatorDelete());
19453ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
19463ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar}
19473ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
1948211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithvoid
1949211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard SmithASTDumper::VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *Node) {
1950211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith  VisitExpr(Node);
1951211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith  if (const ValueDecl *VD = Node->getExtendingDecl()) {
1952211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith    OS << " extended by ";
1953211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith    dumpBareDeclRef(VD);
1954211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith  }
1955211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith}
1956211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith
1957ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitExprWithCleanups(const ExprWithCleanups *Node) {
1958d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
1959d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  for (unsigned i = 0, e = Node->getNumObjects(); i != e; ++i)
1960d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpDeclRef(Node->getObject(i), "cleanup");
19610eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson}
19620eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson
1963ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::dumpCXXTemporary(const CXXTemporary *Temporary) {
1964d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << "(CXXTemporary";
1965d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpPointer(Temporary);
1966d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << ")";
19670eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson}
19680eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson
19690e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid ASTDumper::VisitSizeOfPackExpr(const SizeOfPackExpr *Node) {
19700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  VisitExpr(Node);
19710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  dumpPointer(Node->getPack());
19720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  dumpName(Node->getPack());
19730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
19740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
19750e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
19765508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===//
19775508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// Obj-C Expressions
19785508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===//
19795508518a2702b00be3b15a26d772bde968972f54Anders Carlsson
1980ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCMessageExpr(const ObjCMessageExpr *Node) {
1981d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
1982651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OS << " selector=";
1983651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Node->getSelector().print(OS);
198404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  switch (Node->getReceiverKind()) {
198504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::Instance:
198604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
198704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
198804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::Class:
198904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    OS << " class=";
1990d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpBareType(Node->getClassReceiver());
199104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
199204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
199304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::SuperInstance:
199404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    OS << " super (instance)";
199504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
199604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
199704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::SuperClass:
199804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    OS << " super (class)";
199904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
200004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  }
2001b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek}
2002b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek
2003ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCBoxedExpr(const ObjCBoxedExpr *Node) {
2004d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
2005651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OS << " selector=";
2006651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Node->getBoxingMethod()->getSelector().print(OS);
200736faaddccf519231a3facd26495e895ba5a28776Argyrios Kyrtzidis}
200836faaddccf519231a3facd26495e895ba5a28776Argyrios Kyrtzidis
2009ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCAtCatchStmt(const ObjCAtCatchStmt *Node) {
2010d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitStmt(Node);
2011ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  if (const VarDecl *CatchParam = Node->getCatchParamDecl())
2012d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko    dumpDecl(CatchParam);
2013d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  else
20148f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    OS << " catch all";
20158f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor}
20168f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor
2017ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCEncodeExpr(const ObjCEncodeExpr *Node) {
2018d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
201921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  dumpType(Node->getEncodedType());
2020f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson}
2021f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson
2022ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCSelectorExpr(const ObjCSelectorExpr *Node) {
2023d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
20241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2025651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OS << " ";
2026651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Node->getSelector().print(OS);
2027b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian}
2028b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian
2029ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCProtocolExpr(const ObjCProtocolExpr *Node) {
2030d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
20311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
203221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  OS << ' ' << *Node->getProtocol();
2033390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian}
20347f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar
2035ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr *Node) {
2036d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
203712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  if (Node->isImplicitProperty()) {
203899130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian    OS << " Kind=MethodRef Getter=\"";
203999130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian    if (Node->getImplicitPropertyGetter())
2040651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Node->getImplicitPropertyGetter()->getSelector().print(OS);
204199130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian    else
204299130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian      OS << "(null)";
204399130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian
204499130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian    OS << "\" Setter=\"";
204512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    if (ObjCMethodDecl *Setter = Node->getImplicitPropertySetter())
2046651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Setter->getSelector().print(OS);
204712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    else
204812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall      OS << "(null)";
204912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    OS << "\"";
205012f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  } else {
2051b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer    OS << " Kind=PropertyRef Property=\"" << *Node->getExplicitProperty() <<'"';
205212f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  }
20531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20548ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian  if (Node->isSuperReceiver())
20558ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian    OS << " super";
2056b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis
2057b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis  OS << " Messaging=";
2058b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis  if (Node->isMessagingGetter() && Node->isMessagingSetter())
2059b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis    OS << "Getter&Setter";
2060b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis  else if (Node->isMessagingGetter())
2061b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis    OS << "Getter";
2062b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis  else if (Node->isMessagingSetter())
2063b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis    OS << "Setter";
2064cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor}
2065cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor
2066ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCSubscriptRefExpr(const ObjCSubscriptRefExpr *Node) {
2067d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
2068ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  if (Node->isArraySubscriptRefExpr())
2069ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    OS << " Kind=ArraySubscript GetterForArray=\"";
2070ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  else
2071ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    OS << " Kind=DictionarySubscript GetterForDictionary=\"";
2072ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  if (Node->getAtIndexMethodDecl())
2073651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Node->getAtIndexMethodDecl()->getSelector().print(OS);
2074ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  else
2075ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    OS << "(null)";
207621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
2077ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  if (Node->isArraySubscriptRefExpr())
2078ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    OS << "\" SetterForArray=\"";
2079ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  else
2080ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    OS << "\" SetterForDictionary=\"";
2081ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  if (Node->setAtIndexMethodDecl())
2082651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Node->setAtIndexMethodDecl()->getSelector().print(OS);
2083ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  else
2084ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    OS << "(null)";
2085ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
2086ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
2087ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *Node) {
2088d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
2089ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  OS << " " << (Node->getValue() ? "__objc_yes" : "__objc_no");
2090ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
2091ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
20926000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
2093acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko// Comments
2094acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko//===----------------------------------------------------------------------===//
2095acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2096acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkoconst char *ASTDumper::getCommandName(unsigned CommandID) {
2097acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  if (Traits)
2098acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    return Traits->getCommandInfo(CommandID)->Name;
2099acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  const CommandInfo *Info = CommandTraits::getBuiltinCommandInfo(CommandID);
2100acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  if (Info)
2101acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    return Info->Name;
2102acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  return "<not a builtin command>";
2103acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2104acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2105acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::dumpFullComment(const FullComment *C) {
2106acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  if (!C)
2107acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    return;
2108acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2109acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  FC = C;
2110acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  dumpComment(C);
21116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  FC = nullptr;
2112acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2113acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2114acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::dumpComment(const Comment *C) {
2115176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpChild([=] {
2116176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (!C) {
2117176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ColorScope Color(*this, NullColor);
2118176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << "<<<NULL>>>";
2119176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return;
2120176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
2121acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2122176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    {
2123176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ColorScope Color(*this, CommentColor);
2124176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << C->getCommentKindName();
2125176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
2126176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpPointer(C);
2127176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpSourceRange(C->getSourceRange());
2128176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ConstCommentVisitor<ASTDumper>::visit(C);
2129176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    for (Comment::child_iterator I = C->child_begin(), E = C->child_end();
2130176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines         I != E; ++I)
2131176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpComment(*I);
2132176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  });
2133acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2134acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2135acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitTextComment(const TextComment *C) {
2136acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  OS << " Text=\"" << C->getText() << "\"";
2137acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2138acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2139acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitInlineCommandComment(const InlineCommandComment *C) {
2140acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  OS << " Name=\"" << getCommandName(C->getCommandID()) << "\"";
2141acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  switch (C->getRenderKind()) {
2142acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  case InlineCommandComment::RenderNormal:
2143acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " RenderNormal";
2144acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    break;
2145acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  case InlineCommandComment::RenderBold:
2146acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " RenderBold";
2147acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    break;
2148acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  case InlineCommandComment::RenderMonospaced:
2149acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " RenderMonospaced";
2150acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    break;
2151acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  case InlineCommandComment::RenderEmphasized:
2152acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " RenderEmphasized";
2153acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    break;
2154acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  }
2155acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2156acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  for (unsigned i = 0, e = C->getNumArgs(); i != e; ++i)
2157acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " Arg[" << i << "]=\"" << C->getArgText(i) << "\"";
2158acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2159acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2160acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitHTMLStartTagComment(const HTMLStartTagComment *C) {
2161acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  OS << " Name=\"" << C->getTagName() << "\"";
2162acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  if (C->getNumAttrs() != 0) {
2163acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " Attrs: ";
2164acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    for (unsigned i = 0, e = C->getNumAttrs(); i != e; ++i) {
2165acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko      const HTMLStartTagComment::Attribute &Attr = C->getAttr(i);
2166acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko      OS << " \"" << Attr.Name << "=\"" << Attr.Value << "\"";
2167acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    }
2168acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  }
2169acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  if (C->isSelfClosing())
2170acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " SelfClosing";
2171acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2172acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2173acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitHTMLEndTagComment(const HTMLEndTagComment *C) {
2174acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  OS << " Name=\"" << C->getTagName() << "\"";
2175acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2176acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2177acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitBlockCommandComment(const BlockCommandComment *C) {
2178acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  OS << " Name=\"" << getCommandName(C->getCommandID()) << "\"";
2179acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  for (unsigned i = 0, e = C->getNumArgs(); i != e; ++i)
2180acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " Arg[" << i << "]=\"" << C->getArgText(i) << "\"";
2181acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2182acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2183acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitParamCommandComment(const ParamCommandComment *C) {
2184acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  OS << " " << ParamCommandComment::getDirectionAsString(C->getDirection());
2185acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2186acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  if (C->isDirectionExplicit())
2187acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " explicitly";
2188acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  else
2189acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " implicitly";
2190acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2191acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  if (C->hasParamName()) {
2192acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    if (C->isParamIndexValid())
2193acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko      OS << " Param=\"" << C->getParamName(FC) << "\"";
2194acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    else
2195acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko      OS << " Param=\"" << C->getParamNameAsWritten() << "\"";
2196acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  }
2197acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2198651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (C->isParamIndexValid() && !C->isVarArgParam())
2199acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " ParamIndex=" << C->getParamIndex();
2200acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2201acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2202acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitTParamCommandComment(const TParamCommandComment *C) {
2203acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  if (C->hasParamName()) {
2204acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    if (C->isPositionValid())
2205acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko      OS << " Param=\"" << C->getParamName(FC) << "\"";
2206acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    else
2207acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko      OS << " Param=\"" << C->getParamNameAsWritten() << "\"";
2208acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  }
2209acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2210acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  if (C->isPositionValid()) {
2211acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " Position=<";
2212acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    for (unsigned i = 0, e = C->getDepth(); i != e; ++i) {
2213acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko      OS << C->getIndex(i);
2214acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko      if (i != e - 1)
2215acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko        OS << ", ";
2216acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    }
2217acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << ">";
2218acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  }
2219acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2220acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2221acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitVerbatimBlockComment(const VerbatimBlockComment *C) {
2222acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  OS << " Name=\"" << getCommandName(C->getCommandID()) << "\""
2223acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko        " CloseName=\"" << C->getCloseName() << "\"";
2224acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2225acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2226acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitVerbatimBlockLineComment(
2227acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    const VerbatimBlockLineComment *C) {
2228acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  OS << " Text=\"" << C->getText() << "\"";
2229acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2230acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2231acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitVerbatimLineComment(const VerbatimLineComment *C) {
2232acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  OS << " Text=\"" << C->getText() << "\"";
2233acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2234acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2235acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko//===----------------------------------------------------------------------===//
2236176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Type method implementations
2237176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines//===----------------------------------------------------------------------===//
2238176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2239176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid QualType::dump(const char *msg) const {
2240176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (msg)
2241176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    llvm::errs() << msg << ": ";
2242176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dump();
2243176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2244176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2245176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesLLVM_DUMP_METHOD void QualType::dump() const {
2246176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ASTDumper Dumper(llvm::errs(), nullptr, nullptr);
2247176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  Dumper.dumpTypeAsChild(*this);
2248176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2249176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2250176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesLLVM_DUMP_METHOD void Type::dump() const { QualType(this, 0).dump(); }
2251176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2252176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines//===----------------------------------------------------------------------===//
2253d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko// Decl method implementations
2254d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===//
2255d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
2256651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLLVM_DUMP_METHOD void Decl::dump() const { dump(llvm::errs()); }
2257d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
2258651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLLVM_DUMP_METHOD void Decl::dump(raw_ostream &OS) const {
2259acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  ASTDumper P(OS, &getASTContext().getCommentCommandTraits(),
2260acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko              &getASTContext().getSourceManager());
2261ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  P.dumpDecl(this);
2262d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
2263d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
2264651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLLVM_DUMP_METHOD void Decl::dumpColor() const {
22657ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  ASTDumper P(llvm::errs(), &getASTContext().getCommentCommandTraits(),
22667ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu              &getASTContext().getSourceManager(), /*ShowColors*/true);
2267ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  P.dumpDecl(this);
22687ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu}
22696e322c08b187ba93019732d2295c84c339813e0dRichard Smith
2270651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLLVM_DUMP_METHOD void DeclContext::dumpLookups() const {
2271ab297ccbcc51d5197d4ddb4e99b7bc8868d38314Richard Smith  dumpLookups(llvm::errs());
2272ab297ccbcc51d5197d4ddb4e99b7bc8868d38314Richard Smith}
2273ab297ccbcc51d5197d4ddb4e99b7bc8868d38314Richard Smith
2274176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesLLVM_DUMP_METHOD void DeclContext::dumpLookups(raw_ostream &OS,
2275176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                               bool DumpDecls) const {
22766e322c08b187ba93019732d2295c84c339813e0dRichard Smith  const DeclContext *DC = this;
22776e322c08b187ba93019732d2295c84c339813e0dRichard Smith  while (!DC->isTranslationUnit())
22786e322c08b187ba93019732d2295c84c339813e0dRichard Smith    DC = DC->getParent();
22796e322c08b187ba93019732d2295c84c339813e0dRichard Smith  ASTContext &Ctx = cast<TranslationUnitDecl>(DC)->getASTContext();
2280ab297ccbcc51d5197d4ddb4e99b7bc8868d38314Richard Smith  ASTDumper P(OS, &Ctx.getCommentCommandTraits(), &Ctx.getSourceManager());
2281176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  P.dumpLookups(this, DumpDecls);
22826e322c08b187ba93019732d2295c84c339813e0dRichard Smith}
22836e322c08b187ba93019732d2295c84c339813e0dRichard Smith
2284d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===//
22856000dace22f110d8768476989313e9d981d690d0Chris Lattner// Stmt method implementations
22866000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
22876000dace22f110d8768476989313e9d981d690d0Chris Lattner
2288651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLLVM_DUMP_METHOD void Stmt::dump(SourceManager &SM) const {
22899668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis  dump(llvm::errs(), SM);
22909668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis}
22919668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis
2292651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLLVM_DUMP_METHOD void Stmt::dump(raw_ostream &OS, SourceManager &SM) const {
22936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ASTDumper P(OS, nullptr, &SM);
2294ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  P.dumpStmt(this);
22950c727a35718556866a978f64ac549d9798735f08Chris Lattner}
22960c727a35718556866a978f64ac549d9798735f08Chris Lattner
22973ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga NainarLLVM_DUMP_METHOD void Stmt::dump(raw_ostream &OS) const {
22983ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  ASTDumper P(OS, nullptr, nullptr);
22993ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  P.dumpStmt(this);
23003ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar}
23013ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
2302651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLLVM_DUMP_METHOD void Stmt::dump() const {
23036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ASTDumper P(llvm::errs(), nullptr, nullptr);
2304ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  P.dumpStmt(this);
23056000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2306acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2307651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLLVM_DUMP_METHOD void Stmt::dumpColor() const {
23086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ASTDumper P(llvm::errs(), nullptr, nullptr, /*ShowColors*/true);
2309ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  P.dumpStmt(this);
23107ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu}
23117ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
2312acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko//===----------------------------------------------------------------------===//
2313acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko// Comment method implementations
2314acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko//===----------------------------------------------------------------------===//
2315acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
23166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesLLVM_DUMP_METHOD void Comment::dump() const {
23176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  dump(llvm::errs(), nullptr, nullptr);
23186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
2319acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2320651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLLVM_DUMP_METHOD void Comment::dump(const ASTContext &Context) const {
2321acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  dump(llvm::errs(), &Context.getCommentCommandTraits(),
2322acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko       &Context.getSourceManager());
2323acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2324acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
232551ccafd66682ecbccc0a63364291dc7a8f6ec0f0Alexander Kornienkovoid Comment::dump(raw_ostream &OS, const CommandTraits *Traits,
2326acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko                   const SourceManager *SM) const {
2327acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  const FullComment *FC = dyn_cast<FullComment>(this);
2328acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  ASTDumper D(OS, Traits, SM);
2329acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  D.dumpFullComment(FC);
2330acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
23317ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
2332651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLLVM_DUMP_METHOD void Comment::dumpColor() const {
23337ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  const FullComment *FC = dyn_cast<FullComment>(this);
23346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ASTDumper D(llvm::errs(), nullptr, nullptr, /*ShowColors*/true);
23357ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  D.dumpFullComment(FC);
23367ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu}
2337