StmtPrinter.cpp revision da8249e57f3badecf925571881fe57243935c6c1
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"
165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/Decl.h"
1791d1d7a448bbde955e15ec39aa368958673450bfTed Kremenek#include "clang/AST/DeclObjC.h"
185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/ExprCXX.h"
19f494b579b22f9950f5af021f0bf9879a91bb8b41Steve Naroff#include "clang/AST/ExprObjC.h"
2042a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek#include "clang/AST/PrettyPrinter.h"
21c7229c338c21ef26b01ef3ecf9eec4fd373fa9ecChris Lattner#include "clang/Basic/IdentifierTable.h"
225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/Support/Compiler.h"
2351221ec87faa0365c9fc8c8ad7b7f2d3ee36c8efTed Kremenek#include "llvm/Support/Streams.h"
24b0a721a51a85b7b1ea9b33dbe12f4a58232590e2Chris Lattner#include <iomanip>
255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// StmtPrinter Visitor
295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace  {
32c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner  class VISIBILITY_HIDDEN StmtPrinter : public StmtVisitor<StmtPrinter> {
335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    std::ostream &OS;
345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    unsigned IndentLevel;
3542a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek    clang::PrinterHelper* Helper;
365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  public:
3742a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek    StmtPrinter(std::ostream &os, PrinterHelper* helper) :
3842a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek      OS(os), IndentLevel(0), Helper(helper) {}
395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    void PrintStmt(Stmt *S, int SubIndent = 1) {
415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      IndentLevel += SubIndent;
425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      if (S && isa<Expr>(S)) {
435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // If this is an expr used in a stmt context, indent and newline it.
445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        Indent();
45c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner        Visit(S);
465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        OS << ";\n";
475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      } else if (S) {
48c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner        Visit(S);
495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      } else {
505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        Indent() << "<<<NULL STATEMENT>>>\n";
515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      }
525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      IndentLevel -= SubIndent;
535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    void PrintRawCompoundStmt(CompoundStmt *S);
565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    void PrintRawDecl(Decl *D);
575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    void PrintRawIfStmt(IfStmt *If);
585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    void PrintExpr(Expr *E) {
605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      if (E)
61c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner        Visit(E);
625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      else
635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        OS << "<null expr>";
645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    std::ostream &Indent(int Delta = 0) const {
675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      for (int i = 0, e = IndentLevel+Delta; i < e; ++i)
685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        OS << "  ";
695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return OS;
705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
72704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    bool PrintOffsetOfDesignator(Expr *E);
73704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    void VisitUnaryOffsetOf(UnaryOperator *Node);
74704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner
7542a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek    void Visit(Stmt* S) {
7642a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek      if (Helper && Helper->handledStmt(S,OS))
7742a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek          return;
7842a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek      else StmtVisitor<StmtPrinter>::Visit(S);
7942a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek    }
8042a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek
81c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner    void VisitStmt(Stmt *Node);
825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define STMT(N, CLASS, PARENT) \
83c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner    void Visit##CLASS(CLASS *Node);
845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/StmtNodes.def"
855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  };
865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//  Stmt printing methods.
905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitStmt(Stmt *Node) {
935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "<<unknown stmt type>>\n";
945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// PrintRawCompoundStmt - Print a compound stmt without indenting the {, and
975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// with no newline after the }.
985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawCompoundStmt(CompoundStmt *Node) {
995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "{\n";
1005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (CompoundStmt::body_iterator I = Node->body_begin(), E = Node->body_end();
1015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer       I != E; ++I)
1025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintStmt(*I);
1035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "}";
1055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawDecl(Decl *D) {
1085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // FIXME: Need to complete/beautify this... this code simply shows the
1095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // nodes are where they need to be.
1105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (TypedefDecl *localType = dyn_cast<TypedefDecl>(D)) {
1115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << "typedef " << localType->getUnderlyingType().getAsString();
1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << " " << localType->getName();
1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else if (ValueDecl *VD = dyn_cast<ValueDecl>(D)) {
1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Emit storage class for vardecls.
1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (VarDecl *V = dyn_cast<VarDecl>(VD)) {
1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      switch (V->getStorageClass()) {
1175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        default: assert(0 && "Unknown storage class!");
1185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        case VarDecl::None:     break;
1195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        case VarDecl::Extern:   OS << "extern "; break;
1205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        case VarDecl::Static:   OS << "static "; break;
1215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        case VarDecl::Auto:     OS << "auto "; break;
1225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        case VarDecl::Register: OS << "register "; break;
1235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      }
1245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
1255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    std::string Name = VD->getName();
1275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    VD->getType().getAsStringInternal(Name);
1285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << Name;
1295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
13024c3990cd2469f9692c4b0c3edea4fba67baaf6eChris Lattner    // If this is a vardecl with an initializer, emit it.
13124c3990cd2469f9692c4b0c3edea4fba67baaf6eChris Lattner    if (VarDecl *V = dyn_cast<VarDecl>(VD)) {
13224c3990cd2469f9692c4b0c3edea4fba67baaf6eChris Lattner      if (V->getInit()) {
13324c3990cd2469f9692c4b0c3edea4fba67baaf6eChris Lattner        OS << " = ";
13424c3990cd2469f9692c4b0c3edea4fba67baaf6eChris Lattner        PrintExpr(V->getInit());
13524c3990cd2469f9692c4b0c3edea4fba67baaf6eChris Lattner      }
13624c3990cd2469f9692c4b0c3edea4fba67baaf6eChris Lattner    }
13791578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff  } else if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
13891578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff    // print a free standing tag decl (e.g. "struct x;").
13991578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff    OS << TD->getKindName();
14091578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff    OS << " ";
14191578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff    if (const IdentifierInfo *II = TD->getIdentifier())
14291578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff      OS << II->getName();
14391578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff    else
14491578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff      OS << "<anonymous>";
14591578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff    // FIXME: print tag bodies.
1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
1475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    assert(0 && "Unexpected decl");
1485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitNullStmt(NullStmt *Node) {
1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << ";\n";
1545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDeclStmt(DeclStmt *Node) {
1579474504790f11617479b8d6ef8b64e32d071f251Steve Naroff  for (ScopedDecl *D = Node->getDecl(); D; D = D->getNextDeclarator()) {
1585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Indent();
1595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintRawDecl(D);
1605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << ";\n";
1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCompoundStmt(CompoundStmt *Node) {
1655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent();
1665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintRawCompoundStmt(Node);
1675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "\n";
1685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCaseStmt(CaseStmt *Node) {
1715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent(-1) << "case ";
1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getLHS());
1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Node->getRHS()) {
1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << " ... ";
1755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Node->getRHS());
1765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ":\n";
1785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintStmt(Node->getSubStmt(), 0);
1805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDefaultStmt(DefaultStmt *Node) {
1835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent(-1) << "default:\n";
1845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintStmt(Node->getSubStmt(), 0);
1855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitLabelStmt(LabelStmt *Node) {
1885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent(-1) << Node->getName() << ":\n";
1895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintStmt(Node->getSubStmt(), 0);
1905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawIfStmt(IfStmt *If) {
1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "if ";
1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(If->getCond());
1955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(If->getThen())) {
1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << ' ';
1985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintRawCompoundStmt(CS);
1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << (If->getElse() ? ' ' : '\n');
2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << '\n';
2025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintStmt(If->getThen());
2035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (If->getElse()) Indent();
2045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Stmt *Else = If->getElse()) {
2075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << "else";
2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Else)) {
2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      OS << ' ';
2115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      PrintRawCompoundStmt(CS);
2125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      OS << '\n';
2135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    } else if (IfStmt *ElseIf = dyn_cast<IfStmt>(Else)) {
2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      OS << ' ';
2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      PrintRawIfStmt(ElseIf);
2165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    } else {
2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      OS << '\n';
2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      PrintStmt(If->getElse());
2195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
2205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIfStmt(IfStmt *If) {
2245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent();
2255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintRawIfStmt(If);
2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitSwitchStmt(SwitchStmt *Node) {
2295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "switch (";
2305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getCond());
2315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")";
2325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Pretty print compoundstmt bodies (very common).
2345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
2355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << " ";
2365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintRawCompoundStmt(CS);
2375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << "\n";
2385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
2395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << "\n";
2405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintStmt(Node->getBody());
2415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
244c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlssonvoid StmtPrinter::VisitSwitchCase(SwitchCase*) {
245c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  assert(0 && "SwitchCase is an abstract class");
246c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson}
247c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson
2485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitWhileStmt(WhileStmt *Node) {
2495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "while (";
2505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getCond());
2515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")\n";
2525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintStmt(Node->getBody());
2535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDoStmt(DoStmt *Node) {
2568bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  Indent() << "do ";
2578bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
2588bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    PrintRawCompoundStmt(CS);
2598bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << " ";
2608bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  } else {
2618bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << "\n";
2628bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    PrintStmt(Node->getBody());
2638bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    Indent();
2648bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  }
2658bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner
2668bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  OS << "while ";
2675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getCond());
2685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ";\n";
2695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitForStmt(ForStmt *Node) {
2725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "for (";
2735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Node->getInit()) {
2745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getInit()))
2755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      PrintRawDecl(DS->getDecl());
2765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else
2775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      PrintExpr(cast<Expr>(Node->getInit()));
2785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2798bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  OS << ";";
2808bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  if (Node->getCond()) {
2818bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << " ";
2825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Node->getCond());
2838bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  }
2848bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  OS << ";";
2858bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  if (Node->getInc()) {
2868bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << " ";
2875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Node->getInc());
2888bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  }
2898bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  OS << ") ";
2908bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner
2918bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
2928bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    PrintRawCompoundStmt(CS);
2938bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << "\n";
2948bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  } else {
2958bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << "\n";
2968bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    PrintStmt(Node->getBody());
2978bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  }
2985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
300a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *Node) {
3010196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  Indent() << "for (";
3020196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getElement()))
3030196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    PrintRawDecl(DS->getDecl());
3040196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  else
3050196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    PrintExpr(cast<Expr>(Node->getElement()));
3060196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  OS << " in ";
3070196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  PrintExpr(Node->getCollection());
3080196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  OS << ") ";
3090196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian
3100196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
3110196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    PrintRawCompoundStmt(CS);
3120196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    OS << "\n";
3130196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  } else {
3140196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    OS << "\n";
3150196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    PrintStmt(Node->getBody());
3160196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  }
3170196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian}
3180196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian
3195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitGotoStmt(GotoStmt *Node) {
3205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "goto " << Node->getLabel()->getName() << ";\n";
3215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIndirectGotoStmt(IndirectGotoStmt *Node) {
3245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "goto *";
3255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getTarget());
3265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ";\n";
3275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitContinueStmt(ContinueStmt *Node) {
3305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "continue;\n";
3315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitBreakStmt(BreakStmt *Node) {
3345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "break;\n";
3355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitReturnStmt(ReturnStmt *Node) {
3395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "return";
3405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Node->getRetValue()) {
3415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << " ";
3425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Node->getRetValue());
3435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ";\n";
3455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
347fe795956194141c91ae555985c9b930595bff43fChris Lattner
348fe795956194141c91ae555985c9b930595bff43fChris Lattnervoid StmtPrinter::VisitAsmStmt(AsmStmt *Node) {
34939c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson  Indent() << "asm ";
35039c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson
35139c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson  if (Node->isVolatile())
35239c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson    OS << "volatile ";
35339c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson
35439c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson  OS << "(";
3556a0ef4b83c91a6d6d5acb4ed5577c4659fe022a3Anders Carlsson  VisitStringLiteral(Node->getAsmString());
356b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
357b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  // Outputs
358b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  if (Node->getNumOutputs() != 0 || Node->getNumInputs() != 0 ||
359b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      Node->getNumClobbers() != 0)
360b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " : ";
361b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
362b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  for (unsigned i = 0, e = Node->getNumOutputs(); i != e; ++i) {
363b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (i != 0)
364b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << ", ";
365b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
366b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (!Node->getOutputName(i).empty()) {
367b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << '[';
368b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << Node->getOutputName(i);
369b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << "] ";
370b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    }
371b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
372b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    VisitStringLiteral(Node->getOutputConstraint(i));
373b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " ";
374b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    Visit(Node->getOutputExpr(i));
375b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  }
376b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
377b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  // Inputs
378b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  if (Node->getNumInputs() != 0 || Node->getNumClobbers() != 0)
379b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " : ";
380b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
381b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  for (unsigned i = 0, e = Node->getNumInputs(); i != e; ++i) {
382b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (i != 0)
383b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << ", ";
384b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
385b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (!Node->getInputName(i).empty()) {
386b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << '[';
387b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << Node->getInputName(i);
388b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << "] ";
389b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    }
390b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
391b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    VisitStringLiteral(Node->getInputConstraint(i));
392b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " ";
393b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    Visit(Node->getInputExpr(i));
394b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  }
395b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
396b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  // Clobbers
397b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  if (Node->getNumClobbers() != 0)
398b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " : ";
399b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
400b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  for (unsigned i = 0, e = Node->getNumClobbers(); i != e; ++i) {
401b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (i != 0)
402b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << ", ";
403b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
404b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    VisitStringLiteral(Node->getClobber(i));
405b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  }
406b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson
4076a0ef4b83c91a6d6d5acb4ed5577c4659fe022a3Anders Carlsson  OS << ");\n";
408fe795956194141c91ae555985c9b930595bff43fChris Lattner}
409fe795956194141c91ae555985c9b930595bff43fChris Lattner
410a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtTryStmt(ObjCAtTryStmt *Node) {
4117794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian  Indent() << "@try";
4127794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian  if (CompoundStmt *TS = dyn_cast<CompoundStmt>(Node->getTryBody())) {
4137794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    PrintRawCompoundStmt(TS);
4147794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    OS << "\n";
4157794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian  }
4167794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian
417a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  for (ObjCAtCatchStmt *catchStmt =
418a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek         static_cast<ObjCAtCatchStmt *>(Node->getCatchStmts());
4197794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian       catchStmt;
4207794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian       catchStmt =
421a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek         static_cast<ObjCAtCatchStmt *>(catchStmt->getNextCatchStmt())) {
4227794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    Indent() << "@catch(";
4237794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    if (catchStmt->getCatchParamStmt()) {
4247794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian      if (DeclStmt *DS = dyn_cast<DeclStmt>(catchStmt->getCatchParamStmt()))
4257794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian        PrintRawDecl(DS->getDecl());
4267794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    }
4277794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    OS << ")";
4287794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    if (CompoundStmt *CS = dyn_cast<CompoundStmt>(catchStmt->getCatchBody()))
4297794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian      {
4307794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian        PrintRawCompoundStmt(CS);
4317794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian        OS << "\n";
4327794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian      }
4337794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian  }
4347794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian
435a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  if (ObjCAtFinallyStmt *FS =static_cast<ObjCAtFinallyStmt *>(
4361e7eab4ca34f8a0c076a6783f48e768923a10070Fariborz Jahanian          Node->getFinallyStmt())) {
4371e7eab4ca34f8a0c076a6783f48e768923a10070Fariborz Jahanian    Indent() << "@finally";
4381e7eab4ca34f8a0c076a6783f48e768923a10070Fariborz Jahanian    PrintRawCompoundStmt(dyn_cast<CompoundStmt>(FS->getFinallyBody()));
4397794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    OS << "\n";
4407794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian  }
441b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian}
442b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian
443a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *Node) {
444b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian}
445b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian
446a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtCatchStmt (ObjCAtCatchStmt *Node) {
447b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian  Indent() << "@catch (...) { /* todo */ } \n";
448b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian}
449b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian
45078a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanianvoid StmtPrinter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *Node) {
45139f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian  Indent() << "@throw";
45239f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian  if (Node->getThrowExpr()) {
45339f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian    OS << " ";
45439f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian    PrintExpr(Node->getThrowExpr());
45539f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian  }
45639f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian  OS << ";\n";
45739f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian}
45839f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian
45978a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanianvoid StmtPrinter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *Node) {
460c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian  Indent() << "@synchronized (";
461c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian  PrintExpr(Node->getSynchExpr());
462c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian  OS << ")";
46378a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanian  PrintRawCompoundStmt(Node->getSynchBody());
46478a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanian  OS << "\n";
465c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian}
466c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian
4675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
4685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//  Expr printing methods.
4695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
4705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitExpr(Expr *Node) {
4725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "<<unknown expr type>>";
4735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
4745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) {
4765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << Node->getDecl()->getName();
4775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
4785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
479e3e9add4fd788927df6f545570e7838db59c01d7Steve Naroffvoid StmtPrinter::VisitObjCSuperRefExpr(ObjCSuperRefExpr *Node) {
480e3e9add4fd788927df6f545570e7838db59c01d7Steve Naroff  OS << "super";
481e3e9add4fd788927df6f545570e7838db59c01d7Steve Naroff}
482e3e9add4fd788927df6f545570e7838db59c01d7Steve Naroff
4837779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroffvoid StmtPrinter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
484232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian  if (Node->getBase()) {
485232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian    PrintExpr(Node->getBase());
486232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian    OS << (Node->isArrow() ? "->" : ".");
487232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian  }
4887779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff  OS << Node->getDecl()->getName();
4897779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff}
4907779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff
491ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroffvoid StmtPrinter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
492ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff  if (Node->getBase()) {
493ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff    PrintExpr(Node->getBase());
494ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff    OS << ".";
495ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff  }
496ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff  // FIXME: OS << Node->getDecl()->getName();
497ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff}
498ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff
499227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlssonvoid StmtPrinter::VisitPreDefinedExpr(PreDefinedExpr *Node) {
500227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson  switch (Node->getIdentType()) {
501227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    default:
502227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      assert(0 && "unknown case");
503227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    case PreDefinedExpr::Func:
504227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      OS << "__func__";
505227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      break;
506227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    case PreDefinedExpr::Function:
507227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      OS << "__FUNCTION__";
508227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      break;
509227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    case PreDefinedExpr::PrettyFunction:
510227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      OS << "__PRETTY_FUNCTION__";
511227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      break;
512227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson  }
513227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson}
514227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson
5155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCharacterLiteral(CharacterLiteral *Node) {
5168bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  // FIXME should print an L for wchar_t constants
517b0a721a51a85b7b1ea9b33dbe12f4a58232590e2Chris Lattner  unsigned value = Node->getValue();
5188bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  switch (value) {
5198bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\\':
5208bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\\\'";
5218bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5228bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\'':
5238bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\''";
5248bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5258bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\a':
5268bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    // TODO: K&R: the meaning of '\\a' is different in traditional C
5278bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\a'";
5288bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5298bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\b':
5308bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\b'";
5318bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5328bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  // Nonstandard escape sequence.
5338bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  /*case '\e':
5348bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\e'";
5358bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;*/
5368bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\f':
5378bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\f'";
5388bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5398bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\n':
5408bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\n'";
5418bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5428bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\r':
5438bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\r'";
5448bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5458bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\t':
5468bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\t'";
5478bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5488bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\v':
5498bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\v'";
5508bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5518bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  default:
552471733d84639fcea35d7876940d7d32fa575e158Ted Kremenek    if (value < 256 && isprint(value)) {
5538bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner      OS << "'" << (char)value << "'";
5548bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    } else if (value < 256) {
5558bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner      OS << "'\\x" << std::hex << value << std::dec << "'";
5568bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    } else {
5578bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner      // FIXME what to really do here?
5588bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner      OS << value;
5598bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    }
560b0a721a51a85b7b1ea9b33dbe12f4a58232590e2Chris Lattner  }
5615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIntegerLiteral(IntegerLiteral *Node) {
5645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isSigned = Node->getType()->isSignedIntegerType();
5655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << Node->getValue().toString(10, isSigned);
5665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Emit suffixes.  Integer literals are always a builtin integer type.
5685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (cast<BuiltinType>(Node->getType().getCanonicalType())->getKind()) {
5695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  default: assert(0 && "Unexpected type for integer literal!");
5705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Int:       break; // no suffix.
5715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::UInt:      OS << 'U'; break;
5725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Long:      OS << 'L'; break;
5735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::ULong:     OS << "UL"; break;
5745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::LongLong:  OS << "LL"; break;
5755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::ULongLong: OS << "ULL"; break;
5765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
5775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitFloatingLiteral(FloatingLiteral *Node) {
57986e499d9525ab4f2258724c4ca2826acd6b13a8eChris Lattner  // FIXME: print value more precisely.
580da8249e57f3badecf925571881fe57243935c6c1Chris Lattner  OS << Node->getValueAsApproximateDouble();
5815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5825d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner
5835d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattnervoid StmtPrinter::VisitImaginaryLiteral(ImaginaryLiteral *Node) {
5845d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner  PrintExpr(Node->getSubExpr());
5855d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner  OS << "i";
5865d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner}
5875d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner
5885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitStringLiteral(StringLiteral *Str) {
5895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Str->isWide()) OS << 'L';
5905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << '"';
591ee98ac5a1330db432b188dd2d38b6631aac47bf1Anders Carlsson
5925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // FIXME: this doesn't print wstrings right.
5935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0, e = Str->getByteLength(); i != e; ++i) {
5945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    switch (Str->getStrData()[i]) {
5955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    default: OS << Str->getStrData()[i]; break;
5965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Handle some common ones to make dumps prettier.
5975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case '\\': OS << "\\\\"; break;
5985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case '"': OS << "\\\""; break;
5995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case '\n': OS << "\\n"; break;
6005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case '\t': OS << "\\t"; break;
6015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case '\a': OS << "\\a"; break;
6025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case '\b': OS << "\\b"; break;
6035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
6045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
6055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << '"';
6065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitParenExpr(ParenExpr *Node) {
6085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "(";
6095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getSubExpr());
6105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")";
6115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitUnaryOperator(UnaryOperator *Node) {
613296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner  if (!Node->isPostfix()) {
6145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << UnaryOperator::getOpcodeStr(Node->getOpcode());
615296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner
616296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    // Print a space if this is an "identifier operator" like sizeof or __real.
617296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    switch (Node->getOpcode()) {
618296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    default: break;
619296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    case UnaryOperator::SizeOf:
620296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    case UnaryOperator::AlignOf:
621296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    case UnaryOperator::Real:
622296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    case UnaryOperator::Imag:
623296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    case UnaryOperator::Extension:
624296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner      OS << ' ';
625296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner      break;
626296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    }
627296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner  }
6285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getSubExpr());
6295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Node->isPostfix())
6315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << UnaryOperator::getOpcodeStr(Node->getOpcode());
632704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner}
633704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner
634704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattnerbool StmtPrinter::PrintOffsetOfDesignator(Expr *E) {
635704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner  if (isa<CompoundLiteralExpr>(E)) {
636704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    // Base case, print the type and comma.
637704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    OS << E->getType().getAsString() << ", ";
638704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    return true;
639704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner  } else if (ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(E)) {
640704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    PrintOffsetOfDesignator(ASE->getLHS());
641704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    OS << "[";
642704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    PrintExpr(ASE->getRHS());
643704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    OS << "]";
644704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    return false;
645704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner  } else {
646704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    MemberExpr *ME = cast<MemberExpr>(E);
647704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    bool IsFirst = PrintOffsetOfDesignator(ME->getBase());
648704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    OS << (IsFirst ? "" : ".") << ME->getMemberDecl()->getName();
649704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    return false;
650704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner  }
651704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner}
6525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
653704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattnervoid StmtPrinter::VisitUnaryOffsetOf(UnaryOperator *Node) {
654704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner  OS << "__builtin_offsetof(";
655704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner  PrintOffsetOfDesignator(Node->getSubExpr());
656704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner  OS << ")";
6575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
658704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner
6595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitSizeOfAlignOfTypeExpr(SizeOfAlignOfTypeExpr *Node) {
6605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << (Node->isSizeOf() ? "sizeof(" : "__alignof(");
6615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << Node->getArgumentType().getAsString() << ")";
6625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitArraySubscriptExpr(ArraySubscriptExpr *Node) {
6642324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  PrintExpr(Node->getLHS());
6655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "[";
6662324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  PrintExpr(Node->getRHS());
6675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "]";
6685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCallExpr(CallExpr *Call) {
6715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Call->getCallee());
6725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "(";
6735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0, e = Call->getNumArgs(); i != e; ++i) {
67404421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner    if (isa<CXXDefaultArgExpr>(Call->getArg(i))) {
67504421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner      // Don't print any defaulted arguments
67604421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner      break;
67704421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner    }
67804421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner
6795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (i) OS << ", ";
6805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Call->getArg(i));
6815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
6825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")";
6835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitMemberExpr(MemberExpr *Node) {
6855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getBase());
6865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << (Node->isArrow() ? "->" : ".");
6875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  FieldDecl *Field = Node->getMemberDecl();
6895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(Field && "MemberExpr should alway reference a field!");
6905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << Field->getName();
6915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
692213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanvoid StmtPrinter::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) {
69331a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  PrintExpr(Node->getBase());
69431a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  OS << ".";
69531a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  OS << Node->getAccessor().getName();
69631a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff}
6975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCastExpr(CastExpr *Node) {
69826dc7b39267b7d29b35a7887a5b8e54697192192Chris Lattner  OS << "(" << Node->getType().getAsString() << ")";
6995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getSubExpr());
7005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
701aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroffvoid StmtPrinter::VisitCompoundLiteralExpr(CompoundLiteralExpr *Node) {
702aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff  OS << "(" << Node->getType().getAsString() << ")";
703aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff  PrintExpr(Node->getInitializer());
704aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff}
70549b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroffvoid StmtPrinter::VisitImplicitCastExpr(ImplicitCastExpr *Node) {
70690045e8ebabf50d6f1b3a67081a621b20b5e5341Steve Naroff  // No need to print anything, simply forward to the sub expression.
70790045e8ebabf50d6f1b3a67081a621b20b5e5341Steve Naroff  PrintExpr(Node->getSubExpr());
70849b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff}
7095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitBinaryOperator(BinaryOperator *Node) {
7105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getLHS());
7115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " ";
712eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  PrintExpr(Node->getRHS());
713eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner}
714eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattnervoid StmtPrinter::VisitCompoundAssignOperator(CompoundAssignOperator *Node) {
715eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  PrintExpr(Node->getLHS());
716eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " ";
7175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getRHS());
7185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitConditionalOperator(ConditionalOperator *Node) {
7205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getCond());
7218e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek
7228e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek  if (Node->getLHS()) {
7238e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek    OS << " ? ";
7248e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek    PrintExpr(Node->getLHS());
7258e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek    OS << " : ";
7268e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek  }
7278e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek  else { // Handle GCC extention where LHS can be NULL.
7288e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek    OS << " ?: ";
7298e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek  }
7308e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek
7315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getRHS());
7325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// GNU extensions.
7355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7366481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattnervoid StmtPrinter::VisitAddrLabelExpr(AddrLabelExpr *Node) {
7375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "&&" << Node->getLabel()->getName();
7385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
740ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattnervoid StmtPrinter::VisitStmtExpr(StmtExpr *E) {
741ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  OS << "(";
742ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  PrintRawCompoundStmt(E->getSubStmt());
743ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  OS << ")";
744ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner}
745ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner
746d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroffvoid StmtPrinter::VisitTypesCompatibleExpr(TypesCompatibleExpr *Node) {
747d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff  OS << "__builtin_types_compatible_p(";
748d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff  OS << Node->getArgType1().getAsString() << ",";
749d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff  OS << Node->getArgType2().getAsString() << ")";
750d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff}
751d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff
752d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroffvoid StmtPrinter::VisitChooseExpr(ChooseExpr *Node) {
753d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  OS << "__builtin_choose_expr(";
754d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  PrintExpr(Node->getCond());
75594f05e36488fd08e404ac409d3bcb1db1da1bd4dChris Lattner  OS << ", ";
756d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  PrintExpr(Node->getLHS());
75794f05e36488fd08e404ac409d3bcb1db1da1bd4dChris Lattner  OS << ", ";
758d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  PrintExpr(Node->getRHS());
759d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  OS << ")";
760d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff}
761ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner
762e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begemanvoid StmtPrinter::VisitOverloadExpr(OverloadExpr *Node) {
763e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman  OS << "__builtin_overload(";
76467295d05c50ab0b5d1b0f9ef82a906701c348715Nate Begeman  for (unsigned i = 0, e = Node->getNumSubExprs(); i != e; ++i) {
765e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman    if (i) OS << ", ";
76667295d05c50ab0b5d1b0f9ef82a906701c348715Nate Begeman    PrintExpr(Node->getExpr(i));
767e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman  }
768e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman  OS << ")";
769d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman}
770d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman
771d38617c8a50f9729c254ab76cd359af797c6739bEli Friedmanvoid StmtPrinter::VisitShuffleVectorExpr(ShuffleVectorExpr *Node) {
772d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  OS << "__builtin_shufflevector(";
773d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  for (unsigned i = 0, e = Node->getNumSubExprs(); i != e; ++i) {
774d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman    if (i) OS << ", ";
775d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman    PrintExpr(Node->getExpr(i));
776d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  }
777d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  OS << ")";
778e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman}
779e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman
78066b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlssonvoid StmtPrinter::VisitInitListExpr(InitListExpr* Node) {
78166b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  OS << "{ ";
78266b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  for (unsigned i = 0, e = Node->getNumInits(); i != e; ++i) {
78366b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson    if (i) OS << ", ";
78466b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson    PrintExpr(Node->getInit(i));
78566b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  }
78666b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  OS << " }";
78766b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson}
78866b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson
7897c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlssonvoid StmtPrinter::VisitVAArgExpr(VAArgExpr *Node) {
7907c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  OS << "va_arg(";
7917c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  PrintExpr(Node->getSubExpr());
7927c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  OS << ", ";
7937c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  OS << Node->getType().getAsString();
7947c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  OS << ")";
7957c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson}
7967c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson
7975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// C++
7985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCXXCastExpr(CXXCastExpr *Node) {
80036460eea641bf20a67b8b767b6d26373a90f0965Chris Lattner  OS << CXXCastExpr::getOpcodeStr(Node->getOpcode()) << '<';
8015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << Node->getDestType().getAsString() << ">(";
8025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getSubExpr());
8035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")";
8045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) {
8075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << (Node->getValue() ? "true" : "false");
8085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
81050dd289f45738ed22b7583d52ed2525b927042ffChris Lattnervoid StmtPrinter::VisitCXXThrowExpr(CXXThrowExpr *Node) {
81150dd289f45738ed22b7583d52ed2525b927042ffChris Lattner  if (Node->getSubExpr() == 0)
81250dd289f45738ed22b7583d52ed2525b927042ffChris Lattner    OS << "throw";
81350dd289f45738ed22b7583d52ed2525b927042ffChris Lattner  else {
81450dd289f45738ed22b7583d52ed2525b927042ffChris Lattner    OS << "throw ";
81550dd289f45738ed22b7583d52ed2525b927042ffChris Lattner    PrintExpr(Node->getSubExpr());
81650dd289f45738ed22b7583d52ed2525b927042ffChris Lattner  }
81750dd289f45738ed22b7583d52ed2525b927042ffChris Lattner}
81850dd289f45738ed22b7583d52ed2525b927042ffChris Lattner
81904421087832a031c90bd58f128c7c0e741db8dd2Chris Lattnervoid StmtPrinter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *Node) {
82004421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner  // Nothing to print: we picked up the default argument
82104421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner}
82204421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner
8235508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// Obj-C
8245508518a2702b00be3b15a26d772bde968972f54Anders Carlsson
8255508518a2702b00be3b15a26d772bde968972f54Anders Carlssonvoid StmtPrinter::VisitObjCStringLiteral(ObjCStringLiteral *Node) {
8265508518a2702b00be3b15a26d772bde968972f54Anders Carlsson  OS << "@";
8275508518a2702b00be3b15a26d772bde968972f54Anders Carlsson  VisitStringLiteral(Node->getString());
8285508518a2702b00be3b15a26d772bde968972f54Anders Carlsson}
8295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
830f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlssonvoid StmtPrinter::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) {
831994f939926ddbd38d99c4fe6dcfc3530c13a9a75Chris Lattner  OS << "@encode(" << Node->getEncodedType().getAsString() << ")";
832f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson}
833f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson
834b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanianvoid StmtPrinter::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) {
835994f939926ddbd38d99c4fe6dcfc3530c13a9a75Chris Lattner  OS << "@selector(" << Node->getSelector().getName() << ")";
836b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian}
837b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian
838390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanianvoid StmtPrinter::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) {
839994f939926ddbd38d99c4fe6dcfc3530c13a9a75Chris Lattner  OS << "@protocol(" << Node->getProtocol()->getName() << ")";
840390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian}
841390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian
842563477da25f824e37c535131695dc4dc9b68c465Steve Naroffvoid StmtPrinter::VisitObjCMessageExpr(ObjCMessageExpr *Mess) {
843563477da25f824e37c535131695dc4dc9b68c465Steve Naroff  OS << "[";
8446a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  Expr *receiver = Mess->getReceiver();
8456a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  if (receiver) PrintExpr(receiver);
8466a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  else OS << Mess->getClassName()->getName();
847c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek  OS << ' ';
84897b7f26a92d87e514530a5b652460190ce48c974Ted Kremenek  Selector selector = Mess->getSelector();
8496a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  if (selector.isUnarySelector()) {
850c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek    OS << selector.getIdentifierInfoForSlot(0)->getName();
8516a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  } else {
8526a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff    for (unsigned i = 0, e = Mess->getNumArgs(); i != e; ++i) {
853c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek      if (i < selector.getNumArgs()) {
854c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek        if (i > 0) OS << ' ';
855c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek        if (selector.getIdentifierInfoForSlot(i))
856c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek          OS << selector.getIdentifierInfoForSlot(i)->getName() << ":";
857c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek        else
858c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek           OS << ":";
859c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek      }
860c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek      else OS << ", "; // Handle variadic methods.
861c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek
8626a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff      PrintExpr(Mess->getArg(i));
8636a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff    }
864563477da25f824e37c535131695dc4dc9b68c465Steve Naroff  }
865563477da25f824e37c535131695dc4dc9b68c465Steve Naroff  OS << "]";
866563477da25f824e37c535131695dc4dc9b68c465Steve Naroff}
867563477da25f824e37c535131695dc4dc9b68c465Steve Naroff
8685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
8695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Stmt method implementations
8705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
8715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8726000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dumpPretty() const {
87351221ec87faa0365c9fc8c8ad7b7f2d3ee36c8efTed Kremenek  printPretty(*llvm::cerr.stream());
8745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
87642a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenekvoid Stmt::printPretty(std::ostream &OS, PrinterHelper* Helper) const {
8775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (this == 0) {
8785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << "<NULL>";
8795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return;
8805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
8815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
88242a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek  StmtPrinter P(OS, Helper);
883c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner  P.Visit(const_cast<Stmt*>(this));
8845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
88542a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek
88642a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//===----------------------------------------------------------------------===//
88742a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek// PrinterHelper
88842a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//===----------------------------------------------------------------------===//
88942a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek
89042a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek// Implement virtual destructor.
8918467583c2704e7a9691ea56939a029015f0ade0aGabor GreifPrinterHelper::~PrinterHelper() {}
892