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"
214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/AST/DeclOpenMP.h"
22d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko#include "clang/AST/DeclVisitor.h"
234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/AST/LocInfoType.h"
2455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/StmtVisitor.h"
25176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "clang/AST/TypeVisitor.h"
2687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/Basic/Builtins.h"
27d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko#include "clang/Basic/Module.h"
28e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner#include "clang/Basic/SourceManager.h"
29806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar#include "llvm/Support/raw_ostream.h"
306000dace22f110d8768476989313e9d981d690d0Chris Lattnerusing namespace clang;
31acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkousing namespace clang::comments;
326000dace22f110d8768476989313e9d981d690d0Chris Lattner
336000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
3440b66a000dca59be61117558bb54f3880a77cd14Alexander Kornienko// ASTDumper Visitor
356000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
366000dace22f110d8768476989313e9d981d690d0Chris Lattner
376000dace22f110d8768476989313e9d981d690d0Chris Lattnernamespace  {
387ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // Colors used for various parts of the AST dump
39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Do not use bold yellow for any text.  It is hard to read on white screens.
407ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
417ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  struct TerminalColor {
427ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    raw_ostream::Colors Color;
437ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    bool Bold;
447ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  };
457ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Red           - CastColor
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Green         - TypeColor
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Bold Green    - DeclKindNameColor, UndeserializedColor
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Yellow        - AddressColor, LocationColor
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Blue          - CommentColor, NullColor, IndentColor
51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Bold Blue     - AttrColor
52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Bold Magenta  - StmtColor
53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Cyan          - ValueKindColor, ObjectKindColor
54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Bold Cyan     - ValueColor, DeclNameColor
55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
567ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // Decl kind names (VarDecl, FunctionDecl, etc)
577ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor DeclKindNameColor = { raw_ostream::GREEN, true };
587ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // Attr names (CleanupAttr, GuardedByAttr, etc)
597ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor AttrColor = { raw_ostream::BLUE, true };
607ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // Statement names (DeclStmt, ImplicitCastExpr, etc)
617ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor StmtColor = { raw_ostream::MAGENTA, true };
627ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // Comment names (FullComment, ParagraphComment, TextComment, etc)
63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static const TerminalColor CommentColor = { raw_ostream::BLUE, false };
647ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
657ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // Type names (int, float, etc, plus user defined types)
667ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor TypeColor = { raw_ostream::GREEN, false };
677ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
687ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // Pointer address
697ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor AddressColor = { raw_ostream::YELLOW, false };
707ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // Source locations
717ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor LocationColor = { raw_ostream::YELLOW, false };
727ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
737ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // lvalue/xvalue
747ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor ValueKindColor = { raw_ostream::CYAN, false };
757ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // bitfield/objcproperty/objcsubscript/vectorcomponent
767ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor ObjectKindColor = { raw_ostream::CYAN, false };
777ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
787ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // Null statements
797ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor NullColor = { raw_ostream::BLUE, false };
807ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
81e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith  // Undeserialized entities
82e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith  static const TerminalColor UndeserializedColor = { raw_ostream::GREEN, true };
83e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith
847ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // CastKind from CastExpr's
857ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor CastColor = { raw_ostream::RED, false };
867ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
877ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // Value of the statement
887ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor ValueColor = { raw_ostream::CYAN, true };
897ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  // Decl names
907ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  static const TerminalColor DeclNameColor = { raw_ostream::CYAN, true };
917ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
92e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu  // Indents ( `, -. | )
93e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu  static const TerminalColor IndentColor = { raw_ostream::BLUE, false };
94e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu
95d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  class ASTDumper
96ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko      : public ConstDeclVisitor<ASTDumper>, public ConstStmtVisitor<ASTDumper>,
97176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        public ConstCommentVisitor<ASTDumper>, public TypeVisitor<ASTDumper> {
985f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    raw_ostream &OS;
99acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    const CommandTraits *Traits;
100acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    const SourceManager *SM;
1011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
102176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    /// Pending[i] is an action to dump an entity at level i.
103176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    llvm::SmallVector<std::function<void(bool isLastChild)>, 32> Pending;
104e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu
105176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    /// Indicates whether we're at the top level.
106176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    bool TopLevel;
107e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu
108176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    /// Indicates if we're handling the first child after entering a new depth.
109176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    bool FirstChild;
110176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
111176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    /// Prefix for currently-being-dumped entity.
112176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    std::string Prefix;
113e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu
11421c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    /// Keep track of the last location we print out so that we can
11521c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    /// print out deltas from then on out.
116e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    const char *LastLocFilename;
117e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    unsigned LastLocLine;
118d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor
119acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    /// The \c FullComment parent of the comment being dumped.
120acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    const FullComment *FC;
121acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
1227ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    bool ShowColors;
1237ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
124176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    /// Dump a child of the current node.
125176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    template<typename Fn> void dumpChild(Fn doDumpChild) {
126176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      // If we're at the top level, there's nothing interesting to do; just
127176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      // run the dumper.
128176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (TopLevel) {
129176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        TopLevel = false;
130176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        doDumpChild();
131176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        while (!Pending.empty()) {
132176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          Pending.back()(true);
133176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          Pending.pop_back();
134176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        }
135176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        Prefix.clear();
136176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << "\n";
137176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        TopLevel = true;
138176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        return;
139cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek      }
140176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
141176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      const FullComment *OrigFC = FC;
142176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      auto dumpWithIndent = [this, doDumpChild, OrigFC](bool isLastChild) {
143176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        // Print out the appropriate tree structure and work out the prefix for
144176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        // children of this node. For instance:
145176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //
146176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //   A        Prefix = ""
147176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //   |-B      Prefix = "| "
148176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //   | `-C    Prefix = "|   "
149176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //   `-D      Prefix = "  "
150176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //     |-E    Prefix = "  | "
151176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //     `-F    Prefix = "    "
152176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //   G        Prefix = ""
153176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        //
154176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        // Note that the first level gets no prefix.
155176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        {
156176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          OS << '\n';
157176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          ColorScope Color(*this, IndentColor);
158176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          OS << Prefix << (isLastChild ? '`' : '|') << '-';
159176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          this->Prefix.push_back(isLastChild ? ' ' : '|');
160176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          this->Prefix.push_back(' ');
161176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        }
162176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
163176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        FirstChild = true;
164176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        unsigned Depth = Pending.size();
165176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
166176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        FC = OrigFC;
167176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        doDumpChild();
168176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
169176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        // If any children are left, they're the last at their nesting level.
170176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        // Dump those ones out now.
171176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        while (Depth < Pending.size()) {
172176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          Pending.back()(true);
173176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          this->Pending.pop_back();
174176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        }
175176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
176176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        // Restore the old prefix.
177176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        this->Prefix.resize(Prefix.size() - 2);
178176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      };
179176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
180176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (FirstChild) {
181176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        Pending.push_back(std::move(dumpWithIndent));
182176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      } else {
183176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        Pending.back()(false);
184176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        Pending.back() = std::move(dumpWithIndent);
185cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek      }
186176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      FirstChild = false;
187176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
188cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek
1897ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    class ColorScope {
1907ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      ASTDumper &Dumper;
1917ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    public:
1927ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      ColorScope(ASTDumper &Dumper, TerminalColor Color)
1937ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu        : Dumper(Dumper) {
1947ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu        if (Dumper.ShowColors)
1957ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu          Dumper.OS.changeColor(Color.Color, Color.Bold);
1967ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      }
1977ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      ~ColorScope() {
1987ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu        if (Dumper.ShowColors)
1997ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu          Dumper.OS.resetColor();
2007ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      }
2017ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    };
2027ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
2036000dace22f110d8768476989313e9d981d690d0Chris Lattner  public:
204acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    ASTDumper(raw_ostream &OS, const CommandTraits *Traits,
205acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko              const SourceManager *SM)
206176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : OS(OS), Traits(Traits), SM(SM), TopLevel(true), FirstChild(true),
2076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        LastLocFilename(""), LastLocLine(~0U), FC(nullptr),
2087ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu        ShowColors(SM && SM->getDiagnostics().getShowColors()) { }
2097ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
2107ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    ASTDumper(raw_ostream &OS, const CommandTraits *Traits,
2117ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu              const SourceManager *SM, bool ShowColors)
212176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : OS(OS), Traits(Traits), SM(SM), TopLevel(true), FirstChild(true),
21395f97bf07a1811d020cbdcaa51d6e25752a4bd37Richard Smith        LastLocFilename(""), LastLocLine(~0U),
214e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu        ShowColors(ShowColors) { }
2151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
216ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void dumpDecl(const Decl *D);
217ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void dumpStmt(const Stmt *S);
218acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void dumpFullComment(const FullComment *C);
2191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
220e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu    // Utilities
221d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    void dumpPointer(const void *Ptr);
222d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    void dumpSourceRange(SourceRange R);
22321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    void dumpLocation(SourceLocation Loc);
224176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void dumpBareType(QualType T, bool Desugar = true);
22521c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    void dumpType(QualType T);
226176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void dumpTypeAsChild(QualType T);
227176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void dumpTypeAsChild(const Type *T);
228ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko    void dumpBareDeclRef(const Decl *Node);
2296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    void dumpDeclRef(const Decl *Node, const char *Label = nullptr);
230ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko    void dumpName(const NamedDecl *D);
231e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu    bool hasNodes(const DeclContext *DC);
232ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko    void dumpDeclContext(const DeclContext *DC);
233176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void dumpLookups(const DeclContext *DC, bool DumpDecls);
234c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko    void dumpAttr(const Attr *A);
235d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
236d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    // C++ Utilities
237d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    void dumpAccessSpecifier(AccessSpecifier AS);
238ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko    void dumpCXXCtorInitializer(const CXXCtorInitializer *Init);
239ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko    void dumpTemplateParameters(const TemplateParameterList *TPL);
240d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    void dumpTemplateArgumentListInfo(const TemplateArgumentListInfo &TALI);
241d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    void dumpTemplateArgumentLoc(const TemplateArgumentLoc &A);
242d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    void dumpTemplateArgumentList(const TemplateArgumentList &TAL);
243d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    void dumpTemplateArgument(const TemplateArgument &A,
244d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko                              SourceRange R = SourceRange());
245d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
24687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // Objective-C utilities.
24787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    void dumpObjCTypeParamList(const ObjCTypeParamList *typeParams);
24887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
249176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // Types
250176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitComplexType(const ComplexType *T) {
251176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getElementType());
252176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
253176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitPointerType(const PointerType *T) {
254176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getPointeeType());
255176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
256176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitBlockPointerType(const BlockPointerType *T) {
257176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getPointeeType());
258176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
259176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitReferenceType(const ReferenceType *T) {
260176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getPointeeType());
261176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
262176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitRValueReferenceType(const ReferenceType *T) {
263176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (T->isSpelledAsLValue())
264176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << " written as lvalue reference";
265176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      VisitReferenceType(T);
266176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
267176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitMemberPointerType(const MemberPointerType *T) {
268176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getClass());
269176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getPointeeType());
270176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
271176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitArrayType(const ArrayType *T) {
272176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      switch (T->getSizeModifier()) {
273176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case ArrayType::Normal: break;
274176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case ArrayType::Static: OS << " static"; break;
275176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case ArrayType::Star: OS << " *"; break;
276176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      }
277176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " " << T->getIndexTypeQualifiers().getAsString();
278176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getElementType());
279176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
280176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitConstantArrayType(const ConstantArrayType *T) {
281176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " " << T->getSize();
282176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      VisitArrayType(T);
283176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
284176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitVariableArrayType(const VariableArrayType *T) {
285176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " ";
286176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpSourceRange(T->getBracketsRange());
287176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      VisitArrayType(T);
288176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpStmt(T->getSizeExpr());
289176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
290176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitDependentSizedArrayType(const DependentSizedArrayType *T) {
291176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      VisitArrayType(T);
292176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " ";
293176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpSourceRange(T->getBracketsRange());
294176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpStmt(T->getSizeExpr());
295176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
296176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitDependentSizedExtVectorType(
297176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        const DependentSizedExtVectorType *T) {
298176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " ";
299176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpLocation(T->getAttributeLoc());
300176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getElementType());
301176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpStmt(T->getSizeExpr());
302176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
303176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitVectorType(const VectorType *T) {
304176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      switch (T->getVectorKind()) {
305176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case VectorType::GenericVector: break;
306176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case VectorType::AltiVecVector: OS << " altivec"; break;
307176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case VectorType::AltiVecPixel: OS << " altivec pixel"; break;
308176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case VectorType::AltiVecBool: OS << " altivec bool"; break;
309176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case VectorType::NeonVector: OS << " neon"; break;
310176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case VectorType::NeonPolyVector: OS << " neon poly"; break;
311176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      }
312176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " " << T->getNumElements();
313176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getElementType());
314176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
315176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitFunctionType(const FunctionType *T) {
316176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      auto EI = T->getExtInfo();
317176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (EI.getNoReturn()) OS << " noreturn";
318176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (EI.getProducesResult()) OS << " produces_result";
319176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (EI.getHasRegParm()) OS << " regparm " << EI.getRegParm();
320176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " " << FunctionType::getNameForCallConv(EI.getCC());
321176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getReturnType());
322176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
323176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitFunctionProtoType(const FunctionProtoType *T) {
324176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      auto EPI = T->getExtProtoInfo();
325176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (EPI.HasTrailingReturn) OS << " trailing_return";
326176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (T->isConst()) OS << " const";
327176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (T->isVolatile()) OS << " volatile";
328176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (T->isRestrict()) OS << " restrict";
329176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      switch (EPI.RefQualifier) {
330176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case RQ_None: break;
331176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case RQ_LValue: OS << " &"; break;
332176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        case RQ_RValue: OS << " &&"; break;
333176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      }
334176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      // FIXME: Exception specification.
335176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      // FIXME: Consumed parameters.
336176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      VisitFunctionType(T);
337176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      for (QualType PT : T->getParamTypes())
338176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        dumpTypeAsChild(PT);
339176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (EPI.Variadic)
340176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        dumpChild([=] { OS << "..."; });
341176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
342176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitUnresolvedUsingType(const UnresolvedUsingType *T) {
343176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpDeclRef(T->getDecl());
344176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
345176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitTypedefType(const TypedefType *T) {
346176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpDeclRef(T->getDecl());
347176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
348176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitTypeOfExprType(const TypeOfExprType *T) {
349176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpStmt(T->getUnderlyingExpr());
350176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
351176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitDecltypeType(const DecltypeType *T) {
352176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpStmt(T->getUnderlyingExpr());
353176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
354176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitUnaryTransformType(const UnaryTransformType *T) {
355176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      switch (T->getUTTKind()) {
356176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      case UnaryTransformType::EnumUnderlyingType:
357176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << " underlying_type";
358176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        break;
359176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      }
360176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getBaseType());
361176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
362176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitTagType(const TagType *T) {
363176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpDeclRef(T->getDecl());
364176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
365176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitAttributedType(const AttributedType *T) {
366176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      // FIXME: AttrKind
367176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getModifiedType());
368176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
369176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitTemplateTypeParmType(const TemplateTypeParmType *T) {
370176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " depth " << T->getDepth() << " index " << T->getIndex();
371176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (T->isParameterPack()) OS << " pack";
372176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpDeclRef(T->getDecl());
373176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
374176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitSubstTemplateTypeParmType(const SubstTemplateTypeParmType *T) {
375176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getReplacedParameter());
376176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
377176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitSubstTemplateTypeParmPackType(
378176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        const SubstTemplateTypeParmPackType *T) {
379176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getReplacedParameter());
380176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTemplateArgument(T->getArgumentPack());
381176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
382176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitAutoType(const AutoType *T) {
383176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (T->isDecltypeAuto()) OS << " decltype(auto)";
384176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (!T->isDeduced())
385176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << " undeduced";
386176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
387176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitTemplateSpecializationType(const TemplateSpecializationType *T) {
388176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (T->isTypeAlias()) OS << " alias";
389176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " "; T->getTemplateName().dump(OS);
390176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      for (auto &Arg : *T)
391176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        dumpTemplateArgument(Arg);
392176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (T->isTypeAlias())
393176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        dumpTypeAsChild(T->getAliasedType());
394176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
395176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitInjectedClassNameType(const InjectedClassNameType *T) {
396176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpDeclRef(T->getDecl());
397176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
398176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitObjCInterfaceType(const ObjCInterfaceType *T) {
399176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpDeclRef(T->getDecl());
400176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
401176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitObjCObjectPointerType(const ObjCObjectPointerType *T) {
402176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getPointeeType());
403176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
404176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitAtomicType(const AtomicType *T) {
405176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getValueType());
406176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
4074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    void VisitPipeType(const PipeType *T) {
4084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      dumpTypeAsChild(T->getElementType());
4094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
410176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitAdjustedType(const AdjustedType *T) {
411176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(T->getOriginalType());
412176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
413176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitPackExpansionType(const PackExpansionType *T) {
414176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (auto N = T->getNumExpansions()) OS << " expansions " << *N;
415176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (!T->isSugared())
416176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        dumpTypeAsChild(T->getPattern());
417176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
418176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // FIXME: ElaboratedType, DependentNameType,
419176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // DependentTemplateSpecializationType, ObjCObjectType
420176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
421d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    // Decls
422ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitLabelDecl(const LabelDecl *D);
423ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitTypedefDecl(const TypedefDecl *D);
424ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitEnumDecl(const EnumDecl *D);
425ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitRecordDecl(const RecordDecl *D);
426ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitEnumConstantDecl(const EnumConstantDecl *D);
427ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitIndirectFieldDecl(const IndirectFieldDecl *D);
428ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitFunctionDecl(const FunctionDecl *D);
429ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitFieldDecl(const FieldDecl *D);
430ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitVarDecl(const VarDecl *D);
431ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitFileScopeAsmDecl(const FileScopeAsmDecl *D);
432ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitImportDecl(const ImportDecl *D);
4334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    void VisitPragmaCommentDecl(const PragmaCommentDecl *D);
4344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    void VisitPragmaDetectMismatchDecl(const PragmaDetectMismatchDecl *D);
4354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    void VisitCapturedDecl(const CapturedDecl *D);
4364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // OpenMP decls
4384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    void VisitOMPThreadPrivateDecl(const OMPThreadPrivateDecl *D);
4394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    void VisitOMPDeclareReductionDecl(const OMPDeclareReductionDecl *D);
4404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    void VisitOMPCapturedExprDecl(const OMPCapturedExprDecl *D);
441d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
442d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    // C++ Decls
443ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitNamespaceDecl(const NamespaceDecl *D);
444ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitUsingDirectiveDecl(const UsingDirectiveDecl *D);
445ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitNamespaceAliasDecl(const NamespaceAliasDecl *D);
446ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitTypeAliasDecl(const TypeAliasDecl *D);
447ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitTypeAliasTemplateDecl(const TypeAliasTemplateDecl *D);
448ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitCXXRecordDecl(const CXXRecordDecl *D);
449ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitStaticAssertDecl(const StaticAssertDecl *D);
450651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename SpecializationDecl>
451176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    void VisitTemplateDeclSpecialization(const SpecializationDecl *D,
452651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                         bool DumpExplicitInst,
453651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                         bool DumpRefOnly);
454651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename TemplateDecl>
455651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void VisitTemplateDecl(const TemplateDecl *D, bool DumpExplicitInst);
456ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitFunctionTemplateDecl(const FunctionTemplateDecl *D);
457ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitClassTemplateDecl(const ClassTemplateDecl *D);
458d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    void VisitClassTemplateSpecializationDecl(
459ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko        const ClassTemplateSpecializationDecl *D);
460d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    void VisitClassTemplatePartialSpecializationDecl(
461ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko        const ClassTemplatePartialSpecializationDecl *D);
462d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    void VisitClassScopeFunctionSpecializationDecl(
463ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko        const ClassScopeFunctionSpecializationDecl *D);
46487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    void VisitBuiltinTemplateDecl(const BuiltinTemplateDecl *D);
46571687a01e3f634f9be26a29006380f1cf10a31caRichard Smith    void VisitVarTemplateDecl(const VarTemplateDecl *D);
46671687a01e3f634f9be26a29006380f1cf10a31caRichard Smith    void VisitVarTemplateSpecializationDecl(
46771687a01e3f634f9be26a29006380f1cf10a31caRichard Smith        const VarTemplateSpecializationDecl *D);
46871687a01e3f634f9be26a29006380f1cf10a31caRichard Smith    void VisitVarTemplatePartialSpecializationDecl(
46971687a01e3f634f9be26a29006380f1cf10a31caRichard Smith        const VarTemplatePartialSpecializationDecl *D);
470ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D);
471ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitNonTypeTemplateParmDecl(const NonTypeTemplateParmDecl *D);
472ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitTemplateTemplateParmDecl(const TemplateTemplateParmDecl *D);
473ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitUsingDecl(const UsingDecl *D);
474ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitUnresolvedUsingTypenameDecl(const UnresolvedUsingTypenameDecl *D);
475ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitUnresolvedUsingValueDecl(const UnresolvedUsingValueDecl *D);
476ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitUsingShadowDecl(const UsingShadowDecl *D);
4774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    void VisitConstructorUsingShadowDecl(const ConstructorUsingShadowDecl *D);
478ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitLinkageSpecDecl(const LinkageSpecDecl *D);
479ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitAccessSpecDecl(const AccessSpecDecl *D);
480ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitFriendDecl(const FriendDecl *D);
481d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
482d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    // ObjC Decls
483ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCIvarDecl(const ObjCIvarDecl *D);
484ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCMethodDecl(const ObjCMethodDecl *D);
48587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    void VisitObjCTypeParamDecl(const ObjCTypeParamDecl *D);
486ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCCategoryDecl(const ObjCCategoryDecl *D);
487ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCCategoryImplDecl(const ObjCCategoryImplDecl *D);
488ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCProtocolDecl(const ObjCProtocolDecl *D);
489ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCInterfaceDecl(const ObjCInterfaceDecl *D);
490ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCImplementationDecl(const ObjCImplementationDecl *D);
491ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCCompatibleAliasDecl(const ObjCCompatibleAliasDecl *D);
492ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCPropertyDecl(const ObjCPropertyDecl *D);
493ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D);
494ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitBlockDecl(const BlockDecl *D);
4951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    // Stmts.
497ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitStmt(const Stmt *Node);
498ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitDeclStmt(const DeclStmt *Node);
499ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitAttributedStmt(const AttributedStmt *Node);
500ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitLabelStmt(const LabelStmt *Node);
501ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitGotoStmt(const GotoStmt *Node);
5020aae289e10b3efd484ecc023eb0fad873346754cPavel Labath    void VisitCXXCatchStmt(const CXXCatchStmt *Node);
5034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    void VisitCapturedStmt(const CapturedStmt *Node);
5044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // OpenMP
5064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    void VisitOMPExecutableDirective(const OMPExecutableDirective *Node);
5071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50817a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    // Exprs
509ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitExpr(const Expr *Node);
510ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitCastExpr(const CastExpr *Node);
511ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitDeclRefExpr(const DeclRefExpr *Node);
512ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitPredefinedExpr(const PredefinedExpr *Node);
513ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitCharacterLiteral(const CharacterLiteral *Node);
514ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitIntegerLiteral(const IntegerLiteral *Node);
515ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitFloatingLiteral(const FloatingLiteral *Node);
516ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitStringLiteral(const StringLiteral *Str);
517c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    void VisitInitListExpr(const InitListExpr *ILE);
518ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitUnaryOperator(const UnaryOperator *Node);
519ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *Node);
520ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitMemberExpr(const MemberExpr *Node);
521ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitExtVectorElementExpr(const ExtVectorElementExpr *Node);
522ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitBinaryOperator(const BinaryOperator *Node);
523ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitCompoundAssignOperator(const CompoundAssignOperator *Node);
524ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitAddrLabelExpr(const AddrLabelExpr *Node);
525ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitBlockExpr(const BlockExpr *Node);
526ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitOpaqueValueExpr(const OpaqueValueExpr *Node);
52717a1a72e70dcbd6257dde644c790a3013113174fChris Lattner
52817a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    // C++
529ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitCXXNamedCastExpr(const CXXNamedCastExpr *Node);
530ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *Node);
531ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitCXXThisExpr(const CXXThisExpr *Node);
532ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitCXXFunctionalCastExpr(const CXXFunctionalCastExpr *Node);
533ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitCXXConstructExpr(const CXXConstructExpr *Node);
534ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *Node);
5353ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    void VisitCXXNewExpr(const CXXNewExpr *Node);
5363ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    void VisitCXXDeleteExpr(const CXXDeleteExpr *Node);
537211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith    void VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *Node);
538ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitExprWithCleanups(const ExprWithCleanups *Node);
539ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitUnresolvedLookupExpr(const UnresolvedLookupExpr *Node);
540ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void dumpCXXTemporary(const CXXTemporary *Temporary);
541fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali    void VisitLambdaExpr(const LambdaExpr *Node) {
542fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali      VisitExpr(Node);
543fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali      dumpDecl(Node->getLambdaClass());
544fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali    }
5450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    void VisitSizeOfPackExpr(const SizeOfPackExpr *Node);
5461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
54717a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    // ObjC
548ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCAtCatchStmt(const ObjCAtCatchStmt *Node);
549ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCEncodeExpr(const ObjCEncodeExpr *Node);
550ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCMessageExpr(const ObjCMessageExpr *Node);
551ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCBoxedExpr(const ObjCBoxedExpr *Node);
552ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCSelectorExpr(const ObjCSelectorExpr *Node);
553ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCProtocolExpr(const ObjCProtocolExpr *Node);
554ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr *Node);
555ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCSubscriptRefExpr(const ObjCSubscriptRefExpr *Node);
556ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCIvarRefExpr(const ObjCIvarRefExpr *Node);
557ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    void VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *Node);
558acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
559acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    // Comments.
560acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    const char *getCommandName(unsigned CommandID);
561acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void dumpComment(const Comment *C);
562acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
563acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    // Inline comments.
564acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void visitTextComment(const TextComment *C);
565acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void visitInlineCommandComment(const InlineCommandComment *C);
566acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void visitHTMLStartTagComment(const HTMLStartTagComment *C);
567acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void visitHTMLEndTagComment(const HTMLEndTagComment *C);
568acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
569acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    // Block comments.
570acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void visitBlockCommandComment(const BlockCommandComment *C);
571acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void visitParamCommandComment(const ParamCommandComment *C);
572acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void visitTParamCommandComment(const TParamCommandComment *C);
573acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void visitVerbatimBlockComment(const VerbatimBlockComment *C);
574acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void visitVerbatimBlockLineComment(const VerbatimBlockLineComment *C);
575acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    void visitVerbatimLineComment(const VerbatimLineComment *C);
5766000dace22f110d8768476989313e9d981d690d0Chris Lattner  };
5776000dace22f110d8768476989313e9d981d690d0Chris Lattner}
5786000dace22f110d8768476989313e9d981d690d0Chris Lattner
5796000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
580e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//  Utilities
581e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//===----------------------------------------------------------------------===//
582e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
583d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpPointer(const void *Ptr) {
5847ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  ColorScope Color(*this, AddressColor);
585d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << ' ' << Ptr;
586d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
587d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
58840b66a000dca59be61117558bb54f3880a77cd14Alexander Kornienkovoid ASTDumper::dumpLocation(SourceLocation Loc) {
5896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!SM)
5906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return;
5916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
5927ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  ColorScope Color(*this, LocationColor);
593df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner  SourceLocation SpellingLoc = SM->getSpellingLoc(Loc);
5941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
595e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  // The general format we print out is filename:line:col, but we drop pieces
596e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  // that haven't changed since the last loc printed.
597b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner  PresumedLoc PLoc = SM->getPresumedLoc(SpellingLoc);
598b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner
599cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor  if (PLoc.isInvalid()) {
600cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    OS << "<invalid sloc>";
601cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    return;
602cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor  }
603cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor
604b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner  if (strcmp(PLoc.getFilename(), LastLocFilename) != 0) {
605806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << PLoc.getFilename() << ':' << PLoc.getLine()
606806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar       << ':' << PLoc.getColumn();
607b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    LastLocFilename = PLoc.getFilename();
608b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    LastLocLine = PLoc.getLine();
609b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner  } else if (PLoc.getLine() != LastLocLine) {
610806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << "line" << ':' << PLoc.getLine()
611806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar       << ':' << PLoc.getColumn();
612b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    LastLocLine = PLoc.getLine();
613e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  } else {
614806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << "col" << ':' << PLoc.getColumn();
615e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  }
616e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner}
617e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
618d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpSourceRange(SourceRange R) {
619e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  // Can't translate locations if a SourceManager isn't available.
62021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  if (!SM)
62121c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    return;
6221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
623806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " <";
62421c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  dumpLocation(R.getBegin());
625311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner  if (R.getBegin() != R.getEnd()) {
626806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << ", ";
62721c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    dumpLocation(R.getEnd());
628e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  }
629806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << ">";
6301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
631e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  // <t2.c:123:421[blah], t2.c:412:321>
632e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
633e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner}
634e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
635176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid ASTDumper::dumpBareType(QualType T, bool Desugar) {
6367ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  ColorScope Color(*this, TypeColor);
637176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
63821c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  SplitQualType T_split = T.split();
63921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  OS << "'" << QualType::getAsString(T_split) << "'";
64021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
641176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (Desugar && !T.isNull()) {
64221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    // If the type is sugared, also dump a (shallow) desugared type.
64321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    SplitQualType D_split = T.getSplitDesugaredType();
64421c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    if (T_split != D_split)
64521c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko      OS << ":'" << QualType::getAsString(D_split) << "'";
64621c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  }
64721c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko}
64821c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
649d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpType(QualType T) {
650d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << ' ';
651d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpBareType(T);
652d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
653d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
654176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid ASTDumper::dumpTypeAsChild(QualType T) {
655176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  SplitQualType SQT = T.split();
656176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (!SQT.Quals.hasQualifiers())
657176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return dumpTypeAsChild(SQT.Ty);
658176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
659176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpChild([=] {
660176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    OS << "QualType";
661176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpPointer(T.getAsOpaquePtr());
662176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    OS << " ";
663176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpBareType(T, false);
664176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    OS << " " << T.split().Quals.getAsString();
665176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpTypeAsChild(T.split().Ty);
666176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  });
667176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
668176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
669176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid ASTDumper::dumpTypeAsChild(const Type *T) {
670176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpChild([=] {
671176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (!T) {
672176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ColorScope Color(*this, NullColor);
673176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << "<<<NULL>>>";
674176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return;
675176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
6764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (const LocInfoType *LIT = llvm::dyn_cast<LocInfoType>(T)) {
6774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      {
6784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        ColorScope Color(*this, TypeColor);
6794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OS << "LocInfo Type";
6804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
6814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      dumpPointer(T);
6824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      dumpTypeAsChild(LIT->getTypeSourceInfo()->getType());
6834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      return;
6844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
685176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
686176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    {
687176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ColorScope Color(*this, TypeColor);
688176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << T->getTypeClassName() << "Type";
689176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
690176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpPointer(T);
691176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    OS << " ";
692176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpBareType(QualType(T, 0), false);
693176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
694176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    QualType SingleStepDesugar =
695176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        T->getLocallyUnqualifiedSingleStepDesugaredType();
696176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (SingleStepDesugar != QualType(T, 0))
697176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " sugar";
698176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (T->isDependentType())
699176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " dependent";
700176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    else if (T->isInstantiationDependentType())
701176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " instantiation_dependent";
702176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (T->isVariablyModifiedType())
703176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " variably_modified";
704176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (T->containsUnexpandedParameterPack())
705176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " contains_unexpanded_pack";
706176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (T->isFromAST())
707176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " imported";
708176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
709176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    TypeVisitor<ASTDumper>::Visit(T);
710176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
711176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (SingleStepDesugar != QualType(T, 0))
712176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpTypeAsChild(SingleStepDesugar);
713176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  });
714176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
715176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
716ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpBareDeclRef(const Decl *D) {
7174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!D) {
7184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ColorScope Color(*this, NullColor);
7194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    OS << "<<<NULL>>>";
7204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return;
7214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
7224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
7237ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  {
7247ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    ColorScope Color(*this, DeclKindNameColor);
7257ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    OS << D->getDeclKindName();
7267ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  }
727d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpPointer(D);
72821c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
729ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko  if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
7307ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    ColorScope Color(*this, DeclNameColor);
73117828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    OS << " '" << ND->getDeclName() << '\'';
73221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  }
73321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
734ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko  if (const ValueDecl *VD = dyn_cast<ValueDecl>(D))
73521c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    dumpType(VD->getType());
736d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
737d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
738ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpDeclRef(const Decl *D, const char *Label) {
739d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (!D)
740d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    return;
741d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
742176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpChild([=]{
743176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (Label)
744176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << Label << ' ';
745176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpBareDeclRef(D);
746176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  });
747d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
748d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
749ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpName(const NamedDecl *ND) {
7507ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  if (ND->getDeclName()) {
7517ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    ColorScope Color(*this, DeclNameColor);
752d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << ' ' << ND->getNameAsString();
7537ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  }
754d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
755d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
756e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieubool ASTDumper::hasNodes(const DeclContext *DC) {
757e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu  if (!DC)
758e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu    return false;
759e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu
760e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith  return DC->hasExternalLexicalStorage() ||
761e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith         DC->noload_decls_begin() != DC->noload_decls_end();
762e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu}
763e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu
764ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpDeclContext(const DeclContext *DC) {
765d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (!DC)
766d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    return;
767651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
768651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *D : DC->noload_decls())
769176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpDecl(D);
770651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
771651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (DC->hasExternalLexicalStorage()) {
772176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpChild([=]{
773176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ColorScope Color(*this, UndeserializedColor);
774176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << "<undeserialized declarations>";
775176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    });
776e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith  }
777d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
778d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
779176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid ASTDumper::dumpLookups(const DeclContext *DC, bool DumpDecls) {
780176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpChild([=] {
781176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    OS << "StoredDeclsMap ";
782176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpBareDeclRef(cast<Decl>(DC));
7836e322c08b187ba93019732d2295c84c339813e0dRichard Smith
784176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    const DeclContext *Primary = DC->getPrimaryContext();
785176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (Primary != DC) {
786176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " primary";
787176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpPointer(cast<Decl>(Primary));
788176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
7896e322c08b187ba93019732d2295c84c339813e0dRichard Smith
790176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    bool HasUndeserializedLookups = Primary->hasExternalVisibleStorage();
7916e322c08b187ba93019732d2295c84c339813e0dRichard Smith
792176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    DeclContext::all_lookups_iterator I = Primary->noload_lookups_begin(),
793176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                      E = Primary->noload_lookups_end();
794176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    while (I != E) {
795176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      DeclarationName Name = I.getLookupName();
796176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      DeclContextLookupResult R = *I++;
7976e322c08b187ba93019732d2295c84c339813e0dRichard Smith
798176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpChild([=] {
799176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << "DeclarationName ";
800176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        {
801176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          ColorScope Color(*this, DeclNameColor);
802176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          OS << '\'' << Name << '\'';
803176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        }
8046e322c08b187ba93019732d2295c84c339813e0dRichard Smith
805176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        for (DeclContextLookupResult::iterator RI = R.begin(), RE = R.end();
806176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines             RI != RE; ++RI) {
807176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          dumpChild([=] {
808176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            dumpBareDeclRef(*RI);
809176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
810176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            if ((*RI)->isHidden())
811176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines              OS << " hidden";
812176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
813176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            // If requested, dump the redecl chain for this lookup.
814176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            if (DumpDecls) {
815176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines              // Dump earliest decl first.
816176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines              std::function<void(Decl *)> DumpWithPrev = [&](Decl *D) {
817176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                if (Decl *Prev = D->getPreviousDecl())
818176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  DumpWithPrev(Prev);
819176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                dumpDecl(D);
820176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines              };
821176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines              DumpWithPrev(*RI);
822176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            }
823176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          });
824176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        }
825176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      });
8266e322c08b187ba93019732d2295c84c339813e0dRichard Smith    }
8276e322c08b187ba93019732d2295c84c339813e0dRichard Smith
828176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (HasUndeserializedLookups) {
829176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpChild([=] {
830176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        ColorScope Color(*this, UndeserializedColor);
831176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << "<undeserialized lookups>";
832176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      });
8336e322c08b187ba93019732d2295c84c339813e0dRichard Smith    }
834176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  });
8356e322c08b187ba93019732d2295c84c339813e0dRichard Smith}
8366e322c08b187ba93019732d2295c84c339813e0dRichard Smith
837c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienkovoid ASTDumper::dumpAttr(const Attr *A) {
838176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpChild([=] {
839176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    {
840176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ColorScope Color(*this, AttrColor);
841651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
842176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      switch (A->getKind()) {
843c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko#define ATTR(X) case attr::X: OS << #X; break;
844c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko#include "clang/Basic/AttrList.inc"
845176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      }
846176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << "Attr";
8477ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    }
848176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpPointer(A);
849176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpSourceRange(A->getRange());
850176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (A->isInherited())
851176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " Inherited";
852176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (A->isImplicit())
853176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " Implicit";
854c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#include "clang/AST/AttrDump.inc"
855176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  });
856c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko}
857c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko
858c5042885480aa8b06e7b792247257846dfdddd80Richard Smithstatic void dumpPreviousDeclImpl(raw_ostream &OS, ...) {}
859c5042885480aa8b06e7b792247257846dfdddd80Richard Smith
860c5042885480aa8b06e7b792247257846dfdddd80Richard Smithtemplate<typename T>
861c5042885480aa8b06e7b792247257846dfdddd80Richard Smithstatic void dumpPreviousDeclImpl(raw_ostream &OS, const Mergeable<T> *D) {
862bc6509175e1ce5cc1b48d1b97ac8d23d8b74167cRafael Espindola  const T *First = D->getFirstDecl();
863c5042885480aa8b06e7b792247257846dfdddd80Richard Smith  if (First != D)
864c5042885480aa8b06e7b792247257846dfdddd80Richard Smith    OS << " first " << First;
8654a19052fe91c988885c722252ef03ce5f762a73cRichard Smith}
8664a19052fe91c988885c722252ef03ce5f762a73cRichard Smith
8674a19052fe91c988885c722252ef03ce5f762a73cRichard Smithtemplate<typename T>
868c5042885480aa8b06e7b792247257846dfdddd80Richard Smithstatic void dumpPreviousDeclImpl(raw_ostream &OS, const Redeclarable<T> *D) {
869c5042885480aa8b06e7b792247257846dfdddd80Richard Smith  const T *Prev = D->getPreviousDecl();
870c5042885480aa8b06e7b792247257846dfdddd80Richard Smith  if (Prev)
871c5042885480aa8b06e7b792247257846dfdddd80Richard Smith    OS << " prev " << Prev;
8724a19052fe91c988885c722252ef03ce5f762a73cRichard Smith}
8734a19052fe91c988885c722252ef03ce5f762a73cRichard Smith
874c5042885480aa8b06e7b792247257846dfdddd80Richard Smith/// Dump the previous declaration in the redeclaration chain for a declaration,
875c5042885480aa8b06e7b792247257846dfdddd80Richard Smith/// if any.
876c5042885480aa8b06e7b792247257846dfdddd80Richard Smithstatic void dumpPreviousDecl(raw_ostream &OS, const Decl *D) {
8774a19052fe91c988885c722252ef03ce5f762a73cRichard Smith  switch (D->getKind()) {
8784a19052fe91c988885c722252ef03ce5f762a73cRichard Smith#define DECL(DERIVED, BASE) \
8794a19052fe91c988885c722252ef03ce5f762a73cRichard Smith  case Decl::DERIVED: \
880c5042885480aa8b06e7b792247257846dfdddd80Richard Smith    return dumpPreviousDeclImpl(OS, cast<DERIVED##Decl>(D));
8814a19052fe91c988885c722252ef03ce5f762a73cRichard Smith#define ABSTRACT_DECL(DECL)
8824a19052fe91c988885c722252ef03ce5f762a73cRichard Smith#include "clang/AST/DeclNodes.inc"
8834a19052fe91c988885c722252ef03ce5f762a73cRichard Smith  }
8844a19052fe91c988885c722252ef03ce5f762a73cRichard Smith  llvm_unreachable("Decl that isn't part of DeclNodes.inc!");
8854a19052fe91c988885c722252ef03ce5f762a73cRichard Smith}
8864a19052fe91c988885c722252ef03ce5f762a73cRichard Smith
887d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===//
888d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//  C++ Utilities
889d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===//
890d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
891d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpAccessSpecifier(AccessSpecifier AS) {
892d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  switch (AS) {
893d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  case AS_none:
894d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    break;
895d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  case AS_public:
896d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << "public";
897d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    break;
898d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  case AS_protected:
899d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << "protected";
900d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    break;
901d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  case AS_private:
902d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << "private";
903d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    break;
904d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  }
905d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
906d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
907ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpCXXCtorInitializer(const CXXCtorInitializer *Init) {
908176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpChild([=] {
909176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    OS << "CXXCtorInitializer";
910176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (Init->isAnyMemberInitializer()) {
911176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << ' ';
912176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpBareDeclRef(Init->getAnyMember());
913176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    } else if (Init->isBaseInitializer()) {
914176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpType(QualType(Init->getBaseClass(), 0));
915176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    } else if (Init->isDelegatingInitializer()) {
916176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpType(Init->getTypeSourceInfo()->getType());
917176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    } else {
918176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      llvm_unreachable("Unknown initializer type");
919176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
920176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpStmt(Init->getInit());
921176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  });
922d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
923d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
924ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienkovoid ASTDumper::dumpTemplateParameters(const TemplateParameterList *TPL) {
925d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (!TPL)
926d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    return;
927d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
928ad7bb3601d57e7d41c199a4367490b705f669e67Alexander Kornienko  for (TemplateParameterList::const_iterator I = TPL->begin(), E = TPL->end();
929d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko       I != E; ++I)
930d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpDecl(*I);
931d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
932d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
933d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpTemplateArgumentListInfo(
934d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    const TemplateArgumentListInfo &TALI) {
935176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (unsigned i = 0, e = TALI.size(); i < e; ++i)
936d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpTemplateArgumentLoc(TALI[i]);
937d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
938d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
939d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpTemplateArgumentLoc(const TemplateArgumentLoc &A) {
940d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpTemplateArgument(A.getArgument(), A.getSourceRange());
941d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
942d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
943d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpTemplateArgumentList(const TemplateArgumentList &TAL) {
944d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  for (unsigned i = 0, e = TAL.size(); i < e; ++i)
945d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpTemplateArgument(TAL[i]);
946d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
947d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
948d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::dumpTemplateArgument(const TemplateArgument &A, SourceRange R) {
949176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpChild([=] {
950176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    OS << "TemplateArgument";
951176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (R.isValid())
952176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpSourceRange(R);
953176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
954176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    switch (A.getKind()) {
955176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case TemplateArgument::Null:
956176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " null";
957176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
958176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case TemplateArgument::Type:
959176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " type";
960176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpType(A.getAsType());
961176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
962176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case TemplateArgument::Declaration:
963176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " decl";
964176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpDeclRef(A.getAsDecl());
965176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
966176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case TemplateArgument::NullPtr:
967176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " nullptr";
968176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
969176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case TemplateArgument::Integral:
970176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " integral " << A.getAsIntegral();
971176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
972176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case TemplateArgument::Template:
973176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " template ";
974176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      A.getAsTemplate().dump(OS);
975176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
976176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case TemplateArgument::TemplateExpansion:
977176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " template expansion";
978176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      A.getAsTemplateOrTemplatePattern().dump(OS);
979176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
980176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case TemplateArgument::Expression:
981176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " expr";
982176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpStmt(A.getAsExpr());
983176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
984176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case TemplateArgument::Pack:
985176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " pack";
986176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      for (TemplateArgument::pack_iterator I = A.pack_begin(), E = A.pack_end();
987176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines           I != E; ++I)
988176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        dumpTemplateArgument(*I);
989176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
990e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu    }
991176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  });
99221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko}
99321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
994e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//===----------------------------------------------------------------------===//
99587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//  Objective-C Utilities
99687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//===----------------------------------------------------------------------===//
99787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid ASTDumper::dumpObjCTypeParamList(const ObjCTypeParamList *typeParams) {
99887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (!typeParams)
99987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return;
100087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
100187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (auto typeParam : *typeParams) {
100287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    dumpDecl(typeParam);
100387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
100487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
100587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
100687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//===----------------------------------------------------------------------===//
100721c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko//  Decl dumping methods.
10086000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
10096000dace22f110d8768476989313e9d981d690d0Chris Lattner
1010ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::dumpDecl(const Decl *D) {
1011176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpChild([=] {
1012176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (!D) {
1013176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ColorScope Color(*this, NullColor);
1014176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << "<<<NULL>>>";
1015176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return;
1016176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
1017d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1018176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    {
1019176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ColorScope Color(*this, DeclKindNameColor);
1020176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << D->getDeclKindName() << "Decl";
1021176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
1022176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpPointer(D);
1023176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (D->getLexicalDeclContext() != D->getDeclContext())
1024176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " parent " << cast<Decl>(D->getDeclContext());
1025176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpPreviousDecl(OS, D);
1026176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpSourceRange(D->getSourceRange());
1027176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    OS << ' ';
1028176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpLocation(D->getLocation());
1029b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    if (Module *M = D->getImportedOwningModule())
1030176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " in " << M->getFullModuleName();
1031b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    else if (Module *M = D->getLocalOwningModule())
1032b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      OS << " in (local) " << M->getFullModuleName();
103387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (auto *ND = dyn_cast<NamedDecl>(D))
103487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      for (Module *M : D->getASTContext().getModulesWithMergedDefinition(
103587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar               const_cast<NamedDecl *>(ND)))
103687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        dumpChild([=] { OS << "also in " << M->getFullModuleName(); });
1037176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (const NamedDecl *ND = dyn_cast<NamedDecl>(D))
1038176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (ND->isHidden())
1039176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << " hidden";
1040176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (D->isImplicit())
1041176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " implicit";
1042176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (D->isUsed())
1043176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " used";
1044176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    else if (D->isThisDeclarationReferenced())
1045176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " referenced";
1046176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (D->isInvalidDecl())
1047176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " invalid";
10480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
10490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      if (FD->isConstexpr())
10500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines        OS << " constexpr";
10510e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1052d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1053176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ConstDeclVisitor<ASTDumper>::Visit(D);
1054e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu
1055176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    for (Decl::attr_iterator I = D->attr_begin(), E = D->attr_end(); I != E;
1056176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines         ++I)
1057176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpAttr(*I);
1058e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu
1059176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (const FullComment *Comment =
1060176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            D->getASTContext().getLocalCommentForDeclUncached(D))
1061176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpFullComment(Comment);
1062176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1063176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // Decls within functions are visited by the body.
1064176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (!isa<FunctionDecl>(*D) && !isa<ObjCMethodDecl>(*D) &&
1065176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        hasNodes(dyn_cast<DeclContext>(D)))
1066176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpDeclContext(cast<DeclContext>(D));
1067176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  });
1068d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1069d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1070ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitLabelDecl(const LabelDecl *D) {
1071d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1072d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1073d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1074ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitTypedefDecl(const TypedefDecl *D) {
1075d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1076d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpType(D->getUnderlyingType());
1077d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isModulePrivate())
1078d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " __module_private__";
10794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  dumpTypeAsChild(D->getUnderlyingType());
1080d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1081d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1082ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitEnumDecl(const EnumDecl *D) {
1083d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isScoped()) {
1084d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    if (D->isScopedUsingClassTag())
1085d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " class";
1086d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    else
1087d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " struct";
1088d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  }
1089d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1090d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isModulePrivate())
1091d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " __module_private__";
1092d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isFixed())
1093d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpType(D->getIntegerType());
1094d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1095d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1096ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitRecordDecl(const RecordDecl *D) {
1097d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << ' ' << D->getKindName();
1098d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1099d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isModulePrivate())
1100d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " __module_private__";
1101bb6b5e40b6ea0e512eebd4bdc9d635076ed279f7Richard Smith  if (D->isCompleteDefinition())
1102bb6b5e40b6ea0e512eebd4bdc9d635076ed279f7Richard Smith    OS << " definition";
1103d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1104d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1105ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitEnumConstantDecl(const EnumConstantDecl *D) {
1106d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1107d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpType(D->getType());
1108176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (const Expr *Init = D->getInitExpr())
1109d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpStmt(Init);
1110d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1111d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1112ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitIndirectFieldDecl(const IndirectFieldDecl *D) {
1113d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1114d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpType(D->getType());
1115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *Child : D->chain())
1117176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpDeclRef(Child);
1118d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1119d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1120ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitFunctionDecl(const FunctionDecl *D) {
1121d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1122d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpType(D->getType());
1123d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1124d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola  StorageClass SC = D->getStorageClass();
1125d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (SC != SC_None)
1126d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << ' ' << VarDecl::getStorageClassSpecifierString(SC);
1127d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isInlineSpecified())
1128d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " inline";
1129d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isVirtualAsWritten())
1130d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " virtual";
1131d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isModulePrivate())
1132d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " __module_private__";
1133d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1134d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isPure())
1135d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " pure";
1136d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  else if (D->isDeletedAsWritten())
1137d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " delete";
1138d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1139c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith  if (const FunctionProtoType *FPT = D->getType()->getAs<FunctionProtoType>()) {
1140c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith    FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
1141176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    switch (EPI.ExceptionSpec.Type) {
1142c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith    default: break;
1143c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith    case EST_Unevaluated:
1144176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " noexcept-unevaluated " << EPI.ExceptionSpec.SourceDecl;
1145c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith      break;
1146c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith    case EST_Uninstantiated:
1147176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << " noexcept-uninstantiated " << EPI.ExceptionSpec.SourceTemplate;
1148c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith      break;
1149c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith    }
1150c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith  }
1151c077dbee4c5f63677390e0bd0730271d2bfa18d8Richard Smith
1152176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (const FunctionTemplateSpecializationInfo *FTSI =
1153176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          D->getTemplateSpecializationInfo())
1154d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpTemplateArgumentList(*FTSI->TemplateArguments);
1155d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1156cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  for (ArrayRef<NamedDecl *>::iterator
1157d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko       I = D->getDeclsInPrototypeScope().begin(),
1158176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines       E = D->getDeclsInPrototypeScope().end(); I != E; ++I)
1159d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpDecl(*I);
1160d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
11610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  if (!D->param_begin() && D->getNumParams())
11620e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    dumpChild([=] { OS << "<<NULL params x " << D->getNumParams() << ">>"; });
11630e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  else
11644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    for (const ParmVarDecl *Parameter : D->parameters())
11654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      dumpDecl(Parameter);
1166176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1167176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (const CXXConstructorDecl *C = dyn_cast<CXXConstructorDecl>(D))
1168d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    for (CXXConstructorDecl::init_const_iterator I = C->init_begin(),
1169ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko                                                 E = C->init_end();
1170176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines         I != E; ++I)
1171d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      dumpCXXCtorInitializer(*I);
1172d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1173176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (D->doesThisDeclarationHaveABody())
1174d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpStmt(D->getBody());
1175d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1176d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1177ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitFieldDecl(const FieldDecl *D) {
1178d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1179d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpType(D->getType());
1180d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isMutable())
1181d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " mutable";
1182d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isModulePrivate())
1183d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " __module_private__";
1184e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu
1185176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (D->isBitField())
1186d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpStmt(D->getBitWidth());
1187176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (Expr *Init = D->getInClassInitializer())
1188d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpStmt(Init);
1189d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1190d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1191ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitVarDecl(const VarDecl *D) {
1192d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1193d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpType(D->getType());
1194d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola  StorageClass SC = D->getStorageClass();
1195d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (SC != SC_None)
1196d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << ' ' << VarDecl::getStorageClassSpecifierString(SC);
119738afbc7361d861968232defaeaf8e302af75b5eeRichard Smith  switch (D->getTLSKind()) {
119838afbc7361d861968232defaeaf8e302af75b5eeRichard Smith  case VarDecl::TLS_None: break;
119938afbc7361d861968232defaeaf8e302af75b5eeRichard Smith  case VarDecl::TLS_Static: OS << " tls"; break;
120038afbc7361d861968232defaeaf8e302af75b5eeRichard Smith  case VarDecl::TLS_Dynamic: OS << " tls_dynamic"; break;
120138afbc7361d861968232defaeaf8e302af75b5eeRichard Smith  }
1202d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isModulePrivate())
1203d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " __module_private__";
1204d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isNRVOVariable())
1205d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " nrvo";
12064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (D->isInline())
12074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    OS << " inline";
12084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (D->isConstexpr())
12094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    OS << " constexpr";
1210e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu  if (D->hasInit()) {
1211176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    switch (D->getInitStyle()) {
1212176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case VarDecl::CInit: OS << " cinit"; break;
1213176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case VarDecl::CallInit: OS << " callinit"; break;
1214176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case VarDecl::ListInit: OS << " listinit"; break;
1215176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
1216d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpStmt(D->getInit());
1217e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu  }
1218d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1219d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1220ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitFileScopeAsmDecl(const FileScopeAsmDecl *D) {
1221d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpStmt(D->getAsmString());
1222d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1223d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1224ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitImportDecl(const ImportDecl *D) {
1225d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << ' ' << D->getImportedModule()->getFullModuleName();
1226d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1227d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
12284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTDumper::VisitPragmaCommentDecl(const PragmaCommentDecl *D) {
12294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  OS << ' ';
12304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  switch (D->getCommentKind()) {
12314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case PCK_Unknown:  llvm_unreachable("unexpected pragma comment kind");
12324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case PCK_Compiler: OS << "compiler"; break;
12334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case PCK_ExeStr:   OS << "exestr"; break;
12344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case PCK_Lib:      OS << "lib"; break;
12354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case PCK_Linker:   OS << "linker"; break;
12364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case PCK_User:     OS << "user"; break;
12374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
12384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StringRef Arg = D->getArg();
12394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!Arg.empty())
12404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    OS << " \"" << Arg << "\"";
12414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
12424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTDumper::VisitPragmaDetectMismatchDecl(
12444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const PragmaDetectMismatchDecl *D) {
12454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  OS << " \"" << D->getName() << "\" \"" << D->getValue() << "\"";
12464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
12474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTDumper::VisitCapturedDecl(const CapturedDecl *D) {
12494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  dumpStmt(D->getBody());
12504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
12514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//===----------------------------------------------------------------------===//
12534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// OpenMP Declarations
12544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//===----------------------------------------------------------------------===//
12554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTDumper::VisitOMPThreadPrivateDecl(const OMPThreadPrivateDecl *D) {
12574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (auto *E : D->varlists())
12584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    dumpStmt(E);
12594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
12604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTDumper::VisitOMPDeclareReductionDecl(const OMPDeclareReductionDecl *D) {
12624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  dumpName(D);
12634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  dumpType(D->getType());
12644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  OS << " combiner";
12654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  dumpStmt(D->getCombiner());
12664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (auto *Initializer = D->getInitializer()) {
12674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    OS << " initializer";
12684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    dumpStmt(Initializer);
12694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
12704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
12714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTDumper::VisitOMPCapturedExprDecl(const OMPCapturedExprDecl *D) {
12734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  dumpName(D);
12744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  dumpType(D->getType());
12754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  dumpStmt(D->getInit());
12764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
12774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1278d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===//
1279d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko// C++ Declarations
1280d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===//
1281d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1282ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitNamespaceDecl(const NamespaceDecl *D) {
1283d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1284d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isInline())
1285d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " inline";
1286d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (!D->isOriginalNamespace())
1287d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpDeclRef(D->getOriginalNamespace(), "original");
1288d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1289d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1290ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUsingDirectiveDecl(const UsingDirectiveDecl *D) {
1291d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << ' ';
1292d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpBareDeclRef(D->getNominatedNamespace());
1293d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1294d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1295ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitNamespaceAliasDecl(const NamespaceAliasDecl *D) {
1296d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1297d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getAliasedNamespace());
1298d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1299d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1300ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitTypeAliasDecl(const TypeAliasDecl *D) {
1301d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1302d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpType(D->getUnderlyingType());
13034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  dumpTypeAsChild(D->getUnderlyingType());
1304d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1305d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1306ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitTypeAliasTemplateDecl(const TypeAliasTemplateDecl *D) {
1307d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1308d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpTemplateParameters(D->getTemplateParameters());
1309d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDecl(D->getTemplatedDecl());
1310d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1311d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1312ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXRecordDecl(const CXXRecordDecl *D) {
1313d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  VisitRecordDecl(D);
1314d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (!D->isCompleteDefinition())
1315d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    return;
1316d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1317651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (const auto &I : D->bases()) {
1318176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpChild([=] {
1319176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (I.isVirtual())
1320176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << "virtual ";
1321176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpAccessSpecifier(I.getAccessSpecifier());
1322176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpType(I.getType());
1323176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (I.isPackExpansion())
1324176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << "...";
1325176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    });
1326d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  }
1327d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1328d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1329ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitStaticAssertDecl(const StaticAssertDecl *D) {
1330d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpStmt(D->getAssertExpr());
1331d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpStmt(D->getMessage());
1332d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1333d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1334651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<typename SpecializationDecl>
1335176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid ASTDumper::VisitTemplateDeclSpecialization(const SpecializationDecl *D,
1336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                                bool DumpExplicitInst,
1337651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                                bool DumpRefOnly) {
1338651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool DumpedAny = false;
1339651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *RedeclWithBadType : D->redecls()) {
1340651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // FIXME: The redecls() range sometimes has elements of a less-specific
1341651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // type. (In particular, ClassTemplateSpecializationDecl::redecls() gives
1342651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // us TagDecls, and should give CXXRecordDecls).
1343651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    auto *Redecl = dyn_cast<SpecializationDecl>(RedeclWithBadType);
1344651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!Redecl) {
1345651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // Found the injected-class-name for a class template. This will be dumped
1346651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // as part of its surrounding class so we don't need to dump it here.
1347651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      assert(isa<CXXRecordDecl>(RedeclWithBadType) &&
1348651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines             "expected an injected-class-name");
1349651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      continue;
1350651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
1351651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1352651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    switch (Redecl->getTemplateSpecializationKind()) {
1353d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    case TSK_ExplicitInstantiationDeclaration:
1354d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    case TSK_ExplicitInstantiationDefinition:
1355651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (!DumpExplicitInst)
1356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        break;
1357651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // Fall through.
1358651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case TSK_Undeclared:
1359651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case TSK_ImplicitInstantiation:
1360176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (DumpRefOnly)
1361176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        dumpDeclRef(Redecl);
1362176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      else
1363176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        dumpDecl(Redecl);
1364651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      DumpedAny = true;
1365d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      break;
1366d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    case TSK_ExplicitSpecialization:
1367d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      break;
1368d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    }
1369d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  }
1370651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1371651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Ensure we dump at least one decl for each specialization.
1372651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!DumpedAny)
1373176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpDeclRef(D);
1374d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1375d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1376651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<typename TemplateDecl>
1377651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid ASTDumper::VisitTemplateDecl(const TemplateDecl *D,
1378651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                  bool DumpExplicitInst) {
1379d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1380d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpTemplateParameters(D->getTemplateParameters());
1381e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu
1382176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpDecl(D->getTemplatedDecl());
1383651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1384651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *Child : D->specializations())
1385176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    VisitTemplateDeclSpecialization(Child, DumpExplicitInst,
1386651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                    !D->isCanonicalDecl());
1387651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1388651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1389651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid ASTDumper::VisitFunctionTemplateDecl(const FunctionTemplateDecl *D) {
1390651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: We don't add a declaration of a function template specialization
1391651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // to its context when it's explicitly instantiated, so dump explicit
1392651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // instantiations when we dump the template itself.
1393651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  VisitTemplateDecl(D, true);
1394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1395651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1396651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid ASTDumper::VisitClassTemplateDecl(const ClassTemplateDecl *D) {
1397651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  VisitTemplateDecl(D, false);
1398d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
13991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1400d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::VisitClassTemplateSpecializationDecl(
1401ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    const ClassTemplateSpecializationDecl *D) {
1402d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  VisitCXXRecordDecl(D);
1403d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpTemplateArgumentList(D->getTemplateArgs());
1404d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
14051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1406d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::VisitClassTemplatePartialSpecializationDecl(
1407ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    const ClassTemplatePartialSpecializationDecl *D) {
1408d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  VisitClassTemplateSpecializationDecl(D);
1409d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpTemplateParameters(D->getTemplateParameters());
1410d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1411d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1412d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid ASTDumper::VisitClassScopeFunctionSpecializationDecl(
1413ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    const ClassScopeFunctionSpecializationDecl *D) {
1414d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getSpecialization());
1415d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->hasExplicitTemplateArgs())
1416d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpTemplateArgumentListInfo(D->templateArgs());
1417d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1418d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
141971687a01e3f634f9be26a29006380f1cf10a31caRichard Smithvoid ASTDumper::VisitVarTemplateDecl(const VarTemplateDecl *D) {
1420651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  VisitTemplateDecl(D, false);
142171687a01e3f634f9be26a29006380f1cf10a31caRichard Smith}
142271687a01e3f634f9be26a29006380f1cf10a31caRichard Smith
142387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid ASTDumper::VisitBuiltinTemplateDecl(const BuiltinTemplateDecl *D) {
142487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  dumpName(D);
142587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  dumpTemplateParameters(D->getTemplateParameters());
142687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
142787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
142871687a01e3f634f9be26a29006380f1cf10a31caRichard Smithvoid ASTDumper::VisitVarTemplateSpecializationDecl(
142971687a01e3f634f9be26a29006380f1cf10a31caRichard Smith    const VarTemplateSpecializationDecl *D) {
143071687a01e3f634f9be26a29006380f1cf10a31caRichard Smith  dumpTemplateArgumentList(D->getTemplateArgs());
143171687a01e3f634f9be26a29006380f1cf10a31caRichard Smith  VisitVarDecl(D);
143271687a01e3f634f9be26a29006380f1cf10a31caRichard Smith}
143371687a01e3f634f9be26a29006380f1cf10a31caRichard Smith
143471687a01e3f634f9be26a29006380f1cf10a31caRichard Smithvoid ASTDumper::VisitVarTemplatePartialSpecializationDecl(
143571687a01e3f634f9be26a29006380f1cf10a31caRichard Smith    const VarTemplatePartialSpecializationDecl *D) {
143671687a01e3f634f9be26a29006380f1cf10a31caRichard Smith  dumpTemplateParameters(D->getTemplateParameters());
143771687a01e3f634f9be26a29006380f1cf10a31caRichard Smith  VisitVarTemplateSpecializationDecl(D);
143871687a01e3f634f9be26a29006380f1cf10a31caRichard Smith}
143971687a01e3f634f9be26a29006380f1cf10a31caRichard Smith
1440ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D) {
1441d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->wasDeclaredWithTypename())
1442d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " typename";
1443d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  else
1444d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " class";
1445d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isParameterPack())
1446d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " ...";
1447d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1448176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (D->hasDefaultArgument())
1449651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    dumpTemplateArgument(D->getDefaultArgument());
1450d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1451d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1452ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitNonTypeTemplateParmDecl(const NonTypeTemplateParmDecl *D) {
1453d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpType(D->getType());
1454d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isParameterPack())
1455d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " ...";
1456d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1457176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (D->hasDefaultArgument())
1458651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    dumpTemplateArgument(D->getDefaultArgument());
1459d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1460d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1461ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitTemplateTemplateParmDecl(
1462ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    const TemplateTemplateParmDecl *D) {
1463d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isParameterPack())
1464d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " ...";
1465d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1466d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpTemplateParameters(D->getTemplateParameters());
1467176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (D->hasDefaultArgument())
1468d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpTemplateArgumentLoc(D->getDefaultArgument());
1469d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1470d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1471ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUsingDecl(const UsingDecl *D) {
1472d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << ' ';
147387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (D->getQualifier())
147487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
1475d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << D->getNameAsString();
1476d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1477d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1478ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUnresolvedUsingTypenameDecl(
1479ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    const UnresolvedUsingTypenameDecl *D) {
1480d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << ' ';
148187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (D->getQualifier())
148287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
1483d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << D->getNameAsString();
1484d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1485d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1486ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUnresolvedUsingValueDecl(const UnresolvedUsingValueDecl *D) {
1487d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << ' ';
148887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (D->getQualifier())
148987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
1490d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << D->getNameAsString();
1491d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpType(D->getType());
1492d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1493d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1494ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUsingShadowDecl(const UsingShadowDecl *D) {
1495d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << ' ';
1496d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpBareDeclRef(D->getTargetDecl());
14974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (auto *TD = dyn_cast<TypeDecl>(D->getUnderlyingDecl()))
14984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    dumpTypeAsChild(TD->getTypeForDecl());
14994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
15004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
15014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTDumper::VisitConstructorUsingShadowDecl(
15024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const ConstructorUsingShadowDecl *D) {
15034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (D->constructsVirtualBase())
15044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    OS << " virtual";
15054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
15064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  dumpChild([=] {
15074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    OS << "target ";
15084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    dumpBareDeclRef(D->getTargetDecl());
15094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  });
15104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
15114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  dumpChild([=] {
15124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    OS << "nominated ";
15134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    dumpBareDeclRef(D->getNominatedBaseClass());
15144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    OS << ' ';
15154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    dumpBareDeclRef(D->getNominatedBaseClassShadowDecl());
15164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  });
15174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
15184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  dumpChild([=] {
15194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    OS << "constructed ";
15204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    dumpBareDeclRef(D->getConstructedBaseClass());
15214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    OS << ' ';
15224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    dumpBareDeclRef(D->getConstructedBaseClassShadowDecl());
15234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  });
1524d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1525d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1526ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitLinkageSpecDecl(const LinkageSpecDecl *D) {
1527d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  switch (D->getLanguage()) {
1528d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  case LinkageSpecDecl::lang_c: OS << " C"; break;
1529d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  case LinkageSpecDecl::lang_cxx: OS << " C++"; break;
1530d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  }
1531d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1532d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1533ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitAccessSpecDecl(const AccessSpecDecl *D) {
1534d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << ' ';
1535d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpAccessSpecifier(D->getAccess());
1536d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1537d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1538ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitFriendDecl(const FriendDecl *D) {
1539d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (TypeSourceInfo *T = D->getFriendType())
1540d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpType(T->getType());
1541d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  else
1542d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpDecl(D->getFriendDecl());
1543d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1544d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1545d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===//
1546d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko// Obj-C Declarations
1547d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===//
1548d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1549ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCIvarDecl(const ObjCIvarDecl *D) {
1550d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1551d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpType(D->getType());
1552d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->getSynthesize())
1553d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " synthesize";
1554d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1555d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  switch (D->getAccessControl()) {
1556d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  case ObjCIvarDecl::None:
1557d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " none";
1558d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    break;
1559d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  case ObjCIvarDecl::Private:
1560d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " private";
1561d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    break;
1562d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  case ObjCIvarDecl::Protected:
1563d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " protected";
1564d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    break;
1565d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  case ObjCIvarDecl::Public:
1566d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " public";
1567d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    break;
1568d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  case ObjCIvarDecl::Package:
1569d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " package";
1570d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    break;
1571d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  }
1572d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1573d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1574ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCMethodDecl(const ObjCMethodDecl *D) {
1575d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->isInstanceMethod())
1576d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " -";
1577d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  else
1578d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " +";
1579d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1580651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  dumpType(D->getReturnType());
1581d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1582e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu  if (D->isThisDeclarationADefinition()) {
1583d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpDeclContext(D);
1584e8d411997899a87e1a9f63ad3f52b38e7931687cRichard Trieu  } else {
15854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    for (const ParmVarDecl *Parameter : D->parameters())
15864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      dumpDecl(Parameter);
15876000dace22f110d8768476989313e9d981d690d0Chris Lattner  }
1588d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1589176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (D->isVariadic())
1590176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpChild([=] { OS << "..."; });
1591d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1592176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (D->hasBody())
1593d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpStmt(D->getBody());
1594d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1595d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
159687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid ASTDumper::VisitObjCTypeParamDecl(const ObjCTypeParamDecl *D) {
159787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  dumpName(D);
159887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  switch (D->getVariance()) {
159987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case ObjCTypeParamVariance::Invariant:
160087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
160187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
160287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case ObjCTypeParamVariance::Covariant:
160387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    OS << " covariant";
160487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
160587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
160687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case ObjCTypeParamVariance::Contravariant:
160787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    OS << " contravariant";
160887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
160987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
161087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
161187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (D->hasExplicitBound())
161287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    OS << " bounded";
161387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  dumpType(D->getUnderlyingType());
161487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
161587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1616ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCCategoryDecl(const ObjCCategoryDecl *D) {
1617d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1618d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getClassInterface());
161987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  dumpObjCTypeParamList(D->getTypeParamList());
1620d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getImplementation());
1621d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  for (ObjCCategoryDecl::protocol_iterator I = D->protocol_begin(),
1622ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko                                           E = D->protocol_end();
1623176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines       I != E; ++I)
1624d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpDeclRef(*I);
1625d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1626d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1627ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCCategoryImplDecl(const ObjCCategoryImplDecl *D) {
1628d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1629d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getClassInterface());
1630d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getCategoryDecl());
1631d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1632d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1633ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCProtocolDecl(const ObjCProtocolDecl *D) {
1634d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1635651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1636651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *Child : D->protocols())
1637176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpDeclRef(Child);
1638d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1639d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1640ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCInterfaceDecl(const ObjCInterfaceDecl *D) {
1641d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
164287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  dumpObjCTypeParamList(D->getTypeParamListAsWritten());
1643d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getSuperClass(), "super");
1644651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1645176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpDeclRef(D->getImplementation());
1646651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *Child : D->protocols())
1647176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpDeclRef(Child);
1648d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1649d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1650ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCImplementationDecl(const ObjCImplementationDecl *D) {
1651d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1652d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getSuperClass(), "super");
1653d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getClassInterface());
1654ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  for (ObjCImplementationDecl::init_const_iterator I = D->init_begin(),
1655ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko                                                   E = D->init_end();
1656176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines       I != E; ++I)
1657d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpCXXCtorInitializer(*I);
1658d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1659d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1660ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCCompatibleAliasDecl(const ObjCCompatibleAliasDecl *D) {
1661d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1662d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getClassInterface());
1663d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1664d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1665ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCPropertyDecl(const ObjCPropertyDecl *D) {
1666d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D);
1667d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpType(D->getType());
1668d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1669d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->getPropertyImplementation() == ObjCPropertyDecl::Required)
1670d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " required";
1671d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  else if (D->getPropertyImplementation() == ObjCPropertyDecl::Optional)
1672d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " optional";
1673d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1674d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  ObjCPropertyDecl::PropertyAttributeKind Attrs = D->getPropertyAttributes();
1675d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (Attrs != ObjCPropertyDecl::OBJC_PR_noattr) {
1676d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    if (Attrs & ObjCPropertyDecl::OBJC_PR_readonly)
1677d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " readonly";
1678d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    if (Attrs & ObjCPropertyDecl::OBJC_PR_assign)
1679d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " assign";
1680d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    if (Attrs & ObjCPropertyDecl::OBJC_PR_readwrite)
1681d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " readwrite";
1682d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    if (Attrs & ObjCPropertyDecl::OBJC_PR_retain)
1683d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " retain";
1684d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    if (Attrs & ObjCPropertyDecl::OBJC_PR_copy)
1685d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " copy";
1686d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    if (Attrs & ObjCPropertyDecl::OBJC_PR_nonatomic)
1687d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " nonatomic";
1688d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    if (Attrs & ObjCPropertyDecl::OBJC_PR_atomic)
1689d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " atomic";
1690d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    if (Attrs & ObjCPropertyDecl::OBJC_PR_weak)
1691d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " weak";
1692d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    if (Attrs & ObjCPropertyDecl::OBJC_PR_strong)
1693d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " strong";
1694d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    if (Attrs & ObjCPropertyDecl::OBJC_PR_unsafe_unretained)
1695d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      OS << " unsafe_unretained";
16964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (Attrs & ObjCPropertyDecl::OBJC_PR_class)
16974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      OS << " class";
1698176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (Attrs & ObjCPropertyDecl::OBJC_PR_getter)
1699d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      dumpDeclRef(D->getGetterMethodDecl(), "getter");
1700176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (Attrs & ObjCPropertyDecl::OBJC_PR_setter)
1701d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko      dumpDeclRef(D->getSetterMethodDecl(), "setter");
1702d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  }
1703d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1704d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1705ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D) {
1706d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpName(D->getPropertyDecl());
1707d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize)
1708d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " synthesize";
1709d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  else
1710d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " dynamic";
1711d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getPropertyDecl());
1712d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDeclRef(D->getPropertyIvarDecl());
1713d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
1714d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1715ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitBlockDecl(const BlockDecl *D) {
17164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (auto I : D->parameters())
1717651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    dumpDecl(I);
1718d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1719176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (D->isVariadic())
1720176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpChild([=]{ OS << "..."; });
1721176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1722176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (D->capturesCXXThis())
1723176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpChild([=]{ OS << "capture this"; });
1724d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
1725651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (const auto &I : D->captures()) {
1726176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpChild([=] {
1727176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << "capture";
1728176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (I.isByRef())
1729176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << " byref";
1730176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (I.isNested())
1731176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << " nested";
1732176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (I.getVariable()) {
1733176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        OS << ' ';
1734176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        dumpBareDeclRef(I.getVariable());
1735176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      }
1736176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (I.hasCopyExpr())
1737176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        dumpStmt(I.getCopyExpr());
1738176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    });
1739d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  }
1740d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpStmt(D->getBody());
17416000dace22f110d8768476989313e9d981d690d0Chris Lattner}
17426000dace22f110d8768476989313e9d981d690d0Chris Lattner
1743d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko//===----------------------------------------------------------------------===//
174421c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko//  Stmt dumping methods.
1745d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko//===----------------------------------------------------------------------===//
1746d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko
1747ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::dumpStmt(const Stmt *S) {
1748176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpChild([=] {
1749176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (!S) {
1750176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ColorScope Color(*this, NullColor);
1751176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << "<<<NULL>>>";
1752176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return;
1753176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
1754d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko
1755176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (const DeclStmt *DS = dyn_cast<DeclStmt>(S)) {
1756176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      VisitDeclStmt(DS);
1757176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return;
1758176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
1759d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko
1760176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ConstStmtVisitor<ASTDumper>::Visit(S);
1761d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko
176287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    for (const Stmt *SubStmt : S->children())
176387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      dumpStmt(SubStmt);
1764176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  });
1765d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko}
1766d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko
1767ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitStmt(const Stmt *Node) {
17687ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  {
17697ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    ColorScope Color(*this, StmtColor);
17707ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    OS << Node->getStmtClassName();
17717ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  }
1772d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpPointer(Node);
1773d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpSourceRange(Node->getSourceRange());
1774d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko}
1775d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko
1776ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitDeclStmt(const DeclStmt *Node) {
1777d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitStmt(Node);
1778ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  for (DeclStmt::const_decl_iterator I = Node->decl_begin(),
1779ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko                                     E = Node->decl_end();
1780176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines       I != E; ++I)
1781d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpDecl(*I);
17825399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek}
17835399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek
1784ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitAttributedStmt(const AttributedStmt *Node) {
1785c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko  VisitStmt(Node);
1786ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  for (ArrayRef<const Attr *>::iterator I = Node->getAttrs().begin(),
1787ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko                                        E = Node->getAttrs().end();
1788176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines       I != E; ++I)
1789c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko    dumpAttr(*I);
1790c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko}
1791c3cd2b0d538e4db78f1bcbedd0085e2005ce5c51Alexander Kornienko
1792ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitLabelStmt(const LabelStmt *Node) {
1793d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitStmt(Node);
1794806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " '" << Node->getName() << "'";
17956000dace22f110d8768476989313e9d981d690d0Chris Lattner}
17966000dace22f110d8768476989313e9d981d690d0Chris Lattner
1797ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitGotoStmt(const GotoStmt *Node) {
1798d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitStmt(Node);
1799d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << " '" << Node->getLabel()->getName() << "'";
1800d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpPointer(Node->getLabel());
18016000dace22f110d8768476989313e9d981d690d0Chris Lattner}
18026000dace22f110d8768476989313e9d981d690d0Chris Lattner
18030aae289e10b3efd484ecc023eb0fad873346754cPavel Labathvoid ASTDumper::VisitCXXCatchStmt(const CXXCatchStmt *Node) {
18040aae289e10b3efd484ecc023eb0fad873346754cPavel Labath  VisitStmt(Node);
18050aae289e10b3efd484ecc023eb0fad873346754cPavel Labath  dumpDecl(Node->getExceptionDecl());
18060aae289e10b3efd484ecc023eb0fad873346754cPavel Labath}
18070aae289e10b3efd484ecc023eb0fad873346754cPavel Labath
18084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTDumper::VisitCapturedStmt(const CapturedStmt *Node) {
18094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VisitStmt(Node);
18104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  dumpDecl(Node->getCapturedDecl());
18114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
18124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
18134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//===----------------------------------------------------------------------===//
18144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//  OpenMP dumping methods.
18154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//===----------------------------------------------------------------------===//
18164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
18174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTDumper::VisitOMPExecutableDirective(
18184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const OMPExecutableDirective *Node) {
18194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VisitStmt(Node);
18204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (auto *C : Node->clauses()) {
18214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    dumpChild([=] {
18224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (!C) {
18234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        ColorScope Color(*this, NullColor);
18244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OS << "<<<NULL>>> OMPClause";
18254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        return;
18264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
18274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      {
18284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        ColorScope Color(*this, AttrColor);
18294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        StringRef ClauseName(getOpenMPClauseName(C->getClauseKind()));
18304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OS << "OMP" << ClauseName.substr(/*Start=*/0, /*N=*/1).upper()
18314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar           << ClauseName.drop_front() << "Clause";
18324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
18334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      dumpPointer(C);
18344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      dumpSourceRange(SourceRange(C->getLocStart(), C->getLocEnd()));
18354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (C->isImplicit())
18364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OS << " <implicit>";
18374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      for (auto *S : C->children())
18384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        dumpStmt(S);
18394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    });
18404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
18414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
18424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
18436000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
184421c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko//  Expr dumping methods.
18456000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
18466000dace22f110d8768476989313e9d981d690d0Chris Lattner
1847ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitExpr(const Expr *Node) {
1848d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitStmt(Node);
184921c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  dumpType(Node->getType());
185021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
18517ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  {
18527ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    ColorScope Color(*this, ValueKindColor);
18537ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    switch (Node->getValueKind()) {
18547ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    case VK_RValue:
18557ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      break;
18567ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    case VK_LValue:
18577ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      OS << " lvalue";
18587ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      break;
18597ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    case VK_XValue:
18607ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      OS << " xvalue";
18617ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      break;
18627ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    }
186321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  }
186421c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
18657ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  {
18667ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    ColorScope Color(*this, ObjectKindColor);
18677ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    switch (Node->getObjectKind()) {
18687ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    case OK_Ordinary:
18697ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      break;
18707ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    case OK_BitField:
18717ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      OS << " bitfield";
18727ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      break;
18737ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    case OK_ObjCProperty:
18747ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      OS << " objcproperty";
18757ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      break;
18767ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    case OK_ObjCSubscript:
18777ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      OS << " objcsubscript";
18787ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      break;
18797ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    case OK_VectorComponent:
18807ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      OS << " vectorcomponent";
18817ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu      break;
18827ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    }
188321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  }
18846000dace22f110d8768476989313e9d981d690d0Chris Lattner}
18856000dace22f110d8768476989313e9d981d690d0Chris Lattner
1886ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkostatic void dumpBasePath(raw_ostream &OS, const CastExpr *Node) {
1887f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  if (Node->path_empty())
18885cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    return;
18895cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson
18905cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson  OS << " (";
18915cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson  bool First = true;
1892ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  for (CastExpr::path_const_iterator I = Node->path_begin(),
1893ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko                                     E = Node->path_end();
1894ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko       I != E; ++I) {
18955cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    const CXXBaseSpecifier *Base = *I;
18965cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    if (!First)
18975cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson      OS << " -> ";
189821c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
18995cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    const CXXRecordDecl *RD =
19005cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
190121c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
19025cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    if (Base->isVirtual())
19035cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson      OS << "virtual ";
19045cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    OS << RD->getName();
19055cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    First = false;
19065cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson  }
190721c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
19085cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson  OS << ')';
19095cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson}
19105cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson
1911ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCastExpr(const CastExpr *Node) {
1912d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
19137ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  OS << " <";
19147ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  {
19157ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    ColorScope Color(*this, CastColor);
19167ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    OS << Node->getCastKindName();
19177ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  }
191821c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  dumpBasePath(OS, Node);
19195cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson  OS << ">";
192027a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson}
192127a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson
1922ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitDeclRefExpr(const DeclRefExpr *Node) {
1923d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
1924eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek
1925806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " ";
1926d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpBareDeclRef(Node->getDecl());
19273aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth  if (Node->getDecl() != Node->getFoundDecl()) {
19283aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth    OS << " (";
1929d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpBareDeclRef(Node->getFoundDecl());
19303aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth    OS << ")";
19313aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth  }
19326b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall}
19336b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall
1934ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUnresolvedLookupExpr(const UnresolvedLookupExpr *Node) {
1935d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
19369d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall  OS << " (";
193721c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  if (!Node->requiresADL())
193821c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    OS << "no ";
1939900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer  OS << "ADL) = '" << Node->getName() << '\'';
19409d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall
19419d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall  UnresolvedLookupExpr::decls_iterator
19429d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall    I = Node->decls_begin(), E = Node->decls_end();
194321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  if (I == E)
194421c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    OS << " empty";
19459d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall  for (; I != E; ++I)
1946d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpPointer(*I);
19479d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall}
19489d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall
1949ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCIvarRefExpr(const ObjCIvarRefExpr *Node) {
1950d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
19513c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff
19527ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  {
19537ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    ColorScope Color(*this, DeclKindNameColor);
19547ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu    OS << " " << Node->getDecl()->getDeclKindName() << "Decl";
19557ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  }
19567ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  OS << "='" << *Node->getDecl() << "'";
1957d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpPointer(Node->getDecl());
1958218543b10e81ea2269ef6ae34d2d8ddbdec54dbeSteve Naroff  if (Node->isFreeIvar())
1959806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << " isFreeIvar";
19603c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff}
19613c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff
1962ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitPredefinedExpr(const PredefinedExpr *Node) {
1963d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
1964176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  OS << " " << PredefinedExpr::getIdentTypeName(Node->getIdentType());
19656000dace22f110d8768476989313e9d981d690d0Chris Lattner}
19666000dace22f110d8768476989313e9d981d690d0Chris Lattner
1967ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCharacterLiteral(const CharacterLiteral *Node) {
1968d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
19697ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  ColorScope Color(*this, ValueColor);
197049cf8847ef4d9caebdd162d2a5d7d055333d8b5cRichard Trieu  OS << " " << Node->getValue();
19716000dace22f110d8768476989313e9d981d690d0Chris Lattner}
19726000dace22f110d8768476989313e9d981d690d0Chris Lattner
1973ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitIntegerLiteral(const IntegerLiteral *Node) {
1974d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
19756000dace22f110d8768476989313e9d981d690d0Chris Lattner
19766000dace22f110d8768476989313e9d981d690d0Chris Lattner  bool isSigned = Node->getType()->isSignedIntegerType();
19777ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  ColorScope Color(*this, ValueColor);
1978806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " " << Node->getValue().toString(10, isSigned);
19796000dace22f110d8768476989313e9d981d690d0Chris Lattner}
198021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
1981ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitFloatingLiteral(const FloatingLiteral *Node) {
1982d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
19837ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  ColorScope Color(*this, ValueColor);
1984806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " " << Node->getValueAsApproximateDouble();
19856000dace22f110d8768476989313e9d981d690d0Chris Lattner}
19865d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner
1987ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitStringLiteral(const StringLiteral *Str) {
1988d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Str);
19897ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  ColorScope Color(*this, ValueColor);
1990806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " ";
19918ab09da1faaa33b9fa78de59cc4e191bfe9907b5Richard Trieu  Str->outputString(OS);
19926000dace22f110d8768476989313e9d981d690d0Chris Lattner}
199317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner
1994c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid ASTDumper::VisitInitListExpr(const InitListExpr *ILE) {
1995c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  VisitExpr(ILE);
1996c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  if (auto *Filler = ILE->getArrayFiller()) {
1997176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpChild([=] {
1998176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << "array filler";
1999176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpStmt(Filler);
2000176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    });
2001c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
2002c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  if (auto *Field = ILE->getInitializedFieldInUnion()) {
2003c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    OS << " field ";
2004c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    dumpBareDeclRef(Field);
2005c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
2006c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2007c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2008ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUnaryOperator(const UnaryOperator *Node) {
2009d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
2010806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " " << (Node->isPostfix() ? "postfix" : "prefix")
2011806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar     << " '" << UnaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
20126000dace22f110d8768476989313e9d981d690d0Chris Lattner}
201321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
2014ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitUnaryExprOrTypeTraitExpr(
2015ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    const UnaryExprOrTypeTraitExpr *Node) {
2016d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
2017f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  switch(Node->getKind()) {
2018f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case UETT_SizeOf:
2019d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " sizeof";
2020f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    break;
2021f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case UETT_AlignOf:
2022d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " alignof";
2023f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    break;
2024f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case UETT_VecStep:
2025d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    OS << " vec_step";
2026f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    break;
202787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case UETT_OpenMPRequiredSimdAlign:
202887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    OS << " __builtin_omp_required_simd_align";
202987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    break;
2030f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  }
20310518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  if (Node->isArgumentType())
203221c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko    dumpType(Node->getArgumentType());
20336000dace22f110d8768476989313e9d981d690d0Chris Lattner}
203413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner
2035ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitMemberExpr(const MemberExpr *Node) {
2036d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
2037d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << " " << (Node->isArrow() ? "->" : ".") << *Node->getMemberDecl();
2038d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpPointer(Node->getMemberDecl());
20396000dace22f110d8768476989313e9d981d690d0Chris Lattner}
204021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
2041ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitExtVectorElementExpr(const ExtVectorElementExpr *Node) {
2042d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
2043806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " " << Node->getAccessor().getNameStart();
20446000dace22f110d8768476989313e9d981d690d0Chris Lattner}
204521c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
2046ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitBinaryOperator(const BinaryOperator *Node) {
2047d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
2048806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
2049eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner}
205021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
2051ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCompoundAssignOperator(
2052ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko    const CompoundAssignOperator *Node) {
2053d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
2054806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode())
2055806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar     << "' ComputeLHSTy=";
2056d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpBareType(Node->getComputationLHSType());
2057806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " ComputeResultTy=";
2058d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpBareType(Node->getComputationResultType());
20596000dace22f110d8768476989313e9d981d690d0Chris Lattner}
20606000dace22f110d8768476989313e9d981d690d0Chris Lattner
2061ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitBlockExpr(const BlockExpr *Node) {
2062d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
2063d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpDecl(Node->getBlockDecl());
20646b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall}
20656b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall
2066ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitOpaqueValueExpr(const OpaqueValueExpr *Node) {
2067d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
20684b9c2d235fb9449e249d74f48ecfec601650de93John McCall
2069176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (Expr *Source = Node->getSourceExpr())
2070d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko    dumpStmt(Source);
20714b9c2d235fb9449e249d74f48ecfec601650de93John McCall}
20724b9c2d235fb9449e249d74f48ecfec601650de93John McCall
20736000dace22f110d8768476989313e9d981d690d0Chris Lattner// GNU extensions.
20746000dace22f110d8768476989313e9d981d690d0Chris Lattner
2075ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitAddrLabelExpr(const AddrLabelExpr *Node) {
2076d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
2077d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << " " << Node->getLabel()->getName();
2078d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpPointer(Node->getLabel());
20796000dace22f110d8768476989313e9d981d690d0Chris Lattner}
20806000dace22f110d8768476989313e9d981d690d0Chris Lattner
2081f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===//
2082f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner// C++ Expressions
2083f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===//
20846000dace22f110d8768476989313e9d981d690d0Chris Lattner
2085ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXNamedCastExpr(const CXXNamedCastExpr *Node) {
2086d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
208721c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  OS << " " << Node->getCastName()
2088806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar     << "<" << Node->getTypeAsWritten().getAsString() << ">"
20895cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson     << " <" << Node->getCastKindName();
209021c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  dumpBasePath(OS, Node);
20915cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson  OS << ">";
20926000dace22f110d8768476989313e9d981d690d0Chris Lattner}
20936000dace22f110d8768476989313e9d981d690d0Chris Lattner
2094ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *Node) {
2095d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
2096806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " " << (Node->getValue() ? "true" : "false");
20976000dace22f110d8768476989313e9d981d690d0Chris Lattner}
20986000dace22f110d8768476989313e9d981d690d0Chris Lattner
2099ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXThisExpr(const CXXThisExpr *Node) {
2100d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
2101806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " this";
2102cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor}
2103cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor
2104ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXFunctionalCastExpr(const CXXFunctionalCastExpr *Node) {
2105d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
2106cc2fca2ba2716293204901b8d2393428b965f12aEli Friedman  OS << " functional cast to " << Node->getTypeAsWritten().getAsString()
2107cc2fca2ba2716293204901b8d2393428b965f12aEli Friedman     << " <" << Node->getCastKindName() << ">";
210849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
210949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
2110ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXConstructExpr(const CXXConstructExpr *Node) {
2111d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
2112d4bbdfebe9bd13defa977a934bf73fc2ce3b2817John McCall  CXXConstructorDecl *Ctor = Node->getConstructor();
211321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  dumpType(Ctor->getType());
21140eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson  if (Node->isElidable())
2115806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << " elidable";
2116f8cf0b028c7a5b632c3a711813cd44a9d9642537John McCall  if (Node->requiresZeroInitialization())
2117f8cf0b028c7a5b632c3a711813cd44a9d9642537John McCall    OS << " zeroing";
21180eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson}
21190eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson
2120ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *Node) {
2121d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
2122806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " ";
212321c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  dumpCXXTemporary(Node->getTemporary());
21240eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson}
21250eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson
21263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarvoid ASTDumper::VisitCXXNewExpr(const CXXNewExpr *Node) {
21273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  VisitExpr(Node);
21283ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  if (Node->isGlobalNew())
21293ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    OS << " global";
21303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  if (Node->isArray())
21313ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    OS << " array";
21323ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  if (Node->getOperatorNew()) {
21333ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    OS << ' ';
21343ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    dumpBareDeclRef(Node->getOperatorNew());
21353ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
21363ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // We could dump the deallocation function used in case of error, but it's
21373ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // usually not that interesting.
21383ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar}
21393ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
21403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarvoid ASTDumper::VisitCXXDeleteExpr(const CXXDeleteExpr *Node) {
21413ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  VisitExpr(Node);
21423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  if (Node->isGlobalDelete())
21433ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    OS << " global";
21443ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  if (Node->isArrayForm())
21453ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    OS << " array";
21463ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  if (Node->getOperatorDelete()) {
21473ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    OS << ' ';
21483ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    dumpBareDeclRef(Node->getOperatorDelete());
21493ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
21503ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar}
21513ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
2152211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smithvoid
2153211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard SmithASTDumper::VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *Node) {
2154211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith  VisitExpr(Node);
2155211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith  if (const ValueDecl *VD = Node->getExtendingDecl()) {
2156211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith    OS << " extended by ";
2157211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith    dumpBareDeclRef(VD);
2158211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith  }
2159211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith}
2160211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith
2161ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitExprWithCleanups(const ExprWithCleanups *Node) {
2162d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
2163d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  for (unsigned i = 0, e = Node->getNumObjects(); i != e; ++i)
2164d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpDeclRef(Node->getObject(i), "cleanup");
21650eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson}
21660eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson
2167ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::dumpCXXTemporary(const CXXTemporary *Temporary) {
2168d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << "(CXXTemporary";
2169d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dumpPointer(Temporary);
2170d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  OS << ")";
21710eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson}
21720eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson
21730e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid ASTDumper::VisitSizeOfPackExpr(const SizeOfPackExpr *Node) {
21740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  VisitExpr(Node);
21750e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  dumpPointer(Node->getPack());
21760e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  dumpName(Node->getPack());
217787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (Node->isPartiallySubstituted())
217887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    for (const auto &A : Node->getPartialArguments())
217987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      dumpTemplateArgument(A);
21800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
21810e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
21820e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
21835508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===//
21845508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// Obj-C Expressions
21855508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===//
21865508518a2702b00be3b15a26d772bde968972f54Anders Carlsson
2187ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCMessageExpr(const ObjCMessageExpr *Node) {
2188d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
2189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OS << " selector=";
2190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Node->getSelector().print(OS);
219104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  switch (Node->getReceiverKind()) {
219204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::Instance:
219304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
219404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
219504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::Class:
219604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    OS << " class=";
2197d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko    dumpBareType(Node->getClassReceiver());
219804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
219904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
220004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::SuperInstance:
220104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    OS << " super (instance)";
220204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
220304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
220404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::SuperClass:
220504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    OS << " super (class)";
220604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
220704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  }
2208b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek}
2209b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek
2210ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCBoxedExpr(const ObjCBoxedExpr *Node) {
2211d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
22124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (auto *BoxingMethod = Node->getBoxingMethod()) {
22134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    OS << " selector=";
22144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    BoxingMethod->getSelector().print(OS);
22154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
221636faaddccf519231a3facd26495e895ba5a28776Argyrios Kyrtzidis}
221736faaddccf519231a3facd26495e895ba5a28776Argyrios Kyrtzidis
2218ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCAtCatchStmt(const ObjCAtCatchStmt *Node) {
2219d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitStmt(Node);
2220ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  if (const VarDecl *CatchParam = Node->getCatchParamDecl())
2221d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko    dumpDecl(CatchParam);
2222d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  else
22238f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    OS << " catch all";
22248f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor}
22258f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor
2226ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCEncodeExpr(const ObjCEncodeExpr *Node) {
2227d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
222821c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  dumpType(Node->getEncodedType());
2229f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson}
2230f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson
2231ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCSelectorExpr(const ObjCSelectorExpr *Node) {
2232d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
22331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2234651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OS << " ";
2235651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Node->getSelector().print(OS);
2236b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian}
2237b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian
2238ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCProtocolExpr(const ObjCProtocolExpr *Node) {
2239d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
22401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
224121c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko  OS << ' ' << *Node->getProtocol();
2242390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian}
22437f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar
2244ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr *Node) {
2245d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
224612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  if (Node->isImplicitProperty()) {
224799130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian    OS << " Kind=MethodRef Getter=\"";
224899130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian    if (Node->getImplicitPropertyGetter())
2249651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Node->getImplicitPropertyGetter()->getSelector().print(OS);
225099130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian    else
225199130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian      OS << "(null)";
225299130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian
225399130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian    OS << "\" Setter=\"";
225412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    if (ObjCMethodDecl *Setter = Node->getImplicitPropertySetter())
2255651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Setter->getSelector().print(OS);
225612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    else
225712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall      OS << "(null)";
225812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    OS << "\"";
225912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  } else {
2260b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer    OS << " Kind=PropertyRef Property=\"" << *Node->getExplicitProperty() <<'"';
226112f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  }
22621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22638ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian  if (Node->isSuperReceiver())
22648ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian    OS << " super";
2265b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis
2266b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis  OS << " Messaging=";
2267b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis  if (Node->isMessagingGetter() && Node->isMessagingSetter())
2268b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis    OS << "Getter&Setter";
2269b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis  else if (Node->isMessagingGetter())
2270b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis    OS << "Getter";
2271b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis  else if (Node->isMessagingSetter())
2272b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis    OS << "Setter";
2273cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor}
2274cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor
2275ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCSubscriptRefExpr(const ObjCSubscriptRefExpr *Node) {
2276d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
2277ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  if (Node->isArraySubscriptRefExpr())
2278ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    OS << " Kind=ArraySubscript GetterForArray=\"";
2279ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  else
2280ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    OS << " Kind=DictionarySubscript GetterForDictionary=\"";
2281ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  if (Node->getAtIndexMethodDecl())
2282651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Node->getAtIndexMethodDecl()->getSelector().print(OS);
2283ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  else
2284ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    OS << "(null)";
228521c8b19a28f0140261a53f0cc006c8d55a433665Alexander Kornienko
2286ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  if (Node->isArraySubscriptRefExpr())
2287ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    OS << "\" SetterForArray=\"";
2288ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  else
2289ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    OS << "\" SetterForDictionary=\"";
2290ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  if (Node->setAtIndexMethodDecl())
2291651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Node->setAtIndexMethodDecl()->getSelector().print(OS);
2292ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  else
2293ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    OS << "(null)";
2294ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
2295ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
2296ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienkovoid ASTDumper::VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *Node) {
2297d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
2298ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  OS << " " << (Node->getValue() ? "__objc_yes" : "__objc_no");
2299ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
2300ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
23016000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
2302acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko// Comments
2303acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko//===----------------------------------------------------------------------===//
2304acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2305acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkoconst char *ASTDumper::getCommandName(unsigned CommandID) {
2306acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  if (Traits)
2307acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    return Traits->getCommandInfo(CommandID)->Name;
2308acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  const CommandInfo *Info = CommandTraits::getBuiltinCommandInfo(CommandID);
2309acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  if (Info)
2310acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    return Info->Name;
2311acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  return "<not a builtin command>";
2312acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2313acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2314acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::dumpFullComment(const FullComment *C) {
2315acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  if (!C)
2316acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    return;
2317acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2318acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  FC = C;
2319acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  dumpComment(C);
23206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  FC = nullptr;
2321acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2322acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2323acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::dumpComment(const Comment *C) {
2324176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dumpChild([=] {
2325176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (!C) {
2326176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ColorScope Color(*this, NullColor);
2327176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << "<<<NULL>>>";
2328176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return;
2329176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
2330acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2331176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    {
2332176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ColorScope Color(*this, CommentColor);
2333176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      OS << C->getCommentKindName();
2334176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
2335176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpPointer(C);
2336176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    dumpSourceRange(C->getSourceRange());
2337176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ConstCommentVisitor<ASTDumper>::visit(C);
2338176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    for (Comment::child_iterator I = C->child_begin(), E = C->child_end();
2339176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines         I != E; ++I)
2340176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      dumpComment(*I);
2341176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  });
2342acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2343acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2344acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitTextComment(const TextComment *C) {
2345acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  OS << " Text=\"" << C->getText() << "\"";
2346acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2347acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2348acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitInlineCommandComment(const InlineCommandComment *C) {
2349acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  OS << " Name=\"" << getCommandName(C->getCommandID()) << "\"";
2350acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  switch (C->getRenderKind()) {
2351acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  case InlineCommandComment::RenderNormal:
2352acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " RenderNormal";
2353acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    break;
2354acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  case InlineCommandComment::RenderBold:
2355acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " RenderBold";
2356acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    break;
2357acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  case InlineCommandComment::RenderMonospaced:
2358acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " RenderMonospaced";
2359acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    break;
2360acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  case InlineCommandComment::RenderEmphasized:
2361acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " RenderEmphasized";
2362acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    break;
2363acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  }
2364acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2365acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  for (unsigned i = 0, e = C->getNumArgs(); i != e; ++i)
2366acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " Arg[" << i << "]=\"" << C->getArgText(i) << "\"";
2367acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2368acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2369acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitHTMLStartTagComment(const HTMLStartTagComment *C) {
2370acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  OS << " Name=\"" << C->getTagName() << "\"";
2371acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  if (C->getNumAttrs() != 0) {
2372acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " Attrs: ";
2373acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    for (unsigned i = 0, e = C->getNumAttrs(); i != e; ++i) {
2374acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko      const HTMLStartTagComment::Attribute &Attr = C->getAttr(i);
2375acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko      OS << " \"" << Attr.Name << "=\"" << Attr.Value << "\"";
2376acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    }
2377acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  }
2378acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  if (C->isSelfClosing())
2379acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " SelfClosing";
2380acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2381acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2382acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitHTMLEndTagComment(const HTMLEndTagComment *C) {
2383acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  OS << " Name=\"" << C->getTagName() << "\"";
2384acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2385acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2386acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitBlockCommandComment(const BlockCommandComment *C) {
2387acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  OS << " Name=\"" << getCommandName(C->getCommandID()) << "\"";
2388acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  for (unsigned i = 0, e = C->getNumArgs(); i != e; ++i)
2389acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " Arg[" << i << "]=\"" << C->getArgText(i) << "\"";
2390acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2391acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2392acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitParamCommandComment(const ParamCommandComment *C) {
2393acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  OS << " " << ParamCommandComment::getDirectionAsString(C->getDirection());
2394acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2395acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  if (C->isDirectionExplicit())
2396acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " explicitly";
2397acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  else
2398acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " implicitly";
2399acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2400acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  if (C->hasParamName()) {
2401acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    if (C->isParamIndexValid())
2402acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko      OS << " Param=\"" << C->getParamName(FC) << "\"";
2403acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    else
2404acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko      OS << " Param=\"" << C->getParamNameAsWritten() << "\"";
2405acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  }
2406acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2407651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (C->isParamIndexValid() && !C->isVarArgParam())
2408acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " ParamIndex=" << C->getParamIndex();
2409acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2410acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2411acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitTParamCommandComment(const TParamCommandComment *C) {
2412acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  if (C->hasParamName()) {
2413acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    if (C->isPositionValid())
2414acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko      OS << " Param=\"" << C->getParamName(FC) << "\"";
2415acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    else
2416acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko      OS << " Param=\"" << C->getParamNameAsWritten() << "\"";
2417acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  }
2418acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2419acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  if (C->isPositionValid()) {
2420acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << " Position=<";
2421acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    for (unsigned i = 0, e = C->getDepth(); i != e; ++i) {
2422acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko      OS << C->getIndex(i);
2423acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko      if (i != e - 1)
2424acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko        OS << ", ";
2425acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    }
2426acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    OS << ">";
2427acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  }
2428acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2429acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2430acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitVerbatimBlockComment(const VerbatimBlockComment *C) {
2431acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  OS << " Name=\"" << getCommandName(C->getCommandID()) << "\""
2432acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko        " CloseName=\"" << C->getCloseName() << "\"";
2433acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2434acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2435acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitVerbatimBlockLineComment(
2436acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko    const VerbatimBlockLineComment *C) {
2437acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  OS << " Text=\"" << C->getText() << "\"";
2438acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2439acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2440acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienkovoid ASTDumper::visitVerbatimLineComment(const VerbatimLineComment *C) {
2441acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  OS << " Text=\"" << C->getText() << "\"";
2442acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2443acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2444acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko//===----------------------------------------------------------------------===//
2445176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Type method implementations
2446176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines//===----------------------------------------------------------------------===//
2447176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2448176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid QualType::dump(const char *msg) const {
2449176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (msg)
2450176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    llvm::errs() << msg << ": ";
2451176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  dump();
2452176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2453176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2454176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesLLVM_DUMP_METHOD void QualType::dump() const {
2455176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ASTDumper Dumper(llvm::errs(), nullptr, nullptr);
2456176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  Dumper.dumpTypeAsChild(*this);
2457176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2458176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2459176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesLLVM_DUMP_METHOD void Type::dump() const { QualType(this, 0).dump(); }
2460176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2461176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines//===----------------------------------------------------------------------===//
2462d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko// Decl method implementations
2463d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===//
2464d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
2465651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLLVM_DUMP_METHOD void Decl::dump() const { dump(llvm::errs()); }
2466d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
2467651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLLVM_DUMP_METHOD void Decl::dump(raw_ostream &OS) const {
2468acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  ASTDumper P(OS, &getASTContext().getCommentCommandTraits(),
2469acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko              &getASTContext().getSourceManager());
2470ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  P.dumpDecl(this);
2471d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
2472d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
2473651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLLVM_DUMP_METHOD void Decl::dumpColor() const {
24747ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  ASTDumper P(llvm::errs(), &getASTContext().getCommentCommandTraits(),
24757ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu              &getASTContext().getSourceManager(), /*ShowColors*/true);
2476ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  P.dumpDecl(this);
24777ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu}
24786e322c08b187ba93019732d2295c84c339813e0dRichard Smith
2479651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLLVM_DUMP_METHOD void DeclContext::dumpLookups() const {
2480ab297ccbcc51d5197d4ddb4e99b7bc8868d38314Richard Smith  dumpLookups(llvm::errs());
2481ab297ccbcc51d5197d4ddb4e99b7bc8868d38314Richard Smith}
2482ab297ccbcc51d5197d4ddb4e99b7bc8868d38314Richard Smith
2483176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesLLVM_DUMP_METHOD void DeclContext::dumpLookups(raw_ostream &OS,
2484176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                               bool DumpDecls) const {
24856e322c08b187ba93019732d2295c84c339813e0dRichard Smith  const DeclContext *DC = this;
24866e322c08b187ba93019732d2295c84c339813e0dRichard Smith  while (!DC->isTranslationUnit())
24876e322c08b187ba93019732d2295c84c339813e0dRichard Smith    DC = DC->getParent();
24886e322c08b187ba93019732d2295c84c339813e0dRichard Smith  ASTContext &Ctx = cast<TranslationUnitDecl>(DC)->getASTContext();
2489ab297ccbcc51d5197d4ddb4e99b7bc8868d38314Richard Smith  ASTDumper P(OS, &Ctx.getCommentCommandTraits(), &Ctx.getSourceManager());
2490176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  P.dumpLookups(this, DumpDecls);
24916e322c08b187ba93019732d2295c84c339813e0dRichard Smith}
24926e322c08b187ba93019732d2295c84c339813e0dRichard Smith
2493d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko//===----------------------------------------------------------------------===//
24946000dace22f110d8768476989313e9d981d690d0Chris Lattner// Stmt method implementations
24956000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
24966000dace22f110d8768476989313e9d981d690d0Chris Lattner
2497651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLLVM_DUMP_METHOD void Stmt::dump(SourceManager &SM) const {
24989668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis  dump(llvm::errs(), SM);
24999668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis}
25009668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis
2501651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLLVM_DUMP_METHOD void Stmt::dump(raw_ostream &OS, SourceManager &SM) const {
25026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ASTDumper P(OS, nullptr, &SM);
2503ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  P.dumpStmt(this);
25040c727a35718556866a978f64ac549d9798735f08Chris Lattner}
25050c727a35718556866a978f64ac549d9798735f08Chris Lattner
25063ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga NainarLLVM_DUMP_METHOD void Stmt::dump(raw_ostream &OS) const {
25073ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  ASTDumper P(OS, nullptr, nullptr);
25083ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  P.dumpStmt(this);
25093ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar}
25103ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
2511651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLLVM_DUMP_METHOD void Stmt::dump() const {
25126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ASTDumper P(llvm::errs(), nullptr, nullptr);
2513ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  P.dumpStmt(this);
25146000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2515acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2516651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLLVM_DUMP_METHOD void Stmt::dumpColor() const {
25176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ASTDumper P(llvm::errs(), nullptr, nullptr, /*ShowColors*/true);
2518ae54121c15cdd38f415f6fdda48215ab5e4dcee1Alexander Kornienko  P.dumpStmt(this);
25197ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu}
25207ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
2521acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko//===----------------------------------------------------------------------===//
2522acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko// Comment method implementations
2523acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko//===----------------------------------------------------------------------===//
2524acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
25256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesLLVM_DUMP_METHOD void Comment::dump() const {
25266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  dump(llvm::errs(), nullptr, nullptr);
25276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
2528acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
2529651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLLVM_DUMP_METHOD void Comment::dump(const ASTContext &Context) const {
2530acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  dump(llvm::errs(), &Context.getCommentCommandTraits(),
2531acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko       &Context.getSourceManager());
2532acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
2533acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko
253451ccafd66682ecbccc0a63364291dc7a8f6ec0f0Alexander Kornienkovoid Comment::dump(raw_ostream &OS, const CommandTraits *Traits,
2535acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko                   const SourceManager *SM) const {
2536acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  const FullComment *FC = dyn_cast<FullComment>(this);
2537acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  ASTDumper D(OS, Traits, SM);
2538acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko  D.dumpFullComment(FC);
2539acd356e18ecb8213d65f1454bb3c1bb4f6892babAlexander Kornienko}
25407ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu
2541651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLLVM_DUMP_METHOD void Comment::dumpColor() const {
25427ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  const FullComment *FC = dyn_cast<FullComment>(this);
25436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ASTDumper D(llvm::errs(), nullptr, nullptr, /*ShowColors*/true);
25447ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu  D.dumpFullComment(FC);
25457ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu}
2546