StmtPrinter.cpp revision 8ecdb65716cd7914ffb2eeee993fa9039fcd31e8
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" 161a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor#include "clang/AST/DeclCXX.h" 1791d1d7a448bbde955e15ec39aa368958673450bfTed Kremenek#include "clang/AST/DeclObjC.h" 1842a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek#include "clang/AST/PrettyPrinter.h" 19a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek#include "llvm/Support/Format.h" 208ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor#include "clang/AST/Expr.h" 215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// StmtPrinter Visitor 255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace { 28770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramer class StmtPrinter : public StmtVisitor<StmtPrinter> { 29a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek llvm::raw_ostream &OS; 3048d14a222276fad5279e994d1a062f36ae6fcbceEli Friedman ASTContext &Context; 315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned IndentLevel; 3242a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek clang::PrinterHelper* Helper; 33d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor PrintingPolicy Policy; 34d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor 355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer public: 361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StmtPrinter(llvm::raw_ostream &os, ASTContext &C, PrinterHelper* helper, 37e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner const PrintingPolicy &Policy, 38d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor unsigned Indentation = 0) 3948d14a222276fad5279e994d1a062f36ae6fcbceEli Friedman : OS(os), Context(C), IndentLevel(Indentation), Helper(helper), 4048d14a222276fad5279e994d1a062f36ae6fcbceEli Friedman Policy(Policy) {} 411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor void PrintStmt(Stmt *S) { 43d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor PrintStmt(S, Policy.Indentation); 44d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor } 45d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor 46d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor void PrintStmt(Stmt *S, int SubIndent) { 475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer IndentLevel += SubIndent; 485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (S && isa<Expr>(S)) { 495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If this is an expr used in a stmt context, indent and newline it. 505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(); 51c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner Visit(S); 525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ";\n"; 535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else if (S) { 54c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner Visit(S); 555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else { 565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "<<<NULL STATEMENT>>>\n"; 575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer IndentLevel -= SubIndent; 595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 60db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman 615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void PrintRawCompoundStmt(CompoundStmt *S); 625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void PrintRawDecl(Decl *D); 63ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek void PrintRawDeclStmt(DeclStmt *S); 645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void PrintRawIfStmt(IfStmt *If); 658351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl void PrintRawCXXCatchStmt(CXXCatchStmt *Catch); 661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void PrintExpr(Expr *E) { 685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (E) 69c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner Visit(E); 705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer else 715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "<null expr>"; 725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 74071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump llvm::raw_ostream &Indent(int Delta = 0) { 75d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor for (int i = 0, e = IndentLevel+Delta; i < e; ++i) 76d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor OS << " "; 775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return OS; 785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 80704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner bool PrintOffsetOfDesignator(Expr *E); 81704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner void VisitUnaryOffsetOf(UnaryOperator *Node); 821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump void Visit(Stmt* S) { 8442a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek if (Helper && Helper->handledStmt(S,OS)) 8542a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek return; 8642a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek else StmtVisitor<StmtPrinter>::Visit(S); 8742a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek } 881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 89c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner void VisitStmt(Stmt *Node); 90f2cad8633e46cce12fc3d77c0bd451ffd7264bafDouglas Gregor#define STMT(CLASS, PARENT) \ 91c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner void Visit##CLASS(CLASS *Node); 925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/StmtNodes.def" 935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer }; 945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Stmt printing methods. 985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitStmt(Stmt *Node) { 1015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "<<unknown stmt type>>\n"; 1025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// PrintRawCompoundStmt - Print a compound stmt without indenting the {, and 1055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// with no newline after the }. 1065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawCompoundStmt(CompoundStmt *Node) { 1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "{\n"; 1085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (CompoundStmt::body_iterator I = Node->body_begin(), E = Node->body_end(); 1095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer I != E; ++I) 1105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(*I); 1111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "}"; 1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawDecl(Decl *D) { 116f1d60eaf3f70975ee262852af2d6aeabd140ed58Argyrios Kyrtzidis D->print(OS, Policy, IndentLevel); 117071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump} 118071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump 119ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenekvoid StmtPrinter::PrintRawDeclStmt(DeclStmt *S) { 120db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman DeclStmt::decl_iterator Begin = S->decl_begin(), End = S->decl_end(); 12142f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman llvm::SmallVector<Decl*, 2> Decls; 1221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for ( ; Begin != End; ++Begin) 12342f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman Decls.push_back(*Begin); 124db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman 125f1d60eaf3f70975ee262852af2d6aeabd140ed58Argyrios Kyrtzidis Decl::printGroup(Decls.data(), Decls.size(), OS, Policy, IndentLevel); 126ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek} 1275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitNullStmt(NullStmt *Node) { 1295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << ";\n"; 1305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDeclStmt(DeclStmt *Node) { 133db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman Indent(); 134db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman PrintRawDeclStmt(Node); 135db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman OS << ";\n"; 1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCompoundStmt(CompoundStmt *Node) { 1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(); 1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawCompoundStmt(Node); 1415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "\n"; 1425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCaseStmt(CaseStmt *Node) { 1455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(-1) << "case "; 1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getLHS()); 1475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Node->getRHS()) { 1485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << " ... "; 1495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getRHS()); 1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ":\n"; 1521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(Node->getSubStmt(), 0); 1545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDefaultStmt(DefaultStmt *Node) { 1575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(-1) << "default:\n"; 1585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(Node->getSubStmt(), 0); 1595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitLabelStmt(LabelStmt *Node) { 1625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(-1) << Node->getName() << ":\n"; 1635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(Node->getSubStmt(), 0); 1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawIfStmt(IfStmt *If) { 167bfee9b2d909b80ef56b49980665016b9eecacf12Sebastian Redl OS << "if ("; 1685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(If->getCond()); 169bfee9b2d909b80ef56b49980665016b9eecacf12Sebastian Redl OS << ')'; 1701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (CompoundStmt *CS = dyn_cast<CompoundStmt>(If->getThen())) { 1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ' '; 1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawCompoundStmt(CS); 1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << (If->getElse() ? ' ' : '\n'); 1755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else { 1765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << '\n'; 1775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(If->getThen()); 1785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (If->getElse()) Indent(); 1795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Stmt *Else = If->getElse()) { 1825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "else"; 1831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Else)) { 1855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ' '; 1865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawCompoundStmt(CS); 1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << '\n'; 1885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else if (IfStmt *ElseIf = dyn_cast<IfStmt>(Else)) { 1895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ' '; 1905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawIfStmt(ElseIf); 1915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else { 1925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << '\n'; 1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(If->getElse()); 1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIfStmt(IfStmt *If) { 1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(); 2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawIfStmt(If); 2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitSwitchStmt(SwitchStmt *Node) { 2045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "switch ("; 2055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getCond()); 2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ")"; 2071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Pretty print compoundstmt bodies (very common). 2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << " "; 2115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawCompoundStmt(CS); 2125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "\n"; 2135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else { 2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "\n"; 2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(Node->getBody()); 2165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 219c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlssonvoid StmtPrinter::VisitSwitchCase(SwitchCase*) { 220c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson assert(0 && "SwitchCase is an abstract class"); 221c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson} 222c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson 2235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitWhileStmt(WhileStmt *Node) { 2245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "while ("; 2255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getCond()); 2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ")\n"; 2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(Node->getBody()); 2285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDoStmt(DoStmt *Node) { 2318bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner Indent() << "do "; 2328bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 2338bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner PrintRawCompoundStmt(CS); 2348bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << " "; 2358bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } else { 2368bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << "\n"; 2378bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner PrintStmt(Node->getBody()); 2388bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner Indent(); 2398bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } 2401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 241b3e229694a5d1966fcf604073e82b0057eb3114aEli Friedman OS << "while ("; 2425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getCond()); 243b3e229694a5d1966fcf604073e82b0057eb3114aEli Friedman OS << ");\n"; 2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitForStmt(ForStmt *Node) { 2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "for ("; 2485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Node->getInit()) { 2495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getInit())) 250ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek PrintRawDeclStmt(DS); 2515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer else 2525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(cast<Expr>(Node->getInit())); 2535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2548bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << ";"; 2558bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner if (Node->getCond()) { 2568bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << " "; 2575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getCond()); 2588bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } 2598bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << ";"; 2608bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner if (Node->getInc()) { 2618bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << " "; 2625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getInc()); 2638bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } 2648bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << ") "; 2651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2668bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 2678bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner PrintRawCompoundStmt(CS); 2688bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << "\n"; 2698bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } else { 2708bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << "\n"; 2718bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner PrintStmt(Node->getBody()); 2728bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } 2735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 275a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *Node) { 2760196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian Indent() << "for ("; 2770196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getElement())) 278ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek PrintRawDeclStmt(DS); 2790196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian else 2800196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian PrintExpr(cast<Expr>(Node->getElement())); 2810196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian OS << " in "; 2820196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian PrintExpr(Node->getCollection()); 2830196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian OS << ") "; 2841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2850196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 2860196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian PrintRawCompoundStmt(CS); 2870196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian OS << "\n"; 2880196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian } else { 2890196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian OS << "\n"; 2900196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian PrintStmt(Node->getBody()); 2910196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian } 2920196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian} 2930196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian 2945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitGotoStmt(GotoStmt *Node) { 2955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "goto " << Node->getLabel()->getName() << ";\n"; 2965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIndirectGotoStmt(IndirectGotoStmt *Node) { 2995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "goto *"; 3005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getTarget()); 3015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ";\n"; 3025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitContinueStmt(ContinueStmt *Node) { 3055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "continue;\n"; 3065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitBreakStmt(BreakStmt *Node) { 3095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "break;\n"; 3105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitReturnStmt(ReturnStmt *Node) { 3145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "return"; 3155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Node->getRetValue()) { 3165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << " "; 3175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getRetValue()); 3185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ";\n"; 3205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 322fe795956194141c91ae555985c9b930595bff43fChris Lattner 323fe795956194141c91ae555985c9b930595bff43fChris Lattnervoid StmtPrinter::VisitAsmStmt(AsmStmt *Node) { 32439c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson Indent() << "asm "; 3251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32639c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson if (Node->isVolatile()) 32739c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson OS << "volatile "; 3281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32939c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson OS << "("; 3306a0ef4b83c91a6d6d5acb4ed5577c4659fe022a3Anders Carlsson VisitStringLiteral(Node->getAsmString()); 3311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 332b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson // Outputs 333b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (Node->getNumOutputs() != 0 || Node->getNumInputs() != 0 || 334b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson Node->getNumClobbers() != 0) 335b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << " : "; 3361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 337b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson for (unsigned i = 0, e = Node->getNumOutputs(); i != e; ++i) { 338b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (i != 0) 339b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << ", "; 3401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 341b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (!Node->getOutputName(i).empty()) { 342b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << '['; 343b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << Node->getOutputName(i); 344b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << "] "; 345b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson } 3461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 347b327793860737d1c103a73aeda8057dd628a101dChris Lattner VisitStringLiteral(Node->getOutputConstraintLiteral(i)); 348b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << " "; 349b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson Visit(Node->getOutputExpr(i)); 350b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson } 3511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 352b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson // Inputs 353b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (Node->getNumInputs() != 0 || Node->getNumClobbers() != 0) 354b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << " : "; 3551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 356b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson for (unsigned i = 0, e = Node->getNumInputs(); i != e; ++i) { 357b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (i != 0) 358b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << ", "; 3591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 360b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (!Node->getInputName(i).empty()) { 361b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << '['; 362b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << Node->getInputName(i); 363b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << "] "; 364b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson } 3651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 366b327793860737d1c103a73aeda8057dd628a101dChris Lattner VisitStringLiteral(Node->getInputConstraintLiteral(i)); 367b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << " "; 368b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson Visit(Node->getInputExpr(i)); 369b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson } 3701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 371b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson // Clobbers 372b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (Node->getNumClobbers() != 0) 373b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << " : "; 3741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 375b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson for (unsigned i = 0, e = Node->getNumClobbers(); i != e; ++i) { 376b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (i != 0) 377b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << ", "; 3781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 379b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson VisitStringLiteral(Node->getClobber(i)); 380b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson } 3811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3826a0ef4b83c91a6d6d5acb4ed5577c4659fe022a3Anders Carlsson OS << ");\n"; 383fe795956194141c91ae555985c9b930595bff43fChris Lattner} 384fe795956194141c91ae555985c9b930595bff43fChris Lattner 385a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtTryStmt(ObjCAtTryStmt *Node) { 3867794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian Indent() << "@try"; 3877794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian if (CompoundStmt *TS = dyn_cast<CompoundStmt>(Node->getTryBody())) { 3887794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian PrintRawCompoundStmt(TS); 3897794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian OS << "\n"; 3907794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian } 3911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3928f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor for (unsigned I = 0, N = Node->getNumCatchStmts(); I != N; ++I) { 3938f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor ObjCAtCatchStmt *catchStmt = Node->getCatchStmt(I); 3947794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian Indent() << "@catch("; 3957ba138abd329e591a8f6d5001f60dd7082f71b3bSteve Naroff if (catchStmt->getCatchParamDecl()) { 3967ba138abd329e591a8f6d5001f60dd7082f71b3bSteve Naroff if (Decl *DS = catchStmt->getCatchParamDecl()) 3977ba138abd329e591a8f6d5001f60dd7082f71b3bSteve Naroff PrintRawDecl(DS); 3987794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian } 3997794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian OS << ")"; 4001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (CompoundStmt *CS = dyn_cast<CompoundStmt>(catchStmt->getCatchBody())) { 4011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump PrintRawCompoundStmt(CS); 4021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OS << "\n"; 4031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 4047794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian } 4051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (ObjCAtFinallyStmt *FS = static_cast<ObjCAtFinallyStmt *>( 4071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Node->getFinallyStmt())) { 4081e7eab4ca34f8a0c076a6783f48e768923a10070Fariborz Jahanian Indent() << "@finally"; 4091e7eab4ca34f8a0c076a6783f48e768923a10070Fariborz Jahanian PrintRawCompoundStmt(dyn_cast<CompoundStmt>(FS->getFinallyBody())); 4107794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian OS << "\n"; 4111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 412b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian} 413b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian 414a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *Node) { 415b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian} 416b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian 417a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtCatchStmt (ObjCAtCatchStmt *Node) { 418b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian Indent() << "@catch (...) { /* todo */ } \n"; 419b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian} 420b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian 42178a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanianvoid StmtPrinter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *Node) { 42239f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian Indent() << "@throw"; 42339f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian if (Node->getThrowExpr()) { 42439f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian OS << " "; 42539f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian PrintExpr(Node->getThrowExpr()); 42639f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian } 42739f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian OS << ";\n"; 42839f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian} 42939f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian 43078a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanianvoid StmtPrinter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *Node) { 431c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian Indent() << "@synchronized ("; 432c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian PrintExpr(Node->getSynchExpr()); 433c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian OS << ")"; 43478a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanian PrintRawCompoundStmt(Node->getSynchBody()); 43578a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanian OS << "\n"; 436c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian} 437c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian 4388351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redlvoid StmtPrinter::PrintRawCXXCatchStmt(CXXCatchStmt *Node) { 4398351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl OS << "catch ("; 4404b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl if (Decl *ExDecl = Node->getExceptionDecl()) 4414b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl PrintRawDecl(ExDecl); 4424b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl else 4434b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl OS << "..."; 4444b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl OS << ") "; 4454b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl PrintRawCompoundStmt(cast<CompoundStmt>(Node->getHandlerBlock())); 4468351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl} 4478351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl 4488351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redlvoid StmtPrinter::VisitCXXCatchStmt(CXXCatchStmt *Node) { 4498351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl Indent(); 4508351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl PrintRawCXXCatchStmt(Node); 4518351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl OS << "\n"; 4528351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl} 4538351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl 4548351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redlvoid StmtPrinter::VisitCXXTryStmt(CXXTryStmt *Node) { 4558351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl Indent() << "try "; 4568351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl PrintRawCompoundStmt(Node->getTryBlock()); 4571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (unsigned i = 0, e = Node->getNumHandlers(); i < e; ++i) { 4588351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl OS << " "; 4598351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl PrintRawCXXCatchStmt(Node->getHandler(i)); 4608351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl } 4614b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl OS << "\n"; 4624b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl} 4634b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl 4645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 4655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Expr printing methods. 4665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 4675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 4685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitExpr(Expr *Node) { 4695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "<<unknown expr type>>"; 4705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 4715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 4725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) { 473a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 474a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier->print(OS, Policy); 475900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer OS << Node->getDecl(); 476a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (Node->hasExplicitTemplateArgumentList()) 477a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor OS << TemplateSpecializationType::PrintTemplateArgumentList( 478a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Node->getTemplateArgs(), 479a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Node->getNumTemplateArgs(), 480a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Policy); 4811a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor} 4821a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor 483865d447ac6a4721ab58e898d014a21f2eff74b06John McCallvoid StmtPrinter::VisitDependentScopeDeclRefExpr( 484865d447ac6a4721ab58e898d014a21f2eff74b06John McCall DependentScopeDeclRefExpr *Node) { 485d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor Node->getQualifier()->print(OS, Policy); 4865953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor OS << Node->getDeclName().getAsString(); 487f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (Node->hasExplicitTemplateArgs()) 488f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall OS << TemplateSpecializationType::PrintTemplateArgumentList( 489f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Node->getTemplateArgs(), 490f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Node->getNumTemplateArgs(), 491f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Policy); 4925953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor} 4935953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 494ba13543329afac4a0d01304ec2ec4924d99306a6John McCallvoid StmtPrinter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) { 495edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor if (Node->getQualifier()) 496edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor Node->getQualifier()->print(OS, Policy); 497f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall OS << Node->getName().getAsString(); 498f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (Node->hasExplicitTemplateArgs()) 499f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall OS << TemplateSpecializationType::PrintTemplateArgumentList( 500f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Node->getTemplateArgs(), 501edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor Node->getNumTemplateArgs(), 502f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Policy); 503edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor} 504edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor 5057779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroffvoid StmtPrinter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) { 506232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian if (Node->getBase()) { 507232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian PrintExpr(Node->getBase()); 508232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian OS << (Node->isArrow() ? "->" : "."); 509232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian } 510900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer OS << Node->getDecl(); 5117779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff} 5127779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff 513ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroffvoid StmtPrinter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) { 514ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff if (Node->getBase()) { 515ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff PrintExpr(Node->getBase()); 516ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff OS << "."; 517ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff } 518c77a636688e188af7e7a9a05829e542adb48e880Steve Naroff OS << Node->getProperty()->getNameAsCString(); 519ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff} 520ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff 52109105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanianvoid StmtPrinter::VisitObjCImplicitSetterGetterRefExpr( 52209105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian ObjCImplicitSetterGetterRefExpr *Node) { 5235daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian if (Node->getBase()) { 5245daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian PrintExpr(Node->getBase()); 5255daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian OS << "."; 5265daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian } 527154440e6a8fa6ac5bca395876d79b530b39a2c1cFariborz Jahanian if (Node->getGetterMethod()) 528900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer OS << Node->getGetterMethod(); 5291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5305daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian} 5315daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian 532d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattnervoid StmtPrinter::VisitPredefinedExpr(PredefinedExpr *Node) { 533227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson switch (Node->getIdentType()) { 534227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson default: 535227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson assert(0 && "unknown case"); 536d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner case PredefinedExpr::Func: 537227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson OS << "__func__"; 538227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson break; 539d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner case PredefinedExpr::Function: 540227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson OS << "__FUNCTION__"; 541227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson break; 542d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner case PredefinedExpr::PrettyFunction: 543227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson OS << "__PRETTY_FUNCTION__"; 544227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson break; 545227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson } 546227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson} 547227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson 5485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCharacterLiteral(CharacterLiteral *Node) { 549b0a721a51a85b7b1ea9b33dbe12f4a58232590e2Chris Lattner unsigned value = Node->getValue(); 550c250aae4f645833aed3a6321bc8598f7330dce8dChris Lattner if (Node->isWide()) 551c250aae4f645833aed3a6321bc8598f7330dce8dChris Lattner OS << "L"; 5528bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner switch (value) { 5538bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\\': 5548bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\\\'"; 5558bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 5568bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\'': 5578bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\''"; 5588bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 5598bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\a': 5608bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner // TODO: K&R: the meaning of '\\a' is different in traditional C 5618bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\a'"; 5628bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 5638bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\b': 5648bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\b'"; 5658bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 5668bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner // Nonstandard escape sequence. 5678bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner /*case '\e': 5688bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\e'"; 5698bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break;*/ 5708bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\f': 5718bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\f'"; 5728bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 5738bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\n': 5748bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\n'"; 5758bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 5768bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\r': 5778bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\r'"; 5788bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 5798bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\t': 5808bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\t'"; 5818bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 5828bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\v': 5838bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\v'"; 5848bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 5858bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner default: 586471733d84639fcea35d7876940d7d32fa575e158Ted Kremenek if (value < 256 && isprint(value)) { 5878bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'" << (char)value << "'"; 5888bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner } else if (value < 256) { 589a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek OS << "'\\x" << llvm::format("%x", value) << "'"; 5908bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner } else { 5918bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner // FIXME what to really do here? 5928bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << value; 5938bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner } 594b0a721a51a85b7b1ea9b33dbe12f4a58232590e2Chris Lattner } 5955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIntegerLiteral(IntegerLiteral *Node) { 5985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isSigned = Node->getType()->isSignedIntegerType(); 5995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << Node->getValue().toString(10, isSigned); 6001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Emit suffixes. Integer literals are always a builtin integer type. 602183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall switch (Node->getType()->getAs<BuiltinType>()->getKind()) { 6035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer default: assert(0 && "Unexpected type for integer literal!"); 6045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Int: break; // no suffix. 6055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::UInt: OS << 'U'; break; 6065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Long: OS << 'L'; break; 6075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::ULong: OS << "UL"; break; 6085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::LongLong: OS << "LL"; break; 6095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::ULongLong: OS << "ULL"; break; 6105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 6115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 6125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitFloatingLiteral(FloatingLiteral *Node) { 61386e499d9525ab4f2258724c4ca2826acd6b13a8eChris Lattner // FIXME: print value more precisely. 614da8249e57f3badecf925571881fe57243935c6c1Chris Lattner OS << Node->getValueAsApproximateDouble(); 6155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 6165d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner 6175d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattnervoid StmtPrinter::VisitImaginaryLiteral(ImaginaryLiteral *Node) { 6185d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner PrintExpr(Node->getSubExpr()); 6195d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner OS << "i"; 6205d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner} 6215d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner 6225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitStringLiteral(StringLiteral *Str) { 6235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Str->isWide()) OS << 'L'; 6245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << '"'; 625ee98ac5a1330db432b188dd2d38b6631aac47bf1Anders Carlsson 6265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // FIXME: this doesn't print wstrings right. 6275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0, e = Str->getByteLength(); i != e; ++i) { 6289a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner unsigned char Char = Str->getStrData()[i]; 6291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6309a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner switch (Char) { 6319a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner default: 6329a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner if (isprint(Char)) 6339a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner OS << (char)Char; 6349a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner else // Output anything hard as an octal escape. 6359a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner OS << '\\' 6369a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner << (char)('0'+ ((Char >> 6) & 7)) 6379a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner << (char)('0'+ ((Char >> 3) & 7)) 6389a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner << (char)('0'+ ((Char >> 0) & 7)); 6399a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner break; 6409a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner // Handle some common non-printable cases to make dumps prettier. 6415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case '\\': OS << "\\\\"; break; 6425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case '"': OS << "\\\""; break; 6435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case '\n': OS << "\\n"; break; 6445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case '\t': OS << "\\t"; break; 6455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case '\a': OS << "\\a"; break; 6465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case '\b': OS << "\\b"; break; 6475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 6485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 6495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << '"'; 6505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 6515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitParenExpr(ParenExpr *Node) { 6525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "("; 6535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getSubExpr()); 6545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ")"; 6555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 6565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitUnaryOperator(UnaryOperator *Node) { 657296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner if (!Node->isPostfix()) { 6585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << UnaryOperator::getOpcodeStr(Node->getOpcode()); 6591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6607df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman // Print a space if this is an "identifier operator" like __real, or if 6617df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman // it might be concatenated incorrectly like '+'. 662296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner switch (Node->getOpcode()) { 663296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner default: break; 664296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner case UnaryOperator::Real: 665296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner case UnaryOperator::Imag: 666296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner case UnaryOperator::Extension: 667296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner OS << ' '; 668296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner break; 6697df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman case UnaryOperator::Plus: 6707df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman case UnaryOperator::Minus: 6717df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman if (isa<UnaryOperator>(Node->getSubExpr())) 6727df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman OS << ' '; 6737df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman break; 674296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner } 675296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner } 6765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getSubExpr()); 6771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Node->isPostfix()) 6795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << UnaryOperator::getOpcodeStr(Node->getOpcode()); 680704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner} 681704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner 682704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattnerbool StmtPrinter::PrintOffsetOfDesignator(Expr *E) { 68335183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman if (isa<UnaryOperator>(E)) { 684704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner // Base case, print the type and comma. 685704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner OS << E->getType().getAsString() << ", "; 686704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner return true; 687704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner } else if (ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(E)) { 688704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner PrintOffsetOfDesignator(ASE->getLHS()); 689704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner OS << "["; 690704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner PrintExpr(ASE->getRHS()); 691704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner OS << "]"; 692704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner return false; 693704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner } else { 694704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner MemberExpr *ME = cast<MemberExpr>(E); 695704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner bool IsFirst = PrintOffsetOfDesignator(ME->getBase()); 696900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer OS << (IsFirst ? "" : ".") << ME->getMemberDecl(); 697704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner return false; 698704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner } 699704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner} 7005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 701704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattnervoid StmtPrinter::VisitUnaryOffsetOf(UnaryOperator *Node) { 702704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner OS << "__builtin_offsetof("; 703704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner PrintOffsetOfDesignator(Node->getSubExpr()); 704704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner OS << ")"; 7055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 706704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner 7078ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregorvoid StmtPrinter::VisitOffsetOfExpr(OffsetOfExpr *Node) { 7088ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OS << "__builtin_offsetof("; 7098ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OS << Node->getTypeSourceInfo()->getType().getAsString() << ", "; 7108ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor bool PrintedSomething = false; 7118ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor for (unsigned i = 0, n = Node->getNumComponents(); i < n; ++i) { 7128ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OffsetOfExpr::OffsetOfNode ON = Node->getComponent(i); 7138ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (ON.getKind() == OffsetOfExpr::OffsetOfNode::Array) { 7148ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Array node 7158ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OS << "["; 7168ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor PrintExpr(Node->getIndexExpr(ON.getArrayExprIndex())); 7178ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OS << "]"; 7188ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor PrintedSomething = true; 7198ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor continue; 7208ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 7218ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 7228ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Field or identifier node. 7238ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor IdentifierInfo *Id = ON.getFieldName(); 7248ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (!Id) 7258ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor continue; 7268ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 7278ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (PrintedSomething) 7288ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OS << "."; 7298ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor else 7308ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor PrintedSomething = true; 7318ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OS << Id->getName(); 7328ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 7338ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OS << ")"; 7348ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor} 7358ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 7360518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redlvoid StmtPrinter::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *Node) { 7370518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl OS << (Node->isSizeOf() ? "sizeof" : "__alignof"); 7380518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl if (Node->isArgumentType()) 7390518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl OS << "(" << Node->getArgumentType().getAsString() << ")"; 7400518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl else { 7410518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl OS << " "; 7420518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl PrintExpr(Node->getArgumentExpr()); 7430518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl } 7445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 7455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitArraySubscriptExpr(ArraySubscriptExpr *Node) { 7462324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek PrintExpr(Node->getLHS()); 7475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "["; 7482324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek PrintExpr(Node->getRHS()); 7495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "]"; 7505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 7515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 7525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCallExpr(CallExpr *Call) { 7535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Call->getCallee()); 7545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "("; 7555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0, e = Call->getNumArgs(); i != e; ++i) { 75604421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner if (isa<CXXDefaultArgExpr>(Call->getArg(i))) { 75704421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner // Don't print any defaulted arguments 75804421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner break; 75904421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner } 76004421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner 7615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (i) OS << ", "; 7625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Call->getArg(i)); 7635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 7645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ")"; 7655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 7665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitMemberExpr(MemberExpr *Node) { 767b3eef68111ffc220e449be96da1747998c057790Douglas Gregor // FIXME: Suppress printing implicit bases (like "this") 768b3eef68111ffc220e449be96da1747998c057790Douglas Gregor PrintExpr(Node->getBase()); 76997fd83a8d827400afda3c5fba0840c1f10007239Fariborz Jahanian if (FieldDecl *FD = dyn_cast<FieldDecl>(Node->getMemberDecl())) 77097fd83a8d827400afda3c5fba0840c1f10007239Fariborz Jahanian if (FD->isAnonymousStructOrUnion()) 77197fd83a8d827400afda3c5fba0840c1f10007239Fariborz Jahanian return; 772b3eef68111ffc220e449be96da1747998c057790Douglas Gregor OS << (Node->isArrow() ? "->" : "."); 77383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 77483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier->print(OS, Policy); 77583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor 776900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer OS << Node->getMemberDecl(); 7771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 778c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor if (Node->hasExplicitTemplateArgumentList()) 779c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor OS << TemplateSpecializationType::PrintTemplateArgumentList( 780c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor Node->getTemplateArgs(), 781c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor Node->getNumTemplateArgs(), 782c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor Policy); 7835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 784f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroffvoid StmtPrinter::VisitObjCIsaExpr(ObjCIsaExpr *Node) { 785f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff PrintExpr(Node->getBase()); 786f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff OS << (Node->isArrow() ? "->isa" : ".isa"); 787f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff} 788f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff 789213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanvoid StmtPrinter::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) { 79031a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff PrintExpr(Node->getBase()); 79131a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff OS << "."; 79231a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff OS << Node->getAccessor().getName(); 79331a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff} 7940835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidisvoid StmtPrinter::VisitCastExpr(CastExpr *) { 7950835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis assert(0 && "CastExpr is an abstract class"); 7960835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis} 79749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitExplicitCastExpr(ExplicitCastExpr *) { 79849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor assert(0 && "ExplicitCastExpr is an abstract class"); 79949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 8006eec8e883de118b431e3ead5b1e604a6ac68ff6bDouglas Gregorvoid StmtPrinter::VisitCStyleCastExpr(CStyleCastExpr *Node) { 80126dc7b39267b7d29b35a7887a5b8e54697192192Chris Lattner OS << "(" << Node->getType().getAsString() << ")"; 8025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getSubExpr()); 8035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 804aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroffvoid StmtPrinter::VisitCompoundLiteralExpr(CompoundLiteralExpr *Node) { 805aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff OS << "(" << Node->getType().getAsString() << ")"; 806aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff PrintExpr(Node->getInitializer()); 807aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff} 80849b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroffvoid StmtPrinter::VisitImplicitCastExpr(ImplicitCastExpr *Node) { 80990045e8ebabf50d6f1b3a67081a621b20b5e5341Steve Naroff // No need to print anything, simply forward to the sub expression. 81090045e8ebabf50d6f1b3a67081a621b20b5e5341Steve Naroff PrintExpr(Node->getSubExpr()); 81149b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff} 8125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitBinaryOperator(BinaryOperator *Node) { 8135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getLHS()); 8145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " "; 815eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner PrintExpr(Node->getRHS()); 816eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner} 817eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattnervoid StmtPrinter::VisitCompoundAssignOperator(CompoundAssignOperator *Node) { 818eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner PrintExpr(Node->getLHS()); 819eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " "; 8205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getRHS()); 8215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 8225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitConditionalOperator(ConditionalOperator *Node) { 8235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getCond()); 8241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8258e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek if (Node->getLHS()) { 8268e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek OS << " ? "; 8278e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek PrintExpr(Node->getLHS()); 8288e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek OS << " : "; 8298e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek } 8304fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor else { // Handle GCC extension where LHS can be NULL. 8318e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek OS << " ?: "; 8328e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek } 8331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getRHS()); 8355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 8365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 8375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// GNU extensions. 8385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 8396481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattnervoid StmtPrinter::VisitAddrLabelExpr(AddrLabelExpr *Node) { 8405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "&&" << Node->getLabel()->getName(); 8415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 8425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 843ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattnervoid StmtPrinter::VisitStmtExpr(StmtExpr *E) { 844ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner OS << "("; 845ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner PrintRawCompoundStmt(E->getSubStmt()); 846ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner OS << ")"; 847ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner} 848ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner 849d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroffvoid StmtPrinter::VisitTypesCompatibleExpr(TypesCompatibleExpr *Node) { 850d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff OS << "__builtin_types_compatible_p("; 851d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff OS << Node->getArgType1().getAsString() << ","; 852d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff OS << Node->getArgType2().getAsString() << ")"; 853d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff} 854d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff 855d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroffvoid StmtPrinter::VisitChooseExpr(ChooseExpr *Node) { 856d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff OS << "__builtin_choose_expr("; 857d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff PrintExpr(Node->getCond()); 85894f05e36488fd08e404ac409d3bcb1db1da1bd4dChris Lattner OS << ", "; 859d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff PrintExpr(Node->getLHS()); 86094f05e36488fd08e404ac409d3bcb1db1da1bd4dChris Lattner OS << ", "; 861d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff PrintExpr(Node->getRHS()); 862d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff OS << ")"; 863d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff} 864ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner 8652d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregorvoid StmtPrinter::VisitGNUNullExpr(GNUNullExpr *) { 8662d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor OS << "__null"; 8672d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor} 8682d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor 869d38617c8a50f9729c254ab76cd359af797c6739bEli Friedmanvoid StmtPrinter::VisitShuffleVectorExpr(ShuffleVectorExpr *Node) { 870d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman OS << "__builtin_shufflevector("; 871d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman for (unsigned i = 0, e = Node->getNumSubExprs(); i != e; ++i) { 872d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman if (i) OS << ", "; 873d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman PrintExpr(Node->getExpr(i)); 874d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman } 875d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman OS << ")"; 876e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman} 877e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman 87866b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlssonvoid StmtPrinter::VisitInitListExpr(InitListExpr* Node) { 87964f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor if (Node->getSyntacticForm()) { 88064f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor Visit(Node->getSyntacticForm()); 88164f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor return; 88264f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor } 88364f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor 88466b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson OS << "{ "; 88566b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson for (unsigned i = 0, e = Node->getNumInits(); i != e; ++i) { 88666b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson if (i) OS << ", "; 8874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Node->getInit(i)) 8884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor PrintExpr(Node->getInit(i)); 8894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else 8904c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << "0"; 89166b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson } 89266b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson OS << " }"; 89366b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson} 89466b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson 8952ef13e5abef0570a9f567b4671367275c05d4d34Nate Begemanvoid StmtPrinter::VisitParenListExpr(ParenListExpr* Node) { 8962ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman OS << "( "; 8972ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman for (unsigned i = 0, e = Node->getNumExprs(); i != e; ++i) { 8982ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman if (i) OS << ", "; 8992ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman PrintExpr(Node->getExpr(i)); 9002ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 9012ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman OS << " )"; 9022ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman} 9032ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman 90405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregorvoid StmtPrinter::VisitDesignatedInitExpr(DesignatedInitExpr *Node) { 9054c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor for (DesignatedInitExpr::designators_iterator D = Node->designators_begin(), 9064c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DEnd = Node->designators_end(); 9074c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor D != DEnd; ++D) { 9084c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (D->isFieldDesignator()) { 9094c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (D->getDotLoc().isInvalid()) 9104c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << D->getFieldName()->getName() << ":"; 9114c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else 9124c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << "." << D->getFieldName()->getName(); 9134c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } else { 9144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << "["; 9154c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (D->isArrayDesignator()) { 9164c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor PrintExpr(Node->getArrayIndex(*D)); 9174c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } else { 9184c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor PrintExpr(Node->getArrayRangeStart(*D)); 9194c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << " ... "; 9201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump PrintExpr(Node->getArrayRangeEnd(*D)); 9214c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 9224c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << "]"; 9234c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 9244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 9254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 9264c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << " = "; 9274c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor PrintExpr(Node->getInit()); 92805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 92905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 9303498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregorvoid StmtPrinter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *Node) { 931e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner if (Policy.LangOpts.CPlusPlus) 9324fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor OS << "/*implicit*/" << Node->getType().getAsString(Policy) << "()"; 9334fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor else { 9344fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor OS << "/*implicit*/(" << Node->getType().getAsString(Policy) << ")"; 9354fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor if (Node->getType()->isRecordType()) 9364fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor OS << "{}"; 9374fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor else 9384fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor OS << 0; 9394fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor } 9403498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor} 9413498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 9427c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlssonvoid StmtPrinter::VisitVAArgExpr(VAArgExpr *Node) { 94342f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman OS << "__builtin_va_arg("; 9447c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson PrintExpr(Node->getSubExpr()); 9457c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson OS << ", "; 9467c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson OS << Node->getType().getAsString(); 9477c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson OS << ")"; 9487c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson} 9497c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson 9505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// C++ 951b4609806e9232593ece09ce08b630836e825865cDouglas Gregorvoid StmtPrinter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *Node) { 952b4609806e9232593ece09ce08b630836e825865cDouglas Gregor const char *OpStrings[NUM_OVERLOADED_OPERATORS] = { 953b4609806e9232593ece09ce08b630836e825865cDouglas Gregor "", 954b4609806e9232593ece09ce08b630836e825865cDouglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 955b4609806e9232593ece09ce08b630836e825865cDouglas Gregor Spelling, 956b4609806e9232593ece09ce08b630836e825865cDouglas Gregor#include "clang/Basic/OperatorKinds.def" 957b4609806e9232593ece09ce08b630836e825865cDouglas Gregor }; 958b4609806e9232593ece09ce08b630836e825865cDouglas Gregor 959b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OverloadedOperatorKind Kind = Node->getOperator(); 960b4609806e9232593ece09ce08b630836e825865cDouglas Gregor if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) { 961b4609806e9232593ece09ce08b630836e825865cDouglas Gregor if (Node->getNumArgs() == 1) { 962b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << OpStrings[Kind] << ' '; 963b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 964b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else { 965b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 966b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << ' ' << OpStrings[Kind]; 967b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } 968b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else if (Kind == OO_Call) { 969b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 970b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << '('; 971b4609806e9232593ece09ce08b630836e825865cDouglas Gregor for (unsigned ArgIdx = 1; ArgIdx < Node->getNumArgs(); ++ArgIdx) { 972b4609806e9232593ece09ce08b630836e825865cDouglas Gregor if (ArgIdx > 1) 973b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << ", "; 974b4609806e9232593ece09ce08b630836e825865cDouglas Gregor if (!isa<CXXDefaultArgExpr>(Node->getArg(ArgIdx))) 975b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(ArgIdx)); 976b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } 977b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << ')'; 978b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else if (Kind == OO_Subscript) { 979b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 980b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << '['; 981b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(1)); 982b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << ']'; 983b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else if (Node->getNumArgs() == 1) { 984b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << OpStrings[Kind] << ' '; 985b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 986b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else if (Node->getNumArgs() == 2) { 987b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 988b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << ' ' << OpStrings[Kind] << ' '; 989b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(1)); 990b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else { 991b4609806e9232593ece09ce08b630836e825865cDouglas Gregor assert(false && "unknown overloaded operator"); 992b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } 993b4609806e9232593ece09ce08b630836e825865cDouglas Gregor} 9945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 99588a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregorvoid StmtPrinter::VisitCXXMemberCallExpr(CXXMemberCallExpr *Node) { 99688a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor VisitCallExpr(cast<CallExpr>(Node)); 99788a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor} 99888a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor 99949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) { 100049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor OS << Node->getCastName() << '<'; 100149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor OS << Node->getTypeAsWritten().getAsString() << ">("; 10025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getSubExpr()); 10035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ")"; 10045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 10055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 100649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXStaticCastExpr(CXXStaticCastExpr *Node) { 100749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor VisitCXXNamedCastExpr(Node); 100849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 100949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 101049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *Node) { 101149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor VisitCXXNamedCastExpr(Node); 101249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 101349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 101449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *Node) { 101549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor VisitCXXNamedCastExpr(Node); 101649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 101749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 101849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXConstCastExpr(CXXConstCastExpr *Node) { 101949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor VisitCXXNamedCastExpr(Node); 102049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 102149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 1022c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redlvoid StmtPrinter::VisitCXXTypeidExpr(CXXTypeidExpr *Node) { 1023c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl OS << "typeid("; 1024c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl if (Node->isTypeOperand()) { 1025c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl OS << Node->getTypeOperand().getAsString(); 1026c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl } else { 1027c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl PrintExpr(Node->getExprOperand()); 1028c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl } 1029c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl OS << ")"; 1030c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl} 1031c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl 10325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) { 10335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << (Node->getValue() ? "true" : "false"); 10345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 10355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 10366e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlvoid StmtPrinter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *Node) { 10376e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl OS << "nullptr"; 10386e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl} 10396e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 1040796da18402f286b897782a298ae3b20c459c102eDouglas Gregorvoid StmtPrinter::VisitCXXThisExpr(CXXThisExpr *Node) { 1041796da18402f286b897782a298ae3b20c459c102eDouglas Gregor OS << "this"; 1042796da18402f286b897782a298ae3b20c459c102eDouglas Gregor} 1043796da18402f286b897782a298ae3b20c459c102eDouglas Gregor 104450dd289f45738ed22b7583d52ed2525b927042ffChris Lattnervoid StmtPrinter::VisitCXXThrowExpr(CXXThrowExpr *Node) { 104550dd289f45738ed22b7583d52ed2525b927042ffChris Lattner if (Node->getSubExpr() == 0) 104650dd289f45738ed22b7583d52ed2525b927042ffChris Lattner OS << "throw"; 104750dd289f45738ed22b7583d52ed2525b927042ffChris Lattner else { 104850dd289f45738ed22b7583d52ed2525b927042ffChris Lattner OS << "throw "; 104950dd289f45738ed22b7583d52ed2525b927042ffChris Lattner PrintExpr(Node->getSubExpr()); 105050dd289f45738ed22b7583d52ed2525b927042ffChris Lattner } 105150dd289f45738ed22b7583d52ed2525b927042ffChris Lattner} 105250dd289f45738ed22b7583d52ed2525b927042ffChris Lattner 105304421087832a031c90bd58f128c7c0e741db8dd2Chris Lattnervoid StmtPrinter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *Node) { 105404421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner // Nothing to print: we picked up the default argument 105504421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner} 105604421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner 1057987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidisvoid StmtPrinter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) { 1058987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis OS << Node->getType().getAsString(); 1059987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis OS << "("; 1060987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis PrintExpr(Node->getSubExpr()); 1061987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis OS << ")"; 1062987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis} 1063987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 1064fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlssonvoid StmtPrinter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) { 1065eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson PrintExpr(Node->getSubExpr()); 1066eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson} 1067eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson 1068eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlssonvoid StmtPrinter::VisitCXXBindReferenceExpr(CXXBindReferenceExpr *Node) { 1069fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson PrintExpr(Node->getSubExpr()); 1070fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson} 1071fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson 1072506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregorvoid StmtPrinter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *Node) { 1073506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor OS << Node->getType().getAsString(); 1074506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor OS << "("; 1075506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor for (CXXTemporaryObjectExpr::arg_iterator Arg = Node->arg_begin(), 10761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ArgEnd = Node->arg_end(); 1077506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor Arg != ArgEnd; ++Arg) { 1078506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor if (Arg != Node->arg_begin()) 1079506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor OS << ", "; 1080506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor PrintExpr(*Arg); 1081506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor } 1082506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor OS << ")"; 1083506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor} 1084506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor 1085987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidisvoid StmtPrinter::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *Node) { 1086987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis OS << Node->getType().getAsString() << "()"; 1087987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis} 1088987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 10894c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlvoid StmtPrinter::VisitCXXNewExpr(CXXNewExpr *E) { 10904c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->isGlobalNew()) 10914c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "::"; 10924c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "new "; 10934c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl unsigned NumPlace = E->getNumPlacementArgs(); 10944c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (NumPlace > 0) { 10954c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "("; 10964c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl PrintExpr(E->getPlacementArg(0)); 10974c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl for (unsigned i = 1; i < NumPlace; ++i) { 10984c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << ", "; 10994c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl PrintExpr(E->getPlacementArg(i)); 11004c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 11014c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << ") "; 11024c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 11034c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->isParenTypeId()) 11044c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "("; 11056fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl std::string TypeS; 11066fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl if (Expr *Size = E->getArraySize()) { 11076fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl llvm::raw_string_ostream s(TypeS); 11086e1a345838c8feb500ba8887b3ba5a1c1d0b33dcEli Friedman Size->printPretty(s, Context, Helper, Policy); 11096fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl s.flush(); 11106fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl TypeS = "[" + TypeS + "]"; 11116fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl } 1112d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor E->getAllocatedType().getAsStringInternal(TypeS, Policy); 11136fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl OS << TypeS; 11144c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->isParenTypeId()) 11154c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << ")"; 11164c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 11174c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->hasInitializer()) { 11184c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "("; 11194c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl unsigned NumCons = E->getNumConstructorArgs(); 11204c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (NumCons > 0) { 11214c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl PrintExpr(E->getConstructorArg(0)); 11224c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl for (unsigned i = 1; i < NumCons; ++i) { 11234c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << ", "; 11244c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl PrintExpr(E->getConstructorArg(i)); 11254c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 11264c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 11274c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << ")"; 11284c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 11294c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl} 11304c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 11314c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlvoid StmtPrinter::VisitCXXDeleteExpr(CXXDeleteExpr *E) { 11324c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->isGlobalDelete()) 11334c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "::"; 11344c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "delete "; 11354c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->isArrayForm()) 11364c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "[] "; 11374c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl PrintExpr(E->getArgument()); 11384c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl} 11394c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 1140a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregorvoid StmtPrinter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) { 1141a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor PrintExpr(E->getBase()); 1142a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (E->isArrow()) 1143a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OS << "->"; 1144a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor else 1145a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OS << '.'; 1146a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (E->getQualifier()) 1147a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getQualifier()->print(OS, Policy); 11481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1149a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor std::string TypeS; 1150a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (IdentifierInfo *II = E->getDestroyedTypeIdentifier()) 1151a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor OS << II->getName(); 1152a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor else 1153a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->getDestroyedType().getAsStringInternal(TypeS, Policy); 1154a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OS << TypeS; 1155a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor} 1156a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor 1157e349bea668622ef31bd51a229960a73d69940709Anders Carlssonvoid StmtPrinter::VisitCXXConstructExpr(CXXConstructExpr *E) { 1158c75da518fde1f3b93643ac4e376ff2acd260facdFariborz Jahanian // FIXME. For now we just print a trivial constructor call expression, 1159c75da518fde1f3b93643ac4e376ff2acd260facdFariborz Jahanian // constructing its first argument object. 1160c75da518fde1f3b93643ac4e376ff2acd260facdFariborz Jahanian if (E->getNumArgs() == 1) { 1161c75da518fde1f3b93643ac4e376ff2acd260facdFariborz Jahanian CXXConstructorDecl *CD = E->getConstructor(); 1162c75da518fde1f3b93643ac4e376ff2acd260facdFariborz Jahanian if (CD->isTrivial()) 1163c75da518fde1f3b93643ac4e376ff2acd260facdFariborz Jahanian PrintExpr(E->getArg(0)); 1164c75da518fde1f3b93643ac4e376ff2acd260facdFariborz Jahanian } 1165e349bea668622ef31bd51a229960a73d69940709Anders Carlsson // Nothing to print. 1166e349bea668622ef31bd51a229960a73d69940709Anders Carlsson} 1167e349bea668622ef31bd51a229960a73d69940709Anders Carlsson 11682d44e8a41de8a33c0f04ac198714f71dc841bab0Anders Carlssonvoid StmtPrinter::VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E) { 116902bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson // Just forward to the sub expression. 117002bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson PrintExpr(E->getSubExpr()); 117102bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson} 117202bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson 11731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid 1174d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas GregorStmtPrinter::VisitCXXUnresolvedConstructExpr( 1175d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor CXXUnresolvedConstructExpr *Node) { 1176d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor OS << Node->getTypeAsWritten().getAsString(); 1177d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor OS << "("; 1178d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor for (CXXUnresolvedConstructExpr::arg_iterator Arg = Node->arg_begin(), 11791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ArgEnd = Node->arg_end(); 1180d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor Arg != ArgEnd; ++Arg) { 1181d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor if (Arg != Node->arg_begin()) 1182d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor OS << ", "; 1183d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor PrintExpr(*Arg); 1184d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor } 1185d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor OS << ")"; 1186d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor} 1187d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 1188865d447ac6a4721ab58e898d014a21f2eff74b06John McCallvoid StmtPrinter::VisitCXXDependentScopeMemberExpr( 1189865d447ac6a4721ab58e898d014a21f2eff74b06John McCall CXXDependentScopeMemberExpr *Node) { 1190aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!Node->isImplicitAccess()) { 1191aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall PrintExpr(Node->getBase()); 1192aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OS << (Node->isArrow() ? "->" : "."); 1193aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 1194a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 1195a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier->print(OS, Policy); 1196aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall else if (Node->hasExplicitTemplateArgs()) 11973b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // FIXME: Track use of "template" keyword explicitly? 11983b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor OS << "template "; 11991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12001c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor OS << Node->getMember().getAsString(); 12011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1202aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Node->hasExplicitTemplateArgs()) { 12033b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor OS << TemplateSpecializationType::PrintTemplateArgumentList( 12043b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Node->getTemplateArgs(), 12053b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Node->getNumTemplateArgs(), 12063b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Policy); 12073b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 12081c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor} 12091c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 1210129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCallvoid StmtPrinter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *Node) { 1211aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!Node->isImplicitAccess()) { 1212aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall PrintExpr(Node->getBase()); 1213aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OS << (Node->isArrow() ? "->" : "."); 1214aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 1215129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 1216129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Qualifier->print(OS, Policy); 1217129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 1218129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // FIXME: this might originally have been written with 'template' 1219129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 1220129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall OS << Node->getMemberName().getAsString(); 1221129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 1222129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (Node->hasExplicitTemplateArgs()) { 1223129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall OS << TemplateSpecializationType::PrintTemplateArgumentList( 1224129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Node->getTemplateArgs(), 1225129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Node->getNumTemplateArgs(), 1226129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Policy); 1227129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 1228129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall} 1229129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 123064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redlstatic const char *getTypeTraitName(UnaryTypeTrait UTT) { 123164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl switch (UTT) { 123264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl default: assert(false && "Unknown type trait"); 123364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_HasNothrowAssign: return "__has_nothrow_assign"; 123464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_HasNothrowCopy: return "__has_nothrow_copy"; 123564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_HasNothrowConstructor: return "__has_nothrow_constructor"; 123664b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_HasTrivialAssign: return "__has_trivial_assign"; 123764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_HasTrivialCopy: return "__has_trivial_copy"; 123864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_HasTrivialConstructor: return "__has_trivial_constructor"; 123964b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_HasTrivialDestructor: return "__has_trivial_destructor"; 124064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_HasVirtualDestructor: return "__has_virtual_destructor"; 124164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_IsAbstract: return "__is_abstract"; 124264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_IsClass: return "__is_class"; 124364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_IsEmpty: return "__is_empty"; 124464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_IsEnum: return "__is_enum"; 124564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_IsPOD: return "__is_pod"; 124664b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_IsPolymorphic: return "__is_polymorphic"; 124764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_IsUnion: return "__is_union"; 124864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl } 124964b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl} 125064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl 125164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redlvoid StmtPrinter::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 125264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl OS << getTypeTraitName(E->getTrait()) << "(" 125364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl << E->getQueriedType().getAsString() << ")"; 125464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl} 125564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl 12561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// Obj-C 12575508518a2702b00be3b15a26d772bde968972f54Anders Carlsson 12585508518a2702b00be3b15a26d772bde968972f54Anders Carlssonvoid StmtPrinter::VisitObjCStringLiteral(ObjCStringLiteral *Node) { 12595508518a2702b00be3b15a26d772bde968972f54Anders Carlsson OS << "@"; 12605508518a2702b00be3b15a26d772bde968972f54Anders Carlsson VisitStringLiteral(Node->getString()); 12615508518a2702b00be3b15a26d772bde968972f54Anders Carlsson} 12625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1263f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlssonvoid StmtPrinter::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) { 126439f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner OS << "@encode(" << Node->getEncodedType().getAsString() << ')'; 1265f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson} 1266f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson 1267b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanianvoid StmtPrinter::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) { 126839f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner OS << "@selector(" << Node->getSelector().getAsString() << ')'; 1269b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian} 1270b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian 1271390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanianvoid StmtPrinter::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) { 1272900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer OS << "@protocol(" << Node->getProtocol() << ')'; 1273390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian} 1274390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian 1275563477da25f824e37c535131695dc4dc9b68c465Steve Naroffvoid StmtPrinter::VisitObjCMessageExpr(ObjCMessageExpr *Mess) { 1276563477da25f824e37c535131695dc4dc9b68c465Steve Naroff OS << "["; 127704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor switch (Mess->getReceiverKind()) { 127804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Instance: 127904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor PrintExpr(Mess->getInstanceReceiver()); 128004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 128104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 128204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Class: 128304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor OS << Mess->getClassReceiver().getAsString(Policy); 128404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 128504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 128604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperInstance: 128704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperClass: 128804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor OS << "Super"; 128904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 129004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 129104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 1292c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek OS << ' '; 129397b7f26a92d87e514530a5b652460190ce48c974Ted Kremenek Selector selector = Mess->getSelector(); 12946a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff if (selector.isUnarySelector()) { 1295c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek OS << selector.getIdentifierInfoForSlot(0)->getName(); 12966a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff } else { 12976a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff for (unsigned i = 0, e = Mess->getNumArgs(); i != e; ++i) { 1298c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek if (i < selector.getNumArgs()) { 1299c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek if (i > 0) OS << ' '; 1300c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek if (selector.getIdentifierInfoForSlot(i)) 130139f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner OS << selector.getIdentifierInfoForSlot(i)->getName() << ':'; 1302c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek else 1303c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek OS << ":"; 1304c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek } 1305c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek else OS << ", "; // Handle variadic methods. 13061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 13076a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff PrintExpr(Mess->getArg(i)); 13086a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff } 1309563477da25f824e37c535131695dc4dc9b68c465Steve Naroff } 1310563477da25f824e37c535131695dc4dc9b68c465Steve Naroff OS << "]"; 1311563477da25f824e37c535131695dc4dc9b68c465Steve Naroff} 1312563477da25f824e37c535131695dc4dc9b68c465Steve Naroff 1313cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregorvoid StmtPrinter::VisitObjCSuperExpr(ObjCSuperExpr *) { 1314cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor OS << "super"; 1315cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor} 1316cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor 13174eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffvoid StmtPrinter::VisitBlockExpr(BlockExpr *Node) { 131856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff BlockDecl *BD = Node->getBlockDecl(); 13194eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << "^"; 13201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 13214eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff const FunctionType *AFT = Node->getFunctionType(); 13221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 132372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor if (isa<FunctionNoProtoType>(AFT)) { 13244eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << "()"; 132572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor } else if (!BD->param_empty() || cast<FunctionProtoType>(AFT)->isVariadic()) { 13264eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << '('; 13274eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff std::string ParamStr; 132856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff for (BlockDecl::param_iterator AI = BD->param_begin(), 132956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff E = BD->param_end(); AI != E; ++AI) { 133056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff if (AI != BD->param_begin()) OS << ", "; 133139f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner ParamStr = (*AI)->getNameAsString(); 1332d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor (*AI)->getType().getAsStringInternal(ParamStr, Policy); 13334eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << ParamStr; 13344eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff } 13351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 133672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor const FunctionProtoType *FT = cast<FunctionProtoType>(AFT); 13374eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff if (FT->isVariadic()) { 133856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff if (!BD->param_empty()) OS << ", "; 13394eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << "..."; 13404eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff } 13414eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << ')'; 13424eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff } 13434eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff} 13444eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff 13454eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffvoid StmtPrinter::VisitBlockDeclRefExpr(BlockDeclRefExpr *Node) { 1346900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer OS << Node->getDecl(); 13474eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff} 13485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 13495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Stmt method implementations 13505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 13515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 135248d14a222276fad5279e994d1a062f36ae6fcbceEli Friedmanvoid Stmt::dumpPretty(ASTContext& Context) const { 1353e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner printPretty(llvm::errs(), Context, 0, 1354e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner PrintingPolicy(Context.getLangOptions())); 13555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 13565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 135748d14a222276fad5279e994d1a062f36ae6fcbceEli Friedmanvoid Stmt::printPretty(llvm::raw_ostream &OS, ASTContext& Context, 135848d14a222276fad5279e994d1a062f36ae6fcbceEli Friedman PrinterHelper* Helper, 1359d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor const PrintingPolicy &Policy, 1360d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor unsigned Indentation) const { 13615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (this == 0) { 13625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "<NULL>"; 13635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return; 13645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 13655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1366bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor if (Policy.Dump && &Context) { 1367ad42f06f998c45faed641180d852e46177e695cfArgyrios Kyrtzidis dump(Context.getSourceManager()); 13684fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor return; 13694fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor } 13701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 137148d14a222276fad5279e994d1a062f36ae6fcbceEli Friedman StmtPrinter P(OS, Context, Helper, Policy, Indentation); 1372c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner P.Visit(const_cast<Stmt*>(this)); 13735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 137442a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek 137542a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//===----------------------------------------------------------------------===// 137642a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek// PrinterHelper 137742a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//===----------------------------------------------------------------------===// 137842a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek 137942a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek// Implement virtual destructor. 13808467583c2704e7a9691ea56939a029015f0ade0aGabor GreifPrinterHelper::~PrinterHelper() {} 1381