StmtPrinter.cpp revision 5c37de788529cd9180f22069970737a7208bd625
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- StmtPrinter.cpp - Printing implementation for Stmt ASTs ----------===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
106000dace22f110d8768476989313e9d981d690d0Chris Lattner// This file implements the Stmt::dumpPretty/Stmt::printPretty methods, which
116000dace22f110d8768476989313e9d981d690d0Chris Lattner// pretty print the AST back out to C code.
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/StmtVisitor.h"
1691d1d7a448bbde955e15ec39aa368958673450bfTed Kremenek#include "clang/AST/DeclObjC.h"
1742a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek#include "clang/AST/PrettyPrinter.h"
185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/Support/Compiler.h"
1951221ec87faa0365c9fc8c8ad7b7f2d3ee36c8efTed Kremenek#include "llvm/Support/Streams.h"
20a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek#include "llvm/Support/Format.h"
215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// StmtPrinter Visitor
255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace  {
28c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner  class VISIBILITY_HIDDEN StmtPrinter : public StmtVisitor<StmtPrinter> {
29a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek    llvm::raw_ostream &OS;
305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    unsigned IndentLevel;
3142a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek    clang::PrinterHelper* Helper;
325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  public:
33a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek    StmtPrinter(llvm::raw_ostream &os, PrinterHelper* helper) :
3442a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek      OS(os), IndentLevel(0), Helper(helper) {}
355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    void PrintStmt(Stmt *S, int SubIndent = 1) {
375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      IndentLevel += SubIndent;
385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      if (S && isa<Expr>(S)) {
395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // If this is an expr used in a stmt context, indent and newline it.
405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        Indent();
41c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner        Visit(S);
425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        OS << ";\n";
435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      } else if (S) {
44c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner        Visit(S);
455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      } else {
465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        Indent() << "<<<NULL STATEMENT>>>\n";
475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      }
485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      IndentLevel -= SubIndent;
495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    void PrintRawCompoundStmt(CompoundStmt *S);
525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    void PrintRawDecl(Decl *D);
53ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek    void PrintRawDeclStmt(DeclStmt *S);
545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    void PrintRawIfStmt(IfStmt *If);
555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    void PrintExpr(Expr *E) {
575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      if (E)
58c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner        Visit(E);
595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      else
605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        OS << "<null expr>";
615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
63a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek    llvm::raw_ostream &Indent(int Delta = 0) const {
645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      for (int i = 0, e = IndentLevel+Delta; i < e; ++i)
655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        OS << "  ";
665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return OS;
675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
69704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    bool PrintOffsetOfDesignator(Expr *E);
70704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    void VisitUnaryOffsetOf(UnaryOperator *Node);
71704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner
7242a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek    void Visit(Stmt* S) {
7342a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek      if (Helper && Helper->handledStmt(S,OS))
7442a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek          return;
7542a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek      else StmtVisitor<StmtPrinter>::Visit(S);
7642a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek    }
7742a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek
78c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner    void VisitStmt(Stmt *Node);
79f2cad8633e46cce12fc3d77c0bd451ffd7264bafDouglas Gregor#define STMT(CLASS, PARENT) \
80c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner    void Visit##CLASS(CLASS *Node);
815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/StmtNodes.def"
825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  };
835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//  Stmt printing methods.
875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitStmt(Stmt *Node) {
905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "<<unknown stmt type>>\n";
915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// PrintRawCompoundStmt - Print a compound stmt without indenting the {, and
945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// with no newline after the }.
955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawCompoundStmt(CompoundStmt *Node) {
965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "{\n";
975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (CompoundStmt::body_iterator I = Node->body_begin(), E = Node->body_end();
985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer       I != E; ++I)
995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintStmt(*I);
1005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "}";
1025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawDecl(Decl *D) {
1055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // FIXME: Need to complete/beautify this... this code simply shows the
1065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // nodes are where they need to be.
1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (TypedefDecl *localType = dyn_cast<TypedefDecl>(D)) {
1085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << "typedef " << localType->getUnderlyingType().getAsString();
10939f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner    OS << " " << localType->getNameAsString();
1105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else if (ValueDecl *VD = dyn_cast<ValueDecl>(D)) {
1115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Emit storage class for vardecls.
1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (VarDecl *V = dyn_cast<VarDecl>(VD)) {
1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      switch (V->getStorageClass()) {
1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        default: assert(0 && "Unknown storage class!");
1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        case VarDecl::None:     break;
1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        case VarDecl::Extern:   OS << "extern "; break;
1175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        case VarDecl::Static:   OS << "static "; break;
1185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        case VarDecl::Auto:     OS << "auto "; break;
1195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        case VarDecl::Register: OS << "register "; break;
1205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      }
1215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
1225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
12339f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner    std::string Name = VD->getNameAsString();
1245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    VD->getType().getAsStringInternal(Name);
1255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << Name;
1265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
12724c3990cd2469f9692c4b0c3edea4fba67baaf6eChris Lattner    // If this is a vardecl with an initializer, emit it.
12824c3990cd2469f9692c4b0c3edea4fba67baaf6eChris Lattner    if (VarDecl *V = dyn_cast<VarDecl>(VD)) {
12924c3990cd2469f9692c4b0c3edea4fba67baaf6eChris Lattner      if (V->getInit()) {
13024c3990cd2469f9692c4b0c3edea4fba67baaf6eChris Lattner        OS << " = ";
13124c3990cd2469f9692c4b0c3edea4fba67baaf6eChris Lattner        PrintExpr(V->getInit());
13224c3990cd2469f9692c4b0c3edea4fba67baaf6eChris Lattner      }
13324c3990cd2469f9692c4b0c3edea4fba67baaf6eChris Lattner    }
13491578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff  } else if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
13591578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff    // print a free standing tag decl (e.g. "struct x;").
13691578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff    OS << TD->getKindName();
13791578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff    OS << " ";
13891578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff    if (const IdentifierInfo *II = TD->getIdentifier())
13991578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff      OS << II->getName();
14091578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff    else
14191578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff      OS << "<anonymous>";
14291578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff    // FIXME: print tag bodies.
1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
1445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    assert(0 && "Unexpected decl");
1455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
148ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenekvoid StmtPrinter::PrintRawDeclStmt(DeclStmt *S) {
149ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek  bool isFirst = false;
150ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek
151ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek  for (DeclStmt::decl_iterator I = S->decl_begin(), E = S->decl_end();
152ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek       I != E; ++I) {
153ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek
154ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek    if (!isFirst) OS << ", ";
155ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek    else isFirst = false;
156ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek
157ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek    PrintRawDecl(*I);
158ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek  }
159ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek}
1605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitNullStmt(NullStmt *Node) {
1625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << ";\n";
1635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDeclStmt(DeclStmt *Node) {
166ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek  for (DeclStmt::decl_iterator I = Node->decl_begin(), E = Node->decl_end();
167ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek       I!=E; ++I) {
1685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Indent();
169ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek    PrintRawDecl(*I);
1705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << ";\n";
1715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCompoundStmt(CompoundStmt *Node) {
1755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent();
1765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintRawCompoundStmt(Node);
1775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "\n";
1785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCaseStmt(CaseStmt *Node) {
1815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent(-1) << "case ";
1825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getLHS());
1835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Node->getRHS()) {
1845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << " ... ";
1855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Node->getRHS());
1865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ":\n";
1885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintStmt(Node->getSubStmt(), 0);
1905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDefaultStmt(DefaultStmt *Node) {
1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent(-1) << "default:\n";
1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintStmt(Node->getSubStmt(), 0);
1955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitLabelStmt(LabelStmt *Node) {
1985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent(-1) << Node->getName() << ":\n";
1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintStmt(Node->getSubStmt(), 0);
2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawIfStmt(IfStmt *If) {
2035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "if ";
2045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(If->getCond());
2055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(If->getThen())) {
2075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << ' ';
2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintRawCompoundStmt(CS);
2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << (If->getElse() ? ' ' : '\n');
2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
2115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << '\n';
2125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintStmt(If->getThen());
2135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (If->getElse()) Indent();
2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Stmt *Else = If->getElse()) {
2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << "else";
2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Else)) {
2205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      OS << ' ';
2215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      PrintRawCompoundStmt(CS);
2225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      OS << '\n';
2235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    } else if (IfStmt *ElseIf = dyn_cast<IfStmt>(Else)) {
2245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      OS << ' ';
2255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      PrintRawIfStmt(ElseIf);
2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    } else {
2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      OS << '\n';
2285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      PrintStmt(If->getElse());
2295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
2305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIfStmt(IfStmt *If) {
2345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent();
2355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintRawIfStmt(If);
2365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitSwitchStmt(SwitchStmt *Node) {
2395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "switch (";
2405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getCond());
2415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")";
2425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Pretty print compoundstmt bodies (very common).
2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
2455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << " ";
2465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintRawCompoundStmt(CS);
2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << "\n";
2485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
2495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << "\n";
2505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintStmt(Node->getBody());
2515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
254c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlssonvoid StmtPrinter::VisitSwitchCase(SwitchCase*) {
255c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  assert(0 && "SwitchCase is an abstract class");
256c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson}
257c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson
2585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitWhileStmt(WhileStmt *Node) {
2595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "while (";
2605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getCond());
2615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")\n";
2625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintStmt(Node->getBody());
2635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDoStmt(DoStmt *Node) {
2668bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  Indent() << "do ";
2678bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
2688bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    PrintRawCompoundStmt(CS);
2698bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << " ";
2708bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  } else {
2718bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << "\n";
2728bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    PrintStmt(Node->getBody());
2738bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    Indent();
2748bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  }
2758bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner
2768bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  OS << "while ";
2775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getCond());
2785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ";\n";
2795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitForStmt(ForStmt *Node) {
2825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "for (";
2835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Node->getInit()) {
2845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getInit()))
285ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek      PrintRawDeclStmt(DS);
2865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else
2875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      PrintExpr(cast<Expr>(Node->getInit()));
2885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2898bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  OS << ";";
2908bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  if (Node->getCond()) {
2918bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << " ";
2925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Node->getCond());
2938bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  }
2948bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  OS << ";";
2958bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  if (Node->getInc()) {
2968bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << " ";
2975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Node->getInc());
2988bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  }
2998bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  OS << ") ";
3008bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner
3018bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
3028bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    PrintRawCompoundStmt(CS);
3038bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << "\n";
3048bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  } else {
3058bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << "\n";
3068bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    PrintStmt(Node->getBody());
3078bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  }
3085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
310a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *Node) {
3110196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  Indent() << "for (";
3120196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getElement()))
313ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek    PrintRawDeclStmt(DS);
3140196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  else
3150196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    PrintExpr(cast<Expr>(Node->getElement()));
3160196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  OS << " in ";
3170196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  PrintExpr(Node->getCollection());
3180196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  OS << ") ";
3190196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian
3200196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
3210196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    PrintRawCompoundStmt(CS);
3220196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    OS << "\n";
3230196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  } else {
3240196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    OS << "\n";
3250196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    PrintStmt(Node->getBody());
3260196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  }
3270196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian}
3280196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian
3295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitGotoStmt(GotoStmt *Node) {
3305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "goto " << Node->getLabel()->getName() << ";\n";
3315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIndirectGotoStmt(IndirectGotoStmt *Node) {
3345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "goto *";
3355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getTarget());
3365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ";\n";
3375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitContinueStmt(ContinueStmt *Node) {
3405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "continue;\n";
3415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitBreakStmt(BreakStmt *Node) {
3445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "break;\n";
3455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitReturnStmt(ReturnStmt *Node) {
3495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "return";
3505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Node->getRetValue()) {
3515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << " ";
3525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Node->getRetValue());
3535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ";\n";
3555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
357fe795956194141c91ae555985c9b930595bff43fChris Lattner
358fe795956194141c91ae555985c9b930595bff43fChris Lattnervoid StmtPrinter::VisitAsmStmt(AsmStmt *Node) {
35939c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson  Indent() << "asm ";
36039c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson
36139c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson  if (Node->isVolatile())
36239c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson    OS << "volatile ";
36339c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson
36439c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson  OS << "(";
3656a0ef4b83c91a6d6d5acb4ed5577c4659fe022a3Anders Carlsson  VisitStringLiteral(Node->getAsmString());
366b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
367b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  // Outputs
368b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  if (Node->getNumOutputs() != 0 || Node->getNumInputs() != 0 ||
369b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      Node->getNumClobbers() != 0)
370b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " : ";
371b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
372b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  for (unsigned i = 0, e = Node->getNumOutputs(); i != e; ++i) {
373b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (i != 0)
374b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << ", ";
375b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
376b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (!Node->getOutputName(i).empty()) {
377b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << '[';
378b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << Node->getOutputName(i);
379b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << "] ";
380b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    }
381b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
382b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    VisitStringLiteral(Node->getOutputConstraint(i));
383b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " ";
384b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    Visit(Node->getOutputExpr(i));
385b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  }
386b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
387b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  // Inputs
388b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  if (Node->getNumInputs() != 0 || Node->getNumClobbers() != 0)
389b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " : ";
390b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
391b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  for (unsigned i = 0, e = Node->getNumInputs(); i != e; ++i) {
392b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (i != 0)
393b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << ", ";
394b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
395b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (!Node->getInputName(i).empty()) {
396b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << '[';
397b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << Node->getInputName(i);
398b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << "] ";
399b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    }
400b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
401b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    VisitStringLiteral(Node->getInputConstraint(i));
402b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " ";
403b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    Visit(Node->getInputExpr(i));
404b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  }
405b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
406b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  // Clobbers
407b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  if (Node->getNumClobbers() != 0)
408b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " : ";
409b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
410b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  for (unsigned i = 0, e = Node->getNumClobbers(); i != e; ++i) {
411b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (i != 0)
412b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << ", ";
413b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
414b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    VisitStringLiteral(Node->getClobber(i));
415b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  }
416b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
4176a0ef4b83c91a6d6d5acb4ed5577c4659fe022a3Anders Carlsson  OS << ");\n";
418fe795956194141c91ae555985c9b930595bff43fChris Lattner}
419fe795956194141c91ae555985c9b930595bff43fChris Lattner
420a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtTryStmt(ObjCAtTryStmt *Node) {
4217794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian  Indent() << "@try";
4227794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian  if (CompoundStmt *TS = dyn_cast<CompoundStmt>(Node->getTryBody())) {
4237794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    PrintRawCompoundStmt(TS);
4247794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    OS << "\n";
4257794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian  }
4267794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian
427a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  for (ObjCAtCatchStmt *catchStmt =
428a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek         static_cast<ObjCAtCatchStmt *>(Node->getCatchStmts());
4297794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian       catchStmt;
4307794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian       catchStmt =
431a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek         static_cast<ObjCAtCatchStmt *>(catchStmt->getNextCatchStmt())) {
4327794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    Indent() << "@catch(";
4337794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    if (catchStmt->getCatchParamStmt()) {
4347794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian      if (DeclStmt *DS = dyn_cast<DeclStmt>(catchStmt->getCatchParamStmt()))
435ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek        PrintRawDeclStmt(DS);
4367794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    }
4377794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    OS << ")";
4387794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    if (CompoundStmt *CS = dyn_cast<CompoundStmt>(catchStmt->getCatchBody()))
4397794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian      {
4407794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian        PrintRawCompoundStmt(CS);
4417794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian        OS << "\n";
4427794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian      }
4437794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian  }
4447794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian
445a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  if (ObjCAtFinallyStmt *FS =static_cast<ObjCAtFinallyStmt *>(
4461e7eab4ca34f8a0c076a6783f48e768923a10070Fariborz Jahanian          Node->getFinallyStmt())) {
4471e7eab4ca34f8a0c076a6783f48e768923a10070Fariborz Jahanian    Indent() << "@finally";
4481e7eab4ca34f8a0c076a6783f48e768923a10070Fariborz Jahanian    PrintRawCompoundStmt(dyn_cast<CompoundStmt>(FS->getFinallyBody()));
4497794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    OS << "\n";
4507794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian  }
451b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian}
452b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian
453a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *Node) {
454b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian}
455b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian
456a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtCatchStmt (ObjCAtCatchStmt *Node) {
457b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian  Indent() << "@catch (...) { /* todo */ } \n";
458b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian}
459b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian
46078a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanianvoid StmtPrinter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *Node) {
46139f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian  Indent() << "@throw";
46239f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian  if (Node->getThrowExpr()) {
46339f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian    OS << " ";
46439f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian    PrintExpr(Node->getThrowExpr());
46539f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian  }
46639f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian  OS << ";\n";
46739f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian}
46839f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian
46978a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanianvoid StmtPrinter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *Node) {
470c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian  Indent() << "@synchronized (";
471c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian  PrintExpr(Node->getSynchExpr());
472c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian  OS << ")";
47378a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanian  PrintRawCompoundStmt(Node->getSynchBody());
47478a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanian  OS << "\n";
475c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian}
476c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian
4775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
4785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//  Expr printing methods.
4795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
4805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitExpr(Expr *Node) {
4825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "<<unknown expr type>>";
4835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
4845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) {
48639f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner  OS << Node->getDecl()->getNameAsString();
4875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
4885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4897779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroffvoid StmtPrinter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
490232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian  if (Node->getBase()) {
491232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian    PrintExpr(Node->getBase());
492232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian    OS << (Node->isArrow() ? "->" : ".");
493232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian  }
49439f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner  OS << Node->getDecl()->getNameAsString();
4957779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff}
4967779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff
497ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroffvoid StmtPrinter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
498ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff  if (Node->getBase()) {
499ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff    PrintExpr(Node->getBase());
500ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff    OS << ".";
501ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff  }
502c77a636688e188af7e7a9a05829e542adb48e880Steve Naroff  OS << Node->getProperty()->getNameAsCString();
503ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff}
504ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff
5055daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanianvoid StmtPrinter::VisitObjCKVCRefExpr(ObjCKVCRefExpr *Node) {
5065daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian  if (Node->getBase()) {
5075daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian    PrintExpr(Node->getBase());
5085daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian    OS << ".";
5095daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian  }
5105daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian  // FIXME: Setter/Getter names
5115daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian}
5125daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian
513d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattnervoid StmtPrinter::VisitPredefinedExpr(PredefinedExpr *Node) {
514227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson  switch (Node->getIdentType()) {
515227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    default:
516227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      assert(0 && "unknown case");
517d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner    case PredefinedExpr::Func:
518227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      OS << "__func__";
519227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      break;
520d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner    case PredefinedExpr::Function:
521227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      OS << "__FUNCTION__";
522227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      break;
523d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner    case PredefinedExpr::PrettyFunction:
524227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      OS << "__PRETTY_FUNCTION__";
525227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      break;
526227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson  }
527227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson}
528227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson
5295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCharacterLiteral(CharacterLiteral *Node) {
530b0a721a51a85b7b1ea9b33dbe12f4a58232590e2Chris Lattner  unsigned value = Node->getValue();
531c250aae4f645833aed3a6321bc8598f7330dce8dChris Lattner  if (Node->isWide())
532c250aae4f645833aed3a6321bc8598f7330dce8dChris Lattner    OS << "L";
5338bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  switch (value) {
5348bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\\':
5358bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\\\'";
5368bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5378bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\'':
5388bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\''";
5398bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5408bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\a':
5418bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    // TODO: K&R: the meaning of '\\a' is different in traditional C
5428bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\a'";
5438bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5448bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\b':
5458bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\b'";
5468bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5478bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  // Nonstandard escape sequence.
5488bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  /*case '\e':
5498bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\e'";
5508bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;*/
5518bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\f':
5528bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\f'";
5538bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5548bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\n':
5558bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\n'";
5568bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5578bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\r':
5588bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\r'";
5598bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5608bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\t':
5618bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\t'";
5628bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5638bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\v':
5648bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\v'";
5658bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5668bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  default:
567471733d84639fcea35d7876940d7d32fa575e158Ted Kremenek    if (value < 256 && isprint(value)) {
5688bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner      OS << "'" << (char)value << "'";
5698bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    } else if (value < 256) {
570a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek      OS << "'\\x" << llvm::format("%x", value) << "'";
5718bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    } else {
5728bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner      // FIXME what to really do here?
5738bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner      OS << value;
5748bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    }
575b0a721a51a85b7b1ea9b33dbe12f4a58232590e2Chris Lattner  }
5765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIntegerLiteral(IntegerLiteral *Node) {
5795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isSigned = Node->getType()->isSignedIntegerType();
5805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << Node->getValue().toString(10, isSigned);
5815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Emit suffixes.  Integer literals are always a builtin integer type.
583b77792eabf5882cf9af8cc810599b20432fda6c2Chris Lattner  switch (Node->getType()->getAsBuiltinType()->getKind()) {
5845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  default: assert(0 && "Unexpected type for integer literal!");
5855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Int:       break; // no suffix.
5865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::UInt:      OS << 'U'; break;
5875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Long:      OS << 'L'; break;
5885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::ULong:     OS << "UL"; break;
5895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::LongLong:  OS << "LL"; break;
5905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::ULongLong: OS << "ULL"; break;
5915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
5925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitFloatingLiteral(FloatingLiteral *Node) {
59486e499d9525ab4f2258724c4ca2826acd6b13a8eChris Lattner  // FIXME: print value more precisely.
595da8249e57f3badecf925571881fe57243935c6c1Chris Lattner  OS << Node->getValueAsApproximateDouble();
5965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5975d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner
5985d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattnervoid StmtPrinter::VisitImaginaryLiteral(ImaginaryLiteral *Node) {
5995d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner  PrintExpr(Node->getSubExpr());
6005d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner  OS << "i";
6015d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner}
6025d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner
6035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitStringLiteral(StringLiteral *Str) {
6045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Str->isWide()) OS << 'L';
6055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << '"';
606ee98ac5a1330db432b188dd2d38b6631aac47bf1Anders Carlsson
6075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // FIXME: this doesn't print wstrings right.
6085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0, e = Str->getByteLength(); i != e; ++i) {
6095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    switch (Str->getStrData()[i]) {
6105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    default: OS << Str->getStrData()[i]; break;
6115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Handle some common ones to make dumps prettier.
6125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case '\\': OS << "\\\\"; break;
6135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case '"': OS << "\\\""; break;
6145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case '\n': OS << "\\n"; break;
6155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case '\t': OS << "\\t"; break;
6165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case '\a': OS << "\\a"; break;
6175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case '\b': OS << "\\b"; break;
6185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
6195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
6205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << '"';
6215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitParenExpr(ParenExpr *Node) {
6235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "(";
6245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getSubExpr());
6255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")";
6265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitUnaryOperator(UnaryOperator *Node) {
628296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner  if (!Node->isPostfix()) {
6295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << UnaryOperator::getOpcodeStr(Node->getOpcode());
630296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner
6310518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl    // Print a space if this is an "identifier operator" like __real.
632296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    switch (Node->getOpcode()) {
633296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    default: break;
634296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    case UnaryOperator::Real:
635296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    case UnaryOperator::Imag:
636296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    case UnaryOperator::Extension:
637296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner      OS << ' ';
638296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner      break;
639296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    }
640296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner  }
6415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getSubExpr());
6425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Node->isPostfix())
6445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << UnaryOperator::getOpcodeStr(Node->getOpcode());
645704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner}
646704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner
647704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattnerbool StmtPrinter::PrintOffsetOfDesignator(Expr *E) {
648704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner  if (isa<CompoundLiteralExpr>(E)) {
649704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    // Base case, print the type and comma.
650704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    OS << E->getType().getAsString() << ", ";
651704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    return true;
652704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner  } else if (ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(E)) {
653704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    PrintOffsetOfDesignator(ASE->getLHS());
654704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    OS << "[";
655704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    PrintExpr(ASE->getRHS());
656704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    OS << "]";
657704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    return false;
658704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner  } else {
659704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    MemberExpr *ME = cast<MemberExpr>(E);
660704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    bool IsFirst = PrintOffsetOfDesignator(ME->getBase());
66139f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner    OS << (IsFirst ? "" : ".") << ME->getMemberDecl()->getNameAsString();
662704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    return false;
663704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner  }
664704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner}
6655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
666704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattnervoid StmtPrinter::VisitUnaryOffsetOf(UnaryOperator *Node) {
667704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner  OS << "__builtin_offsetof(";
668704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner  PrintOffsetOfDesignator(Node->getSubExpr());
669704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner  OS << ")";
6705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
671704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner
6720518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redlvoid StmtPrinter::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *Node) {
6730518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  OS << (Node->isSizeOf() ? "sizeof" : "__alignof");
6740518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  if (Node->isArgumentType())
6750518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl    OS << "(" << Node->getArgumentType().getAsString() << ")";
6760518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  else {
6770518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl    OS << " ";
6780518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl    PrintExpr(Node->getArgumentExpr());
6790518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  }
6805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitArraySubscriptExpr(ArraySubscriptExpr *Node) {
6822324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  PrintExpr(Node->getLHS());
6835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "[";
6842324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  PrintExpr(Node->getRHS());
6855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "]";
6865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCallExpr(CallExpr *Call) {
6895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Call->getCallee());
6905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "(";
6915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0, e = Call->getNumArgs(); i != e; ++i) {
69204421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner    if (isa<CXXDefaultArgExpr>(Call->getArg(i))) {
69304421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner      // Don't print any defaulted arguments
69404421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner      break;
69504421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner    }
69604421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner
6975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (i) OS << ", ";
6985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Call->getArg(i));
6995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
7005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")";
7015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitMemberExpr(MemberExpr *Node) {
7035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getBase());
7045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << (Node->isArrow() ? "->" : ".");
7055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  FieldDecl *Field = Node->getMemberDecl();
7075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(Field && "MemberExpr should alway reference a field!");
70839f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner  OS << Field->getNameAsString();
7095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
710213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanvoid StmtPrinter::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) {
71131a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  PrintExpr(Node->getBase());
71231a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  OS << ".";
71331a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  OS << Node->getAccessor().getName();
71431a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff}
7150835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidisvoid StmtPrinter::VisitCastExpr(CastExpr *) {
7160835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis  assert(0 && "CastExpr is an abstract class");
7170835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis}
71849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitExplicitCastExpr(ExplicitCastExpr *) {
71949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  assert(0 && "ExplicitCastExpr is an abstract class");
72049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
7216eec8e883de118b431e3ead5b1e604a6ac68ff6bDouglas Gregorvoid StmtPrinter::VisitCStyleCastExpr(CStyleCastExpr *Node) {
72226dc7b39267b7d29b35a7887a5b8e54697192192Chris Lattner  OS << "(" << Node->getType().getAsString() << ")";
7235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getSubExpr());
7245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
725aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroffvoid StmtPrinter::VisitCompoundLiteralExpr(CompoundLiteralExpr *Node) {
726aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff  OS << "(" << Node->getType().getAsString() << ")";
727aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff  PrintExpr(Node->getInitializer());
728aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff}
72949b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroffvoid StmtPrinter::VisitImplicitCastExpr(ImplicitCastExpr *Node) {
73090045e8ebabf50d6f1b3a67081a621b20b5e5341Steve Naroff  // No need to print anything, simply forward to the sub expression.
73190045e8ebabf50d6f1b3a67081a621b20b5e5341Steve Naroff  PrintExpr(Node->getSubExpr());
73249b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff}
7335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitBinaryOperator(BinaryOperator *Node) {
7345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getLHS());
7355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " ";
736eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  PrintExpr(Node->getRHS());
737eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner}
738eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattnervoid StmtPrinter::VisitCompoundAssignOperator(CompoundAssignOperator *Node) {
739eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  PrintExpr(Node->getLHS());
740eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " ";
7415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getRHS());
7425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitConditionalOperator(ConditionalOperator *Node) {
7445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getCond());
7458e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek
7468e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek  if (Node->getLHS()) {
7478e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek    OS << " ? ";
7488e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek    PrintExpr(Node->getLHS());
7498e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek    OS << " : ";
7508e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek  }
7518e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek  else { // Handle GCC extention where LHS can be NULL.
7528e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek    OS << " ?: ";
7538e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek  }
7548e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek
7555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getRHS());
7565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// GNU extensions.
7595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7606481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattnervoid StmtPrinter::VisitAddrLabelExpr(AddrLabelExpr *Node) {
7615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "&&" << Node->getLabel()->getName();
7625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
764ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattnervoid StmtPrinter::VisitStmtExpr(StmtExpr *E) {
765ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  OS << "(";
766ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  PrintRawCompoundStmt(E->getSubStmt());
767ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  OS << ")";
768ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner}
769ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner
770d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroffvoid StmtPrinter::VisitTypesCompatibleExpr(TypesCompatibleExpr *Node) {
771d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff  OS << "__builtin_types_compatible_p(";
772d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff  OS << Node->getArgType1().getAsString() << ",";
773d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff  OS << Node->getArgType2().getAsString() << ")";
774d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff}
775d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff
776d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroffvoid StmtPrinter::VisitChooseExpr(ChooseExpr *Node) {
777d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  OS << "__builtin_choose_expr(";
778d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  PrintExpr(Node->getCond());
77994f05e36488fd08e404ac409d3bcb1db1da1bd4dChris Lattner  OS << ", ";
780d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  PrintExpr(Node->getLHS());
78194f05e36488fd08e404ac409d3bcb1db1da1bd4dChris Lattner  OS << ", ";
782d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  PrintExpr(Node->getRHS());
783d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  OS << ")";
784d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff}
785ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner
7862d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregorvoid StmtPrinter::VisitGNUNullExpr(GNUNullExpr *) {
7872d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor  OS << "__null";
7882d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor}
7892d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor
790e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begemanvoid StmtPrinter::VisitOverloadExpr(OverloadExpr *Node) {
791e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman  OS << "__builtin_overload(";
79267295d05c50ab0b5d1b0f9ef82a906701c348715Nate Begeman  for (unsigned i = 0, e = Node->getNumSubExprs(); i != e; ++i) {
793e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman    if (i) OS << ", ";
79467295d05c50ab0b5d1b0f9ef82a906701c348715Nate Begeman    PrintExpr(Node->getExpr(i));
795e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman  }
796e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman  OS << ")";
797d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman}
798d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman
799d38617c8a50f9729c254ab76cd359af797c6739bEli Friedmanvoid StmtPrinter::VisitShuffleVectorExpr(ShuffleVectorExpr *Node) {
800d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  OS << "__builtin_shufflevector(";
801d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  for (unsigned i = 0, e = Node->getNumSubExprs(); i != e; ++i) {
802d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman    if (i) OS << ", ";
803d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman    PrintExpr(Node->getExpr(i));
804d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  }
805d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  OS << ")";
806e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman}
807e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman
80866b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlssonvoid StmtPrinter::VisitInitListExpr(InitListExpr* Node) {
80966b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  OS << "{ ";
81066b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  for (unsigned i = 0, e = Node->getNumInits(); i != e; ++i) {
81166b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson    if (i) OS << ", ";
81266b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson    PrintExpr(Node->getInit(i));
81366b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  }
81466b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  OS << " }";
81566b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson}
81666b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson
8177c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlssonvoid StmtPrinter::VisitVAArgExpr(VAArgExpr *Node) {
8187c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  OS << "va_arg(";
8197c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  PrintExpr(Node->getSubExpr());
8207c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  OS << ", ";
8217c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  OS << Node->getType().getAsString();
8227c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  OS << ")";
8237c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson}
8247c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson
8255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// C++
826b4609806e9232593ece09ce08b630836e825865cDouglas Gregorvoid StmtPrinter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *Node) {
827b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  const char *OpStrings[NUM_OVERLOADED_OPERATORS] = {
828b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    "",
829b4609806e9232593ece09ce08b630836e825865cDouglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
830b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    Spelling,
831b4609806e9232593ece09ce08b630836e825865cDouglas Gregor#include "clang/Basic/OperatorKinds.def"
832b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  };
833b4609806e9232593ece09ce08b630836e825865cDouglas Gregor
834b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  OverloadedOperatorKind Kind = Node->getOperator();
835b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
836b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    if (Node->getNumArgs() == 1) {
837b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      OS << OpStrings[Kind] << ' ';
838b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      PrintExpr(Node->getArg(0));
839b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    } else {
840b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      PrintExpr(Node->getArg(0));
841b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      OS << ' ' << OpStrings[Kind];
842b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    }
843b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else if (Kind == OO_Call) {
844b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(0));
845b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << '(';
846b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    for (unsigned ArgIdx = 1; ArgIdx < Node->getNumArgs(); ++ArgIdx) {
847b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      if (ArgIdx > 1)
848b4609806e9232593ece09ce08b630836e825865cDouglas Gregor        OS << ", ";
849b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      if (!isa<CXXDefaultArgExpr>(Node->getArg(ArgIdx)))
850b4609806e9232593ece09ce08b630836e825865cDouglas Gregor        PrintExpr(Node->getArg(ArgIdx));
851b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    }
852b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << ')';
853b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else if (Kind == OO_Subscript) {
854b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(0));
855b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << '[';
856b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(1));
857b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << ']';
858b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else if (Node->getNumArgs() == 1) {
859b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << OpStrings[Kind] << ' ';
860b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(0));
861b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else if (Node->getNumArgs() == 2) {
862b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(0));
863b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << ' ' << OpStrings[Kind] << ' ';
864b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(1));
865b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else {
866b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    assert(false && "unknown overloaded operator");
867b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  }
868b4609806e9232593ece09ce08b630836e825865cDouglas Gregor}
8695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
87049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) {
87149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  OS << Node->getCastName() << '<';
87249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  OS << Node->getTypeAsWritten().getAsString() << ">(";
8735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getSubExpr());
8745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")";
8755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
87749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXStaticCastExpr(CXXStaticCastExpr *Node) {
87849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  VisitCXXNamedCastExpr(Node);
87949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
88049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
88149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *Node) {
88249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  VisitCXXNamedCastExpr(Node);
88349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
88449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
88549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *Node) {
88649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  VisitCXXNamedCastExpr(Node);
88749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
88849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
88949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXConstCastExpr(CXXConstCastExpr *Node) {
89049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  VisitCXXNamedCastExpr(Node);
89149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
89249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
893c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redlvoid StmtPrinter::VisitCXXTypeidExpr(CXXTypeidExpr *Node) {
894c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  OS << "typeid(";
895c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  if (Node->isTypeOperand()) {
896c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl    OS << Node->getTypeOperand().getAsString();
897c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  } else {
898c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl    PrintExpr(Node->getExprOperand());
899c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  }
900c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  OS << ")";
901c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl}
902c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl
9035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) {
9045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << (Node->getValue() ? "true" : "false");
9055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
9065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
907796da18402f286b897782a298ae3b20c459c102eDouglas Gregorvoid StmtPrinter::VisitCXXThisExpr(CXXThisExpr *Node) {
908796da18402f286b897782a298ae3b20c459c102eDouglas Gregor  OS << "this";
909796da18402f286b897782a298ae3b20c459c102eDouglas Gregor}
910796da18402f286b897782a298ae3b20c459c102eDouglas Gregor
91150dd289f45738ed22b7583d52ed2525b927042ffChris Lattnervoid StmtPrinter::VisitCXXThrowExpr(CXXThrowExpr *Node) {
91250dd289f45738ed22b7583d52ed2525b927042ffChris Lattner  if (Node->getSubExpr() == 0)
91350dd289f45738ed22b7583d52ed2525b927042ffChris Lattner    OS << "throw";
91450dd289f45738ed22b7583d52ed2525b927042ffChris Lattner  else {
91550dd289f45738ed22b7583d52ed2525b927042ffChris Lattner    OS << "throw ";
91650dd289f45738ed22b7583d52ed2525b927042ffChris Lattner    PrintExpr(Node->getSubExpr());
91750dd289f45738ed22b7583d52ed2525b927042ffChris Lattner  }
91850dd289f45738ed22b7583d52ed2525b927042ffChris Lattner}
91950dd289f45738ed22b7583d52ed2525b927042ffChris Lattner
92004421087832a031c90bd58f128c7c0e741db8dd2Chris Lattnervoid StmtPrinter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *Node) {
92104421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner  // Nothing to print: we picked up the default argument
92204421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner}
92304421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner
924987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidisvoid StmtPrinter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) {
925987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  OS << Node->getType().getAsString();
926987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  OS << "(";
927987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  PrintExpr(Node->getSubExpr());
928987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  OS << ")";
929987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis}
930987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis
931987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidisvoid StmtPrinter::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *Node) {
932987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  OS << Node->getType().getAsString() << "()";
933987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis}
934987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis
9359e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidisvoid
9369e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios KyrtzidisStmtPrinter::VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
9379e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis  PrintRawDecl(E->getVarDecl());
9389e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis}
9399e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis
9404c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlvoid StmtPrinter::VisitCXXNewExpr(CXXNewExpr *E) {
9414c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (E->isGlobalNew())
9424c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << "::";
9434c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  OS << "new ";
9444c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  unsigned NumPlace = E->getNumPlacementArgs();
9454c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (NumPlace > 0) {
9464c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << "(";
9474c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    PrintExpr(E->getPlacementArg(0));
9484c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    for (unsigned i = 1; i < NumPlace; ++i) {
9494c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl      OS << ", ";
9504c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl      PrintExpr(E->getPlacementArg(i));
9514c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    }
9524c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << ") ";
9534c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
9544c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (E->isParenTypeId())
9554c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << "(";
9566fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl  std::string TypeS;
9576fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl  if (Expr *Size = E->getArraySize()) {
9586fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl    llvm::raw_string_ostream s(TypeS);
9596fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl    Size->printPretty(s);
9606fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl    s.flush();
9616fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl    TypeS = "[" + TypeS + "]";
9626fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl  }
9636fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl  E->getAllocatedType().getAsStringInternal(TypeS);
9646fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl  OS << TypeS;
9654c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (E->isParenTypeId())
9664c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << ")";
9674c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
9684c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (E->hasInitializer()) {
9694c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << "(";
9704c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    unsigned NumCons = E->getNumConstructorArgs();
9714c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    if (NumCons > 0) {
9724c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl      PrintExpr(E->getConstructorArg(0));
9734c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl      for (unsigned i = 1; i < NumCons; ++i) {
9744c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl        OS << ", ";
9754c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl        PrintExpr(E->getConstructorArg(i));
9764c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl      }
9774c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    }
9784c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << ")";
9794c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
9804c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl}
9814c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
9824c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlvoid StmtPrinter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
9834c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (E->isGlobalDelete())
9844c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << "::";
9854c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  OS << "delete ";
9864c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (E->isArrayForm())
9874c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << "[] ";
9884c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  PrintExpr(E->getArgument());
9894c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl}
9904c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
9915c37de788529cd9180f22069970737a7208bd625Douglas Gregorvoid StmtPrinter::VisitCXXDependentNameExpr(CXXDependentNameExpr *E) {
9925c37de788529cd9180f22069970737a7208bd625Douglas Gregor  OS << E->getName()->getName();
9935c37de788529cd9180f22069970737a7208bd625Douglas Gregor}
9945c37de788529cd9180f22069970737a7208bd625Douglas Gregor
9955508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// Obj-C
9965508518a2702b00be3b15a26d772bde968972f54Anders Carlsson
9975508518a2702b00be3b15a26d772bde968972f54Anders Carlssonvoid StmtPrinter::VisitObjCStringLiteral(ObjCStringLiteral *Node) {
9985508518a2702b00be3b15a26d772bde968972f54Anders Carlsson  OS << "@";
9995508518a2702b00be3b15a26d772bde968972f54Anders Carlsson  VisitStringLiteral(Node->getString());
10005508518a2702b00be3b15a26d772bde968972f54Anders Carlsson}
10015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1002f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlssonvoid StmtPrinter::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) {
100339f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner  OS << "@encode(" << Node->getEncodedType().getAsString() << ')';
1004f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson}
1005f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson
1006b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanianvoid StmtPrinter::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) {
100739f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner  OS << "@selector(" << Node->getSelector().getAsString() << ')';
1008b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian}
1009b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian
1010390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanianvoid StmtPrinter::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) {
101139f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner  OS << "@protocol(" << Node->getProtocol()->getNameAsString() << ')';
1012390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian}
1013390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian
1014563477da25f824e37c535131695dc4dc9b68c465Steve Naroffvoid StmtPrinter::VisitObjCMessageExpr(ObjCMessageExpr *Mess) {
1015563477da25f824e37c535131695dc4dc9b68c465Steve Naroff  OS << "[";
10166a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  Expr *receiver = Mess->getReceiver();
10176a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  if (receiver) PrintExpr(receiver);
10186a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  else OS << Mess->getClassName()->getName();
1019c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek  OS << ' ';
102097b7f26a92d87e514530a5b652460190ce48c974Ted Kremenek  Selector selector = Mess->getSelector();
10216a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  if (selector.isUnarySelector()) {
1022c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek    OS << selector.getIdentifierInfoForSlot(0)->getName();
10236a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  } else {
10246a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff    for (unsigned i = 0, e = Mess->getNumArgs(); i != e; ++i) {
1025c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek      if (i < selector.getNumArgs()) {
1026c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek        if (i > 0) OS << ' ';
1027c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek        if (selector.getIdentifierInfoForSlot(i))
102839f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner          OS << selector.getIdentifierInfoForSlot(i)->getName() << ':';
1029c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek        else
1030c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek           OS << ":";
1031c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek      }
1032c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek      else OS << ", "; // Handle variadic methods.
1033c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek
10346a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff      PrintExpr(Mess->getArg(i));
10356a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff    }
1036563477da25f824e37c535131695dc4dc9b68c465Steve Naroff  }
1037563477da25f824e37c535131695dc4dc9b68c465Steve Naroff  OS << "]";
1038563477da25f824e37c535131695dc4dc9b68c465Steve Naroff}
1039563477da25f824e37c535131695dc4dc9b68c465Steve Naroff
1040cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregorvoid StmtPrinter::VisitObjCSuperExpr(ObjCSuperExpr *) {
1041cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor  OS << "super";
1042cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor}
1043cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor
10444eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffvoid StmtPrinter::VisitBlockExpr(BlockExpr *Node) {
104556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  BlockDecl *BD = Node->getBlockDecl();
10464eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff  OS << "^";
10474eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff
10484eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff  const FunctionType *AFT = Node->getFunctionType();
10494eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff
10504eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff  if (isa<FunctionTypeNoProto>(AFT)) {
10514eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    OS << "()";
105256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  } else if (!BD->param_empty() || cast<FunctionTypeProto>(AFT)->isVariadic()) {
10534eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    OS << '(';
10544eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    std::string ParamStr;
105556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff    for (BlockDecl::param_iterator AI = BD->param_begin(),
105656ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff         E = BD->param_end(); AI != E; ++AI) {
105756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff      if (AI != BD->param_begin()) OS << ", ";
105839f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner      ParamStr = (*AI)->getNameAsString();
10594eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff      (*AI)->getType().getAsStringInternal(ParamStr);
10604eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff      OS << ParamStr;
10614eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    }
10624eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff
106356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff    const FunctionTypeProto *FT = cast<FunctionTypeProto>(AFT);
10644eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    if (FT->isVariadic()) {
106556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff      if (!BD->param_empty()) OS << ", ";
10664eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff      OS << "...";
10674eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    }
10684eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    OS << ')';
10694eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff  }
10704eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff}
10714eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff
10724eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffvoid StmtPrinter::VisitBlockDeclRefExpr(BlockDeclRefExpr *Node) {
107339f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner  OS << Node->getDecl()->getNameAsString();
10744eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff}
10755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
10765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Stmt method implementations
10775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
10785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
10796000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dumpPretty() const {
1080a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek  printPretty(llvm::errs());
10815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
10825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1083a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenekvoid Stmt::printPretty(llvm::raw_ostream &OS, PrinterHelper* Helper) const {
10845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (this == 0) {
10855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << "<NULL>";
10865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return;
10875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
10885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
108942a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek  StmtPrinter P(OS, Helper);
1090c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner  P.Visit(const_cast<Stmt*>(this));
10915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
109242a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek
109342a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//===----------------------------------------------------------------------===//
109442a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek// PrinterHelper
109542a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//===----------------------------------------------------------------------===//
109642a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek
109742a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek// Implement virtual destructor.
10988467583c2704e7a9691ea56939a029015f0ade0aGabor GreifPrinterHelper::~PrinterHelper() {}
1099