StmtDumper.cpp revision 17a1a72e70dcbd6257dde644c790a3013113174f
16000dace22f110d8768476989313e9d981d690d0Chris Lattner//===--- StmtDumper.cpp - Dumping implementation for Stmt ASTs ------------===//
26000dace22f110d8768476989313e9d981d690d0Chris Lattner//
36000dace22f110d8768476989313e9d981d690d0Chris Lattner//                     The LLVM Compiler Infrastructure
46000dace22f110d8768476989313e9d981d690d0Chris Lattner//
56000dace22f110d8768476989313e9d981d690d0Chris Lattner// This file was developed by Chris Lattner and is distributed under
66000dace22f110d8768476989313e9d981d690d0Chris Lattner// the University of Illinois Open Source 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"
166000dace22f110d8768476989313e9d981d690d0Chris Lattner#include "clang/AST/Decl.h"
176000dace22f110d8768476989313e9d981d690d0Chris Lattner#include "clang/AST/ExprCXX.h"
186000dace22f110d8768476989313e9d981d690d0Chris Lattner#include "clang/Lex/IdentifierTable.h"
196000dace22f110d8768476989313e9d981d690d0Chris Lattner#include "llvm/Support/Compiler.h"
206000dace22f110d8768476989313e9d981d690d0Chris Lattner#include <cstdio>
216000dace22f110d8768476989313e9d981d690d0Chris Lattnerusing namespace clang;
226000dace22f110d8768476989313e9d981d690d0Chris Lattner
236000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
246000dace22f110d8768476989313e9d981d690d0Chris Lattner// StmtDumper Visitor
256000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
266000dace22f110d8768476989313e9d981d690d0Chris Lattner
276000dace22f110d8768476989313e9d981d690d0Chris Lattnernamespace  {
28c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner  class VISIBILITY_HIDDEN StmtDumper : public StmtVisitor<StmtDumper> {
290c727a35718556866a978f64ac549d9798735f08Chris Lattner    const SourceManager *SM;
306000dace22f110d8768476989313e9d981d690d0Chris Lattner    FILE *F;
316000dace22f110d8768476989313e9d981d690d0Chris Lattner    unsigned IndentLevel;
326000dace22f110d8768476989313e9d981d690d0Chris Lattner
336000dace22f110d8768476989313e9d981d690d0Chris Lattner    /// MaxDepth - When doing a normal dump (not dumpAll) we only want to dump
346000dace22f110d8768476989313e9d981d690d0Chris Lattner    /// the first few levels of an AST.  This keeps track of how many ast levels
356000dace22f110d8768476989313e9d981d690d0Chris Lattner    /// are left.
366000dace22f110d8768476989313e9d981d690d0Chris Lattner    unsigned MaxDepth;
376000dace22f110d8768476989313e9d981d690d0Chris Lattner  public:
380c727a35718556866a978f64ac549d9798735f08Chris Lattner    StmtDumper(const SourceManager *sm, FILE *f, unsigned maxDepth)
39b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner      : SM(sm), F(f), IndentLevel(0-1), MaxDepth(maxDepth) {}
406000dace22f110d8768476989313e9d981d690d0Chris Lattner
41f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    void DumpSubTree(Stmt *S) {
426000dace22f110d8768476989313e9d981d690d0Chris Lattner      // Prune the recursion if not using dump all.
436000dace22f110d8768476989313e9d981d690d0Chris Lattner      if (MaxDepth == 0) return;
446000dace22f110d8768476989313e9d981d690d0Chris Lattner
45f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      ++IndentLevel;
466000dace22f110d8768476989313e9d981d690d0Chris Lattner      if (S) {
47c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner        Visit(S);
48b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner
49b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner        // Print out children.
50b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner        Stmt::child_iterator CI = S->child_begin(), CE = S->child_end();
51b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner        if (CI != CE) {
52b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner          while (CI != CE) {
53b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner            fprintf(F, "\n");
54b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner            DumpSubTree(*CI++);
55b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner          }
56b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner        }
57b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner        fprintf(F, ")");
586000dace22f110d8768476989313e9d981d690d0Chris Lattner      } else {
596000dace22f110d8768476989313e9d981d690d0Chris Lattner        Indent();
604a70adba92ff0e26af87360557ee2e9a6ff529d3Chris Lattner        fprintf(F, "<<<NULL>>>");
616000dace22f110d8768476989313e9d981d690d0Chris Lattner      }
62f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      --IndentLevel;
636000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
646000dace22f110d8768476989313e9d981d690d0Chris Lattner
65f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    void DumpDeclarator(Decl *D);
666000dace22f110d8768476989313e9d981d690d0Chris Lattner
676000dace22f110d8768476989313e9d981d690d0Chris Lattner    void Indent() const {
686000dace22f110d8768476989313e9d981d690d0Chris Lattner      for (int i = 0, e = IndentLevel; i < e; ++i)
696000dace22f110d8768476989313e9d981d690d0Chris Lattner        fprintf(F, "  ");
706000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
716000dace22f110d8768476989313e9d981d690d0Chris Lattner
72fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner    void DumpType(QualType T) const {
73fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner      fprintf(F, "'%s'", T.getAsString().c_str());
74fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner
75fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner      // If the type is directly a typedef, strip off typedefness to give at
76fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner      // least one level of concreteness.
77fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner      if (TypedefType *TDT = dyn_cast<TypedefType>(T))
78fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner        fprintf(F, ":'%s'", TDT->LookThroughTypedefs().getAsString().c_str());
79fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner    }
80fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner
816000dace22f110d8768476989313e9d981d690d0Chris Lattner    void DumpStmt(const Stmt *Node) const {
826000dace22f110d8768476989313e9d981d690d0Chris Lattner      Indent();
836000dace22f110d8768476989313e9d981d690d0Chris Lattner      fprintf(F, "(%s %p", Node->getStmtClassName(), (void*)Node);
846000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
856000dace22f110d8768476989313e9d981d690d0Chris Lattner
866000dace22f110d8768476989313e9d981d690d0Chris Lattner    void DumpExpr(Expr *Node) const {
876000dace22f110d8768476989313e9d981d690d0Chris Lattner      DumpStmt(Node);
88fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner      fprintf(F, " ");
89fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner      DumpType(Node->getType());
906000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
916000dace22f110d8768476989313e9d981d690d0Chris Lattner
9217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    // Stmts.
93c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner    void VisitStmt(Stmt *Node);
9417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitDeclStmt(DeclStmt *Node);
9517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitLabelStmt(LabelStmt *Node);
9617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitGotoStmt(GotoStmt *Node);
9717a1a72e70dcbd6257dde644c790a3013113174fChris Lattner
9817a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    // Exprs
9917a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitExpr(Expr *Node);
10017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitDeclRefExpr(DeclRefExpr *Node);
10117a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitPreDefinedExpr(PreDefinedExpr *Node);
10217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitCharacterLiteral(CharacterLiteral *Node);
10317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitIntegerLiteral(IntegerLiteral *Node);
10417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitFloatingLiteral(FloatingLiteral *Node);
10517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitStringLiteral(StringLiteral *Str);
10617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitUnaryOperator(UnaryOperator *Node);
10717a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitSizeOfAlignOfTypeExpr(SizeOfAlignOfTypeExpr *Node);
10817a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitMemberExpr(MemberExpr *Node);
10917a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitOCUVectorElementExpr(OCUVectorElementExpr *Node);
11017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitBinaryOperator(BinaryOperator *Node);
11117a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitCompoundAssignOperator(CompoundAssignOperator *Node);
11217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitAddrLabelExpr(AddrLabelExpr *Node);
11317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitTypesCompatibleExpr(TypesCompatibleExpr *Node);
11417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner
11517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    // C++
11617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitCXXCastExpr(CXXCastExpr *Node);
11717a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node);
11817a1a72e70dcbd6257dde644c790a3013113174fChris Lattner
11917a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    // ObjC
12017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitObjCEncodeExpr(ObjCEncodeExpr *Node);
1216000dace22f110d8768476989313e9d981d690d0Chris Lattner  };
1226000dace22f110d8768476989313e9d981d690d0Chris Lattner}
1236000dace22f110d8768476989313e9d981d690d0Chris Lattner
1246000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
1256000dace22f110d8768476989313e9d981d690d0Chris Lattner//  Stmt printing methods.
1266000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
1276000dace22f110d8768476989313e9d981d690d0Chris Lattner
1286000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitStmt(Stmt *Node) {
12917a1a72e70dcbd6257dde644c790a3013113174fChris Lattner  DumpStmt(Node);
1306000dace22f110d8768476989313e9d981d690d0Chris Lattner}
1316000dace22f110d8768476989313e9d981d690d0Chris Lattner
132f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattnervoid StmtDumper::DumpDeclarator(Decl *D) {
1336000dace22f110d8768476989313e9d981d690d0Chris Lattner  // FIXME: Need to complete/beautify this... this code simply shows the
1346000dace22f110d8768476989313e9d981d690d0Chris Lattner  // nodes are where they need to be.
1356000dace22f110d8768476989313e9d981d690d0Chris Lattner  if (TypedefDecl *localType = dyn_cast<TypedefDecl>(D)) {
136f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    fprintf(F, "\"typedef %s %s\"",
137f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner            localType->getUnderlyingType().getAsString().c_str(),
138f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner            localType->getName());
1396000dace22f110d8768476989313e9d981d690d0Chris Lattner  } else if (ValueDecl *VD = dyn_cast<ValueDecl>(D)) {
140f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    fprintf(F, "\"");
1416000dace22f110d8768476989313e9d981d690d0Chris Lattner    // Emit storage class for vardecls.
1426000dace22f110d8768476989313e9d981d690d0Chris Lattner    if (VarDecl *V = dyn_cast<VarDecl>(VD)) {
1436000dace22f110d8768476989313e9d981d690d0Chris Lattner      switch (V->getStorageClass()) {
144f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      default: assert(0 && "Unknown storage class!");
145f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      case VarDecl::None:     break;
146f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      case VarDecl::Extern:   fprintf(F, "extern "); break;
147f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      case VarDecl::Static:   fprintf(F, "static "); break;
148f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      case VarDecl::Auto:     fprintf(F, "auto "); break;
149f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      case VarDecl::Register: fprintf(F, "register "); break;
1506000dace22f110d8768476989313e9d981d690d0Chris Lattner      }
1516000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
1526000dace22f110d8768476989313e9d981d690d0Chris Lattner
1536000dace22f110d8768476989313e9d981d690d0Chris Lattner    std::string Name = VD->getName();
1546000dace22f110d8768476989313e9d981d690d0Chris Lattner    VD->getType().getAsStringInternal(Name);
155f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    fprintf(F, "%s", Name.c_str());
1566000dace22f110d8768476989313e9d981d690d0Chris Lattner
1576000dace22f110d8768476989313e9d981d690d0Chris Lattner    // If this is a vardecl with an initializer, emit it.
1586000dace22f110d8768476989313e9d981d690d0Chris Lattner    if (VarDecl *V = dyn_cast<VarDecl>(VD)) {
1596000dace22f110d8768476989313e9d981d690d0Chris Lattner      if (V->getInit()) {
160f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner        fprintf(F, " =\n");
161f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner        DumpSubTree(V->getInit());
1626000dace22f110d8768476989313e9d981d690d0Chris Lattner      }
1636000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
164f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    fprintf(F, "\"");
1656000dace22f110d8768476989313e9d981d690d0Chris Lattner  } else {
1666000dace22f110d8768476989313e9d981d690d0Chris Lattner    // FIXME: "struct x;"
1676000dace22f110d8768476989313e9d981d690d0Chris Lattner    assert(0 && "Unexpected decl");
1686000dace22f110d8768476989313e9d981d690d0Chris Lattner  }
1696000dace22f110d8768476989313e9d981d690d0Chris Lattner}
1706000dace22f110d8768476989313e9d981d690d0Chris Lattner
1716000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitDeclStmt(DeclStmt *Node) {
1726000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpStmt(Node);
173f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner  fprintf(F, "\n");
1746000dace22f110d8768476989313e9d981d690d0Chris Lattner  for (Decl *D = Node->getDecl(); D; D = D->getNextDeclarator()) {
175f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    ++IndentLevel;
1766000dace22f110d8768476989313e9d981d690d0Chris Lattner    Indent();
177f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    fprintf(F, "%p ", (void*)D);
178f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    DumpDeclarator(D);
179f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    if (D->getNextDeclarator())
180f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      fprintf(F, "\n");
181f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    --IndentLevel;
1826000dace22f110d8768476989313e9d981d690d0Chris Lattner  }
1836000dace22f110d8768476989313e9d981d690d0Chris Lattner}
1846000dace22f110d8768476989313e9d981d690d0Chris Lattner
1856000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitLabelStmt(LabelStmt *Node) {
1866000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpStmt(Node);
1876000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, " '%s'\n", Node->getName());
1886000dace22f110d8768476989313e9d981d690d0Chris Lattner}
1896000dace22f110d8768476989313e9d981d690d0Chris Lattner
1906000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitGotoStmt(GotoStmt *Node) {
1916000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpStmt(Node);
192b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, " '%s':%p", Node->getLabel()->getName(), (void*)Node->getLabel());
1936000dace22f110d8768476989313e9d981d690d0Chris Lattner}
1946000dace22f110d8768476989313e9d981d690d0Chris Lattner
1956000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
1966000dace22f110d8768476989313e9d981d690d0Chris Lattner//  Expr printing methods.
1976000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
1986000dace22f110d8768476989313e9d981d690d0Chris Lattner
1996000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitExpr(Expr *Node) {
2006000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
2016000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2026000dace22f110d8768476989313e9d981d690d0Chris Lattner
2036000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitDeclRefExpr(DeclRefExpr *Node) {
2046000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
205b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, " Decl='%s' %p", Node->getDecl()->getName(),
2066000dace22f110d8768476989313e9d981d690d0Chris Lattner          (void*)Node->getDecl());
2076000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2086000dace22f110d8768476989313e9d981d690d0Chris Lattner
2096000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitPreDefinedExpr(PreDefinedExpr *Node) {
2106000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
2116000dace22f110d8768476989313e9d981d690d0Chris Lattner  switch (Node->getIdentType()) {
2126000dace22f110d8768476989313e9d981d690d0Chris Lattner  default:
2136000dace22f110d8768476989313e9d981d690d0Chris Lattner    assert(0 && "unknown case");
2146000dace22f110d8768476989313e9d981d690d0Chris Lattner  case PreDefinedExpr::Func:
215b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner    fprintf(F, " __func__");
2166000dace22f110d8768476989313e9d981d690d0Chris Lattner    break;
2176000dace22f110d8768476989313e9d981d690d0Chris Lattner  case PreDefinedExpr::Function:
218b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner    fprintf(F, " __FUNCTION__");
2196000dace22f110d8768476989313e9d981d690d0Chris Lattner    break;
2206000dace22f110d8768476989313e9d981d690d0Chris Lattner  case PreDefinedExpr::PrettyFunction:
221b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner    fprintf(F, " __PRETTY_FUNCTION__");
2226000dace22f110d8768476989313e9d981d690d0Chris Lattner    break;
2236000dace22f110d8768476989313e9d981d690d0Chris Lattner  }
2246000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2256000dace22f110d8768476989313e9d981d690d0Chris Lattner
2266000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCharacterLiteral(CharacterLiteral *Node) {
227a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner  DumpExpr(Node);
228b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, " %d", Node->getValue());
2296000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2306000dace22f110d8768476989313e9d981d690d0Chris Lattner
2316000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitIntegerLiteral(IntegerLiteral *Node) {
2326000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
2336000dace22f110d8768476989313e9d981d690d0Chris Lattner
2346000dace22f110d8768476989313e9d981d690d0Chris Lattner  bool isSigned = Node->getType()->isSignedIntegerType();
235b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, " %s", Node->getValue().toString(10, isSigned).c_str());
2366000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2376000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitFloatingLiteral(FloatingLiteral *Node) {
2386000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
239b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, " %f", Node->getValue());
2406000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2415d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner
2426000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitStringLiteral(StringLiteral *Str) {
243a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner  DumpExpr(Str);
244a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner  // FIXME: this doesn't print wstrings right.
2455fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner  fprintf(F, " %s\"", Str->isWide() ? "L" : "");
246a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner
2476000dace22f110d8768476989313e9d981d690d0Chris Lattner  for (unsigned i = 0, e = Str->getByteLength(); i != e; ++i) {
2485fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    switch (char C = Str->getStrData()[i]) {
2495fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    default:
2505fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner      if (isprint(C))
2515fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner        fputc(C, F);
2525fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner      else
2535fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner        fprintf(F, "\\%03o", C);
2545fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner      break;
2556000dace22f110d8768476989313e9d981d690d0Chris Lattner    // Handle some common ones to make dumps prettier.
2565fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    case '\\': fprintf(F, "\\\\"); break;
2575fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    case '"':  fprintf(F, "\\\""); break;
2585fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    case '\n': fprintf(F, "\\n"); break;
2595fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    case '\t': fprintf(F, "\\t"); break;
2605fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    case '\a': fprintf(F, "\\a"); break;
2615fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    case '\b': fprintf(F, "\\b"); break;
2626000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
2636000dace22f110d8768476989313e9d981d690d0Chris Lattner  }
264b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, "\"");
2656000dace22f110d8768476989313e9d981d690d0Chris Lattner}
26617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner
2676000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitUnaryOperator(UnaryOperator *Node) {
26813cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
269b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, " %s '%s'", Node->isPostfix() ? "postfix" : "prefix",
27013cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner          UnaryOperator::getOpcodeStr(Node->getOpcode()));
2716000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2726000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitSizeOfAlignOfTypeExpr(SizeOfAlignOfTypeExpr *Node) {
27313cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
27413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, " %s ", Node->isSizeOf() ? "sizeof" : "alignof");
27513cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpType(Node->getArgumentType());
2766000dace22f110d8768476989313e9d981d690d0Chris Lattner}
27713cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner
2786000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitMemberExpr(MemberExpr *Node) {
27913cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
280b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, " %s%s %p", Node->isArrow() ? "->" : ".",
28113cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner          Node->getMemberDecl()->getName(), (void*)Node->getMemberDecl());
2826000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2836000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitOCUVectorElementExpr(OCUVectorElementExpr *Node) {
28413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
285b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, " %s", Node->getAccessor().getName());
2866000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2876000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitBinaryOperator(BinaryOperator *Node) {
2886000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
289b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, " '%s'", BinaryOperator::getOpcodeStr(Node->getOpcode()));
290eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner}
291eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattnervoid StmtDumper::VisitCompoundAssignOperator(CompoundAssignOperator *Node) {
292eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  DumpExpr(Node);
293eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  fprintf(F, " '%s' ComputeTy=",
294eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner          BinaryOperator::getOpcodeStr(Node->getOpcode()));
295eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  DumpType(Node->getComputationType());
2966000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2976000dace22f110d8768476989313e9d981d690d0Chris Lattner
2986000dace22f110d8768476989313e9d981d690d0Chris Lattner// GNU extensions.
2996000dace22f110d8768476989313e9d981d690d0Chris Lattner
3006000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitAddrLabelExpr(AddrLabelExpr *Node) {
30113cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
302b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, " %s %p", Node->getLabel()->getName(), (void*)Node->getLabel());
3036000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3046000dace22f110d8768476989313e9d981d690d0Chris Lattner
3056000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitTypesCompatibleExpr(TypesCompatibleExpr *Node) {
30613cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
30713cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, " ");
30813cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpType(Node->getArgType1());
30913cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, " ");
31013cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpType(Node->getArgType2());
3116000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3126000dace22f110d8768476989313e9d981d690d0Chris Lattner
313f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===//
314f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner// C++ Expressions
315f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===//
3166000dace22f110d8768476989313e9d981d690d0Chris Lattner
3176000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCXXCastExpr(CXXCastExpr *Node) {
31813cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
319b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, " %s", CXXCastExpr::getOpcodeStr(Node->getOpcode()));
3206000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3216000dace22f110d8768476989313e9d981d690d0Chris Lattner
3226000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) {
32313cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
324b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  fprintf(F, " %s", Node->getValue() ? "true" : "false");
3256000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3266000dace22f110d8768476989313e9d981d690d0Chris Lattner
3275508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===//
3285508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// Obj-C Expressions
3295508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===//
3305508518a2702b00be3b15a26d772bde968972f54Anders Carlsson
331f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlssonvoid StmtDumper::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) {
332f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson  DumpExpr(Node);
333f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson
334f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson  fprintf(F, " ");
335f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson  DumpType(Node->getEncodedType());
336f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson}
337f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson
3386000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
3396000dace22f110d8768476989313e9d981d690d0Chris Lattner// Stmt method implementations
3406000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
3416000dace22f110d8768476989313e9d981d690d0Chris Lattner
3426000dace22f110d8768476989313e9d981d690d0Chris Lattner/// dump - This does a local dump of the specified AST fragment.  It dumps the
3436000dace22f110d8768476989313e9d981d690d0Chris Lattner/// specified node and a few nodes underneath it, but not the whole subtree.
3446000dace22f110d8768476989313e9d981d690d0Chris Lattner/// This is useful in a debugger.
3450c727a35718556866a978f64ac549d9798735f08Chris Lattnervoid Stmt::dump(const SourceManager &SM) const {
3460c727a35718556866a978f64ac549d9798735f08Chris Lattner  StmtDumper P(&SM, stderr, 4);
347b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  P.DumpSubTree(const_cast<Stmt*>(this));
3480c727a35718556866a978f64ac549d9798735f08Chris Lattner  fprintf(stderr, "\n");
3490c727a35718556866a978f64ac549d9798735f08Chris Lattner}
3500c727a35718556866a978f64ac549d9798735f08Chris Lattner
3510c727a35718556866a978f64ac549d9798735f08Chris Lattner/// dump - This does a local dump of the specified AST fragment.  It dumps the
3520c727a35718556866a978f64ac549d9798735f08Chris Lattner/// specified node and a few nodes underneath it, but not the whole subtree.
3530c727a35718556866a978f64ac549d9798735f08Chris Lattner/// This is useful in a debugger.
3546000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dump() const {
3550c727a35718556866a978f64ac549d9798735f08Chris Lattner  StmtDumper P(0, stderr, 4);
356b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  P.DumpSubTree(const_cast<Stmt*>(this));
3570c727a35718556866a978f64ac549d9798735f08Chris Lattner  fprintf(stderr, "\n");
3580c727a35718556866a978f64ac549d9798735f08Chris Lattner}
3590c727a35718556866a978f64ac549d9798735f08Chris Lattner
3600c727a35718556866a978f64ac549d9798735f08Chris Lattner/// dumpAll - This does a dump of the specified AST fragment and all subtrees.
3610c727a35718556866a978f64ac549d9798735f08Chris Lattnervoid Stmt::dumpAll(const SourceManager &SM) const {
3620c727a35718556866a978f64ac549d9798735f08Chris Lattner  StmtDumper P(&SM, stderr, ~0U);
363b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  P.DumpSubTree(const_cast<Stmt*>(this));
364ee41ce53f7017591a9d62d5986cf3fd6fc98a120Chris Lattner  fprintf(stderr, "\n");
3656000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3666000dace22f110d8768476989313e9d981d690d0Chris Lattner
3676000dace22f110d8768476989313e9d981d690d0Chris Lattner/// dumpAll - This does a dump of the specified AST fragment and all subtrees.
3686000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dumpAll() const {
3690c727a35718556866a978f64ac549d9798735f08Chris Lattner  StmtDumper P(0, stderr, ~0U);
370b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner  P.DumpSubTree(const_cast<Stmt*>(this));
371ee41ce53f7017591a9d62d5986cf3fd6fc98a120Chris Lattner  fprintf(stderr, "\n");
3726000dace22f110d8768476989313e9d981d690d0Chris Lattner}
373