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