StmtDumper.cpp revision 04badcf84c8d504d8491c7c7e29b58f52cb16640
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; 30806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar llvm::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: 44806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar StmtDumper(SourceManager *sm, llvm::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. 625399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek Stmt::child_iterator CI = S->child_begin(), CE = S->child_end(); 635399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek if (CI != CE) { 645399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek while (CI != CE) { 65806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << '\n'; 665399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek DumpSubTree(*CI++); 675399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek } 68b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner } 69806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << ')'; 70b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner } 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) { 86806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "'" << T.getAsString() << "'"; 87fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner 8861366e9cd41a6dbde4e66416dac21269c8ac1d94Douglas Gregor if (!T.isNull()) { 890953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If the type is sugared, also dump a (shallow) desugared type. 900953e767ff7817f97b3ab20896b229891eeff45bJohn McCall QualType Simplified = T.getDesugaredType(); 910953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (Simplified != T) 92806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << ":'" << Simplified.getAsString() << "'"; 93bad37858aef8910195a9c75f2892a09a032424b7Chris Lattner } 94fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner } 959dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff void DumpStmt(const Stmt *Node) { 966000dace22f110d8768476989313e9d981d690d0Chris Lattner Indent(); 97806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "(" << Node->getStmtClassName() 98806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << " " << (void*)Node; 999dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff DumpSourceRange(Node); 1006000dace22f110d8768476989313e9d981d690d0Chris Lattner } 1019dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff void DumpExpr(const Expr *Node) { 1026000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpStmt(Node); 103806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << ' '; 104fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner DumpType(Node->getType()); 1056000dace22f110d8768476989313e9d981d690d0Chris Lattner } 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); 1180e489ea67da94ca5ba3df67cab4f0da61d56367dAnders Carlsson void VisitImplicitCastExpr(ImplicitCastExpr *Node); 11917a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitDeclRefExpr(DeclRefExpr *Node); 120d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner void VisitPredefinedExpr(PredefinedExpr *Node); 12117a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitCharacterLiteral(CharacterLiteral *Node); 12217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitIntegerLiteral(IntegerLiteral *Node); 12317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitFloatingLiteral(FloatingLiteral *Node); 12417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitStringLiteral(StringLiteral *Str); 12517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitUnaryOperator(UnaryOperator *Node); 1260518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl void VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *Node); 12717a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitMemberExpr(MemberExpr *Node); 128213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman void VisitExtVectorElementExpr(ExtVectorElementExpr *Node); 12917a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitBinaryOperator(BinaryOperator *Node); 13017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitCompoundAssignOperator(CompoundAssignOperator *Node); 13117a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitAddrLabelExpr(AddrLabelExpr *Node); 13217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitTypesCompatibleExpr(TypesCompatibleExpr *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); 1410eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson void VisitCXXExprWithTemporaries(CXXExprWithTemporaries *Node); 1429d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall void VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node); 1430eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson void DumpCXXTemporary(CXXTemporary *Temporary); 1441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // ObjC 14617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitObjCEncodeExpr(ObjCEncodeExpr *Node); 147b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek void VisitObjCMessageExpr(ObjCMessageExpr* Node); 148b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian void VisitObjCSelectorExpr(ObjCSelectorExpr *Node); 149390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian void VisitObjCProtocolExpr(ObjCProtocolExpr *Node); 1507f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node); 15109105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian void VisitObjCImplicitSetterGetterRefExpr( 15209105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian ObjCImplicitSetterGetterRefExpr *Node); 1533c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff void VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node); 154cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor void VisitObjCSuperExpr(ObjCSuperExpr *Node); 1556000dace22f110d8768476989313e9d981d690d0Chris Lattner }; 1566000dace22f110d8768476989313e9d981d690d0Chris Lattner} 1576000dace22f110d8768476989313e9d981d690d0Chris Lattner 1586000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 159e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner// Utilities 160e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//===----------------------------------------------------------------------===// 161e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 162e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattnervoid StmtDumper::DumpLocation(SourceLocation Loc) { 163df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner SourceLocation SpellingLoc = SM->getSpellingLoc(Loc); 1641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 165b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner if (SpellingLoc.isInvalid()) { 166806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "<invalid sloc>"; 167b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner return; 168b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner } 169e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 170e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // The general format we print out is filename:line:col, but we drop pieces 171e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // that haven't changed since the last loc printed. 172b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PresumedLoc PLoc = SM->getPresumedLoc(SpellingLoc); 173b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner 174b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner if (strcmp(PLoc.getFilename(), LastLocFilename) != 0) { 175806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << PLoc.getFilename() << ':' << PLoc.getLine() 176806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << ':' << PLoc.getColumn(); 177b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner LastLocFilename = PLoc.getFilename(); 178b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner LastLocLine = PLoc.getLine(); 179b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner } else if (PLoc.getLine() != LastLocLine) { 180806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "line" << ':' << PLoc.getLine() 181806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << ':' << PLoc.getColumn(); 182b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner LastLocLine = PLoc.getLine(); 183e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } else { 184806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "col" << ':' << PLoc.getColumn(); 185e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } 186e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner} 187e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 1889dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroffvoid StmtDumper::DumpSourceRange(const Stmt *Node) { 189e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // Can't translate locations if a SourceManager isn't available. 190e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner if (SM == 0) return; 1911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 192e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // TODO: If the parent expression is available, we can print a delta vs its 193e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // location. 194e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner SourceRange R = Node->getSourceRange(); 1951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 196806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " <"; 197311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner DumpLocation(R.getBegin()); 198311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner if (R.getBegin() != R.getEnd()) { 199806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << ", "; 200311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner DumpLocation(R.getEnd()); 201e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } 202806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << ">"; 2031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 204e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // <t2.c:123:421[blah], t2.c:412:321> 205e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 206e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner} 207e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 208e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 209e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//===----------------------------------------------------------------------===// 2106000dace22f110d8768476989313e9d981d690d0Chris Lattner// Stmt printing methods. 2116000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 2126000dace22f110d8768476989313e9d981d690d0Chris Lattner 2136000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitStmt(Stmt *Node) { 21417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner DumpStmt(Node); 2156000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2166000dace22f110d8768476989313e9d981d690d0Chris Lattner 217f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattnervoid StmtDumper::DumpDeclarator(Decl *D) { 2186000dace22f110d8768476989313e9d981d690d0Chris Lattner // FIXME: Need to complete/beautify this... this code simply shows the 2196000dace22f110d8768476989313e9d981d690d0Chris Lattner // nodes are where they need to be. 2206000dace22f110d8768476989313e9d981d690d0Chris Lattner if (TypedefDecl *localType = dyn_cast<TypedefDecl>(D)) { 221806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "\"typedef " << localType->getUnderlyingType().getAsString() 222900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer << ' ' << localType << '"'; 2236000dace22f110d8768476989313e9d981d690d0Chris Lattner } else if (ValueDecl *VD = dyn_cast<ValueDecl>(D)) { 224806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "\""; 2256000dace22f110d8768476989313e9d981d690d0Chris Lattner // Emit storage class for vardecls. 2266000dace22f110d8768476989313e9d981d690d0Chris Lattner if (VarDecl *V = dyn_cast<VarDecl>(VD)) { 2275466c7b0ca8ce662e2c0bc295cecba2b78d6957dDaniel Dunbar if (V->getStorageClass() != VarDecl::None) 228806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << VarDecl::getStorageClassSpecifierString(V->getStorageClass()) 229806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << " "; 2306000dace22f110d8768476989313e9d981d690d0Chris Lattner } 2311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23239f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner std::string Name = VD->getNameAsString(); 2331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump VD->getType().getAsStringInternal(Name, 234e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner PrintingPolicy(VD->getASTContext().getLangOptions())); 235806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << Name; 2361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2376000dace22f110d8768476989313e9d981d690d0Chris Lattner // If this is a vardecl with an initializer, emit it. 2386000dace22f110d8768476989313e9d981d690d0Chris Lattner if (VarDecl *V = dyn_cast<VarDecl>(VD)) { 2396000dace22f110d8768476989313e9d981d690d0Chris Lattner if (V->getInit()) { 240806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " =\n"; 241f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner DumpSubTree(V->getInit()); 2426000dace22f110d8768476989313e9d981d690d0Chris Lattner } 2436000dace22f110d8768476989313e9d981d690d0Chris Lattner } 244806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << '"'; 2459219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff } else if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 2469219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff // print a free standing tag decl (e.g. "struct x;"). 2479219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff const char *tagname; 2489219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff if (const IdentifierInfo *II = TD->getIdentifier()) 249e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar tagname = II->getNameStart(); 2509219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff else 2519219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff tagname = "<anonymous>"; 252806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << '"' << TD->getKindName() << ' ' << tagname << ";\""; 2539219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff // FIXME: print tag bodies. 2542a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor } else if (UsingDirectiveDecl *UD = dyn_cast<UsingDirectiveDecl>(D)) { 2552a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor // print using-directive decl (e.g. "using namespace x;") 2562a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor const char *ns; 2572a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor if (const IdentifierInfo *II = UD->getNominatedNamespace()->getIdentifier()) 258e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar ns = II->getNameStart(); 2592a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor else 2602a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor ns = "<anonymous>"; 261806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << '"' << UD->getDeclKindName() << ns << ";\""; 2626000dace22f110d8768476989313e9d981d690d0Chris Lattner } else { 2636000dace22f110d8768476989313e9d981d690d0Chris Lattner assert(0 && "Unexpected decl"); 2646000dace22f110d8768476989313e9d981d690d0Chris Lattner } 2656000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2666000dace22f110d8768476989313e9d981d690d0Chris Lattner 2675399ce26f27e6d093417a3882e38da8738a78fefTed Kremenekvoid StmtDumper::VisitDeclStmt(DeclStmt *Node) { 2685399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek DumpStmt(Node); 269806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "\n"; 27004a72b77da736734c925d673834888a081f5ebc5Ted Kremenek for (DeclStmt::decl_iterator DI = Node->decl_begin(), DE = Node->decl_end(); 27104a72b77da736734c925d673834888a081f5ebc5Ted Kremenek DI != DE; ++DI) { 2724afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor Decl* D = *DI; 2735399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek ++IndentLevel; 2745399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek Indent(); 275806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << (void*) D << " "; 2765399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek DumpDeclarator(D); 277f279725f9772a8644957049971001f655b9041c9Chris Lattner if (DI+1 != DE) 278806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "\n"; 2795399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek --IndentLevel; 2805399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek } 2815399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek} 2825399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek 2836000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitLabelStmt(LabelStmt *Node) { 2846000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpStmt(Node); 285806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " '" << Node->getName() << "'"; 2866000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2876000dace22f110d8768476989313e9d981d690d0Chris Lattner 2886000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitGotoStmt(GotoStmt *Node) { 2896000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpStmt(Node); 290806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " '" << Node->getLabel()->getName() 291806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << "':" << (void*)Node->getLabel(); 2926000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2936000dace22f110d8768476989313e9d981d690d0Chris Lattner 2946000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 2956000dace22f110d8768476989313e9d981d690d0Chris Lattner// Expr printing methods. 2966000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 2976000dace22f110d8768476989313e9d981d690d0Chris Lattner 2986000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitExpr(Expr *Node) { 2996000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 3006000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3016000dace22f110d8768476989313e9d981d690d0Chris Lattner 30227a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlssonvoid StmtDumper::VisitCastExpr(CastExpr *Node) { 30327a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson DumpExpr(Node); 304806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " <" << Node->getCastKindName() << ">"; 30527a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson} 30627a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson 3070e489ea67da94ca5ba3df67cab4f0da61d56367dAnders Carlssonvoid StmtDumper::VisitImplicitCastExpr(ImplicitCastExpr *Node) { 3080e489ea67da94ca5ba3df67cab4f0da61d56367dAnders Carlsson VisitCastExpr(Node); 3090e489ea67da94ca5ba3df67cab4f0da61d56367dAnders Carlsson if (Node->isLvalueCast()) 310806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " lvalue"; 3110e489ea67da94ca5ba3df67cab4f0da61d56367dAnders Carlsson} 3120e489ea67da94ca5ba3df67cab4f0da61d56367dAnders Carlsson 3136000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitDeclRefExpr(DeclRefExpr *Node) { 3146000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 315eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek 316806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " "; 317eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek switch (Node->getDecl()->getKind()) { 318806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar default: OS << "Decl"; break; 319806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case Decl::Function: OS << "FunctionDecl"; break; 320806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case Decl::Var: OS << "Var"; break; 321806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case Decl::ParmVar: OS << "ParmVar"; break; 322806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case Decl::EnumConstant: OS << "EnumConstant"; break; 323806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case Decl::Typedef: OS << "Typedef"; break; 324806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case Decl::Record: OS << "Record"; break; 325806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case Decl::Enum: OS << "Enum"; break; 326806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case Decl::CXXRecord: OS << "CXXRecord"; break; 327806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case Decl::ObjCInterface: OS << "ObjCInterface"; break; 328806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case Decl::ObjCClass: OS << "ObjCClass"; break; 329eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek } 3301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 331900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer OS << "='" << Node->getDecl() << "' " << (void*)Node->getDecl(); 3326000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3336000dace22f110d8768476989313e9d981d690d0Chris Lattner 3349d5f35e1124bbaa4a8944f7409478d45cb839de5John McCallvoid StmtDumper::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) { 3359d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall DumpExpr(Node); 3369d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall OS << " ("; 3379d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall if (!Node->requiresADL()) OS << "no "; 338900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer OS << "ADL) = '" << Node->getName() << '\''; 3399d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall 3409d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall UnresolvedLookupExpr::decls_iterator 3419d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall I = Node->decls_begin(), E = Node->decls_end(); 3429d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall if (I == E) OS << " empty"; 3439d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall for (; I != E; ++I) 3449d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall OS << " " << (void*) *I; 3459d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall} 3469d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall 3473c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroffvoid StmtDumper::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) { 348466c2e3af049964f3a573917bd04d6b6ce1d121dSteve Naroff DumpExpr(Node); 3493c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff 350806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getDecl()->getDeclKindName() 351900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer << "Decl='" << Node->getDecl() 352806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << "' " << (void*)Node->getDecl(); 353218543b10e81ea2269ef6ae34d2d8ddbdec54dbeSteve Naroff if (Node->isFreeIvar()) 354806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " isFreeIvar"; 3553c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff} 3563c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff 357d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattnervoid StmtDumper::VisitPredefinedExpr(PredefinedExpr *Node) { 3586000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 3596000dace22f110d8768476989313e9d981d690d0Chris Lattner switch (Node->getIdentType()) { 3600d17f6f7b1882850fa56ad38cca0ee518869255bChris Lattner default: assert(0 && "unknown case"); 361806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case PredefinedExpr::Func: OS << " __func__"; break; 362806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case PredefinedExpr::Function: OS << " __FUNCTION__"; break; 363806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar case PredefinedExpr::PrettyFunction: OS << " __PRETTY_FUNCTION__";break; 3646000dace22f110d8768476989313e9d981d690d0Chris Lattner } 3656000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3666000dace22f110d8768476989313e9d981d690d0Chris Lattner 3676000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCharacterLiteral(CharacterLiteral *Node) { 368a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner DumpExpr(Node); 369806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << Node->getValue(); 3706000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3716000dace22f110d8768476989313e9d981d690d0Chris Lattner 3726000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitIntegerLiteral(IntegerLiteral *Node) { 3736000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 3746000dace22f110d8768476989313e9d981d690d0Chris Lattner 3756000dace22f110d8768476989313e9d981d690d0Chris Lattner bool isSigned = Node->getType()->isSignedIntegerType(); 376806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getValue().toString(10, isSigned); 3776000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3786000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitFloatingLiteral(FloatingLiteral *Node) { 3796000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 380806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getValueAsApproximateDouble(); 3816000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3825d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner 3836000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitStringLiteral(StringLiteral *Str) { 384a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner DumpExpr(Str); 385a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner // FIXME: this doesn't print wstrings right. 386806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " "; 387806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar if (Str->isWide()) 388806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "L"; 389806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << '"'; 390806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS.write_escaped(llvm::StringRef(Str->getStrData(), 391806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar Str->getByteLength())); 392806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << '"'; 3936000dace22f110d8768476989313e9d981d690d0Chris Lattner} 39417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner 3956000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitUnaryOperator(UnaryOperator *Node) { 39613cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 397806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << (Node->isPostfix() ? "postfix" : "prefix") 398806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << " '" << UnaryOperator::getOpcodeStr(Node->getOpcode()) << "'"; 3996000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4000518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redlvoid StmtDumper::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *Node) { 40113cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 402806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << (Node->isSizeOf() ? "sizeof" : "alignof") << " "; 4030518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl if (Node->isArgumentType()) 4040518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl DumpType(Node->getArgumentType()); 4056000dace22f110d8768476989313e9d981d690d0Chris Lattner} 40613cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner 4076000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitMemberExpr(MemberExpr *Node) { 40813cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 409806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << (Node->isArrow() ? "->" : ".") 410900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer << Node->getMemberDecl() << ' ' 411806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << (void*)Node->getMemberDecl(); 4126000dace22f110d8768476989313e9d981d690d0Chris Lattner} 413213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanvoid StmtDumper::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) { 41413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 415806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getAccessor().getNameStart(); 4166000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4176000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitBinaryOperator(BinaryOperator *Node) { 4186000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 419806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode()) << "'"; 420eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner} 421eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattnervoid StmtDumper::VisitCompoundAssignOperator(CompoundAssignOperator *Node) { 422eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner DumpExpr(Node); 423806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode()) 424806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << "' ComputeLHSTy="; 425ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman DumpType(Node->getComputationLHSType()); 426806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " ComputeResultTy="; 427ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman DumpType(Node->getComputationResultType()); 4286000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4296000dace22f110d8768476989313e9d981d690d0Chris Lattner 4306000dace22f110d8768476989313e9d981d690d0Chris Lattner// GNU extensions. 4316000dace22f110d8768476989313e9d981d690d0Chris Lattner 4326000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitAddrLabelExpr(AddrLabelExpr *Node) { 43313cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 434806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getLabel()->getName() 435806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << " " << (void*)Node->getLabel(); 4366000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4376000dace22f110d8768476989313e9d981d690d0Chris Lattner 4386000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitTypesCompatibleExpr(TypesCompatibleExpr *Node) { 43913cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 440806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " "; 44113cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpType(Node->getArgType1()); 442806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " "; 44313cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpType(Node->getArgType2()); 4446000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4456000dace22f110d8768476989313e9d981d690d0Chris Lattner 446f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===// 447f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner// C++ Expressions 448f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===// 4496000dace22f110d8768476989313e9d981d690d0Chris Lattner 45049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtDumper::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) { 45113cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 452806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getCastName() 453806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << "<" << Node->getTypeAsWritten().getAsString() << ">" 454806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << " <" << Node->getCastKindName() << ">"; 4556000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4566000dace22f110d8768476989313e9d981d690d0Chris Lattner 4576000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) { 45813cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 459806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << (Node->getValue() ? "true" : "false"); 4606000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4616000dace22f110d8768476989313e9d981d690d0Chris Lattner 462cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregorvoid StmtDumper::VisitCXXThisExpr(CXXThisExpr *Node) { 463cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor DumpExpr(Node); 464806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " this"; 465cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor} 466cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor 46749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtDumper::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) { 46849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor DumpExpr(Node); 469806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " functional cast to " << Node->getTypeAsWritten().getAsString(); 47049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 47149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 4720eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlssonvoid StmtDumper::VisitCXXConstructExpr(CXXConstructExpr *Node) { 4730eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson DumpExpr(Node); 474d4bbdfebe9bd13defa977a934bf73fc2ce3b2817John McCall CXXConstructorDecl *Ctor = Node->getConstructor(); 475d4bbdfebe9bd13defa977a934bf73fc2ce3b2817John McCall DumpType(Ctor->getType()); 4760eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson if (Node->isElidable()) 477806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " elidable"; 4780eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 4790eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 4800eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlssonvoid StmtDumper::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) { 4810eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson DumpExpr(Node); 482806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " "; 4830eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson DumpCXXTemporary(Node->getTemporary()); 4840eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 4850eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 4860eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlssonvoid StmtDumper::VisitCXXExprWithTemporaries(CXXExprWithTemporaries *Node) { 4870eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson DumpExpr(Node); 4880eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson ++IndentLevel; 4890eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson for (unsigned i = 0, e = Node->getNumTemporaries(); i != e; ++i) { 490806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "\n"; 4910eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson Indent(); 4920eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson DumpCXXTemporary(Node->getTemporary(i)); 4930eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson } 4940eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson --IndentLevel; 4950eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 4960eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 4970eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlssonvoid StmtDumper::DumpCXXTemporary(CXXTemporary *Temporary) { 498806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "(CXXTemporary " << (void *)Temporary << ")"; 4990eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 5000eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 5015508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===// 5025508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// Obj-C Expressions 5035508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===// 5045508518a2702b00be3b15a26d772bde968972f54Anders Carlsson 505b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenekvoid StmtDumper::VisitObjCMessageExpr(ObjCMessageExpr* Node) { 506b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek DumpExpr(Node); 507806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " selector=" << Node->getSelector().getAsString(); 50804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor switch (Node->getReceiverKind()) { 50904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Instance: 51004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 51104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 51204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Class: 51304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor OS << " class="; 51404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor DumpType(Node->getClassReceiver()); 51504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 51604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 51704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperInstance: 51804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor OS << " super (instance)"; 51904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 52004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 52104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperClass: 52204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor OS << " super (class)"; 52304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 52404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 525b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek} 526b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek 527f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlssonvoid StmtDumper::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) { 528f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson DumpExpr(Node); 529806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " "; 530f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson DumpType(Node->getEncodedType()); 531f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson} 532f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson 533b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanianvoid StmtDumper::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) { 534b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian DumpExpr(Node); 5351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 536806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " " << Node->getSelector().getAsString(); 537b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian} 538b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian 539390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanianvoid StmtDumper::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) { 540390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian DumpExpr(Node); 5411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 542900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer OS << ' ' << Node->getProtocol(); 543390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian} 5447f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar 5457f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbarvoid StmtDumper::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) { 5467f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar DumpExpr(Node); 547e66f4e3e3ae9d7d11b0c302211066fad69228abaDaniel Dunbar 548900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer OS << " Kind=PropertyRef Property=\"" << Node->getProperty() << '"'; 5495daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian} 5505daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian 55109105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanianvoid StmtDumper::VisitObjCImplicitSetterGetterRefExpr( 55209105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian ObjCImplicitSetterGetterRefExpr *Node) { 5535daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian DumpExpr(Node); 5541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5555daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian ObjCMethodDecl *Getter = Node->getGetterMethod(); 5565daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian ObjCMethodDecl *Setter = Node->getSetterMethod(); 557806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " Kind=MethodRef Getter=\"" 558806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << Getter->getSelector().getAsString() 559806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar << "\" Setter=\""; 560806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar if (Setter) 561806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << Setter->getSelector().getAsString(); 562806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar else 563806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "(null)"; 564806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << "\""; 5657f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar} 5667f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar 567cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregorvoid StmtDumper::VisitObjCSuperExpr(ObjCSuperExpr *Node) { 568cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor DumpExpr(Node); 569806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar OS << " super"; 570cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor} 571cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor 5726000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 5736000dace22f110d8768476989313e9d981d690d0Chris Lattner// Stmt method implementations 5746000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 5756000dace22f110d8768476989313e9d981d690d0Chris Lattner 5766000dace22f110d8768476989313e9d981d690d0Chris Lattner/// dump - This does a local dump of the specified AST fragment. It dumps the 5776000dace22f110d8768476989313e9d981d690d0Chris Lattner/// specified node and a few nodes underneath it, but not the whole subtree. 5786000dace22f110d8768476989313e9d981d690d0Chris Lattner/// This is useful in a debugger. 579e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattnervoid Stmt::dump(SourceManager &SM) const { 580806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar StmtDumper P(&SM, llvm::errs(), 4); 581b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner P.DumpSubTree(const_cast<Stmt*>(this)); 582806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar llvm::errs() << "\n"; 5830c727a35718556866a978f64ac549d9798735f08Chris Lattner} 5840c727a35718556866a978f64ac549d9798735f08Chris Lattner 5850c727a35718556866a978f64ac549d9798735f08Chris Lattner/// dump - This does a local dump of the specified AST fragment. It dumps the 5860c727a35718556866a978f64ac549d9798735f08Chris Lattner/// specified node and a few nodes underneath it, but not the whole subtree. 5870c727a35718556866a978f64ac549d9798735f08Chris Lattner/// This is useful in a debugger. 5886000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dump() const { 589806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar StmtDumper P(0, llvm::errs(), 4); 590b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner P.DumpSubTree(const_cast<Stmt*>(this)); 591806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar llvm::errs() << "\n"; 5920c727a35718556866a978f64ac549d9798735f08Chris Lattner} 5930c727a35718556866a978f64ac549d9798735f08Chris Lattner 5940c727a35718556866a978f64ac549d9798735f08Chris Lattner/// dumpAll - This does a dump of the specified AST fragment and all subtrees. 595e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattnervoid Stmt::dumpAll(SourceManager &SM) const { 596806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar StmtDumper P(&SM, llvm::errs(), ~0U); 597b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner P.DumpSubTree(const_cast<Stmt*>(this)); 598806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar llvm::errs() << "\n"; 5996000dace22f110d8768476989313e9d981d690d0Chris Lattner} 6006000dace22f110d8768476989313e9d981d690d0Chris Lattner 6016000dace22f110d8768476989313e9d981d690d0Chris Lattner/// dumpAll - This does a dump of the specified AST fragment and all subtrees. 6026000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dumpAll() const { 603806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar StmtDumper P(0, llvm::errs(), ~0U); 604b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner P.DumpSubTree(const_cast<Stmt*>(this)); 605806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar llvm::errs() << "\n"; 6066000dace22f110d8768476989313e9d981d690d0Chris Lattner} 607