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