StmtDumper.cpp revision 2e1cd4264d363ca869bf37ef160902f211d21b8c
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"
17e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner#include "clang/Basic/SourceManager.h"
186000dace22f110d8768476989313e9d981d690d0Chris Lattner#include "llvm/Support/Compiler.h"
196000dace22f110d8768476989313e9d981d690d0Chris Lattner#include <cstdio>
206000dace22f110d8768476989313e9d981d690d0Chris Lattnerusing namespace clang;
216000dace22f110d8768476989313e9d981d690d0Chris Lattner
226000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
236000dace22f110d8768476989313e9d981d690d0Chris Lattner// StmtDumper Visitor
246000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
256000dace22f110d8768476989313e9d981d690d0Chris Lattner
266000dace22f110d8768476989313e9d981d690d0Chris Lattnernamespace  {
27c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner  class VISIBILITY_HIDDEN StmtDumper : public StmtVisitor<StmtDumper> {
28e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    SourceManager *SM;
296000dace22f110d8768476989313e9d981d690d0Chris Lattner    FILE *F;
306000dace22f110d8768476989313e9d981d690d0Chris Lattner    unsigned IndentLevel;
316000dace22f110d8768476989313e9d981d690d0Chris Lattner
326000dace22f110d8768476989313e9d981d690d0Chris Lattner    /// MaxDepth - When doing a normal dump (not dumpAll) we only want to dump
336000dace22f110d8768476989313e9d981d690d0Chris Lattner    /// the first few levels of an AST.  This keeps track of how many ast levels
346000dace22f110d8768476989313e9d981d690d0Chris Lattner    /// are left.
356000dace22f110d8768476989313e9d981d690d0Chris Lattner    unsigned MaxDepth;
36e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
37e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    /// LastLocFilename/LastLocLine - Keep track of the last location we print
38e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    /// out so that we can print out deltas from then on out.
39e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    const char *LastLocFilename;
40e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    unsigned LastLocLine;
416000dace22f110d8768476989313e9d981d690d0Chris Lattner  public:
42e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    StmtDumper(SourceManager *sm, FILE *f, unsigned maxDepth)
43e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner      : SM(sm), F(f), IndentLevel(0-1), MaxDepth(maxDepth) {
44e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner      LastLocFilename = "";
45e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner      LastLocLine = ~0U;
46e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    }
476000dace22f110d8768476989313e9d981d690d0Chris Lattner
48f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    void DumpSubTree(Stmt *S) {
496000dace22f110d8768476989313e9d981d690d0Chris Lattner      // Prune the recursion if not using dump all.
506000dace22f110d8768476989313e9d981d690d0Chris Lattner      if (MaxDepth == 0) return;
516000dace22f110d8768476989313e9d981d690d0Chris Lattner
52f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      ++IndentLevel;
536000dace22f110d8768476989313e9d981d690d0Chris Lattner      if (S) {
545399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek        if (DeclStmt* DS = dyn_cast<DeclStmt>(S))
555399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek          VisitDeclStmt(DS);
565399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek        else {
575399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek          Visit(S);
585399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek
595399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek          // Print out children.
605399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek          Stmt::child_iterator CI = S->child_begin(), CE = S->child_end();
615399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek          if (CI != CE) {
625399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek            while (CI != CE) {
635399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek              fprintf(F, "\n");
645399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek              DumpSubTree(*CI++);
655399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek            }
66b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner          }
675399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek          fprintf(F, ")");
68b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner        }
696000dace22f110d8768476989313e9d981d690d0Chris Lattner      } else {
706000dace22f110d8768476989313e9d981d690d0Chris Lattner        Indent();
714a70adba92ff0e26af87360557ee2e9a6ff529d3Chris Lattner        fprintf(F, "<<<NULL>>>");
726000dace22f110d8768476989313e9d981d690d0Chris Lattner      }
73f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      --IndentLevel;
746000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
756000dace22f110d8768476989313e9d981d690d0Chris Lattner
76f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    void DumpDeclarator(Decl *D);
776000dace22f110d8768476989313e9d981d690d0Chris Lattner
786000dace22f110d8768476989313e9d981d690d0Chris Lattner    void Indent() const {
796000dace22f110d8768476989313e9d981d690d0Chris Lattner      for (int i = 0, e = IndentLevel; i < e; ++i)
806000dace22f110d8768476989313e9d981d690d0Chris Lattner        fprintf(F, "  ");
816000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
826000dace22f110d8768476989313e9d981d690d0Chris Lattner
839dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff    void DumpType(QualType T) {
84fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner      fprintf(F, "'%s'", T.getAsString().c_str());
85fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner
86fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner      // If the type is directly a typedef, strip off typedefness to give at
87fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner      // least one level of concreteness.
88bad37858aef8910195a9c75f2892a09a032424b7Chris Lattner      if (TypedefType *TDT = dyn_cast<TypedefType>(T)) {
89bad37858aef8910195a9c75f2892a09a032424b7Chris Lattner        QualType Simplified =
90bad37858aef8910195a9c75f2892a09a032424b7Chris Lattner          TDT->LookThroughTypedefs().getQualifiedType(T.getCVRQualifiers());
91bad37858aef8910195a9c75f2892a09a032424b7Chris Lattner        fprintf(F, ":'%s'", Simplified.getAsString().c_str());
92bad37858aef8910195a9c75f2892a09a032424b7Chris Lattner      }
93fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner    }
949dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff    void DumpStmt(const Stmt *Node) {
956000dace22f110d8768476989313e9d981d690d0Chris Lattner      Indent();
966000dace22f110d8768476989313e9d981d690d0Chris Lattner      fprintf(F, "(%s %p", Node->getStmtClassName(), (void*)Node);
979dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff      DumpSourceRange(Node);
986000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
999dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff    void DumpExpr(const Expr *Node) {
1006000dace22f110d8768476989313e9d981d690d0Chris Lattner      DumpStmt(Node);
101fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner      fprintf(F, " ");
102fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner      DumpType(Node->getType());
1036000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
1049dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff    void DumpSourceRange(const Stmt *Node);
105e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    void DumpLocation(SourceLocation Loc);
106e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
10717a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    // Stmts.
108c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner    void VisitStmt(Stmt *Node);
1095399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek    void VisitDeclStmt(DeclStmt *Node);
11017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitLabelStmt(LabelStmt *Node);
11117a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitGotoStmt(GotoStmt *Node);
11217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner
11317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    // Exprs
11417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitExpr(Expr *Node);
11517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitDeclRefExpr(DeclRefExpr *Node);
116d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner    void VisitPredefinedExpr(PredefinedExpr *Node);
11717a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitCharacterLiteral(CharacterLiteral *Node);
11817a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitIntegerLiteral(IntegerLiteral *Node);
11917a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitFloatingLiteral(FloatingLiteral *Node);
12017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitStringLiteral(StringLiteral *Str);
12117a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitUnaryOperator(UnaryOperator *Node);
1220518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl    void VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *Node);
12317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitMemberExpr(MemberExpr *Node);
124213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman    void VisitExtVectorElementExpr(ExtVectorElementExpr *Node);
12517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitBinaryOperator(BinaryOperator *Node);
12617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitCompoundAssignOperator(CompoundAssignOperator *Node);
12717a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitAddrLabelExpr(AddrLabelExpr *Node);
12817a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitTypesCompatibleExpr(TypesCompatibleExpr *Node);
12917a1a72e70dcbd6257dde644c790a3013113174fChris Lattner
13017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    // C++
13149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor    void VisitCXXNamedCastExpr(CXXNamedCastExpr *Node);
13217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node);
133cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor    void VisitCXXThisExpr(CXXThisExpr *Node);
13449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor    void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node);
135cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor
13617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    // ObjC
13717a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitObjCEncodeExpr(ObjCEncodeExpr *Node);
138b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek    void VisitObjCMessageExpr(ObjCMessageExpr* Node);
139b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian    void VisitObjCSelectorExpr(ObjCSelectorExpr *Node);
140390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian    void VisitObjCProtocolExpr(ObjCProtocolExpr *Node);
1417f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar    void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node);
1423c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff    void VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node);
143cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor    void VisitObjCSuperExpr(ObjCSuperExpr *Node);
1446000dace22f110d8768476989313e9d981d690d0Chris Lattner  };
1456000dace22f110d8768476989313e9d981d690d0Chris Lattner}
1466000dace22f110d8768476989313e9d981d690d0Chris Lattner
1476000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
148e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//  Utilities
149e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//===----------------------------------------------------------------------===//
150e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
151e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattnervoid StmtDumper::DumpLocation(SourceLocation Loc) {
152e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  SourceLocation PhysLoc = SM->getPhysicalLoc(Loc);
153e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
154e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  // The general format we print out is filename:line:col, but we drop pieces
155e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  // that haven't changed since the last loc printed.
156e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  const char *Filename = SM->getSourceName(PhysLoc);
157e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  unsigned LineNo = SM->getLineNumber(PhysLoc);
158e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  if (strcmp(Filename, LastLocFilename) != 0) {
159e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    fprintf(stderr, "%s:%u:%u", Filename, LineNo, SM->getColumnNumber(PhysLoc));
160e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    LastLocFilename = Filename;
161e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    LastLocLine = LineNo;
162e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  } else if (LineNo != LastLocLine) {
163e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    fprintf(stderr, "line:%u:%u", LineNo, SM->getColumnNumber(PhysLoc));
164e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    LastLocLine = LineNo;
165e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  } else {
166e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    fprintf(stderr, "col:%u", SM->getColumnNumber(PhysLoc));
167e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  }
168e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner}
169e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
1709dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroffvoid StmtDumper::DumpSourceRange(const Stmt *Node) {
171e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  // Can't translate locations if a SourceManager isn't available.
172e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  if (SM == 0) return;
173e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
174e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  // TODO: If the parent expression is available, we can print a delta vs its
175e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  // location.
176e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  SourceRange R = Node->getSourceRange();
177e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
178e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  fprintf(stderr, " <");
179311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner  DumpLocation(R.getBegin());
180311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner  if (R.getBegin() != R.getEnd()) {
181e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    fprintf(stderr, ", ");
182311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner    DumpLocation(R.getEnd());
183e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  }
184e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  fprintf(stderr, ">");
185e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
186e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  // <t2.c:123:421[blah], t2.c:412:321>
187e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
188e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner}
189e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
190e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
191e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//===----------------------------------------------------------------------===//
1926000dace22f110d8768476989313e9d981d690d0Chris Lattner//  Stmt printing methods.
1936000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
1946000dace22f110d8768476989313e9d981d690d0Chris Lattner
1956000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitStmt(Stmt *Node) {
19617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner  DumpStmt(Node);
1976000dace22f110d8768476989313e9d981d690d0Chris Lattner}
1986000dace22f110d8768476989313e9d981d690d0Chris Lattner
199f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattnervoid StmtDumper::DumpDeclarator(Decl *D) {
2006000dace22f110d8768476989313e9d981d690d0Chris Lattner  // FIXME: Need to complete/beautify this... this code simply shows the
2016000dace22f110d8768476989313e9d981d690d0Chris Lattner  // nodes are where they need to be.
2026000dace22f110d8768476989313e9d981d690d0Chris Lattner  if (TypedefDecl *localType = dyn_cast<TypedefDecl>(D)) {
203f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    fprintf(F, "\"typedef %s %s\"",
204f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner            localType->getUnderlyingType().getAsString().c_str(),
2052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor            localType->getIdentifierName());
2066000dace22f110d8768476989313e9d981d690d0Chris Lattner  } else if (ValueDecl *VD = dyn_cast<ValueDecl>(D)) {
207f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    fprintf(F, "\"");
2086000dace22f110d8768476989313e9d981d690d0Chris Lattner    // Emit storage class for vardecls.
2096000dace22f110d8768476989313e9d981d690d0Chris Lattner    if (VarDecl *V = dyn_cast<VarDecl>(VD)) {
2106000dace22f110d8768476989313e9d981d690d0Chris Lattner      switch (V->getStorageClass()) {
211f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      default: assert(0 && "Unknown storage class!");
212f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      case VarDecl::None:     break;
213f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      case VarDecl::Extern:   fprintf(F, "extern "); break;
214f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      case VarDecl::Static:   fprintf(F, "static "); break;
215f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      case VarDecl::Auto:     fprintf(F, "auto "); break;
216f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      case VarDecl::Register: fprintf(F, "register "); break;
2176000dace22f110d8768476989313e9d981d690d0Chris Lattner      }
2186000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
2196000dace22f110d8768476989313e9d981d690d0Chris Lattner
2206000dace22f110d8768476989313e9d981d690d0Chris Lattner    std::string Name = VD->getName();
2216000dace22f110d8768476989313e9d981d690d0Chris Lattner    VD->getType().getAsStringInternal(Name);
222f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    fprintf(F, "%s", Name.c_str());
2236000dace22f110d8768476989313e9d981d690d0Chris Lattner
2246000dace22f110d8768476989313e9d981d690d0Chris Lattner    // If this is a vardecl with an initializer, emit it.
2256000dace22f110d8768476989313e9d981d690d0Chris Lattner    if (VarDecl *V = dyn_cast<VarDecl>(VD)) {
2266000dace22f110d8768476989313e9d981d690d0Chris Lattner      if (V->getInit()) {
227f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner        fprintf(F, " =\n");
228f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner        DumpSubTree(V->getInit());
2296000dace22f110d8768476989313e9d981d690d0Chris Lattner      }
2306000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
231f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    fprintf(F, "\"");
2329219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff  } else if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
2339219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff    // print a free standing tag decl (e.g. "struct x;").
2349219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff    const char *tagname;
2359219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff    if (const IdentifierInfo *II = TD->getIdentifier())
2369219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff      tagname = II->getName();
2379219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff    else
2389219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff      tagname = "<anonymous>";
2399219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff    fprintf(F, "\"%s %s;\"", TD->getKindName(), tagname);
2409219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff    // FIXME: print tag bodies.
2416000dace22f110d8768476989313e9d981d690d0Chris Lattner  } else {
2426000dace22f110d8768476989313e9d981d690d0Chris Lattner    assert(0 && "Unexpected decl");
2436000dace22f110d8768476989313e9d981d690d0Chris Lattner  }
2446000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2456000dace22f110d8768476989313e9d981d690d0Chris Lattner
2465399ce26f27e6d093417a3882e38da8738a78fefTed Kremenekvoid StmtDumper::VisitDeclStmt(DeclStmt *Node) {
2475399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek  DumpStmt(Node);
2485399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek  fprintf(F,"\n");
24904a72b77da736734c925d673834888a081f5ebc5Ted Kremenek  for (DeclStmt::decl_iterator DI = Node->decl_begin(), DE = Node->decl_end();
25004a72b77da736734c925d673834888a081f5ebc5Ted Kremenek       DI != DE; ++DI) {
25104a72b77da736734c925d673834888a081f5ebc5Ted Kremenek    ScopedDecl* D = *DI;
2525399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek    ++IndentLevel;
2535399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek    Indent();
2545399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek    fprintf(F, "%p ", (void*) D);
2555399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek    DumpDeclarator(D);
2565399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek    if (D->getNextDeclarator())
2575399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek      fprintf(F,"\n");
2585399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek    --IndentLevel;
2595399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek  }
2605399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek}
2615399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek
2626000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitLabelStmt(LabelStmt *Node) {
2636000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpStmt(Node);
2643cb640bad3e6d8a40897f0a02c5ed6dcb14d1418Chris Lattner  fprintf(F, " '%s'", Node->getName());
2656000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2666000dace22f110d8768476989313e9d981d690d0Chris Lattner
2676000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitGotoStmt(GotoStmt *Node) {
2686000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpStmt(Node);
269b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, " '%s':%p", Node->getLabel()->getName(), (void*)Node->getLabel());
2706000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2716000dace22f110d8768476989313e9d981d690d0Chris Lattner
2726000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
2736000dace22f110d8768476989313e9d981d690d0Chris Lattner//  Expr printing methods.
2746000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
2756000dace22f110d8768476989313e9d981d690d0Chris Lattner
2766000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitExpr(Expr *Node) {
2776000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
2786000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2796000dace22f110d8768476989313e9d981d690d0Chris Lattner
2806000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitDeclRefExpr(DeclRefExpr *Node) {
2816000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
282eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek
283eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek  fprintf(F, " ");
284eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek  switch (Node->getDecl()->getKind()) {
285eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek    case Decl::Function: fprintf(F,"FunctionDecl"); break;
286248a753f6b670692523c99afaeb8fe98f7ae3ca7Steve Naroff    case Decl::Var: fprintf(F,"Var"); break;
287aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner    case Decl::ParmVar: fprintf(F,"ParmVar"); break;
288eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek    case Decl::EnumConstant: fprintf(F,"EnumConstant"); break;
289eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek    case Decl::Typedef: fprintf(F,"Typedef"); break;
29035bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis    case Decl::Record: fprintf(F,"Record"); break;
291eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek    case Decl::Enum: fprintf(F,"Enum"); break;
29235bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis    case Decl::CXXRecord: fprintf(F,"CXXRecord"); break;
293a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek    case Decl::ObjCInterface: fprintf(F,"ObjCInterface"); break;
294a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek    case Decl::ObjCClass: fprintf(F,"ObjCClass"); break;
295eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek    default: fprintf(F,"Decl"); break;
296eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek  }
297eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek
2982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  fprintf(F, "='%s' %p", Node->getDecl()->getName().c_str(),
2992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor          (void*)Node->getDecl());
3006000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3016000dace22f110d8768476989313e9d981d690d0Chris Lattner
3023c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroffvoid StmtDumper::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
303466c2e3af049964f3a573917bd04d6b6ce1d121dSteve Naroff  DumpExpr(Node);
3043c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff
305466c2e3af049964f3a573917bd04d6b6ce1d121dSteve Naroff  fprintf(F, " %sDecl='%s' %p", Node->getDecl()->getDeclKindName(),
3062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor                            Node->getDecl()->getIdentifierName(),
3072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor          (void*)Node->getDecl());
308218543b10e81ea2269ef6ae34d2d8ddbdec54dbeSteve Naroff  if (Node->isFreeIvar())
309218543b10e81ea2269ef6ae34d2d8ddbdec54dbeSteve Naroff    fprintf(F, " isFreeIvar");
3103c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff}
3113c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff
312d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattnervoid StmtDumper::VisitPredefinedExpr(PredefinedExpr *Node) {
3136000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
3146000dace22f110d8768476989313e9d981d690d0Chris Lattner  switch (Node->getIdentType()) {
3150d17f6f7b1882850fa56ad38cca0ee518869255bChris Lattner  default: assert(0 && "unknown case");
316d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner  case PredefinedExpr::Func:           fprintf(F, " __func__"); break;
317d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner  case PredefinedExpr::Function:       fprintf(F, " __FUNCTION__"); break;
318d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner  case PredefinedExpr::PrettyFunction: fprintf(F, " __PRETTY_FUNCTION__");break;
3196000dace22f110d8768476989313e9d981d690d0Chris Lattner  }
3206000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3216000dace22f110d8768476989313e9d981d690d0Chris Lattner
3226000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCharacterLiteral(CharacterLiteral *Node) {
323a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner  DumpExpr(Node);
324b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, " %d", Node->getValue());
3256000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3266000dace22f110d8768476989313e9d981d690d0Chris Lattner
3276000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitIntegerLiteral(IntegerLiteral *Node) {
3286000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
3296000dace22f110d8768476989313e9d981d690d0Chris Lattner
3306000dace22f110d8768476989313e9d981d690d0Chris Lattner  bool isSigned = Node->getType()->isSignedIntegerType();
331b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, " %s", Node->getValue().toString(10, isSigned).c_str());
3326000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3336000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitFloatingLiteral(FloatingLiteral *Node) {
3346000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
335da8249e57f3badecf925571881fe57243935c6c1Chris Lattner  fprintf(F, " %f", Node->getValueAsApproximateDouble());
3366000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3375d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner
3386000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitStringLiteral(StringLiteral *Str) {
339a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner  DumpExpr(Str);
340a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner  // FIXME: this doesn't print wstrings right.
3415fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner  fprintf(F, " %s\"", Str->isWide() ? "L" : "");
342a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner
3436000dace22f110d8768476989313e9d981d690d0Chris Lattner  for (unsigned i = 0, e = Str->getByteLength(); i != e; ++i) {
3445fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    switch (char C = Str->getStrData()[i]) {
3455fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    default:
3465fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner      if (isprint(C))
3475fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner        fputc(C, F);
3485fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner      else
3495fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner        fprintf(F, "\\%03o", C);
3505fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner      break;
3516000dace22f110d8768476989313e9d981d690d0Chris Lattner    // Handle some common ones to make dumps prettier.
3525fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    case '\\': fprintf(F, "\\\\"); break;
3535fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    case '"':  fprintf(F, "\\\""); break;
3545fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    case '\n': fprintf(F, "\\n"); break;
3555fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    case '\t': fprintf(F, "\\t"); break;
3565fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    case '\a': fprintf(F, "\\a"); break;
3575fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    case '\b': fprintf(F, "\\b"); break;
3586000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
3596000dace22f110d8768476989313e9d981d690d0Chris Lattner  }
360b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, "\"");
3616000dace22f110d8768476989313e9d981d690d0Chris Lattner}
36217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner
3636000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitUnaryOperator(UnaryOperator *Node) {
36413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
365b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, " %s '%s'", Node->isPostfix() ? "postfix" : "prefix",
36613cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner          UnaryOperator::getOpcodeStr(Node->getOpcode()));
3676000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3680518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redlvoid StmtDumper::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *Node) {
36913cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
37013cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, " %s ", Node->isSizeOf() ? "sizeof" : "alignof");
3710518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  if (Node->isArgumentType())
3720518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl    DumpType(Node->getArgumentType());
3736000dace22f110d8768476989313e9d981d690d0Chris Lattner}
37413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner
3756000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitMemberExpr(MemberExpr *Node) {
37613cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
377b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, " %s%s %p", Node->isArrow() ? "->" : ".",
3782e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor          Node->getMemberDecl()->getName().c_str(),
3792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor          (void*)Node->getMemberDecl());
3806000dace22f110d8768476989313e9d981d690d0Chris Lattner}
381213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanvoid StmtDumper::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) {
38213cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
383b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, " %s", Node->getAccessor().getName());
3846000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3856000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitBinaryOperator(BinaryOperator *Node) {
3866000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
387b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, " '%s'", BinaryOperator::getOpcodeStr(Node->getOpcode()));
388eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner}
389eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattnervoid StmtDumper::VisitCompoundAssignOperator(CompoundAssignOperator *Node) {
390eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  DumpExpr(Node);
391eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  fprintf(F, " '%s' ComputeTy=",
392eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner          BinaryOperator::getOpcodeStr(Node->getOpcode()));
393eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  DumpType(Node->getComputationType());
3946000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3956000dace22f110d8768476989313e9d981d690d0Chris Lattner
3966000dace22f110d8768476989313e9d981d690d0Chris Lattner// GNU extensions.
3976000dace22f110d8768476989313e9d981d690d0Chris Lattner
3986000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitAddrLabelExpr(AddrLabelExpr *Node) {
39913cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
400b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, " %s %p", Node->getLabel()->getName(), (void*)Node->getLabel());
4016000dace22f110d8768476989313e9d981d690d0Chris Lattner}
4026000dace22f110d8768476989313e9d981d690d0Chris Lattner
4036000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitTypesCompatibleExpr(TypesCompatibleExpr *Node) {
40413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
40513cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, " ");
40613cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpType(Node->getArgType1());
40713cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, " ");
40813cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpType(Node->getArgType2());
4096000dace22f110d8768476989313e9d981d690d0Chris Lattner}
4106000dace22f110d8768476989313e9d981d690d0Chris Lattner
411f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===//
412f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner// C++ Expressions
413f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===//
4146000dace22f110d8768476989313e9d981d690d0Chris Lattner
41549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtDumper::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) {
41613cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
41749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  fprintf(F, " %s<%s>", Node->getCastName(),
41849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor          Node->getTypeAsWritten().getAsString().c_str());
4196000dace22f110d8768476989313e9d981d690d0Chris Lattner}
4206000dace22f110d8768476989313e9d981d690d0Chris Lattner
4216000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) {
42213cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
423b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, " %s", Node->getValue() ? "true" : "false");
4246000dace22f110d8768476989313e9d981d690d0Chris Lattner}
4256000dace22f110d8768476989313e9d981d690d0Chris Lattner
426cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregorvoid StmtDumper::VisitCXXThisExpr(CXXThisExpr *Node) {
427cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor  DumpExpr(Node);
428cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor  fprintf(F, " this");
429cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor}
430cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor
43149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtDumper::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) {
43249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  DumpExpr(Node);
43349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  fprintf(F, " functional cast to %s",
43449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor          Node->getTypeAsWritten().getAsString().c_str());
43549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
43649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
4375508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===//
4385508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// Obj-C Expressions
4395508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===//
4405508518a2702b00be3b15a26d772bde968972f54Anders Carlsson
441b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenekvoid StmtDumper::VisitObjCMessageExpr(ObjCMessageExpr* Node) {
442b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek  DumpExpr(Node);
443b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek  fprintf(F, " selector=%s", Node->getSelector().getName().c_str());
444ea958e57a370b641c5a69347b75e9f8e3b5a41a2Ted Kremenek  IdentifierInfo* clsName = Node->getClassName();
445ea958e57a370b641c5a69347b75e9f8e3b5a41a2Ted Kremenek  if (clsName) fprintf(F, " class=%s", clsName->getName());
446b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek}
447b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek
448f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlssonvoid StmtDumper::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) {
449f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson  DumpExpr(Node);
450f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson
451f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson  fprintf(F, " ");
452f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson  DumpType(Node->getEncodedType());
453f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson}
454f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson
455b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanianvoid StmtDumper::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) {
456b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian  DumpExpr(Node);
457b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian
458b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian  fprintf(F, " ");
45997b7f26a92d87e514530a5b652460190ce48c974Ted Kremenek  Selector selector = Node->getSelector();
460c5c42f5311b2ef40faefc976f03f408e10697a48Fariborz Jahanian  fprintf(F, "%s", selector.getName().c_str());
461b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian}
462b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian
463390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanianvoid StmtDumper::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) {
464390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian  DumpExpr(Node);
465390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian
466390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian  fprintf(F, " ");
4672e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  fprintf(F, "%s", Node->getProtocol()->getIdentifierName());
468390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian}
4697f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar
4707f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbarvoid StmtDumper::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
4717f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar  DumpExpr(Node);
472e66f4e3e3ae9d7d11b0c302211066fad69228abaDaniel Dunbar
473e66f4e3e3ae9d7d11b0c302211066fad69228abaDaniel Dunbar  if (Node->getKind() == ObjCPropertyRefExpr::MethodRef) {
474e66f4e3e3ae9d7d11b0c302211066fad69228abaDaniel Dunbar    ObjCMethodDecl *Getter = Node->getGetterMethod();
475e66f4e3e3ae9d7d11b0c302211066fad69228abaDaniel Dunbar    ObjCMethodDecl *Setter = Node->getSetterMethod();
476e66f4e3e3ae9d7d11b0c302211066fad69228abaDaniel Dunbar    fprintf(F, " Kind=MethodRef Getter=\"%s\" Setter=\"%s\"",
477e66f4e3e3ae9d7d11b0c302211066fad69228abaDaniel Dunbar            Getter->getSelector().getName().c_str(),
478e66f4e3e3ae9d7d11b0c302211066fad69228abaDaniel Dunbar            Setter ? Setter->getSelector().getName().c_str() : "(null)");
4797f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar  } else {
4802e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    fprintf(F, " Kind=PropertyRef Property=\"%s\"",
4812e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor            Node->getProperty()->getIdentifierName());
4827f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar  }
4837f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar}
4847f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar
485cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregorvoid StmtDumper::VisitObjCSuperExpr(ObjCSuperExpr *Node) {
486cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor  DumpExpr(Node);
487cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor  fprintf(F, " super");
488cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor}
489cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor
4906000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
4916000dace22f110d8768476989313e9d981d690d0Chris Lattner// Stmt method implementations
4926000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
4936000dace22f110d8768476989313e9d981d690d0Chris Lattner
4946000dace22f110d8768476989313e9d981d690d0Chris Lattner/// dump - This does a local dump of the specified AST fragment.  It dumps the
4956000dace22f110d8768476989313e9d981d690d0Chris Lattner/// specified node and a few nodes underneath it, but not the whole subtree.
4966000dace22f110d8768476989313e9d981d690d0Chris Lattner/// This is useful in a debugger.
497e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattnervoid Stmt::dump(SourceManager &SM) const {
4980c727a35718556866a978f64ac549d9798735f08Chris Lattner  StmtDumper P(&SM, stderr, 4);
499b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  P.DumpSubTree(const_cast<Stmt*>(this));
5000c727a35718556866a978f64ac549d9798735f08Chris Lattner  fprintf(stderr, "\n");
5010c727a35718556866a978f64ac549d9798735f08Chris Lattner}
5020c727a35718556866a978f64ac549d9798735f08Chris Lattner
5030c727a35718556866a978f64ac549d9798735f08Chris Lattner/// dump - This does a local dump of the specified AST fragment.  It dumps the
5040c727a35718556866a978f64ac549d9798735f08Chris Lattner/// specified node and a few nodes underneath it, but not the whole subtree.
5050c727a35718556866a978f64ac549d9798735f08Chris Lattner/// This is useful in a debugger.
5066000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dump() const {
5070c727a35718556866a978f64ac549d9798735f08Chris Lattner  StmtDumper P(0, stderr, 4);
508b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  P.DumpSubTree(const_cast<Stmt*>(this));
5090c727a35718556866a978f64ac549d9798735f08Chris Lattner  fprintf(stderr, "\n");
5100c727a35718556866a978f64ac549d9798735f08Chris Lattner}
5110c727a35718556866a978f64ac549d9798735f08Chris Lattner
5120c727a35718556866a978f64ac549d9798735f08Chris Lattner/// dumpAll - This does a dump of the specified AST fragment and all subtrees.
513e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattnervoid Stmt::dumpAll(SourceManager &SM) const {
5140c727a35718556866a978f64ac549d9798735f08Chris Lattner  StmtDumper P(&SM, stderr, ~0U);
515b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  P.DumpSubTree(const_cast<Stmt*>(this));
516ee41ce53f7017591a9d62d5986cf3fd6fc98a120Chris Lattner  fprintf(stderr, "\n");
5176000dace22f110d8768476989313e9d981d690d0Chris Lattner}
5186000dace22f110d8768476989313e9d981d690d0Chris Lattner
5196000dace22f110d8768476989313e9d981d690d0Chris Lattner/// dumpAll - This does a dump of the specified AST fragment and all subtrees.
5206000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dumpAll() const {
5210c727a35718556866a978f64ac549d9798735f08Chris Lattner  StmtDumper P(0, stderr, ~0U);
522b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  P.DumpSubTree(const_cast<Stmt*>(this));
523ee41ce53f7017591a9d62d5986cf3fd6fc98a120Chris Lattner  fprintf(stderr, "\n");
5246000dace22f110d8768476989313e9d981d690d0Chris Lattner}
525