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