StmtDumper.cpp revision 5f9e272e632e951b1efe824cd16acb4d96077930
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// 106000dace22f110d8768476989313e9d981d690d0Chris Lattner// This file implements the Stmt::dump/Stmt::print methods, which dump out the 116000dace22f110d8768476989313e9d981d690d0Chris Lattner// AST in a form that exposes type details and other fields. 126000dace22f110d8768476989313e9d981d690d0Chris Lattner// 136000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 146000dace22f110d8768476989313e9d981d690d0Chris Lattner 156000dace22f110d8768476989313e9d981d690d0Chris Lattner#include "clang/AST/StmtVisitor.h" 1691d1d7a448bbde955e15ec39aa368958673450bfTed Kremenek#include "clang/AST/DeclObjC.h" 172a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor#include "clang/AST/DeclCXX.h" 18d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor#include "clang/AST/PrettyPrinter.h" 19e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner#include "clang/Basic/SourceManager.h" 20806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar#include "llvm/Support/raw_ostream.h" 216000dace22f110d8768476989313e9d981d690d0Chris Lattnerusing namespace clang; 226000dace22f110d8768476989313e9d981d690d0Chris Lattner 236000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 246000dace22f110d8768476989313e9d981d690d0Chris Lattner// StmtDumper Visitor 256000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 266000dace22f110d8768476989313e9d981d690d0Chris Lattner 276000dace22f110d8768476989313e9d981d690d0Chris Lattnernamespace { 28770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramer class StmtDumper : public StmtVisitor<StmtDumper> { 29e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner SourceManager *SM; 305f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner raw_ostream &OS; 316000dace22f110d8768476989313e9d981d690d0Chris Lattner unsigned IndentLevel; 321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 336000dace22f110d8768476989313e9d981d690d0Chris Lattner /// MaxDepth - When doing a normal dump (not dumpAll) we only want to dump 346000dace22f110d8768476989313e9d981d690d0Chris Lattner /// the first few levels of an AST. This keeps track of how many ast levels 356000dace22f110d8768476989313e9d981d690d0Chris Lattner /// are left. 366000dace22f110d8768476989313e9d981d690d0Chris Lattner unsigned MaxDepth; 371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner /// LastLocFilename/LastLocLine - Keep track of the last location we print 39e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner /// out so that we can print out deltas from then on out. 40e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner const char *LastLocFilename; 41e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner unsigned LastLocLine; 42d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor 436000dace22f110d8768476989313e9d981d690d0Chris Lattner public: 445f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StmtDumper(SourceManager *sm, raw_ostream &os, unsigned maxDepth) 45806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar : SM(sm), OS(os), IndentLevel(0-1), MaxDepth(maxDepth) { 46e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner LastLocFilename = ""; 47e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner LastLocLine = ~0U; 48e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } 491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 50f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner void DumpSubTree(Stmt *S) { 516000dace22f110d8768476989313e9d981d690d0Chris Lattner // Prune the recursion if not using dump all. 526000dace22f110d8768476989313e9d981d690d0Chris Lattner if (MaxDepth == 0) return; 531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 54f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner ++IndentLevel; 556000dace22f110d8768476989313e9d981d690d0Chris Lattner if (S) { 565399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek if (DeclStmt* DS = dyn_cast<DeclStmt>(S)) 575399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek VisitDeclStmt(DS); 581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else { 595399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek Visit(S); 601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 615399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek // Print out children. 627502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall Stmt::child_range CI = S->children(); 637502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall if (CI) { 647502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall while (CI) { 65806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << '\n'; 665399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek DumpSubTree(*CI++); 675399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek } 68b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner } 69b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner } 70a46325e7b9c07adcfcf25566ba6ccce033a63e61Chris Lattner OS << ')'; 716000dace22f110d8768476989313e9d981d690d0Chris Lattner } else { 726000dace22f110d8768476989313e9d981d690d0Chris Lattner Indent(); 73806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "<<<NULL>>>"; 746000dace22f110d8768476989313e9d981d690d0Chris Lattner } 75f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner --IndentLevel; 766000dace22f110d8768476989313e9d981d690d0Chris Lattner } 771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 78f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner void DumpDeclarator(Decl *D); 791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 806000dace22f110d8768476989313e9d981d690d0Chris Lattner void Indent() const { 816000dace22f110d8768476989313e9d981d690d0Chris Lattner for (int i = 0, e = IndentLevel; i < e; ++i) 82806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " "; 836000dace22f110d8768476989313e9d981d690d0Chris Lattner } 841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 859dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff void DumpType(QualType T) { 8649f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall SplitQualType T_split = T.split(); 8749f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall OS << "'" << QualType::getAsString(T_split) << "'"; 88fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner 8961366e9cd41a6dbde4e66416dac21269c8ac1d94Douglas Gregor if (!T.isNull()) { 900953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If the type is sugared, also dump a (shallow) desugared type. 9149f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall SplitQualType D_split = T.getSplitDesugaredType(); 9249f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall if (T_split != D_split) 9349f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall OS << ":'" << QualType::getAsString(D_split) << "'"; 94bad37858aef8910195a9c75f2892a09a032424b7Chris Lattner } 95fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner } 966b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall void DumpDeclRef(Decl *node); 979dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff void DumpStmt(const Stmt *Node) { 986000dace22f110d8768476989313e9d981d690d0Chris Lattner Indent(); 99806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "(" << Node->getStmtClassName() 100806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << " " << (void*)Node; 1019dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff DumpSourceRange(Node); 1026000dace22f110d8768476989313e9d981d690d0Chris Lattner } 103f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall void DumpValueKind(ExprValueKind K) { 104f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall switch (K) { 105f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall case VK_RValue: break; 106f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall case VK_LValue: OS << " lvalue"; break; 107f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall case VK_XValue: OS << " xvalue"; break; 108f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall } 109f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall } 110f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall void DumpObjectKind(ExprObjectKind K) { 111f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall switch (K) { 112f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall case OK_Ordinary: break; 113f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall case OK_BitField: OS << " bitfield"; break; 114f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall case OK_ObjCProperty: OS << " objcproperty"; break; 115f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall case OK_VectorComponent: OS << " vectorcomponent"; break; 116f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall } 117f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall } 1189dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff void DumpExpr(const Expr *Node) { 1196000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpStmt(Node); 120806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << ' '; 121fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner DumpType(Node->getType()); 122f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall DumpValueKind(Node->getValueKind()); 123f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall DumpObjectKind(Node->getObjectKind()); 1246000dace22f110d8768476989313e9d981d690d0Chris Lattner } 1259dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff void DumpSourceRange(const Stmt *Node); 126e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner void DumpLocation(SourceLocation Loc); 1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12817a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // Stmts. 129c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner void VisitStmt(Stmt *Node); 1305399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek void VisitDeclStmt(DeclStmt *Node); 13117a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitLabelStmt(LabelStmt *Node); 13217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitGotoStmt(GotoStmt *Node); 1331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 13417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // Exprs 13517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitExpr(Expr *Node); 13627a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson void VisitCastExpr(CastExpr *Node); 13717a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitDeclRefExpr(DeclRefExpr *Node); 138d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner void VisitPredefinedExpr(PredefinedExpr *Node); 13917a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitCharacterLiteral(CharacterLiteral *Node); 14017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitIntegerLiteral(IntegerLiteral *Node); 14117a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitFloatingLiteral(FloatingLiteral *Node); 14217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitStringLiteral(StringLiteral *Str); 14317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitUnaryOperator(UnaryOperator *Node); 144f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne void VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *Node); 14517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitMemberExpr(MemberExpr *Node); 146213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman void VisitExtVectorElementExpr(ExtVectorElementExpr *Node); 14717a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitBinaryOperator(BinaryOperator *Node); 14817a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitCompoundAssignOperator(CompoundAssignOperator *Node); 14917a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitAddrLabelExpr(AddrLabelExpr *Node); 1506b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall void VisitBlockExpr(BlockExpr *Node); 15117a1a72e70dcbd6257dde644c790a3013113174fChris Lattner 15217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // C++ 15349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor void VisitCXXNamedCastExpr(CXXNamedCastExpr *Node); 15417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node); 155cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor void VisitCXXThisExpr(CXXThisExpr *Node); 15649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node); 1570eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson void VisitCXXConstructExpr(CXXConstructExpr *Node); 1580eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node); 1594765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall void VisitExprWithCleanups(ExprWithCleanups *Node); 1609d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall void VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node); 1610eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson void DumpCXXTemporary(CXXTemporary *Temporary); 1621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // ObjC 1648f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor void VisitObjCAtCatchStmt(ObjCAtCatchStmt *Node); 16517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitObjCEncodeExpr(ObjCEncodeExpr *Node); 166b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek void VisitObjCMessageExpr(ObjCMessageExpr* Node); 167b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian void VisitObjCSelectorExpr(ObjCSelectorExpr *Node); 168390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian void VisitObjCProtocolExpr(ObjCProtocolExpr *Node); 1697f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node); 1703c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff void VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node); 1716000dace22f110d8768476989313e9d981d690d0Chris Lattner }; 1726000dace22f110d8768476989313e9d981d690d0Chris Lattner} 1736000dace22f110d8768476989313e9d981d690d0Chris Lattner 1746000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 175e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner// Utilities 176e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//===----------------------------------------------------------------------===// 177e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 178e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattnervoid StmtDumper::DumpLocation(SourceLocation Loc) { 179df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner SourceLocation SpellingLoc = SM->getSpellingLoc(Loc); 1801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 181e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // The general format we print out is filename:line:col, but we drop pieces 182e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // that haven't changed since the last loc printed. 183b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PresumedLoc PLoc = SM->getPresumedLoc(SpellingLoc); 184b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner 185cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor if (PLoc.isInvalid()) { 186cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor OS << "<invalid sloc>"; 187cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor return; 188cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor } 189cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor 190b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner if (strcmp(PLoc.getFilename(), LastLocFilename) != 0) { 191806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << PLoc.getFilename() << ':' << PLoc.getLine() 192806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << ':' << PLoc.getColumn(); 193b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner LastLocFilename = PLoc.getFilename(); 194b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner LastLocLine = PLoc.getLine(); 195b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner } else if (PLoc.getLine() != LastLocLine) { 196806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "line" << ':' << PLoc.getLine() 197806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << ':' << PLoc.getColumn(); 198b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner LastLocLine = PLoc.getLine(); 199e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } else { 200806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "col" << ':' << PLoc.getColumn(); 201e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } 202e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner} 203e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 2049dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroffvoid StmtDumper::DumpSourceRange(const Stmt *Node) { 205e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // Can't translate locations if a SourceManager isn't available. 206e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner if (SM == 0) return; 2071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 208e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // TODO: If the parent expression is available, we can print a delta vs its 209e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // location. 210e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner SourceRange R = Node->getSourceRange(); 2111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 212806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " <"; 213311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner DumpLocation(R.getBegin()); 214311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner if (R.getBegin() != R.getEnd()) { 215806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << ", "; 216311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner DumpLocation(R.getEnd()); 217e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } 218806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << ">"; 2191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 220e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // <t2.c:123:421[blah], t2.c:412:321> 221e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 222e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner} 223e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 224e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 225e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//===----------------------------------------------------------------------===// 2266000dace22f110d8768476989313e9d981d690d0Chris Lattner// Stmt printing methods. 2276000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 2286000dace22f110d8768476989313e9d981d690d0Chris Lattner 2296000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitStmt(Stmt *Node) { 23017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner DumpStmt(Node); 2316000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2326000dace22f110d8768476989313e9d981d690d0Chris Lattner 233f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattnervoid StmtDumper::DumpDeclarator(Decl *D) { 2346000dace22f110d8768476989313e9d981d690d0Chris Lattner // FIXME: Need to complete/beautify this... this code simply shows the 2356000dace22f110d8768476989313e9d981d690d0Chris Lattner // nodes are where they need to be. 2366000dace22f110d8768476989313e9d981d690d0Chris Lattner if (TypedefDecl *localType = dyn_cast<TypedefDecl>(D)) { 237806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "\"typedef " << localType->getUnderlyingType().getAsString() 238900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer << ' ' << localType << '"'; 239162e1c1b487352434552147967c3dd296ebee2f7Richard Smith } else if (TypeAliasDecl *localType = dyn_cast<TypeAliasDecl>(D)) { 240162e1c1b487352434552147967c3dd296ebee2f7Richard Smith OS << "\"using " << localType << " = " 241162e1c1b487352434552147967c3dd296ebee2f7Richard Smith << localType->getUnderlyingType().getAsString() << '"'; 2426000dace22f110d8768476989313e9d981d690d0Chris Lattner } else if (ValueDecl *VD = dyn_cast<ValueDecl>(D)) { 243806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "\""; 2446000dace22f110d8768476989313e9d981d690d0Chris Lattner // Emit storage class for vardecls. 2456000dace22f110d8768476989313e9d981d690d0Chris Lattner if (VarDecl *V = dyn_cast<VarDecl>(VD)) { 246d931b086984257de68868a64a235c2b4b34003fbJohn McCall if (V->getStorageClass() != SC_None) 247806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << VarDecl::getStorageClassSpecifierString(V->getStorageClass()) 248806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << " "; 2496000dace22f110d8768476989313e9d981d690d0Chris Lattner } 2501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25139f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner std::string Name = VD->getNameAsString(); 2521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump VD->getType().getAsStringInternal(Name, 253e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner PrintingPolicy(VD->getASTContext().getLangOptions())); 254806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << Name; 2551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2566000dace22f110d8768476989313e9d981d690d0Chris Lattner // If this is a vardecl with an initializer, emit it. 2576000dace22f110d8768476989313e9d981d690d0Chris Lattner if (VarDecl *V = dyn_cast<VarDecl>(VD)) { 2586000dace22f110d8768476989313e9d981d690d0Chris Lattner if (V->getInit()) { 259806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " =\n"; 260f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner DumpSubTree(V->getInit()); 2616000dace22f110d8768476989313e9d981d690d0Chris Lattner } 2626000dace22f110d8768476989313e9d981d690d0Chris Lattner } 263806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << '"'; 2649219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff } else if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 2659219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff // print a free standing tag decl (e.g. "struct x;"). 2669219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff const char *tagname; 2679219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff if (const IdentifierInfo *II = TD->getIdentifier()) 268e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar tagname = II->getNameStart(); 2699219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff else 2709219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff tagname = "<anonymous>"; 271806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << '"' << TD->getKindName() << ' ' << tagname << ";\""; 2729219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff // FIXME: print tag bodies. 2732a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor } else if (UsingDirectiveDecl *UD = dyn_cast<UsingDirectiveDecl>(D)) { 2742a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor // print using-directive decl (e.g. "using namespace x;") 2752a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor const char *ns; 2762a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor if (const IdentifierInfo *II = UD->getNominatedNamespace()->getIdentifier()) 277e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar ns = II->getNameStart(); 2782a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor else 2792a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor ns = "<anonymous>"; 280806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << '"' << UD->getDeclKindName() << ns << ";\""; 2810ca43595e9e8dcf62a2ab6f5c7f4666bfb230b6aSebastian Redl } else if (UsingDecl *UD = dyn_cast<UsingDecl>(D)) { 2820ca43595e9e8dcf62a2ab6f5c7f4666bfb230b6aSebastian Redl // print using decl (e.g. "using std::string;") 2830ca43595e9e8dcf62a2ab6f5c7f4666bfb230b6aSebastian Redl const char *tn = UD->isTypeName() ? "typename " : ""; 2840ca43595e9e8dcf62a2ab6f5c7f4666bfb230b6aSebastian Redl OS << '"' << UD->getDeclKindName() << tn; 285dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor UD->getQualifier()->print(OS, 286dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor PrintingPolicy(UD->getASTContext().getLangOptions())); 2870ca43595e9e8dcf62a2ab6f5c7f4666bfb230b6aSebastian Redl OS << ";\""; 2884ae493cccbfbf122ec6ebac0e330232c22fa8489Chris Lattner } else if (LabelDecl *LD = dyn_cast<LabelDecl>(D)) { 2894ae493cccbfbf122ec6ebac0e330232c22fa8489Chris Lattner OS << "label " << LD->getNameAsString(); 29028ac87e1a22ee15f284643d9007640d25b1aab5bPeter Collingbourne } else if (StaticAssertDecl *SAD = dyn_cast<StaticAssertDecl>(D)) { 29128ac87e1a22ee15f284643d9007640d25b1aab5bPeter Collingbourne OS << "\"static_assert(\n"; 29228ac87e1a22ee15f284643d9007640d25b1aab5bPeter Collingbourne DumpSubTree(SAD->getAssertExpr()); 29328ac87e1a22ee15f284643d9007640d25b1aab5bPeter Collingbourne OS << ",\n"; 29428ac87e1a22ee15f284643d9007640d25b1aab5bPeter Collingbourne DumpSubTree(SAD->getMessage()); 29528ac87e1a22ee15f284643d9007640d25b1aab5bPeter Collingbourne OS << ");\""; 2966000dace22f110d8768476989313e9d981d690d0Chris Lattner } else { 2976000dace22f110d8768476989313e9d981d690d0Chris Lattner assert(0 && "Unexpected decl"); 2986000dace22f110d8768476989313e9d981d690d0Chris Lattner } 2996000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3006000dace22f110d8768476989313e9d981d690d0Chris Lattner 3015399ce26f27e6d093417a3882e38da8738a78fefTed Kremenekvoid StmtDumper::VisitDeclStmt(DeclStmt *Node) { 3025399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek DumpStmt(Node); 303806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "\n"; 30404a72b77da736734c925d673834888a081f5ebc5Ted Kremenek for (DeclStmt::decl_iterator DI = Node->decl_begin(), DE = Node->decl_end(); 30504a72b77da736734c925d673834888a081f5ebc5Ted Kremenek DI != DE; ++DI) { 3064afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor Decl* D = *DI; 3075399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek ++IndentLevel; 3085399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek Indent(); 309806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << (void*) D << " "; 3105399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek DumpDeclarator(D); 311f279725f9772a8644957049971001f655b9041c9Chris Lattner if (DI+1 != DE) 312806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "\n"; 3135399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek --IndentLevel; 3145399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek } 3155399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek} 3165399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek 3176000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitLabelStmt(LabelStmt *Node) { 3186000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpStmt(Node); 319806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " '" << Node->getName() << "'"; 3206000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3216000dace22f110d8768476989313e9d981d690d0Chris Lattner 3226000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitGotoStmt(GotoStmt *Node) { 3236000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpStmt(Node); 324806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " '" << Node->getLabel()->getName() 325806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << "':" << (void*)Node->getLabel(); 3266000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3276000dace22f110d8768476989313e9d981d690d0Chris Lattner 3286000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 3296000dace22f110d8768476989313e9d981d690d0Chris Lattner// Expr printing methods. 3306000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 3316000dace22f110d8768476989313e9d981d690d0Chris Lattner 3326000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitExpr(Expr *Node) { 3336000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 3346000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3356000dace22f110d8768476989313e9d981d690d0Chris Lattner 3365f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void DumpBasePath(raw_ostream &OS, CastExpr *Node) { 337f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall if (Node->path_empty()) 3385cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson return; 3395cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson 3405cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << " ("; 3415cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson bool First = true; 342f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall for (CastExpr::path_iterator 343f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall I = Node->path_begin(), E = Node->path_end(); I != E; ++I) { 3445cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson const CXXBaseSpecifier *Base = *I; 3455cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson if (!First) 3465cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << " -> "; 3475cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson 3485cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson const CXXRecordDecl *RD = 3495cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl()); 3505cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson 3515cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson if (Base->isVirtual()) 3525cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << "virtual "; 3535cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << RD->getName(); 3545cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson First = false; 3555cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson } 3565cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson 3575cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << ')'; 3585cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson} 3595cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson 36027a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlssonvoid StmtDumper::VisitCastExpr(CastExpr *Node) { 36127a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson DumpExpr(Node); 3625cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << " <" << Node->getCastKindName(); 3635cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson DumpBasePath(OS, Node); 3645cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << ">"; 36527a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson} 36627a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson 3676000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitDeclRefExpr(DeclRefExpr *Node) { 3686000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 369eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek 370806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " "; 3716b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall DumpDeclRef(Node->getDecl()); 3723aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth if (Node->getDecl() != Node->getFoundDecl()) { 3733aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth OS << " ("; 3743aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth DumpDeclRef(Node->getFoundDecl()); 3753aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth OS << ")"; 3763aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth } 3776b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall} 3786b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall 3796b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCallvoid StmtDumper::DumpDeclRef(Decl *d) { 3806b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall OS << d->getDeclKindName() << ' ' << (void*) d; 3816b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall 3826b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall if (NamedDecl *nd = dyn_cast<NamedDecl>(d)) { 3836b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall OS << " '"; 3846b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall nd->getDeclName().printName(OS); 3856b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall OS << "'"; 386eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek } 3871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3886b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall if (ValueDecl *vd = dyn_cast<ValueDecl>(d)) { 3896b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall OS << ' '; DumpType(vd->getType()); 3906b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall } 3916000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3926000dace22f110d8768476989313e9d981d690d0Chris Lattner 3939d5f35e1124bbaa4a8944f7409478d45cb839de5John McCallvoid StmtDumper::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) { 3949d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall DumpExpr(Node); 3959d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall OS << " ("; 3969d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall if (!Node->requiresADL()) OS << "no "; 397900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer OS << "ADL) = '" << Node->getName() << '\''; 3989d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall 3999d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall UnresolvedLookupExpr::decls_iterator 4009d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall I = Node->decls_begin(), E = Node->decls_end(); 4019d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall if (I == E) OS << " empty"; 4029d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall for (; I != E; ++I) 4039d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall OS << " " << (void*) *I; 4049d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall} 4059d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall 4063c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroffvoid StmtDumper::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) { 407466c2e3af049964f3a573917bd04d6b6ce1d121dSteve Naroff DumpExpr(Node); 4083c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff 409806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getDecl()->getDeclKindName() 410900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer << "Decl='" << Node->getDecl() 411806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << "' " << (void*)Node->getDecl(); 412218543b10e81ea2269ef6ae34d2d8ddbdec54dbeSteve Naroff if (Node->isFreeIvar()) 413806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " isFreeIvar"; 4143c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff} 4153c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff 416d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattnervoid StmtDumper::VisitPredefinedExpr(PredefinedExpr *Node) { 4176000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 4186000dace22f110d8768476989313e9d981d690d0Chris Lattner switch (Node->getIdentType()) { 4190d17f6f7b1882850fa56ad38cca0ee518869255bChris Lattner default: assert(0 && "unknown case"); 420806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case PredefinedExpr::Func: OS << " __func__"; break; 421806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case PredefinedExpr::Function: OS << " __FUNCTION__"; break; 422806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case PredefinedExpr::PrettyFunction: OS << " __PRETTY_FUNCTION__";break; 4236000dace22f110d8768476989313e9d981d690d0Chris Lattner } 4246000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4256000dace22f110d8768476989313e9d981d690d0Chris Lattner 4266000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCharacterLiteral(CharacterLiteral *Node) { 427a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner DumpExpr(Node); 428806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << Node->getValue(); 4296000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4306000dace22f110d8768476989313e9d981d690d0Chris Lattner 4316000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitIntegerLiteral(IntegerLiteral *Node) { 4326000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 4336000dace22f110d8768476989313e9d981d690d0Chris Lattner 4346000dace22f110d8768476989313e9d981d690d0Chris Lattner bool isSigned = Node->getType()->isSignedIntegerType(); 435806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getValue().toString(10, isSigned); 4366000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4376000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitFloatingLiteral(FloatingLiteral *Node) { 4386000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 439806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getValueAsApproximateDouble(); 4406000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4415d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner 4426000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitStringLiteral(StringLiteral *Str) { 443a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner DumpExpr(Str); 444a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner // FIXME: this doesn't print wstrings right. 445806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " "; 446806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar if (Str->isWide()) 447806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "L"; 448806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << '"'; 4492f4eaef37476ae6891ede8ba215d0f6fd093629bBenjamin Kramer OS.write_escaped(Str->getString()); 450806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << '"'; 4516000dace22f110d8768476989313e9d981d690d0Chris Lattner} 45217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner 4536000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitUnaryOperator(UnaryOperator *Node) { 45413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 455806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << (Node->isPostfix() ? "postfix" : "prefix") 456806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << " '" << UnaryOperator::getOpcodeStr(Node->getOpcode()) << "'"; 4576000dace22f110d8768476989313e9d981d690d0Chris Lattner} 458f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbournevoid StmtDumper::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *Node) { 45913cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 460f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne switch(Node->getKind()) { 461f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_SizeOf: 462f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne OS << " sizeof "; 463f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne break; 464f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_AlignOf: 465f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne OS << " __alignof "; 466f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne break; 467f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_VecStep: 468f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne OS << " vec_step "; 469f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne break; 470f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne } 4710518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl if (Node->isArgumentType()) 4720518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl DumpType(Node->getArgumentType()); 4736000dace22f110d8768476989313e9d981d690d0Chris Lattner} 47413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner 4756000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitMemberExpr(MemberExpr *Node) { 47613cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 477806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << (Node->isArrow() ? "->" : ".") 478900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer << Node->getMemberDecl() << ' ' 479806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << (void*)Node->getMemberDecl(); 4806000dace22f110d8768476989313e9d981d690d0Chris Lattner} 481213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanvoid StmtDumper::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) { 48213cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 483806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getAccessor().getNameStart(); 4846000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4856000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitBinaryOperator(BinaryOperator *Node) { 4866000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 487806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode()) << "'"; 488eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner} 489eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattnervoid StmtDumper::VisitCompoundAssignOperator(CompoundAssignOperator *Node) { 490eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner DumpExpr(Node); 491806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode()) 492806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << "' ComputeLHSTy="; 493ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman DumpType(Node->getComputationLHSType()); 494806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " ComputeResultTy="; 495ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman DumpType(Node->getComputationResultType()); 4966000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4976000dace22f110d8768476989313e9d981d690d0Chris Lattner 4986b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCallvoid StmtDumper::VisitBlockExpr(BlockExpr *Node) { 4996b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall DumpExpr(Node); 5006b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall 5016b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall IndentLevel++; 5026b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall BlockDecl *block = Node->getBlockDecl(); 5036b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall if (block->capturesCXXThis()) { 5046b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall OS << '\n'; Indent(); OS << "(capture this)"; 5056b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall } 5066b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall for (BlockDecl::capture_iterator 5076b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall i = block->capture_begin(), e = block->capture_end(); i != e; ++i) { 5086b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall OS << '\n'; 5096b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall Indent(); 5106b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall OS << "(capture "; 5116b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall if (i->isByRef()) OS << "byref "; 5126b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall if (i->isNested()) OS << "nested "; 5136b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall DumpDeclRef(i->getVariable()); 5146b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall if (i->hasCopyExpr()) DumpSubTree(i->getCopyExpr()); 5156b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall OS << ")"; 5166b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall } 5176b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall IndentLevel--; 5186b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall 5196b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall DumpSubTree(block->getBody()); 5206b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall} 5216b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall 5226000dace22f110d8768476989313e9d981d690d0Chris Lattner// GNU extensions. 5236000dace22f110d8768476989313e9d981d690d0Chris Lattner 5246000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitAddrLabelExpr(AddrLabelExpr *Node) { 52513cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 526806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getLabel()->getName() 527806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << " " << (void*)Node->getLabel(); 5286000dace22f110d8768476989313e9d981d690d0Chris Lattner} 5296000dace22f110d8768476989313e9d981d690d0Chris Lattner 530f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===// 531f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner// C++ Expressions 532f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===// 5336000dace22f110d8768476989313e9d981d690d0Chris Lattner 53449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtDumper::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) { 53513cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 536806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getCastName() 537806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << "<" << Node->getTypeAsWritten().getAsString() << ">" 5385cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson << " <" << Node->getCastKindName(); 5395cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson DumpBasePath(OS, Node); 5405cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson OS << ">"; 5416000dace22f110d8768476989313e9d981d690d0Chris Lattner} 5426000dace22f110d8768476989313e9d981d690d0Chris Lattner 5436000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) { 54413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 545806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << (Node->getValue() ? "true" : "false"); 5466000dace22f110d8768476989313e9d981d690d0Chris Lattner} 5476000dace22f110d8768476989313e9d981d690d0Chris Lattner 548cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregorvoid StmtDumper::VisitCXXThisExpr(CXXThisExpr *Node) { 549cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor DumpExpr(Node); 550806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " this"; 551cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor} 552cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor 55349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtDumper::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) { 55449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor DumpExpr(Node); 555806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " functional cast to " << Node->getTypeAsWritten().getAsString(); 55649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 55749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 5580eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlssonvoid StmtDumper::VisitCXXConstructExpr(CXXConstructExpr *Node) { 5590eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson DumpExpr(Node); 560d4bbdfebe9bd13defa977a934bf73fc2ce3b2817John McCall CXXConstructorDecl *Ctor = Node->getConstructor(); 561d4bbdfebe9bd13defa977a934bf73fc2ce3b2817John McCall DumpType(Ctor->getType()); 5620eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson if (Node->isElidable()) 563806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " elidable"; 564f8cf0b028c7a5b632c3a711813cd44a9d9642537John McCall if (Node->requiresZeroInitialization()) 565f8cf0b028c7a5b632c3a711813cd44a9d9642537John McCall OS << " zeroing"; 5660eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 5670eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 5680eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlssonvoid StmtDumper::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) { 5690eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson DumpExpr(Node); 570806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " "; 5710eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson DumpCXXTemporary(Node->getTemporary()); 5720eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 5730eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 5744765fa05b5652fcc4356371c2f481d0ea9a1b007John McCallvoid StmtDumper::VisitExprWithCleanups(ExprWithCleanups *Node) { 5750eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson DumpExpr(Node); 5760eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson ++IndentLevel; 5770eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson for (unsigned i = 0, e = Node->getNumTemporaries(); i != e; ++i) { 578806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "\n"; 5790eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson Indent(); 5800eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson DumpCXXTemporary(Node->getTemporary(i)); 5810eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson } 5820eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson --IndentLevel; 5830eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 5840eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 5850eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlssonvoid StmtDumper::DumpCXXTemporary(CXXTemporary *Temporary) { 586806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "(CXXTemporary " << (void *)Temporary << ")"; 5870eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 5880eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 5895508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===// 5905508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// Obj-C Expressions 5915508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===// 5925508518a2702b00be3b15a26d772bde968972f54Anders Carlsson 593b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenekvoid StmtDumper::VisitObjCMessageExpr(ObjCMessageExpr* Node) { 594b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek DumpExpr(Node); 595806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " selector=" << Node->getSelector().getAsString(); 59604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor switch (Node->getReceiverKind()) { 59704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Instance: 59804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 59904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 60004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Class: 60104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor OS << " class="; 60204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor DumpType(Node->getClassReceiver()); 60304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 60404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 60504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperInstance: 60604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor OS << " super (instance)"; 60704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 60804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 60904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperClass: 61004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor OS << " super (class)"; 61104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 61204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 613b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek} 614b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek 6158f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregorvoid StmtDumper::VisitObjCAtCatchStmt(ObjCAtCatchStmt *Node) { 6168f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor DumpStmt(Node); 617c00d8e18ad3d903acfeb5d05163ce90713066a3fDouglas Gregor if (VarDecl *CatchParam = Node->getCatchParamDecl()) { 6188f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor OS << " catch parm = "; 6198f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor DumpDeclarator(CatchParam); 6208f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor } else { 6218f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor OS << " catch all"; 6228f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor } 6238f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor} 6248f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor 625f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlssonvoid StmtDumper::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) { 626f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson DumpExpr(Node); 627806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " "; 628f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson DumpType(Node->getEncodedType()); 629f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson} 630f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson 631b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanianvoid StmtDumper::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) { 632b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian DumpExpr(Node); 6331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 634806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getSelector().getAsString(); 635b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian} 636b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian 637390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanianvoid StmtDumper::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) { 638390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian DumpExpr(Node); 6391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 640900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer OS << ' ' << Node->getProtocol(); 641390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian} 6427f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar 6437f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbarvoid StmtDumper::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) { 6447f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar DumpExpr(Node); 64512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall if (Node->isImplicitProperty()) { 64699130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian OS << " Kind=MethodRef Getter=\""; 64799130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian if (Node->getImplicitPropertyGetter()) 64899130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian OS << Node->getImplicitPropertyGetter()->getSelector().getAsString(); 64999130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian else 65099130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian OS << "(null)"; 65199130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian 65299130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian OS << "\" Setter=\""; 65312f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall if (ObjCMethodDecl *Setter = Node->getImplicitPropertySetter()) 65412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall OS << Setter->getSelector().getAsString(); 65512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall else 65612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall OS << "(null)"; 65712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall OS << "\""; 65812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall } else { 65912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall OS << " Kind=PropertyRef Property=\"" << Node->getExplicitProperty() << '"'; 66012f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall } 6611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6628ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian if (Node->isSuperReceiver()) 6638ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian OS << " super"; 664cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor} 665cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor 6666000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 6676000dace22f110d8768476989313e9d981d690d0Chris Lattner// Stmt method implementations 6686000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 6696000dace22f110d8768476989313e9d981d690d0Chris Lattner 6706000dace22f110d8768476989313e9d981d690d0Chris Lattner/// dump - This does a local dump of the specified AST fragment. It dumps the 6716000dace22f110d8768476989313e9d981d690d0Chris Lattner/// specified node and a few nodes underneath it, but not the whole subtree. 6726000dace22f110d8768476989313e9d981d690d0Chris Lattner/// This is useful in a debugger. 673e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattnervoid Stmt::dump(SourceManager &SM) const { 6749668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis dump(llvm::errs(), SM); 6759668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis} 6769668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis 6775f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid Stmt::dump(raw_ostream &OS, SourceManager &SM) const { 6789668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis StmtDumper P(&SM, OS, 4); 679b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner P.DumpSubTree(const_cast<Stmt*>(this)); 6809668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis OS << "\n"; 6810c727a35718556866a978f64ac549d9798735f08Chris Lattner} 6820c727a35718556866a978f64ac549d9798735f08Chris Lattner 6830c727a35718556866a978f64ac549d9798735f08Chris Lattner/// dump - This does a local dump of the specified AST fragment. It dumps the 6840c727a35718556866a978f64ac549d9798735f08Chris Lattner/// specified node and a few nodes underneath it, but not the whole subtree. 6850c727a35718556866a978f64ac549d9798735f08Chris Lattner/// This is useful in a debugger. 6866000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dump() const { 6879668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis StmtDumper P(0, llvm::errs(), 4); 688b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner P.DumpSubTree(const_cast<Stmt*>(this)); 6899668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis llvm::errs() << "\n"; 6900c727a35718556866a978f64ac549d9798735f08Chris Lattner} 6910c727a35718556866a978f64ac549d9798735f08Chris Lattner 6920c727a35718556866a978f64ac549d9798735f08Chris Lattner/// dumpAll - This does a dump of the specified AST fragment and all subtrees. 693e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattnervoid Stmt::dumpAll(SourceManager &SM) const { 6949668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis StmtDumper P(&SM, llvm::errs(), ~0U); 695b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner P.DumpSubTree(const_cast<Stmt*>(this)); 6969668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis llvm::errs() << "\n"; 6976000dace22f110d8768476989313e9d981d690d0Chris Lattner} 6986000dace22f110d8768476989313e9d981d690d0Chris Lattner 6996000dace22f110d8768476989313e9d981d690d0Chris Lattner/// dumpAll - This does a dump of the specified AST fragment and all subtrees. 7006000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dumpAll() const { 7019668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis StmtDumper P(0, llvm::errs(), ~0U); 702b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner P.DumpSubTree(const_cast<Stmt*>(this)); 7039668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis llvm::errs() << "\n"; 7046000dace22f110d8768476989313e9d981d690d0Chris Lattner} 705