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