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