ASTDumper.cpp revision d5bc359971fe9e3d78a44e9b25a909f01f3018ec
16000dace22f110d8768476989313e9d981d690d0Chris Lattner//===--- StmtDumper.cpp - Dumping implementation for Stmt 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// 10cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek// This file implements the Stmt::dump method, which dumps out the 116000dace22f110d8768476989313e9d981d690d0Chris Lattner// AST in a form that exposes type details and other fields. 126000dace22f110d8768476989313e9d981d690d0Chris Lattner// 136000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 146000dace22f110d8768476989313e9d981d690d0Chris Lattner 1555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/PrettyPrinter.h" 16478851c3ed6bd784e7377dffd8e57b200c1b9ba9Benjamin Kramer#include "clang/AST/ASTContext.h" 172a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor#include "clang/AST/DeclCXX.h" 1855fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/DeclObjC.h" 1955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/StmtVisitor.h" 20e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner#include "clang/Basic/SourceManager.h" 21806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar#include "llvm/Support/raw_ostream.h" 226000dace22f110d8768476989313e9d981d690d0Chris Lattnerusing namespace clang; 236000dace22f110d8768476989313e9d981d690d0Chris Lattner 246000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 256000dace22f110d8768476989313e9d981d690d0Chris Lattner// StmtDumper Visitor 266000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 276000dace22f110d8768476989313e9d981d690d0Chris Lattner 286000dace22f110d8768476989313e9d981d690d0Chris Lattnernamespace { 29770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramer class StmtDumper : public StmtVisitor<StmtDumper> { 30e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner SourceManager *SM; 315f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner raw_ostream &OS; 326000dace22f110d8768476989313e9d981d690d0Chris Lattner unsigned IndentLevel; 33cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek bool IsFirstLine; 341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner /// LastLocFilename/LastLocLine - Keep track of the last location we print 36e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner /// out so that we can print out deltas from then on out. 37e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner const char *LastLocFilename; 38e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner unsigned LastLocLine; 39d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor 40cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek class IndentScope { 41cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek StmtDumper &Dumper; 42cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek public: 43cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek IndentScope(StmtDumper &Dumper) : Dumper(Dumper) { 44cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek Dumper.indent(); 45cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek } 46cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek ~IndentScope() { 47cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek Dumper.unindent(); 48cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek } 49cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek }; 50cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek 516000dace22f110d8768476989313e9d981d690d0Chris Lattner public: 5295f6190acb664b345b1395abaea84ee451740c5bDmitri Gribenko StmtDumper(SourceManager *SM, raw_ostream &OS) 5395f6190acb664b345b1395abaea84ee451740c5bDmitri Gribenko : SM(SM), OS(OS), IndentLevel(0), IsFirstLine(true), 5495f6190acb664b345b1395abaea84ee451740c5bDmitri Gribenko LastLocFilename(""), LastLocLine(~0U) { } 551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 56cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek ~StmtDumper() { 57cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek OS << "\n"; 58cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek } 59cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek 60d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko void dumpDecl(Decl *D); 61d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko void dumpStmt(Stmt *S); 621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 63cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek void indent() { 64cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek if (IsFirstLine) 65cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek IsFirstLine = false; 66cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek else 67cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek OS << "\n"; 68cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek OS.indent(IndentLevel * 2); 69cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek OS << "("; 70cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek IndentLevel++; 71cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek } 72cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek 73cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek void unindent() { 74cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek OS << ")"; 75cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek IndentLevel--; 766000dace22f110d8768476989313e9d981d690d0Chris Lattner } 771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 789dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff void DumpType(QualType T) { 7949f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall SplitQualType T_split = T.split(); 8049f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall OS << "'" << QualType::getAsString(T_split) << "'"; 81fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner 8261366e9cd41a6dbde4e66416dac21269c8ac1d94Douglas Gregor if (!T.isNull()) { 830953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If the type is sugared, also dump a (shallow) desugared type. 8449f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall SplitQualType D_split = T.getSplitDesugaredType(); 8549f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall if (T_split != D_split) 8649f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall OS << ":'" << QualType::getAsString(D_split) << "'"; 87bad37858aef8910195a9c75f2892a09a032424b7Chris Lattner } 88fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner } 896b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall void DumpDeclRef(Decl *node); 90f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall void DumpValueKind(ExprValueKind K) { 91f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall switch (K) { 92f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall case VK_RValue: break; 93f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall case VK_LValue: OS << " lvalue"; break; 94f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall case VK_XValue: OS << " xvalue"; break; 95f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall } 96f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall } 97f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall void DumpObjectKind(ExprObjectKind K) { 98f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall switch (K) { 99f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall case OK_Ordinary: break; 100f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall case OK_BitField: OS << " bitfield"; break; 101f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall case OK_ObjCProperty: OS << " objcproperty"; break; 102ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek case OK_ObjCSubscript: OS << " objcsubscript"; break; 103f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall case OK_VectorComponent: OS << " vectorcomponent"; break; 104f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall } 105f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall } 1069dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff void DumpSourceRange(const Stmt *Node); 107e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner void DumpLocation(SourceLocation Loc); 1081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10917a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // Stmts. 110c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner void VisitStmt(Stmt *Node); 1115399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek void VisitDeclStmt(DeclStmt *Node); 11217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitLabelStmt(LabelStmt *Node); 11317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitGotoStmt(GotoStmt *Node); 1141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // Exprs 11617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitExpr(Expr *Node); 11727a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson void VisitCastExpr(CastExpr *Node); 11817a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitDeclRefExpr(DeclRefExpr *Node); 119d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner void VisitPredefinedExpr(PredefinedExpr *Node); 12017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitCharacterLiteral(CharacterLiteral *Node); 12117a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitIntegerLiteral(IntegerLiteral *Node); 12217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitFloatingLiteral(FloatingLiteral *Node); 12317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitStringLiteral(StringLiteral *Str); 12417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitUnaryOperator(UnaryOperator *Node); 125f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne void VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *Node); 12617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitMemberExpr(MemberExpr *Node); 127213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman void VisitExtVectorElementExpr(ExtVectorElementExpr *Node); 12817a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitBinaryOperator(BinaryOperator *Node); 12917a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitCompoundAssignOperator(CompoundAssignOperator *Node); 13017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitAddrLabelExpr(AddrLabelExpr *Node); 1316b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall void VisitBlockExpr(BlockExpr *Node); 1324b9c2d235fb9449e249d74f48ecfec601650de93John McCall void VisitOpaqueValueExpr(OpaqueValueExpr *Node); 13317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner 13417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // C++ 13549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor void VisitCXXNamedCastExpr(CXXNamedCastExpr *Node); 13617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node); 137cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor void VisitCXXThisExpr(CXXThisExpr *Node); 13849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node); 1390eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson void VisitCXXConstructExpr(CXXConstructExpr *Node); 1400eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node); 1414765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall void VisitExprWithCleanups(ExprWithCleanups *Node); 1429d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall void VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node); 1430eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson void DumpCXXTemporary(CXXTemporary *Temporary); 1441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // ObjC 1468f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor void VisitObjCAtCatchStmt(ObjCAtCatchStmt *Node); 14717a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitObjCEncodeExpr(ObjCEncodeExpr *Node); 148b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek void VisitObjCMessageExpr(ObjCMessageExpr* Node); 14936faaddccf519231a3facd26495e895ba5a28776Argyrios Kyrtzidis void VisitObjCBoxedExpr(ObjCBoxedExpr* Node); 150b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian void VisitObjCSelectorExpr(ObjCSelectorExpr *Node); 151390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian void VisitObjCProtocolExpr(ObjCProtocolExpr *Node); 1527f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node); 153ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek void VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *Node); 1543c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff void VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node); 155ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek void VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *Node); 1566000dace22f110d8768476989313e9d981d690d0Chris Lattner }; 1576000dace22f110d8768476989313e9d981d690d0Chris Lattner} 1586000dace22f110d8768476989313e9d981d690d0Chris Lattner 1596000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 160e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner// Utilities 161e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//===----------------------------------------------------------------------===// 162e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 163e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattnervoid StmtDumper::DumpLocation(SourceLocation Loc) { 164df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner SourceLocation SpellingLoc = SM->getSpellingLoc(Loc); 1651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 166e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // The general format we print out is filename:line:col, but we drop pieces 167e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // that haven't changed since the last loc printed. 168b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PresumedLoc PLoc = SM->getPresumedLoc(SpellingLoc); 169b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner 170cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor if (PLoc.isInvalid()) { 171cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor OS << "<invalid sloc>"; 172cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor return; 173cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor } 174cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor 175b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner if (strcmp(PLoc.getFilename(), LastLocFilename) != 0) { 176806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << PLoc.getFilename() << ':' << PLoc.getLine() 177806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << ':' << PLoc.getColumn(); 178b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner LastLocFilename = PLoc.getFilename(); 179b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner LastLocLine = PLoc.getLine(); 180b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner } else if (PLoc.getLine() != LastLocLine) { 181806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "line" << ':' << PLoc.getLine() 182806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << ':' << PLoc.getColumn(); 183b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner LastLocLine = PLoc.getLine(); 184e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } else { 185806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "col" << ':' << PLoc.getColumn(); 186e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } 187e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner} 188e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 1899dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroffvoid StmtDumper::DumpSourceRange(const Stmt *Node) { 190e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // Can't translate locations if a SourceManager isn't available. 191e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner if (SM == 0) return; 1921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 193e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // TODO: If the parent expression is available, we can print a delta vs its 194e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // location. 195e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner SourceRange R = Node->getSourceRange(); 1961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 197806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " <"; 198311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner DumpLocation(R.getBegin()); 199311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner if (R.getBegin() != R.getEnd()) { 200806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << ", "; 201311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner DumpLocation(R.getEnd()); 202e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } 203806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << ">"; 2041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 205e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // <t2.c:123:421[blah], t2.c:412:321> 206e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 207e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner} 208e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 209e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//===----------------------------------------------------------------------===// 210d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko// Decl printing methods. 2116000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 2126000dace22f110d8768476989313e9d981d690d0Chris Lattner 213d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienkovoid StmtDumper::dumpDecl(Decl *D) { 2146000dace22f110d8768476989313e9d981d690d0Chris Lattner // FIXME: Need to complete/beautify this... this code simply shows the 2156000dace22f110d8768476989313e9d981d690d0Chris Lattner // nodes are where they need to be. 2166000dace22f110d8768476989313e9d981d690d0Chris Lattner if (TypedefDecl *localType = dyn_cast<TypedefDecl>(D)) { 217806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "\"typedef " << localType->getUnderlyingType().getAsString() 218b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer << ' ' << *localType << '"'; 219162e1c1b487352434552147967c3dd296ebee2f7Richard Smith } else if (TypeAliasDecl *localType = dyn_cast<TypeAliasDecl>(D)) { 220b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer OS << "\"using " << *localType << " = " 221162e1c1b487352434552147967c3dd296ebee2f7Richard Smith << localType->getUnderlyingType().getAsString() << '"'; 2226000dace22f110d8768476989313e9d981d690d0Chris Lattner } else if (ValueDecl *VD = dyn_cast<ValueDecl>(D)) { 223806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "\""; 2246000dace22f110d8768476989313e9d981d690d0Chris Lattner // Emit storage class for vardecls. 2256000dace22f110d8768476989313e9d981d690d0Chris Lattner if (VarDecl *V = dyn_cast<VarDecl>(VD)) { 226d931b086984257de68868a64a235c2b4b34003fbJohn McCall if (V->getStorageClass() != SC_None) 227806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << VarDecl::getStorageClassSpecifierString(V->getStorageClass()) 228806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << " "; 2296000dace22f110d8768476989313e9d981d690d0Chris Lattner } 2301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23139f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner std::string Name = VD->getNameAsString(); 2321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump VD->getType().getAsStringInternal(Name, 2334e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie PrintingPolicy(VD->getASTContext().getLangOpts())); 234806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << Name; 2351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2366000dace22f110d8768476989313e9d981d690d0Chris Lattner // If this is a vardecl with an initializer, emit it. 2376000dace22f110d8768476989313e9d981d690d0Chris Lattner if (VarDecl *V = dyn_cast<VarDecl>(VD)) { 2386000dace22f110d8768476989313e9d981d690d0Chris Lattner if (V->getInit()) { 239cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek OS << " ="; 240d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko dumpStmt(V->getInit()); 2416000dace22f110d8768476989313e9d981d690d0Chris Lattner } 2426000dace22f110d8768476989313e9d981d690d0Chris Lattner } 243806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << '"'; 2449219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff } else if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 2459219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff // print a free standing tag decl (e.g. "struct x;"). 2469219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff const char *tagname; 2479219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff if (const IdentifierInfo *II = TD->getIdentifier()) 248e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar tagname = II->getNameStart(); 2499219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff else 2509219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff tagname = "<anonymous>"; 251806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << '"' << TD->getKindName() << ' ' << tagname << ";\""; 2529219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff // FIXME: print tag bodies. 2532a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor } else if (UsingDirectiveDecl *UD = dyn_cast<UsingDirectiveDecl>(D)) { 2542a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor // print using-directive decl (e.g. "using namespace x;") 2552a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor const char *ns; 2562a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor if (const IdentifierInfo *II = UD->getNominatedNamespace()->getIdentifier()) 257e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar ns = II->getNameStart(); 2582a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor else 2592a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor ns = "<anonymous>"; 260806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << '"' << UD->getDeclKindName() << ns << ";\""; 2610ca43595e9e8dcf62a2ab6f5c7f4666bfb230b6aSebastian Redl } else if (UsingDecl *UD = dyn_cast<UsingDecl>(D)) { 2620ca43595e9e8dcf62a2ab6f5c7f4666bfb230b6aSebastian Redl // print using decl (e.g. "using std::string;") 2630ca43595e9e8dcf62a2ab6f5c7f4666bfb230b6aSebastian Redl const char *tn = UD->isTypeName() ? "typename " : ""; 2640ca43595e9e8dcf62a2ab6f5c7f4666bfb230b6aSebastian Redl OS << '"' << UD->getDeclKindName() << tn; 265dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor UD->getQualifier()->print(OS, 2664e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie PrintingPolicy(UD->getASTContext().getLangOpts())); 2670ca43595e9e8dcf62a2ab6f5c7f4666bfb230b6aSebastian Redl OS << ";\""; 2684ae493cccbfbf122ec6ebac0e330232c22fa8489Chris Lattner } else if (LabelDecl *LD = dyn_cast<LabelDecl>(D)) { 269a59d20b135bfde058a5a69045bab5ec4e2553f74Benjamin Kramer OS << "label " << *LD; 27028ac87e1a22ee15f284643d9007640d25b1aab5bPeter Collingbourne } else if (StaticAssertDecl *SAD = dyn_cast<StaticAssertDecl>(D)) { 271cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek OS << "\"static_assert("; 272d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko dumpStmt(SAD->getAssertExpr()); 273cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek OS << ","; 274d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko dumpStmt(SAD->getMessage()); 27528ac87e1a22ee15f284643d9007640d25b1aab5bPeter Collingbourne OS << ");\""; 2766000dace22f110d8768476989313e9d981d690d0Chris Lattner } else { 277b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unexpected decl"); 2786000dace22f110d8768476989313e9d981d690d0Chris Lattner } 2796000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2806000dace22f110d8768476989313e9d981d690d0Chris Lattner 281d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko//===----------------------------------------------------------------------===// 282d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko// Stmt printing methods. 283d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko//===----------------------------------------------------------------------===// 284d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko 285d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienkovoid StmtDumper::dumpStmt(Stmt *S) { 286d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko IndentScope Indent(*this); 287d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko 288d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko if (!S) { 289d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko OS << "<<<NULL>>>"; 290d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko return; 291d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko } 292d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko 293d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko if (DeclStmt *DS = dyn_cast<DeclStmt>(S)) { 294d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitDeclStmt(DS); 295d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko return; 296d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko } 297d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko 298d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko Visit(S); 299d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko for (Stmt::child_range CI = S->children(); CI; ++CI) 300d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko dumpStmt(*CI); 301d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko} 302d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko 303d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienkovoid StmtDumper::VisitStmt(Stmt *Node) { 304d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko OS << Node->getStmtClassName() << " " << (const void *)Node; 305d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko DumpSourceRange(Node); 306d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko} 307d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko 3085399ce26f27e6d093417a3882e38da8738a78fefTed Kremenekvoid StmtDumper::VisitDeclStmt(DeclStmt *Node) { 309d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitStmt(Node); 31004a72b77da736734c925d673834888a081f5ebc5Ted Kremenek for (DeclStmt::decl_iterator DI = Node->decl_begin(), DE = Node->decl_end(); 31104a72b77da736734c925d673834888a081f5ebc5Ted Kremenek DI != DE; ++DI) { 312cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek IndentScope Indent(*this); 3134afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor Decl* D = *DI; 314806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << (void*) D << " "; 315d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko dumpDecl(D); 3165399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek } 3175399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek} 3185399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek 3196000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitLabelStmt(LabelStmt *Node) { 320d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitStmt(Node); 321806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " '" << Node->getName() << "'"; 3226000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3236000dace22f110d8768476989313e9d981d690d0Chris Lattner 3246000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitGotoStmt(GotoStmt *Node) { 325d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitStmt(Node); 326806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " '" << Node->getLabel()->getName() 327806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << "':" << (void*)Node->getLabel(); 3286000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3296000dace22f110d8768476989313e9d981d690d0Chris Lattner 3306000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 3316000dace22f110d8768476989313e9d981d690d0Chris Lattner// Expr printing methods. 3326000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 3336000dace22f110d8768476989313e9d981d690d0Chris Lattner 3346000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitExpr(Expr *Node) { 335d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitStmt(Node); 336d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko OS << ' '; 337d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko DumpType(Node->getType()); 338d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko DumpValueKind(Node->getValueKind()); 339d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko DumpObjectKind(Node->getObjectKind()); 3406000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3416000dace22f110d8768476989313e9d981d690d0Chris Lattner 3425f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void DumpBasePath(raw_ostream &OS, CastExpr *Node) { 343f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall if (Node->path_empty()) 3445cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson return; 3455cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson 3465cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << " ("; 3475cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson bool First = true; 348f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall for (CastExpr::path_iterator 349f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall I = Node->path_begin(), E = Node->path_end(); I != E; ++I) { 3505cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson const CXXBaseSpecifier *Base = *I; 3515cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson if (!First) 3525cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << " -> "; 3535cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson 3545cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson const CXXRecordDecl *RD = 3555cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl()); 3565cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson 3575cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson if (Base->isVirtual()) 3585cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << "virtual "; 3595cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << RD->getName(); 3605cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson First = false; 3615cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson } 3625cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson 3635cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << ')'; 3645cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson} 3655cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson 36627a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlssonvoid StmtDumper::VisitCastExpr(CastExpr *Node) { 367d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 3685cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << " <" << Node->getCastKindName(); 3695cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson DumpBasePath(OS, Node); 3705cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << ">"; 37127a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson} 37227a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson 3736000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitDeclRefExpr(DeclRefExpr *Node) { 374d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 375eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek 376806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " "; 3776b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall DumpDeclRef(Node->getDecl()); 3783aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth if (Node->getDecl() != Node->getFoundDecl()) { 3793aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth OS << " ("; 3803aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth DumpDeclRef(Node->getFoundDecl()); 3813aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth OS << ")"; 3823aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth } 3836b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall} 3846b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall 3856b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCallvoid StmtDumper::DumpDeclRef(Decl *d) { 3866b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall OS << d->getDeclKindName() << ' ' << (void*) d; 3876b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall 3886b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall if (NamedDecl *nd = dyn_cast<NamedDecl>(d)) { 3896b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall OS << " '"; 3906b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall nd->getDeclName().printName(OS); 3916b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall OS << "'"; 392eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek } 3931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3946b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall if (ValueDecl *vd = dyn_cast<ValueDecl>(d)) { 3956b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall OS << ' '; DumpType(vd->getType()); 3966b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall } 3976000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3986000dace22f110d8768476989313e9d981d690d0Chris Lattner 3999d5f35e1124bbaa4a8944f7409478d45cb839de5John McCallvoid StmtDumper::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) { 400d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 4019d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall OS << " ("; 4029d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall if (!Node->requiresADL()) OS << "no "; 403900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer OS << "ADL) = '" << Node->getName() << '\''; 4049d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall 4059d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall UnresolvedLookupExpr::decls_iterator 4069d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall I = Node->decls_begin(), E = Node->decls_end(); 4079d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall if (I == E) OS << " empty"; 4089d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall for (; I != E; ++I) 4099d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall OS << " " << (void*) *I; 4109d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall} 4119d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall 4123c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroffvoid StmtDumper::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) { 413d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 4143c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff 415806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getDecl()->getDeclKindName() 416b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer << "Decl='" << *Node->getDecl() 417806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << "' " << (void*)Node->getDecl(); 418218543b10e81ea2269ef6ae34d2d8ddbdec54dbeSteve Naroff if (Node->isFreeIvar()) 419806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " isFreeIvar"; 4203c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff} 4213c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff 422d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattnervoid StmtDumper::VisitPredefinedExpr(PredefinedExpr *Node) { 423d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 4246000dace22f110d8768476989313e9d981d690d0Chris Lattner switch (Node->getIdentType()) { 425b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("unknown case"); 426806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case PredefinedExpr::Func: OS << " __func__"; break; 427806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case PredefinedExpr::Function: OS << " __FUNCTION__"; break; 42828ad063b279378b19cb0704f977429df366a151eNico Weber case PredefinedExpr::LFunction: OS << " L__FUNCTION__"; break; 429806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case PredefinedExpr::PrettyFunction: OS << " __PRETTY_FUNCTION__";break; 4306000dace22f110d8768476989313e9d981d690d0Chris Lattner } 4316000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4326000dace22f110d8768476989313e9d981d690d0Chris Lattner 4336000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCharacterLiteral(CharacterLiteral *Node) { 434d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 43549cf8847ef4d9caebdd162d2a5d7d055333d8b5cRichard Trieu OS << " " << Node->getValue(); 4366000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4376000dace22f110d8768476989313e9d981d690d0Chris Lattner 4386000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitIntegerLiteral(IntegerLiteral *Node) { 439d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 4406000dace22f110d8768476989313e9d981d690d0Chris Lattner 4416000dace22f110d8768476989313e9d981d690d0Chris Lattner bool isSigned = Node->getType()->isSignedIntegerType(); 442806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getValue().toString(10, isSigned); 4436000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4446000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitFloatingLiteral(FloatingLiteral *Node) { 445d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 446806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getValueAsApproximateDouble(); 4476000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4485d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner 4496000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitStringLiteral(StringLiteral *Str) { 450d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Str); 451806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " "; 4528ab09da1faaa33b9fa78de59cc4e191bfe9907b5Richard Trieu Str->outputString(OS); 4536000dace22f110d8768476989313e9d981d690d0Chris Lattner} 45417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner 4556000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitUnaryOperator(UnaryOperator *Node) { 456d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 457806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << (Node->isPostfix() ? "postfix" : "prefix") 458806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << " '" << UnaryOperator::getOpcodeStr(Node->getOpcode()) << "'"; 4596000dace22f110d8768476989313e9d981d690d0Chris Lattner} 460f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbournevoid StmtDumper::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *Node) { 461d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 462f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne switch(Node->getKind()) { 463f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_SizeOf: 464f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne OS << " sizeof "; 465f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne break; 466f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_AlignOf: 467f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose OS << " alignof "; 468f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne break; 469f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_VecStep: 470f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne OS << " vec_step "; 471f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne break; 472f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne } 4730518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl if (Node->isArgumentType()) 4740518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl DumpType(Node->getArgumentType()); 4756000dace22f110d8768476989313e9d981d690d0Chris Lattner} 47613cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner 4776000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitMemberExpr(MemberExpr *Node) { 478d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 479806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << (Node->isArrow() ? "->" : ".") 480b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer << *Node->getMemberDecl() << ' ' 481806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << (void*)Node->getMemberDecl(); 4826000dace22f110d8768476989313e9d981d690d0Chris Lattner} 483213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanvoid StmtDumper::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) { 484d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 485806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getAccessor().getNameStart(); 4866000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4876000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitBinaryOperator(BinaryOperator *Node) { 488d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 489806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode()) << "'"; 490eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner} 491eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattnervoid StmtDumper::VisitCompoundAssignOperator(CompoundAssignOperator *Node) { 492d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 493806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode()) 494806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << "' ComputeLHSTy="; 495ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman DumpType(Node->getComputationLHSType()); 496806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " ComputeResultTy="; 497ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman DumpType(Node->getComputationResultType()); 4986000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4996000dace22f110d8768476989313e9d981d690d0Chris Lattner 5006b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCallvoid StmtDumper::VisitBlockExpr(BlockExpr *Node) { 501d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 5026b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall 5036b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall BlockDecl *block = Node->getBlockDecl(); 50489da8cf16b671845660711d3dd4174a809ca6ccaJohn McCall OS << " decl=" << block; 50589da8cf16b671845660711d3dd4174a809ca6ccaJohn McCall 5066b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall if (block->capturesCXXThis()) { 507cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek IndentScope Indent(*this); 508cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek OS << "capture this"; 5096b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall } 5106b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall for (BlockDecl::capture_iterator 5116b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall i = block->capture_begin(), e = block->capture_end(); i != e; ++i) { 512cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek IndentScope Indent(*this); 513cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek OS << "capture "; 5146b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall if (i->isByRef()) OS << "byref "; 5156b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall if (i->isNested()) OS << "nested "; 516ac1303eca6cbe3e623fb5ec6fe7ec184ef4b0dfaDouglas Gregor if (i->getVariable()) 517ac1303eca6cbe3e623fb5ec6fe7ec184ef4b0dfaDouglas Gregor DumpDeclRef(i->getVariable()); 518d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko if (i->hasCopyExpr()) 519d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko dumpStmt(i->getCopyExpr()); 5206b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall } 5216b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall 522d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko dumpStmt(block->getBody()); 5236b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall} 5246b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall 5254b9c2d235fb9449e249d74f48ecfec601650de93John McCallvoid StmtDumper::VisitOpaqueValueExpr(OpaqueValueExpr *Node) { 526d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 5274b9c2d235fb9449e249d74f48ecfec601650de93John McCall 528cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek if (Expr *Source = Node->getSourceExpr()) 529d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko dumpStmt(Source); 5304b9c2d235fb9449e249d74f48ecfec601650de93John McCall} 5314b9c2d235fb9449e249d74f48ecfec601650de93John McCall 5326000dace22f110d8768476989313e9d981d690d0Chris Lattner// GNU extensions. 5336000dace22f110d8768476989313e9d981d690d0Chris Lattner 5346000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitAddrLabelExpr(AddrLabelExpr *Node) { 535d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 536806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getLabel()->getName() 537806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << " " << (void*)Node->getLabel(); 5386000dace22f110d8768476989313e9d981d690d0Chris Lattner} 5396000dace22f110d8768476989313e9d981d690d0Chris Lattner 540f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===// 541f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner// C++ Expressions 542f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===// 5436000dace22f110d8768476989313e9d981d690d0Chris Lattner 54449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtDumper::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) { 545d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 546806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getCastName() 547806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << "<" << Node->getTypeAsWritten().getAsString() << ">" 5485cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson << " <" << Node->getCastKindName(); 5495cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson DumpBasePath(OS, Node); 5505cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << ">"; 5516000dace22f110d8768476989313e9d981d690d0Chris Lattner} 5526000dace22f110d8768476989313e9d981d690d0Chris Lattner 5536000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) { 554d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 555806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << (Node->getValue() ? "true" : "false"); 5566000dace22f110d8768476989313e9d981d690d0Chris Lattner} 5576000dace22f110d8768476989313e9d981d690d0Chris Lattner 558cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregorvoid StmtDumper::VisitCXXThisExpr(CXXThisExpr *Node) { 559d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 560806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " this"; 561cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor} 562cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor 56349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtDumper::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) { 564d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 565cc2fca2ba2716293204901b8d2393428b965f12aEli Friedman OS << " functional cast to " << Node->getTypeAsWritten().getAsString() 566cc2fca2ba2716293204901b8d2393428b965f12aEli Friedman << " <" << Node->getCastKindName() << ">"; 56749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 56849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 5690eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlssonvoid StmtDumper::VisitCXXConstructExpr(CXXConstructExpr *Node) { 570d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 571d4bbdfebe9bd13defa977a934bf73fc2ce3b2817John McCall CXXConstructorDecl *Ctor = Node->getConstructor(); 572d4bbdfebe9bd13defa977a934bf73fc2ce3b2817John McCall DumpType(Ctor->getType()); 5730eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson if (Node->isElidable()) 574806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " elidable"; 575f8cf0b028c7a5b632c3a711813cd44a9d9642537John McCall if (Node->requiresZeroInitialization()) 576f8cf0b028c7a5b632c3a711813cd44a9d9642537John McCall OS << " zeroing"; 5770eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 5780eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 5790eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlssonvoid StmtDumper::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) { 580d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 581806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " "; 5820eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson DumpCXXTemporary(Node->getTemporary()); 5830eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 5840eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 5854765fa05b5652fcc4356371c2f481d0ea9a1b007John McCallvoid StmtDumper::VisitExprWithCleanups(ExprWithCleanups *Node) { 586d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 58780ee6e878a169e6255d4686a91bb696151ff229fJohn McCall for (unsigned i = 0, e = Node->getNumObjects(); i != e; ++i) { 588cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek IndentScope Indent(*this); 589cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek OS << "cleanup "; 59080ee6e878a169e6255d4686a91bb696151ff229fJohn McCall DumpDeclRef(Node->getObject(i)); 5910eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson } 5920eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 5930eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 5940eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlssonvoid StmtDumper::DumpCXXTemporary(CXXTemporary *Temporary) { 595806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "(CXXTemporary " << (void *)Temporary << ")"; 5960eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 5970eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 5985508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===// 5995508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// Obj-C Expressions 6005508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===// 6015508518a2702b00be3b15a26d772bde968972f54Anders Carlsson 602b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenekvoid StmtDumper::VisitObjCMessageExpr(ObjCMessageExpr* Node) { 603d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 604806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " selector=" << Node->getSelector().getAsString(); 60504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor switch (Node->getReceiverKind()) { 60604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Instance: 60704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 60804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 60904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Class: 61004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor OS << " class="; 61104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor DumpType(Node->getClassReceiver()); 61204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 61304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 61404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperInstance: 61504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor OS << " super (instance)"; 61604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 61704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 61804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperClass: 61904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor OS << " super (class)"; 62004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 62104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 622b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek} 623b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek 62436faaddccf519231a3facd26495e895ba5a28776Argyrios Kyrtzidisvoid StmtDumper::VisitObjCBoxedExpr(ObjCBoxedExpr* Node) { 625d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 62636faaddccf519231a3facd26495e895ba5a28776Argyrios Kyrtzidis OS << " selector=" << Node->getBoxingMethod()->getSelector().getAsString(); 62736faaddccf519231a3facd26495e895ba5a28776Argyrios Kyrtzidis} 62836faaddccf519231a3facd26495e895ba5a28776Argyrios Kyrtzidis 6298f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregorvoid StmtDumper::VisitObjCAtCatchStmt(ObjCAtCatchStmt *Node) { 630d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitStmt(Node); 631c00d8e18ad3d903acfeb5d05163ce90713066a3fDouglas Gregor if (VarDecl *CatchParam = Node->getCatchParamDecl()) { 6328f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor OS << " catch parm = "; 633d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko dumpDecl(CatchParam); 6348f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor } else { 6358f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor OS << " catch all"; 6368f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor } 6378f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor} 6388f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor 639f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlssonvoid StmtDumper::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) { 640d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 641806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " "; 642f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson DumpType(Node->getEncodedType()); 643f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson} 644f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson 645b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanianvoid StmtDumper::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) { 646d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 6471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 648806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getSelector().getAsString(); 649b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian} 650b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian 651390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanianvoid StmtDumper::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) { 652d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 6531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 654b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer OS << ' ' <<* Node->getProtocol(); 655390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian} 6567f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar 6577f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbarvoid StmtDumper::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) { 658d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 65912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall if (Node->isImplicitProperty()) { 66099130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian OS << " Kind=MethodRef Getter=\""; 66199130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian if (Node->getImplicitPropertyGetter()) 66299130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian OS << Node->getImplicitPropertyGetter()->getSelector().getAsString(); 66399130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian else 66499130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian OS << "(null)"; 66599130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian 66699130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian OS << "\" Setter=\""; 66712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall if (ObjCMethodDecl *Setter = Node->getImplicitPropertySetter()) 66812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall OS << Setter->getSelector().getAsString(); 66912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall else 67012f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall OS << "(null)"; 67112f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall OS << "\""; 67212f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall } else { 673b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer OS << " Kind=PropertyRef Property=\"" << *Node->getExplicitProperty() <<'"'; 67412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall } 6751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6768ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian if (Node->isSuperReceiver()) 6778ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian OS << " super"; 678b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis 679b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis OS << " Messaging="; 680b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis if (Node->isMessagingGetter() && Node->isMessagingSetter()) 681b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis OS << "Getter&Setter"; 682b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis else if (Node->isMessagingGetter()) 683b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis OS << "Getter"; 684b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis else if (Node->isMessagingSetter()) 685b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis OS << "Setter"; 686cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor} 687cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor 688ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekvoid StmtDumper::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *Node) { 689d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 690ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek if (Node->isArraySubscriptRefExpr()) 691ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << " Kind=ArraySubscript GetterForArray=\""; 692ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek else 693ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << " Kind=DictionarySubscript GetterForDictionary=\""; 694ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek if (Node->getAtIndexMethodDecl()) 695ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << Node->getAtIndexMethodDecl()->getSelector().getAsString(); 696ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek else 697ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << "(null)"; 698ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 699ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek if (Node->isArraySubscriptRefExpr()) 700ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << "\" SetterForArray=\""; 701ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek else 702ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << "\" SetterForDictionary=\""; 703ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek if (Node->setAtIndexMethodDecl()) 704ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << Node->setAtIndexMethodDecl()->getSelector().getAsString(); 705ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek else 706ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << "(null)"; 707ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek} 708ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 709ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekvoid StmtDumper::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *Node) { 710d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko VisitExpr(Node); 711ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << " " << (Node->getValue() ? "__objc_yes" : "__objc_no"); 712ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek} 713ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 7146000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 7156000dace22f110d8768476989313e9d981d690d0Chris Lattner// Stmt method implementations 7166000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 7176000dace22f110d8768476989313e9d981d690d0Chris Lattner 718e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattnervoid Stmt::dump(SourceManager &SM) const { 7199668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis dump(llvm::errs(), SM); 7209668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis} 7219668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis 7225f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid Stmt::dump(raw_ostream &OS, SourceManager &SM) const { 72395f6190acb664b345b1395abaea84ee451740c5bDmitri Gribenko StmtDumper P(&SM, OS); 724d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko P.dumpStmt(const_cast<Stmt*>(this)); 7250c727a35718556866a978f64ac549d9798735f08Chris Lattner} 7260c727a35718556866a978f64ac549d9798735f08Chris Lattner 7276000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dump() const { 72895f6190acb664b345b1395abaea84ee451740c5bDmitri Gribenko StmtDumper P(0, llvm::errs()); 729d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko P.dumpStmt(const_cast<Stmt*>(this)); 7306000dace22f110d8768476989313e9d981d690d0Chris Lattner} 731