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