StmtDumper.cpp revision 0953e767ff7817f97b3ab20896b229891eeff45b
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" 206000dace22f110d8768476989313e9d981d690d0Chris Lattner#include "llvm/Support/Compiler.h" 216000dace22f110d8768476989313e9d981d690d0Chris Lattner#include <cstdio> 226000dace22f110d8768476989313e9d981d690d0Chris Lattnerusing namespace clang; 236000dace22f110d8768476989313e9d981d690d0Chris Lattner 246000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 256000dace22f110d8768476989313e9d981d690d0Chris Lattner// StmtDumper Visitor 266000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 276000dace22f110d8768476989313e9d981d690d0Chris Lattner 286000dace22f110d8768476989313e9d981d690d0Chris Lattnernamespace { 29c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner class VISIBILITY_HIDDEN StmtDumper : public StmtVisitor<StmtDumper> { 30e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner SourceManager *SM; 316000dace22f110d8768476989313e9d981d690d0Chris Lattner FILE *F; 326000dace22f110d8768476989313e9d981d690d0Chris Lattner unsigned IndentLevel; 331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 346000dace22f110d8768476989313e9d981d690d0Chris Lattner /// MaxDepth - When doing a normal dump (not dumpAll) we only want to dump 356000dace22f110d8768476989313e9d981d690d0Chris Lattner /// the first few levels of an AST. This keeps track of how many ast levels 366000dace22f110d8768476989313e9d981d690d0Chris Lattner /// are left. 376000dace22f110d8768476989313e9d981d690d0Chris Lattner unsigned MaxDepth; 381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner /// LastLocFilename/LastLocLine - Keep track of the last location we print 40e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner /// out so that we can print out deltas from then on out. 41e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner const char *LastLocFilename; 42e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner unsigned LastLocLine; 43d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor 446000dace22f110d8768476989313e9d981d690d0Chris Lattner public: 45e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner StmtDumper(SourceManager *sm, FILE *f, unsigned maxDepth) 46e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner : SM(sm), F(f), IndentLevel(0-1), MaxDepth(maxDepth) { 47e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner LastLocFilename = ""; 48e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner LastLocLine = ~0U; 49e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } 501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 51f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner void DumpSubTree(Stmt *S) { 526000dace22f110d8768476989313e9d981d690d0Chris Lattner // Prune the recursion if not using dump all. 536000dace22f110d8768476989313e9d981d690d0Chris Lattner if (MaxDepth == 0) return; 541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 55f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner ++IndentLevel; 566000dace22f110d8768476989313e9d981d690d0Chris Lattner if (S) { 575399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek if (DeclStmt* DS = dyn_cast<DeclStmt>(S)) 585399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek VisitDeclStmt(DS); 591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else { 605399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek Visit(S); 611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 625399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek // Print out children. 635399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek Stmt::child_iterator CI = S->child_begin(), CE = S->child_end(); 645399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek if (CI != CE) { 655399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek while (CI != CE) { 665399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek fprintf(F, "\n"); 675399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek DumpSubTree(*CI++); 685399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek } 69b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner } 705399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek fprintf(F, ")"); 71b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner } 726000dace22f110d8768476989313e9d981d690d0Chris Lattner } else { 736000dace22f110d8768476989313e9d981d690d0Chris Lattner Indent(); 744a70adba92ff0e26af87360557ee2e9a6ff529d3Chris Lattner fprintf(F, "<<<NULL>>>"); 756000dace22f110d8768476989313e9d981d690d0Chris Lattner } 76f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner --IndentLevel; 776000dace22f110d8768476989313e9d981d690d0Chris Lattner } 781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 79f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner void DumpDeclarator(Decl *D); 801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 816000dace22f110d8768476989313e9d981d690d0Chris Lattner void Indent() const { 826000dace22f110d8768476989313e9d981d690d0Chris Lattner for (int i = 0, e = IndentLevel; i < e; ++i) 836000dace22f110d8768476989313e9d981d690d0Chris Lattner fprintf(F, " "); 846000dace22f110d8768476989313e9d981d690d0Chris Lattner } 851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 869dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff void DumpType(QualType T) { 87fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner fprintf(F, "'%s'", T.getAsString().c_str()); 88fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner 8961366e9cd41a6dbde4e66416dac21269c8ac1d94Douglas Gregor if (!T.isNull()) { 900953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If the type is sugared, also dump a (shallow) desugared type. 910953e767ff7817f97b3ab20896b229891eeff45bJohn McCall QualType Simplified = T.getDesugaredType(); 920953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (Simplified != T) 9361366e9cd41a6dbde4e66416dac21269c8ac1d94Douglas Gregor fprintf(F, ":'%s'", Simplified.getAsString().c_str()); 94bad37858aef8910195a9c75f2892a09a032424b7Chris Lattner } 95fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner } 969dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff void DumpStmt(const Stmt *Node) { 976000dace22f110d8768476989313e9d981d690d0Chris Lattner Indent(); 986000dace22f110d8768476989313e9d981d690d0Chris Lattner fprintf(F, "(%s %p", Node->getStmtClassName(), (void*)Node); 999dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff DumpSourceRange(Node); 1006000dace22f110d8768476989313e9d981d690d0Chris Lattner } 1019dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff void DumpExpr(const Expr *Node) { 1026000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpStmt(Node); 103fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner fprintf(F, " "); 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); 11817a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitDeclRefExpr(DeclRefExpr *Node); 119d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner void VisitPredefinedExpr(PredefinedExpr *Node); 12017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitCharacterLiteral(CharacterLiteral *Node); 12117a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitIntegerLiteral(IntegerLiteral *Node); 12217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitFloatingLiteral(FloatingLiteral *Node); 12317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitStringLiteral(StringLiteral *Str); 12417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitUnaryOperator(UnaryOperator *Node); 1250518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl void VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *Node); 12617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitMemberExpr(MemberExpr *Node); 127213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman void VisitExtVectorElementExpr(ExtVectorElementExpr *Node); 12817a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitBinaryOperator(BinaryOperator *Node); 12917a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitCompoundAssignOperator(CompoundAssignOperator *Node); 13017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitAddrLabelExpr(AddrLabelExpr *Node); 13117a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitTypesCompatibleExpr(TypesCompatibleExpr *Node); 13217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner 13317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // C++ 13449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor void VisitCXXNamedCastExpr(CXXNamedCastExpr *Node); 13517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node); 136cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor void VisitCXXThisExpr(CXXThisExpr *Node); 13749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node); 1380eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson void VisitCXXConstructExpr(CXXConstructExpr *Node); 1390eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node); 1400eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson void VisitCXXExprWithTemporaries(CXXExprWithTemporaries *Node); 1410eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson void DumpCXXTemporary(CXXTemporary *Temporary); 1421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // ObjC 14417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitObjCEncodeExpr(ObjCEncodeExpr *Node); 145b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek void VisitObjCMessageExpr(ObjCMessageExpr* Node); 146b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian void VisitObjCSelectorExpr(ObjCSelectorExpr *Node); 147390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian void VisitObjCProtocolExpr(ObjCProtocolExpr *Node); 1487f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node); 14909105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian void VisitObjCImplicitSetterGetterRefExpr( 15009105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian ObjCImplicitSetterGetterRefExpr *Node); 1513c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff void VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node); 152cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor void VisitObjCSuperExpr(ObjCSuperExpr *Node); 1536000dace22f110d8768476989313e9d981d690d0Chris Lattner }; 1546000dace22f110d8768476989313e9d981d690d0Chris Lattner} 1556000dace22f110d8768476989313e9d981d690d0Chris Lattner 1566000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 157e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner// Utilities 158e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//===----------------------------------------------------------------------===// 159e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 160e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattnervoid StmtDumper::DumpLocation(SourceLocation Loc) { 161df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner SourceLocation SpellingLoc = SM->getSpellingLoc(Loc); 1621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 163b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner if (SpellingLoc.isInvalid()) { 164b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner fprintf(stderr, "<invalid sloc>"); 165b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner return; 166b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner } 167e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 168e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // The general format we print out is filename:line:col, but we drop pieces 169e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // that haven't changed since the last loc printed. 170b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PresumedLoc PLoc = SM->getPresumedLoc(SpellingLoc); 171b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner 172b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner if (strcmp(PLoc.getFilename(), LastLocFilename) != 0) { 173b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner fprintf(stderr, "%s:%u:%u", PLoc.getFilename(), PLoc.getLine(), 174b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PLoc.getColumn()); 175b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner LastLocFilename = PLoc.getFilename(); 176b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner LastLocLine = PLoc.getLine(); 177b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner } else if (PLoc.getLine() != LastLocLine) { 178b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner fprintf(stderr, "line:%u:%u", PLoc.getLine(), PLoc.getColumn()); 179b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner LastLocLine = PLoc.getLine(); 180e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } else { 181b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner fprintf(stderr, "col:%u", PLoc.getColumn()); 182e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } 183e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner} 184e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 1859dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroffvoid StmtDumper::DumpSourceRange(const Stmt *Node) { 186e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // Can't translate locations if a SourceManager isn't available. 187e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner if (SM == 0) return; 1881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 189e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // TODO: If the parent expression is available, we can print a delta vs its 190e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // location. 191e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner SourceRange R = Node->getSourceRange(); 1921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 193e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner fprintf(stderr, " <"); 194311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner DumpLocation(R.getBegin()); 195311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner if (R.getBegin() != R.getEnd()) { 196e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner fprintf(stderr, ", "); 197311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner DumpLocation(R.getEnd()); 198e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } 199e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner fprintf(stderr, ">"); 2001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 201e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // <t2.c:123:421[blah], t2.c:412:321> 202e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 203e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner} 204e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 205e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 206e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//===----------------------------------------------------------------------===// 2076000dace22f110d8768476989313e9d981d690d0Chris Lattner// Stmt printing methods. 2086000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 2096000dace22f110d8768476989313e9d981d690d0Chris Lattner 2106000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitStmt(Stmt *Node) { 21117a1a72e70dcbd6257dde644c790a3013113174fChris Lattner DumpStmt(Node); 2126000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2136000dace22f110d8768476989313e9d981d690d0Chris Lattner 214f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattnervoid StmtDumper::DumpDeclarator(Decl *D) { 2156000dace22f110d8768476989313e9d981d690d0Chris Lattner // FIXME: Need to complete/beautify this... this code simply shows the 2166000dace22f110d8768476989313e9d981d690d0Chris Lattner // nodes are where they need to be. 2176000dace22f110d8768476989313e9d981d690d0Chris Lattner if (TypedefDecl *localType = dyn_cast<TypedefDecl>(D)) { 218f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner fprintf(F, "\"typedef %s %s\"", 219f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner localType->getUnderlyingType().getAsString().c_str(), 2208ec03f58c33c33a917f54bb7f2cd61b6d7ffe0caChris Lattner localType->getNameAsString().c_str()); 2216000dace22f110d8768476989313e9d981d690d0Chris Lattner } else if (ValueDecl *VD = dyn_cast<ValueDecl>(D)) { 222f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner fprintf(F, "\""); 2236000dace22f110d8768476989313e9d981d690d0Chris Lattner // Emit storage class for vardecls. 2246000dace22f110d8768476989313e9d981d690d0Chris Lattner if (VarDecl *V = dyn_cast<VarDecl>(VD)) { 2255466c7b0ca8ce662e2c0bc295cecba2b78d6957dDaniel Dunbar if (V->getStorageClass() != VarDecl::None) 2261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump fprintf(F, "%s ", 2275466c7b0ca8ce662e2c0bc295cecba2b78d6957dDaniel Dunbar VarDecl::getStorageClassSpecifierString(V->getStorageClass())); 2286000dace22f110d8768476989313e9d981d690d0Chris Lattner } 2291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23039f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner std::string Name = VD->getNameAsString(); 2311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump VD->getType().getAsStringInternal(Name, 232e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner PrintingPolicy(VD->getASTContext().getLangOptions())); 233f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner fprintf(F, "%s", Name.c_str()); 2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2356000dace22f110d8768476989313e9d981d690d0Chris Lattner // If this is a vardecl with an initializer, emit it. 2366000dace22f110d8768476989313e9d981d690d0Chris Lattner if (VarDecl *V = dyn_cast<VarDecl>(VD)) { 2376000dace22f110d8768476989313e9d981d690d0Chris Lattner if (V->getInit()) { 238f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner fprintf(F, " =\n"); 239f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner DumpSubTree(V->getInit()); 2406000dace22f110d8768476989313e9d981d690d0Chris Lattner } 2416000dace22f110d8768476989313e9d981d690d0Chris Lattner } 242f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner fprintf(F, "\""); 2439219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff } else if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 2449219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff // print a free standing tag decl (e.g. "struct x;"). 2459219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff const char *tagname; 2469219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff if (const IdentifierInfo *II = TD->getIdentifier()) 2479219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff tagname = II->getName(); 2489219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff else 2499219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff tagname = "<anonymous>"; 2509219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff fprintf(F, "\"%s %s;\"", TD->getKindName(), tagname); 2519219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff // FIXME: print tag bodies. 2522a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor } else if (UsingDirectiveDecl *UD = dyn_cast<UsingDirectiveDecl>(D)) { 2532a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor // print using-directive decl (e.g. "using namespace x;") 2542a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor const char *ns; 2552a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor if (const IdentifierInfo *II = UD->getNominatedNamespace()->getIdentifier()) 2562a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor ns = II->getName(); 2572a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor else 2582a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor ns = "<anonymous>"; 2592a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor fprintf(F, "\"%s %s;\"",UD->getDeclKindName(), ns); 2606000dace22f110d8768476989313e9d981d690d0Chris Lattner } else { 2616000dace22f110d8768476989313e9d981d690d0Chris Lattner assert(0 && "Unexpected decl"); 2626000dace22f110d8768476989313e9d981d690d0Chris Lattner } 2636000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2646000dace22f110d8768476989313e9d981d690d0Chris Lattner 2655399ce26f27e6d093417a3882e38da8738a78fefTed Kremenekvoid StmtDumper::VisitDeclStmt(DeclStmt *Node) { 2665399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek DumpStmt(Node); 2675399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek fprintf(F,"\n"); 26804a72b77da736734c925d673834888a081f5ebc5Ted Kremenek for (DeclStmt::decl_iterator DI = Node->decl_begin(), DE = Node->decl_end(); 26904a72b77da736734c925d673834888a081f5ebc5Ted Kremenek DI != DE; ++DI) { 2704afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor Decl* D = *DI; 2715399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek ++IndentLevel; 2725399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek Indent(); 2735399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek fprintf(F, "%p ", (void*) D); 2745399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek DumpDeclarator(D); 275f279725f9772a8644957049971001f655b9041c9Chris Lattner if (DI+1 != DE) 2765399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek fprintf(F,"\n"); 2775399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek --IndentLevel; 2785399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek } 2795399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek} 2805399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek 2816000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitLabelStmt(LabelStmt *Node) { 2826000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpStmt(Node); 2833cb640bad3e6d8a40897f0a02c5ed6dcb14d1418Chris Lattner fprintf(F, " '%s'", Node->getName()); 2846000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2856000dace22f110d8768476989313e9d981d690d0Chris Lattner 2866000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitGotoStmt(GotoStmt *Node) { 2876000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpStmt(Node); 288b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " '%s':%p", Node->getLabel()->getName(), (void*)Node->getLabel()); 2896000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2906000dace22f110d8768476989313e9d981d690d0Chris Lattner 2916000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 2926000dace22f110d8768476989313e9d981d690d0Chris Lattner// Expr printing methods. 2936000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 2946000dace22f110d8768476989313e9d981d690d0Chris Lattner 2956000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitExpr(Expr *Node) { 2966000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 2976000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2986000dace22f110d8768476989313e9d981d690d0Chris Lattner 29927a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlssonvoid StmtDumper::VisitCastExpr(CastExpr *Node) { 30027a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson DumpExpr(Node); 301f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson fprintf(F, " <%s>", Node->getCastKindName()); 30227a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson} 30327a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson 3046000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitDeclRefExpr(DeclRefExpr *Node) { 3056000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 306eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek 307eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek fprintf(F, " "); 308eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek switch (Node->getDecl()->getKind()) { 30927a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson default: fprintf(F,"Decl"); break; 31027a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson case Decl::Function: fprintf(F,"FunctionDecl"); break; 31127a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson case Decl::Var: fprintf(F,"Var"); break; 31227a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson case Decl::ParmVar: fprintf(F,"ParmVar"); break; 31327a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson case Decl::EnumConstant: fprintf(F,"EnumConstant"); break; 31427a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson case Decl::Typedef: fprintf(F,"Typedef"); break; 31527a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson case Decl::Record: fprintf(F,"Record"); break; 31627a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson case Decl::Enum: fprintf(F,"Enum"); break; 31727a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson case Decl::CXXRecord: fprintf(F,"CXXRecord"); break; 31827a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson case Decl::ObjCInterface: fprintf(F,"ObjCInterface"); break; 31927a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson case Decl::ObjCClass: fprintf(F,"ObjCClass"); break; 320eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek } 3211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump fprintf(F, "='%s' %p", Node->getDecl()->getNameAsString().c_str(), 3232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor (void*)Node->getDecl()); 3246000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3256000dace22f110d8768476989313e9d981d690d0Chris Lattner 3263c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroffvoid StmtDumper::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) { 327466c2e3af049964f3a573917bd04d6b6ce1d121dSteve Naroff DumpExpr(Node); 3283c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff 3291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump fprintf(F, " %sDecl='%s' %p", Node->getDecl()->getDeclKindName(), 3308ec03f58c33c33a917f54bb7f2cd61b6d7ffe0caChris Lattner Node->getDecl()->getNameAsString().c_str(), (void*)Node->getDecl()); 331218543b10e81ea2269ef6ae34d2d8ddbdec54dbeSteve Naroff if (Node->isFreeIvar()) 332218543b10e81ea2269ef6ae34d2d8ddbdec54dbeSteve Naroff fprintf(F, " isFreeIvar"); 3333c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff} 3343c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff 335d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattnervoid StmtDumper::VisitPredefinedExpr(PredefinedExpr *Node) { 3366000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 3376000dace22f110d8768476989313e9d981d690d0Chris Lattner switch (Node->getIdentType()) { 3380d17f6f7b1882850fa56ad38cca0ee518869255bChris Lattner default: assert(0 && "unknown case"); 339d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner case PredefinedExpr::Func: fprintf(F, " __func__"); break; 340d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner case PredefinedExpr::Function: fprintf(F, " __FUNCTION__"); break; 341d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner case PredefinedExpr::PrettyFunction: fprintf(F, " __PRETTY_FUNCTION__");break; 3426000dace22f110d8768476989313e9d981d690d0Chris Lattner } 3436000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3446000dace22f110d8768476989313e9d981d690d0Chris Lattner 3456000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCharacterLiteral(CharacterLiteral *Node) { 346a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner DumpExpr(Node); 347b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %d", Node->getValue()); 3486000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3496000dace22f110d8768476989313e9d981d690d0Chris Lattner 3506000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitIntegerLiteral(IntegerLiteral *Node) { 3516000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 3526000dace22f110d8768476989313e9d981d690d0Chris Lattner 3536000dace22f110d8768476989313e9d981d690d0Chris Lattner bool isSigned = Node->getType()->isSignedIntegerType(); 354b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %s", Node->getValue().toString(10, isSigned).c_str()); 3556000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3566000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitFloatingLiteral(FloatingLiteral *Node) { 3576000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 358da8249e57f3badecf925571881fe57243935c6c1Chris Lattner fprintf(F, " %f", Node->getValueAsApproximateDouble()); 3596000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3605d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner 3616000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitStringLiteral(StringLiteral *Str) { 362a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner DumpExpr(Str); 363a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner // FIXME: this doesn't print wstrings right. 3645fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner fprintf(F, " %s\"", Str->isWide() ? "L" : ""); 365a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner 3666000dace22f110d8768476989313e9d981d690d0Chris Lattner for (unsigned i = 0, e = Str->getByteLength(); i != e; ++i) { 3675fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner switch (char C = Str->getStrData()[i]) { 3685fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner default: 3695fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner if (isprint(C)) 3701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump fputc(C, F); 3715fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner else 3725fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner fprintf(F, "\\%03o", C); 3735fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner break; 3746000dace22f110d8768476989313e9d981d690d0Chris Lattner // Handle some common ones to make dumps prettier. 3755fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner case '\\': fprintf(F, "\\\\"); break; 3765fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner case '"': fprintf(F, "\\\""); break; 3775fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner case '\n': fprintf(F, "\\n"); break; 3785fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner case '\t': fprintf(F, "\\t"); break; 3795fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner case '\a': fprintf(F, "\\a"); break; 3805fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner case '\b': fprintf(F, "\\b"); break; 3816000dace22f110d8768476989313e9d981d690d0Chris Lattner } 3826000dace22f110d8768476989313e9d981d690d0Chris Lattner } 383b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, "\""); 3846000dace22f110d8768476989313e9d981d690d0Chris Lattner} 38517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner 3866000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitUnaryOperator(UnaryOperator *Node) { 38713cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 388b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %s '%s'", Node->isPostfix() ? "postfix" : "prefix", 38913cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner UnaryOperator::getOpcodeStr(Node->getOpcode())); 3906000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3910518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redlvoid StmtDumper::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *Node) { 39213cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 39313cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner fprintf(F, " %s ", Node->isSizeOf() ? "sizeof" : "alignof"); 3940518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl if (Node->isArgumentType()) 3950518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl DumpType(Node->getArgumentType()); 3966000dace22f110d8768476989313e9d981d690d0Chris Lattner} 39713cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner 3986000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitMemberExpr(MemberExpr *Node) { 39913cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 400b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %s%s %p", Node->isArrow() ? "->" : ".", 4011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Node->getMemberDecl()->getNameAsString().c_str(), 4022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor (void*)Node->getMemberDecl()); 4036000dace22f110d8768476989313e9d981d690d0Chris Lattner} 404213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanvoid StmtDumper::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) { 40513cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 406b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %s", Node->getAccessor().getName()); 4076000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4086000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitBinaryOperator(BinaryOperator *Node) { 4096000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 410b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " '%s'", BinaryOperator::getOpcodeStr(Node->getOpcode())); 411eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner} 412eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattnervoid StmtDumper::VisitCompoundAssignOperator(CompoundAssignOperator *Node) { 413eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner DumpExpr(Node); 414ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman fprintf(F, " '%s' ComputeLHSTy=", 415eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner BinaryOperator::getOpcodeStr(Node->getOpcode())); 416ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman DumpType(Node->getComputationLHSType()); 417ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman fprintf(F, " ComputeResultTy="); 418ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman DumpType(Node->getComputationResultType()); 4196000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4206000dace22f110d8768476989313e9d981d690d0Chris Lattner 4216000dace22f110d8768476989313e9d981d690d0Chris Lattner// GNU extensions. 4226000dace22f110d8768476989313e9d981d690d0Chris Lattner 4236000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitAddrLabelExpr(AddrLabelExpr *Node) { 42413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 425b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %s %p", Node->getLabel()->getName(), (void*)Node->getLabel()); 4266000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4276000dace22f110d8768476989313e9d981d690d0Chris Lattner 4286000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitTypesCompatibleExpr(TypesCompatibleExpr *Node) { 42913cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 43013cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner fprintf(F, " "); 43113cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpType(Node->getArgType1()); 43213cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner fprintf(F, " "); 43313cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpType(Node->getArgType2()); 4346000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4356000dace22f110d8768476989313e9d981d690d0Chris Lattner 436f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===// 437f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner// C++ Expressions 438f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===// 4396000dace22f110d8768476989313e9d981d690d0Chris Lattner 44049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtDumper::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) { 44113cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 442f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson fprintf(F, " %s<%s> <%s>", Node->getCastName(), 443f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson Node->getTypeAsWritten().getAsString().c_str(), 444f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson Node->getCastKindName()); 4456000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4466000dace22f110d8768476989313e9d981d690d0Chris Lattner 4476000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) { 44813cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 449b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %s", Node->getValue() ? "true" : "false"); 4506000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4516000dace22f110d8768476989313e9d981d690d0Chris Lattner 452cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregorvoid StmtDumper::VisitCXXThisExpr(CXXThisExpr *Node) { 453cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor DumpExpr(Node); 454cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor fprintf(F, " this"); 455cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor} 456cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor 45749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtDumper::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) { 45849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor DumpExpr(Node); 4591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump fprintf(F, " functional cast to %s", 46049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor Node->getTypeAsWritten().getAsString().c_str()); 46149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 46249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 4630eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlssonvoid StmtDumper::VisitCXXConstructExpr(CXXConstructExpr *Node) { 4640eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson DumpExpr(Node); 4650eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson if (Node->isElidable()) 4660e67f9dc4d7d554f2146f2d028c5338109208485Anders Carlsson fprintf(F, " elidable"); 4670eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 4680eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 4690eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlssonvoid StmtDumper::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) { 4700eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson DumpExpr(Node); 4710eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson fprintf(F, " "); 4720eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson DumpCXXTemporary(Node->getTemporary()); 4730eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 4740eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 4750eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlssonvoid StmtDumper::VisitCXXExprWithTemporaries(CXXExprWithTemporaries *Node) { 4760eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson DumpExpr(Node); 4770eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson ++IndentLevel; 4780eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson for (unsigned i = 0, e = Node->getNumTemporaries(); i != e; ++i) { 4790eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson fprintf(F, "\n"); 4800eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson Indent(); 4810eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson DumpCXXTemporary(Node->getTemporary(i)); 4820eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson } 4830eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson --IndentLevel; 4840eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 4850eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 4860eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlssonvoid StmtDumper::DumpCXXTemporary(CXXTemporary *Temporary) { 4870eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson fprintf(F, "(CXXTemporary %p)", (void *)Temporary); 4880eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson} 4890eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson 4905508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===// 4915508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// Obj-C Expressions 4925508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===// 4935508518a2702b00be3b15a26d772bde968972f54Anders Carlsson 494b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenekvoid StmtDumper::VisitObjCMessageExpr(ObjCMessageExpr* Node) { 495b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek DumpExpr(Node); 496077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner fprintf(F, " selector=%s", Node->getSelector().getAsString().c_str()); 497ea958e57a370b641c5a69347b75e9f8e3b5a41a2Ted Kremenek IdentifierInfo* clsName = Node->getClassName(); 498ea958e57a370b641c5a69347b75e9f8e3b5a41a2Ted Kremenek if (clsName) fprintf(F, " class=%s", clsName->getName()); 499b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek} 500b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek 501f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlssonvoid StmtDumper::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) { 502f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson DumpExpr(Node); 5031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 504f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson fprintf(F, " "); 505f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson DumpType(Node->getEncodedType()); 506f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson} 507f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson 508b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanianvoid StmtDumper::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) { 509b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian DumpExpr(Node); 5101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 511b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian fprintf(F, " "); 512077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner fprintf(F, "%s", Node->getSelector().getAsString().c_str()); 513b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian} 514b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian 515390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanianvoid StmtDumper::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) { 516390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian DumpExpr(Node); 5171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 518390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian fprintf(F, " "); 5198ec03f58c33c33a917f54bb7f2cd61b6d7ffe0caChris Lattner fprintf(F, "%s", Node->getProtocol()->getNameAsString().c_str()); 520390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian} 5217f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar 5227f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbarvoid StmtDumper::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) { 5237f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar DumpExpr(Node); 524e66f4e3e3ae9d7d11b0c302211066fad69228abaDaniel Dunbar 5251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump fprintf(F, " Kind=PropertyRef Property=\"%s\"", 5268ec03f58c33c33a917f54bb7f2cd61b6d7ffe0caChris Lattner Node->getProperty()->getNameAsString().c_str()); 5275daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian} 5285daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian 52909105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanianvoid StmtDumper::VisitObjCImplicitSetterGetterRefExpr( 53009105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian ObjCImplicitSetterGetterRefExpr *Node) { 5315daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian DumpExpr(Node); 5321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5335daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian ObjCMethodDecl *Getter = Node->getGetterMethod(); 5345daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian ObjCMethodDecl *Setter = Node->getSetterMethod(); 5351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump fprintf(F, " Kind=MethodRef Getter=\"%s\" Setter=\"%s\"", 536077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner Getter->getSelector().getAsString().c_str(), 537077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner Setter ? Setter->getSelector().getAsString().c_str() : "(null)"); 5387f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar} 5397f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar 540cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregorvoid StmtDumper::VisitObjCSuperExpr(ObjCSuperExpr *Node) { 541cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor DumpExpr(Node); 542cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor fprintf(F, " super"); 543cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor} 544cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor 5456000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 5466000dace22f110d8768476989313e9d981d690d0Chris Lattner// Stmt method implementations 5476000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 5486000dace22f110d8768476989313e9d981d690d0Chris Lattner 5496000dace22f110d8768476989313e9d981d690d0Chris Lattner/// dump - This does a local dump of the specified AST fragment. It dumps the 5506000dace22f110d8768476989313e9d981d690d0Chris Lattner/// specified node and a few nodes underneath it, but not the whole subtree. 5516000dace22f110d8768476989313e9d981d690d0Chris Lattner/// This is useful in a debugger. 552e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattnervoid Stmt::dump(SourceManager &SM) const { 5530c727a35718556866a978f64ac549d9798735f08Chris Lattner StmtDumper P(&SM, stderr, 4); 554b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner P.DumpSubTree(const_cast<Stmt*>(this)); 5550c727a35718556866a978f64ac549d9798735f08Chris Lattner fprintf(stderr, "\n"); 5560c727a35718556866a978f64ac549d9798735f08Chris Lattner} 5570c727a35718556866a978f64ac549d9798735f08Chris Lattner 5580c727a35718556866a978f64ac549d9798735f08Chris Lattner/// dump - This does a local dump of the specified AST fragment. It dumps the 5590c727a35718556866a978f64ac549d9798735f08Chris Lattner/// specified node and a few nodes underneath it, but not the whole subtree. 5600c727a35718556866a978f64ac549d9798735f08Chris Lattner/// This is useful in a debugger. 5616000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dump() const { 5620c727a35718556866a978f64ac549d9798735f08Chris Lattner StmtDumper P(0, stderr, 4); 563b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner P.DumpSubTree(const_cast<Stmt*>(this)); 5640c727a35718556866a978f64ac549d9798735f08Chris Lattner fprintf(stderr, "\n"); 5650c727a35718556866a978f64ac549d9798735f08Chris Lattner} 5660c727a35718556866a978f64ac549d9798735f08Chris Lattner 5670c727a35718556866a978f64ac549d9798735f08Chris Lattner/// dumpAll - This does a dump of the specified AST fragment and all subtrees. 568e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattnervoid Stmt::dumpAll(SourceManager &SM) const { 5690c727a35718556866a978f64ac549d9798735f08Chris Lattner StmtDumper P(&SM, stderr, ~0U); 570b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner P.DumpSubTree(const_cast<Stmt*>(this)); 571ee41ce53f7017591a9d62d5986cf3fd6fc98a120Chris Lattner fprintf(stderr, "\n"); 5726000dace22f110d8768476989313e9d981d690d0Chris Lattner} 5736000dace22f110d8768476989313e9d981d690d0Chris Lattner 5746000dace22f110d8768476989313e9d981d690d0Chris Lattner/// dumpAll - This does a dump of the specified AST fragment and all subtrees. 5756000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dumpAll() const { 5760c727a35718556866a978f64ac549d9798735f08Chris Lattner StmtDumper P(0, stderr, ~0U); 577b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner P.DumpSubTree(const_cast<Stmt*>(this)); 578ee41ce53f7017591a9d62d5986cf3fd6fc98a120Chris Lattner fprintf(stderr, "\n"); 5796000dace22f110d8768476989313e9d981d690d0Chris Lattner} 580