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