1 //===--- StmtPrinter.cpp - Printing implementation for Stmt ASTs ----------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the Stmt::dumpPretty/Stmt::printPretty methods, which
11 // pretty print the AST back out to C code.
13 //===----------------------------------------------------------------------===//
15 #include "clang/AST/StmtVisitor.h"
16 #include "clang/AST/DeclCXX.h"
17 #include "clang/AST/DeclObjC.h"
18 #include "clang/AST/PrettyPrinter.h"
19 #include "llvm/Support/Format.h"
20 #include "clang/AST/Expr.h"
21 using namespace clang;
23 //===----------------------------------------------------------------------===//
24 // StmtPrinter Visitor
25 //===----------------------------------------------------------------------===//
28 class StmtPrinter : public StmtVisitor<StmtPrinter> {
29 llvm::raw_ostream &OS;
32 clang::PrinterHelper* Helper;
33 PrintingPolicy Policy;
36 StmtPrinter(llvm::raw_ostream &os, ASTContext &C, PrinterHelper* helper,
37 const PrintingPolicy &Policy,
38 unsigned Indentation = 0)
39 : OS(os), Context(C), IndentLevel(Indentation), Helper(helper),
42 void PrintStmt(Stmt *S) {
43 PrintStmt(S, Policy.Indentation);
46 void PrintStmt(Stmt *S, int SubIndent) {
47 IndentLevel += SubIndent;
48 if (S && isa<Expr>(S)) {
49 // If this is an expr used in a stmt context, indent and newline it.
56 Indent() << "<<<NULL STATEMENT>>>\n";
58 IndentLevel -= SubIndent;
61 void PrintRawCompoundStmt(CompoundStmt *S);
62 void PrintRawDecl(Decl *D);
63 void PrintRawDeclStmt(DeclStmt *S);
64 void PrintRawIfStmt(IfStmt *If);
65 void PrintRawCXXCatchStmt(CXXCatchStmt *Catch);
67 void PrintExpr(Expr *E) {
74 llvm::raw_ostream &Indent(int Delta = 0) {
75 for (int i = 0, e = IndentLevel+Delta; i < e; ++i)
80 bool PrintOffsetOfDesignator(Expr *E);
81 void VisitUnaryOffsetOf(UnaryOperator *Node);
84 if (Helper && Helper->handledStmt(S,OS))
86 else StmtVisitor<StmtPrinter>::Visit(S);
89 void VisitStmt(Stmt *Node);
90 #define STMT(CLASS, PARENT) \
91 void Visit##CLASS(CLASS *Node);
92 #include "clang/AST/StmtNodes.inc"
96 //===----------------------------------------------------------------------===//
97 // Stmt printing methods.
98 //===----------------------------------------------------------------------===//
100 void StmtPrinter::VisitStmt(Stmt *Node) {
101 Indent() << "<<unknown stmt type>>\n";
104 /// PrintRawCompoundStmt - Print a compound stmt without indenting the {, and
105 /// with no newline after the }.
106 void StmtPrinter::PrintRawCompoundStmt(CompoundStmt *Node) {
108 for (CompoundStmt::body_iterator I = Node->body_begin(), E = Node->body_end();
115 void StmtPrinter::PrintRawDecl(Decl *D) {
116 D->print(OS, Policy, IndentLevel);
119 void StmtPrinter::PrintRawDeclStmt(DeclStmt *S) {
120 DeclStmt::decl_iterator Begin = S->decl_begin(), End = S->decl_end();
121 llvm::SmallVector<Decl*, 2> Decls;
122 for ( ; Begin != End; ++Begin)
123 Decls.push_back(*Begin);
125 Decl::printGroup(Decls.data(), Decls.size(), OS, Policy, IndentLevel);
128 void StmtPrinter::VisitNullStmt(NullStmt *Node) {
132 void StmtPrinter::VisitDeclStmt(DeclStmt *Node) {
134 PrintRawDeclStmt(Node);
138 void StmtPrinter::VisitCompoundStmt(CompoundStmt *Node) {
140 PrintRawCompoundStmt(Node);
144 void StmtPrinter::VisitCaseStmt(CaseStmt *Node) {
145 Indent(-1) << "case ";
146 PrintExpr(Node->getLHS());
147 if (Node->getRHS()) {
149 PrintExpr(Node->getRHS());
153 PrintStmt(Node->getSubStmt(), 0);
156 void StmtPrinter::VisitDefaultStmt(DefaultStmt *Node) {
157 Indent(-1) << "default:\n";
158 PrintStmt(Node->getSubStmt(), 0);
161 void StmtPrinter::VisitLabelStmt(LabelStmt *Node) {
162 Indent(-1) << Node->getName() << ":\n";
163 PrintStmt(Node->getSubStmt(), 0);
166 void StmtPrinter::PrintRawIfStmt(IfStmt *If) {
168 PrintExpr(If->getCond());
171 if (CompoundStmt *CS = dyn_cast<CompoundStmt>(If->getThen())) {
173 PrintRawCompoundStmt(CS);
174 OS << (If->getElse() ? ' ' : '\n');
177 PrintStmt(If->getThen());
178 if (If->getElse()) Indent();
181 if (Stmt *Else = If->getElse()) {
184 if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Else)) {
186 PrintRawCompoundStmt(CS);
188 } else if (IfStmt *ElseIf = dyn_cast<IfStmt>(Else)) {
190 PrintRawIfStmt(ElseIf);
193 PrintStmt(If->getElse());
198 void StmtPrinter::VisitIfStmt(IfStmt *If) {
203 void StmtPrinter::VisitSwitchStmt(SwitchStmt *Node) {
204 Indent() << "switch (";
205 PrintExpr(Node->getCond());
208 // Pretty print compoundstmt bodies (very common).
209 if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
211 PrintRawCompoundStmt(CS);
215 PrintStmt(Node->getBody());
219 void StmtPrinter::VisitSwitchCase(SwitchCase*) {
220 assert(0 && "SwitchCase is an abstract class");
223 void StmtPrinter::VisitWhileStmt(WhileStmt *Node) {
224 Indent() << "while (";
225 PrintExpr(Node->getCond());
227 PrintStmt(Node->getBody());
230 void StmtPrinter::VisitDoStmt(DoStmt *Node) {
232 if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
233 PrintRawCompoundStmt(CS);
237 PrintStmt(Node->getBody());
242 PrintExpr(Node->getCond());
246 void StmtPrinter::VisitForStmt(ForStmt *Node) {
248 if (Node->getInit()) {
249 if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getInit()))
250 PrintRawDeclStmt(DS);
252 PrintExpr(cast<Expr>(Node->getInit()));
255 if (Node->getCond()) {
257 PrintExpr(Node->getCond());
260 if (Node->getInc()) {
262 PrintExpr(Node->getInc());
266 if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
267 PrintRawCompoundStmt(CS);
271 PrintStmt(Node->getBody());
275 void StmtPrinter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *Node) {
277 if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getElement()))
278 PrintRawDeclStmt(DS);
280 PrintExpr(cast<Expr>(Node->getElement()));
282 PrintExpr(Node->getCollection());
285 if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
286 PrintRawCompoundStmt(CS);
290 PrintStmt(Node->getBody());
294 void StmtPrinter::VisitGotoStmt(GotoStmt *Node) {
295 Indent() << "goto " << Node->getLabel()->getName() << ";\n";
298 void StmtPrinter::VisitIndirectGotoStmt(IndirectGotoStmt *Node) {
299 Indent() << "goto *";
300 PrintExpr(Node->getTarget());
304 void StmtPrinter::VisitContinueStmt(ContinueStmt *Node) {
305 Indent() << "continue;\n";
308 void StmtPrinter::VisitBreakStmt(BreakStmt *Node) {
309 Indent() << "break;\n";
313 void StmtPrinter::VisitReturnStmt(ReturnStmt *Node) {
314 Indent() << "return";
315 if (Node->getRetValue()) {
317 PrintExpr(Node->getRetValue());
323 void StmtPrinter::VisitAsmStmt(AsmStmt *Node) {
326 if (Node->isVolatile())
330 VisitStringLiteral(Node->getAsmString());
333 if (Node->getNumOutputs() != 0 || Node->getNumInputs() != 0 ||
334 Node->getNumClobbers() != 0)
337 for (unsigned i = 0, e = Node->getNumOutputs(); i != e; ++i) {
341 if (!Node->getOutputName(i).empty()) {
343 OS << Node->getOutputName(i);
347 VisitStringLiteral(Node->getOutputConstraintLiteral(i));
349 Visit(Node->getOutputExpr(i));
353 if (Node->getNumInputs() != 0 || Node->getNumClobbers() != 0)
356 for (unsigned i = 0, e = Node->getNumInputs(); i != e; ++i) {
360 if (!Node->getInputName(i).empty()) {
362 OS << Node->getInputName(i);
366 VisitStringLiteral(Node->getInputConstraintLiteral(i));
368 Visit(Node->getInputExpr(i));
372 if (Node->getNumClobbers() != 0)
375 for (unsigned i = 0, e = Node->getNumClobbers(); i != e; ++i) {
379 VisitStringLiteral(Node->getClobber(i));
385 void StmtPrinter::VisitObjCAtTryStmt(ObjCAtTryStmt *Node) {
387 if (CompoundStmt *TS = dyn_cast<CompoundStmt>(Node->getTryBody())) {
388 PrintRawCompoundStmt(TS);
392 for (unsigned I = 0, N = Node->getNumCatchStmts(); I != N; ++I) {
393 ObjCAtCatchStmt *catchStmt = Node->getCatchStmt(I);
394 Indent() << "@catch(";
395 if (catchStmt->getCatchParamDecl()) {
396 if (Decl *DS = catchStmt->getCatchParamDecl())
400 if (CompoundStmt *CS = dyn_cast<CompoundStmt>(catchStmt->getCatchBody())) {
401 PrintRawCompoundStmt(CS);
406 if (ObjCAtFinallyStmt *FS = static_cast<ObjCAtFinallyStmt *>(
407 Node->getFinallyStmt())) {
408 Indent() << "@finally";
409 PrintRawCompoundStmt(dyn_cast<CompoundStmt>(FS->getFinallyBody()));
414 void StmtPrinter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *Node) {
417 void StmtPrinter::VisitObjCAtCatchStmt (ObjCAtCatchStmt *Node) {
418 Indent() << "@catch (...) { /* todo */ } \n";
421 void StmtPrinter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *Node) {
422 Indent() << "@throw";
423 if (Node->getThrowExpr()) {
425 PrintExpr(Node->getThrowExpr());
430 void StmtPrinter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *Node) {
431 Indent() << "@synchronized (";
432 PrintExpr(Node->getSynchExpr());
434 PrintRawCompoundStmt(Node->getSynchBody());
438 void StmtPrinter::PrintRawCXXCatchStmt(CXXCatchStmt *Node) {
440 if (Decl *ExDecl = Node->getExceptionDecl())
441 PrintRawDecl(ExDecl);
445 PrintRawCompoundStmt(cast<CompoundStmt>(Node->getHandlerBlock()));
448 void StmtPrinter::VisitCXXCatchStmt(CXXCatchStmt *Node) {
450 PrintRawCXXCatchStmt(Node);
454 void StmtPrinter::VisitCXXTryStmt(CXXTryStmt *Node) {
456 PrintRawCompoundStmt(Node->getTryBlock());
457 for (unsigned i = 0, e = Node->getNumHandlers(); i < e; ++i) {
459 PrintRawCXXCatchStmt(Node->getHandler(i));
464 //===----------------------------------------------------------------------===//
465 // Expr printing methods.
466 //===----------------------------------------------------------------------===//
468 void StmtPrinter::VisitExpr(Expr *Node) {
469 OS << "<<unknown expr type>>";
472 void StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) {
473 if (NestedNameSpecifier *Qualifier = Node->getQualifier())
474 Qualifier->print(OS, Policy);
475 OS << Node->getDecl();
476 if (Node->hasExplicitTemplateArgumentList())
477 OS << TemplateSpecializationType::PrintTemplateArgumentList(
478 Node->getTemplateArgs(),
479 Node->getNumTemplateArgs(),
483 void StmtPrinter::VisitDependentScopeDeclRefExpr(
484 DependentScopeDeclRefExpr *Node) {
485 Node->getQualifier()->print(OS, Policy);
486 OS << Node->getDeclName().getAsString();
487 if (Node->hasExplicitTemplateArgs())
488 OS << TemplateSpecializationType::PrintTemplateArgumentList(
489 Node->getTemplateArgs(),
490 Node->getNumTemplateArgs(),
494 void StmtPrinter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) {
495 if (Node->getQualifier())
496 Node->getQualifier()->print(OS, Policy);
497 OS << Node->getName().getAsString();
498 if (Node->hasExplicitTemplateArgs())
499 OS << TemplateSpecializationType::PrintTemplateArgumentList(
500 Node->getTemplateArgs(),
501 Node->getNumTemplateArgs(),
505 void StmtPrinter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
506 if (Node->getBase()) {
507 PrintExpr(Node->getBase());
508 OS << (Node->isArrow() ? "->" : ".");
510 OS << Node->getDecl();
513 void StmtPrinter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
514 if (Node->getBase()) {
515 PrintExpr(Node->getBase());
518 OS << Node->getProperty()->getNameAsCString();
521 void StmtPrinter::VisitObjCImplicitSetterGetterRefExpr(
522 ObjCImplicitSetterGetterRefExpr *Node) {
523 if (Node->getBase()) {
524 PrintExpr(Node->getBase());
527 if (Node->getGetterMethod())
528 OS << Node->getGetterMethod();
532 void StmtPrinter::VisitPredefinedExpr(PredefinedExpr *Node) {
533 switch (Node->getIdentType()) {
535 assert(0 && "unknown case");
536 case PredefinedExpr::Func:
539 case PredefinedExpr::Function:
540 OS << "__FUNCTION__";
542 case PredefinedExpr::PrettyFunction:
543 OS << "__PRETTY_FUNCTION__";
548 void StmtPrinter::VisitCharacterLiteral(CharacterLiteral *Node) {
549 unsigned value = Node->getValue();
560 // TODO: K&R: the meaning of '\\a' is different in traditional C
566 // Nonstandard escape sequence.
586 if (value < 256 && isprint(value)) {
587 OS << "'" << (char)value << "'";
588 } else if (value < 256) {
589 OS << "'\\x" << llvm::format("%x", value) << "'";
591 // FIXME what to really do here?
597 void StmtPrinter::VisitIntegerLiteral(IntegerLiteral *Node) {
598 bool isSigned = Node->getType()->isSignedIntegerType();
599 OS << Node->getValue().toString(10, isSigned);
601 // Emit suffixes. Integer literals are always a builtin integer type.
602 switch (Node->getType()->getAs<BuiltinType>()->getKind()) {
603 default: assert(0 && "Unexpected type for integer literal!");
604 case BuiltinType::Int: break; // no suffix.
605 case BuiltinType::UInt: OS << 'U'; break;
606 case BuiltinType::Long: OS << 'L'; break;
607 case BuiltinType::ULong: OS << "UL"; break;
608 case BuiltinType::LongLong: OS << "LL"; break;
609 case BuiltinType::ULongLong: OS << "ULL"; break;
612 void StmtPrinter::VisitFloatingLiteral(FloatingLiteral *Node) {
613 // FIXME: print value more precisely.
614 OS << Node->getValueAsApproximateDouble();
617 void StmtPrinter::VisitImaginaryLiteral(ImaginaryLiteral *Node) {
618 PrintExpr(Node->getSubExpr());
622 void StmtPrinter::VisitStringLiteral(StringLiteral *Str) {
623 if (Str->isWide()) OS << 'L';
626 // FIXME: this doesn't print wstrings right.
627 for (unsigned i = 0, e = Str->getByteLength(); i != e; ++i) {
628 unsigned char Char = Str->getStrData()[i];
634 else // Output anything hard as an octal escape.
636 << (char)('0'+ ((Char >> 6) & 7))
637 << (char)('0'+ ((Char >> 3) & 7))
638 << (char)('0'+ ((Char >> 0) & 7));
640 // Handle some common non-printable cases to make dumps prettier.
641 case '\\': OS << "\\\\"; break;
642 case '"': OS << "\\\""; break;
643 case '\n': OS << "\\n"; break;
644 case '\t': OS << "\\t"; break;
645 case '\a': OS << "\\a"; break;
646 case '\b': OS << "\\b"; break;
651 void StmtPrinter::VisitParenExpr(ParenExpr *Node) {
653 PrintExpr(Node->getSubExpr());
656 void StmtPrinter::VisitUnaryOperator(UnaryOperator *Node) {
657 if (!Node->isPostfix()) {
658 OS << UnaryOperator::getOpcodeStr(Node->getOpcode());
660 // Print a space if this is an "identifier operator" like __real, or if
661 // it might be concatenated incorrectly like '+'.
662 switch (Node->getOpcode()) {
664 case UnaryOperator::Real:
665 case UnaryOperator::Imag:
666 case UnaryOperator::Extension:
669 case UnaryOperator::Plus:
670 case UnaryOperator::Minus:
671 if (isa<UnaryOperator>(Node->getSubExpr()))
676 PrintExpr(Node->getSubExpr());
678 if (Node->isPostfix())
679 OS << UnaryOperator::getOpcodeStr(Node->getOpcode());
682 bool StmtPrinter::PrintOffsetOfDesignator(Expr *E) {
683 if (isa<UnaryOperator>(E)) {
684 // Base case, print the type and comma.
685 OS << E->getType().getAsString() << ", ";
687 } else if (ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(E)) {
688 PrintOffsetOfDesignator(ASE->getLHS());
690 PrintExpr(ASE->getRHS());
694 MemberExpr *ME = cast<MemberExpr>(E);
695 bool IsFirst = PrintOffsetOfDesignator(ME->getBase());
696 OS << (IsFirst ? "" : ".") << ME->getMemberDecl();
701 void StmtPrinter::VisitUnaryOffsetOf(UnaryOperator *Node) {
702 OS << "__builtin_offsetof(";
703 PrintOffsetOfDesignator(Node->getSubExpr());
707 void StmtPrinter::VisitOffsetOfExpr(OffsetOfExpr *Node) {
708 OS << "__builtin_offsetof(";
709 OS << Node->getTypeSourceInfo()->getType().getAsString() << ", ";
710 bool PrintedSomething = false;
711 for (unsigned i = 0, n = Node->getNumComponents(); i < n; ++i) {
712 OffsetOfExpr::OffsetOfNode ON = Node->getComponent(i);
713 if (ON.getKind() == OffsetOfExpr::OffsetOfNode::Array) {
716 PrintExpr(Node->getIndexExpr(ON.getArrayExprIndex()));
718 PrintedSomething = true;
722 // Skip implicit base indirections.
723 if (ON.getKind() == OffsetOfExpr::OffsetOfNode::Base)
726 // Field or identifier node.
727 IdentifierInfo *Id = ON.getFieldName();
731 if (PrintedSomething)
734 PrintedSomething = true;
740 void StmtPrinter::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *Node) {
741 OS << (Node->isSizeOf() ? "sizeof" : "__alignof");
742 if (Node->isArgumentType())
743 OS << "(" << Node->getArgumentType().getAsString() << ")";
746 PrintExpr(Node->getArgumentExpr());
749 void StmtPrinter::VisitArraySubscriptExpr(ArraySubscriptExpr *Node) {
750 PrintExpr(Node->getLHS());
752 PrintExpr(Node->getRHS());
756 void StmtPrinter::VisitCallExpr(CallExpr *Call) {
757 PrintExpr(Call->getCallee());
759 for (unsigned i = 0, e = Call->getNumArgs(); i != e; ++i) {
760 if (isa<CXXDefaultArgExpr>(Call->getArg(i))) {
761 // Don't print any defaulted arguments
766 PrintExpr(Call->getArg(i));
770 void StmtPrinter::VisitMemberExpr(MemberExpr *Node) {
771 // FIXME: Suppress printing implicit bases (like "this")
772 PrintExpr(Node->getBase());
773 if (FieldDecl *FD = dyn_cast<FieldDecl>(Node->getMemberDecl()))
774 if (FD->isAnonymousStructOrUnion())
776 OS << (Node->isArrow() ? "->" : ".");
777 if (NestedNameSpecifier *Qualifier = Node->getQualifier())
778 Qualifier->print(OS, Policy);
780 OS << Node->getMemberDecl();
782 if (Node->hasExplicitTemplateArgumentList())
783 OS << TemplateSpecializationType::PrintTemplateArgumentList(
784 Node->getTemplateArgs(),
785 Node->getNumTemplateArgs(),
788 void StmtPrinter::VisitObjCIsaExpr(ObjCIsaExpr *Node) {
789 PrintExpr(Node->getBase());
790 OS << (Node->isArrow() ? "->isa" : ".isa");
793 void StmtPrinter::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) {
794 PrintExpr(Node->getBase());
796 OS << Node->getAccessor().getName();
798 void StmtPrinter::VisitCastExpr(CastExpr *) {
799 assert(0 && "CastExpr is an abstract class");
801 void StmtPrinter::VisitExplicitCastExpr(ExplicitCastExpr *) {
802 assert(0 && "ExplicitCastExpr is an abstract class");
804 void StmtPrinter::VisitCStyleCastExpr(CStyleCastExpr *Node) {
805 OS << "(" << Node->getType().getAsString() << ")";
806 PrintExpr(Node->getSubExpr());
808 void StmtPrinter::VisitCompoundLiteralExpr(CompoundLiteralExpr *Node) {
809 OS << "(" << Node->getType().getAsString() << ")";
810 PrintExpr(Node->getInitializer());
812 void StmtPrinter::VisitImplicitCastExpr(ImplicitCastExpr *Node) {
813 // No need to print anything, simply forward to the sub expression.
814 PrintExpr(Node->getSubExpr());
816 void StmtPrinter::VisitBinaryOperator(BinaryOperator *Node) {
817 PrintExpr(Node->getLHS());
818 OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " ";
819 PrintExpr(Node->getRHS());
821 void StmtPrinter::VisitCompoundAssignOperator(CompoundAssignOperator *Node) {
822 PrintExpr(Node->getLHS());
823 OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " ";
824 PrintExpr(Node->getRHS());
826 void StmtPrinter::VisitConditionalOperator(ConditionalOperator *Node) {
827 PrintExpr(Node->getCond());
829 if (Node->getLHS()) {
831 PrintExpr(Node->getLHS());
834 else { // Handle GCC extension where LHS can be NULL.
838 PrintExpr(Node->getRHS());
843 void StmtPrinter::VisitAddrLabelExpr(AddrLabelExpr *Node) {
844 OS << "&&" << Node->getLabel()->getName();
847 void StmtPrinter::VisitStmtExpr(StmtExpr *E) {
849 PrintRawCompoundStmt(E->getSubStmt());
853 void StmtPrinter::VisitTypesCompatibleExpr(TypesCompatibleExpr *Node) {
854 OS << "__builtin_types_compatible_p(";
855 OS << Node->getArgType1().getAsString() << ",";
856 OS << Node->getArgType2().getAsString() << ")";
859 void StmtPrinter::VisitChooseExpr(ChooseExpr *Node) {
860 OS << "__builtin_choose_expr(";
861 PrintExpr(Node->getCond());
863 PrintExpr(Node->getLHS());
865 PrintExpr(Node->getRHS());
869 void StmtPrinter::VisitGNUNullExpr(GNUNullExpr *) {
873 void StmtPrinter::VisitShuffleVectorExpr(ShuffleVectorExpr *Node) {
874 OS << "__builtin_shufflevector(";
875 for (unsigned i = 0, e = Node->getNumSubExprs(); i != e; ++i) {
877 PrintExpr(Node->getExpr(i));
882 void StmtPrinter::VisitInitListExpr(InitListExpr* Node) {
883 if (Node->getSyntacticForm()) {
884 Visit(Node->getSyntacticForm());
889 for (unsigned i = 0, e = Node->getNumInits(); i != e; ++i) {
891 if (Node->getInit(i))
892 PrintExpr(Node->getInit(i));
899 void StmtPrinter::VisitParenListExpr(ParenListExpr* Node) {
901 for (unsigned i = 0, e = Node->getNumExprs(); i != e; ++i) {
903 PrintExpr(Node->getExpr(i));
908 void StmtPrinter::VisitDesignatedInitExpr(DesignatedInitExpr *Node) {
909 for (DesignatedInitExpr::designators_iterator D = Node->designators_begin(),
910 DEnd = Node->designators_end();
912 if (D->isFieldDesignator()) {
913 if (D->getDotLoc().isInvalid())
914 OS << D->getFieldName()->getName() << ":";
916 OS << "." << D->getFieldName()->getName();
919 if (D->isArrayDesignator()) {
920 PrintExpr(Node->getArrayIndex(*D));
922 PrintExpr(Node->getArrayRangeStart(*D));
924 PrintExpr(Node->getArrayRangeEnd(*D));
931 PrintExpr(Node->getInit());
934 void StmtPrinter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *Node) {
935 if (Policy.LangOpts.CPlusPlus)
936 OS << "/*implicit*/" << Node->getType().getAsString(Policy) << "()";
938 OS << "/*implicit*/(" << Node->getType().getAsString(Policy) << ")";
939 if (Node->getType()->isRecordType())
946 void StmtPrinter::VisitVAArgExpr(VAArgExpr *Node) {
947 OS << "__builtin_va_arg(";
948 PrintExpr(Node->getSubExpr());
950 OS << Node->getType().getAsString();
955 void StmtPrinter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *Node) {
956 const char *OpStrings[NUM_OVERLOADED_OPERATORS] = {
958 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
960 #include "clang/Basic/OperatorKinds.def"
963 OverloadedOperatorKind Kind = Node->getOperator();
964 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
965 if (Node->getNumArgs() == 1) {
966 OS << OpStrings[Kind] << ' ';
967 PrintExpr(Node->getArg(0));
969 PrintExpr(Node->getArg(0));
970 OS << ' ' << OpStrings[Kind];
972 } else if (Kind == OO_Call) {
973 PrintExpr(Node->getArg(0));
975 for (unsigned ArgIdx = 1; ArgIdx < Node->getNumArgs(); ++ArgIdx) {
978 if (!isa<CXXDefaultArgExpr>(Node->getArg(ArgIdx)))
979 PrintExpr(Node->getArg(ArgIdx));
982 } else if (Kind == OO_Subscript) {
983 PrintExpr(Node->getArg(0));
985 PrintExpr(Node->getArg(1));
987 } else if (Node->getNumArgs() == 1) {
988 OS << OpStrings[Kind] << ' ';
989 PrintExpr(Node->getArg(0));
990 } else if (Node->getNumArgs() == 2) {
991 PrintExpr(Node->getArg(0));
992 OS << ' ' << OpStrings[Kind] << ' ';
993 PrintExpr(Node->getArg(1));
995 assert(false && "unknown overloaded operator");
999 void StmtPrinter::VisitCXXMemberCallExpr(CXXMemberCallExpr *Node) {
1000 VisitCallExpr(cast<CallExpr>(Node));
1003 void StmtPrinter::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) {
1004 OS << Node->getCastName() << '<';
1005 OS << Node->getTypeAsWritten().getAsString() << ">(";
1006 PrintExpr(Node->getSubExpr());
1010 void StmtPrinter::VisitCXXStaticCastExpr(CXXStaticCastExpr *Node) {
1011 VisitCXXNamedCastExpr(Node);
1014 void StmtPrinter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *Node) {
1015 VisitCXXNamedCastExpr(Node);
1018 void StmtPrinter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *Node) {
1019 VisitCXXNamedCastExpr(Node);
1022 void StmtPrinter::VisitCXXConstCastExpr(CXXConstCastExpr *Node) {
1023 VisitCXXNamedCastExpr(Node);
1026 void StmtPrinter::VisitCXXTypeidExpr(CXXTypeidExpr *Node) {
1028 if (Node->isTypeOperand()) {
1029 OS << Node->getTypeOperand().getAsString();
1031 PrintExpr(Node->getExprOperand());
1036 void StmtPrinter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) {
1037 OS << (Node->getValue() ? "true" : "false");
1040 void StmtPrinter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *Node) {
1044 void StmtPrinter::VisitCXXThisExpr(CXXThisExpr *Node) {
1048 void StmtPrinter::VisitCXXThrowExpr(CXXThrowExpr *Node) {
1049 if (Node->getSubExpr() == 0)
1053 PrintExpr(Node->getSubExpr());
1057 void StmtPrinter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *Node) {
1058 // Nothing to print: we picked up the default argument
1061 void StmtPrinter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) {
1062 OS << Node->getType().getAsString();
1064 PrintExpr(Node->getSubExpr());
1068 void StmtPrinter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) {
1069 PrintExpr(Node->getSubExpr());
1072 void StmtPrinter::VisitCXXBindReferenceExpr(CXXBindReferenceExpr *Node) {
1073 PrintExpr(Node->getSubExpr());
1076 void StmtPrinter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *Node) {
1077 OS << Node->getType().getAsString();
1079 for (CXXTemporaryObjectExpr::arg_iterator Arg = Node->arg_begin(),
1080 ArgEnd = Node->arg_end();
1081 Arg != ArgEnd; ++Arg) {
1082 if (Arg != Node->arg_begin())
1089 void StmtPrinter::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *Node) {
1090 OS << Node->getType().getAsString() << "()";
1093 void StmtPrinter::VisitCXXNewExpr(CXXNewExpr *E) {
1094 if (E->isGlobalNew())
1097 unsigned NumPlace = E->getNumPlacementArgs();
1100 PrintExpr(E->getPlacementArg(0));
1101 for (unsigned i = 1; i < NumPlace; ++i) {
1103 PrintExpr(E->getPlacementArg(i));
1107 if (E->isParenTypeId())
1110 if (Expr *Size = E->getArraySize()) {
1111 llvm::raw_string_ostream s(TypeS);
1112 Size->printPretty(s, Context, Helper, Policy);
1114 TypeS = "[" + TypeS + "]";
1116 E->getAllocatedType().getAsStringInternal(TypeS, Policy);
1118 if (E->isParenTypeId())
1121 if (E->hasInitializer()) {
1123 unsigned NumCons = E->getNumConstructorArgs();
1125 PrintExpr(E->getConstructorArg(0));
1126 for (unsigned i = 1; i < NumCons; ++i) {
1128 PrintExpr(E->getConstructorArg(i));
1135 void StmtPrinter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1136 if (E->isGlobalDelete())
1139 if (E->isArrayForm())
1141 PrintExpr(E->getArgument());
1144 void StmtPrinter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
1145 PrintExpr(E->getBase());
1150 if (E->getQualifier())
1151 E->getQualifier()->print(OS, Policy);
1154 if (IdentifierInfo *II = E->getDestroyedTypeIdentifier())
1155 OS << II->getName();
1157 E->getDestroyedType().getAsStringInternal(TypeS, Policy);
1161 void StmtPrinter::VisitCXXConstructExpr(CXXConstructExpr *E) {
1162 // FIXME. For now we just print a trivial constructor call expression,
1163 // constructing its first argument object.
1164 if (E->getNumArgs() == 1) {
1165 CXXConstructorDecl *CD = E->getConstructor();
1166 if (CD->isTrivial())
1167 PrintExpr(E->getArg(0));
1169 // Nothing to print.
1172 void StmtPrinter::VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E) {
1173 // Just forward to the sub expression.
1174 PrintExpr(E->getSubExpr());
1178 StmtPrinter::VisitCXXUnresolvedConstructExpr(
1179 CXXUnresolvedConstructExpr *Node) {
1180 OS << Node->getTypeAsWritten().getAsString();
1182 for (CXXUnresolvedConstructExpr::arg_iterator Arg = Node->arg_begin(),
1183 ArgEnd = Node->arg_end();
1184 Arg != ArgEnd; ++Arg) {
1185 if (Arg != Node->arg_begin())
1192 void StmtPrinter::VisitCXXDependentScopeMemberExpr(
1193 CXXDependentScopeMemberExpr *Node) {
1194 if (!Node->isImplicitAccess()) {
1195 PrintExpr(Node->getBase());
1196 OS << (Node->isArrow() ? "->" : ".");
1198 if (NestedNameSpecifier *Qualifier = Node->getQualifier())
1199 Qualifier->print(OS, Policy);
1200 else if (Node->hasExplicitTemplateArgs())
1201 // FIXME: Track use of "template" keyword explicitly?
1204 OS << Node->getMember().getAsString();
1206 if (Node->hasExplicitTemplateArgs()) {
1207 OS << TemplateSpecializationType::PrintTemplateArgumentList(
1208 Node->getTemplateArgs(),
1209 Node->getNumTemplateArgs(),
1214 void StmtPrinter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *Node) {
1215 if (!Node->isImplicitAccess()) {
1216 PrintExpr(Node->getBase());
1217 OS << (Node->isArrow() ? "->" : ".");
1219 if (NestedNameSpecifier *Qualifier = Node->getQualifier())
1220 Qualifier->print(OS, Policy);
1222 // FIXME: this might originally have been written with 'template'
1224 OS << Node->getMemberName().getAsString();
1226 if (Node->hasExplicitTemplateArgs()) {
1227 OS << TemplateSpecializationType::PrintTemplateArgumentList(
1228 Node->getTemplateArgs(),
1229 Node->getNumTemplateArgs(),
1234 static const char *getTypeTraitName(UnaryTypeTrait UTT) {
1236 default: assert(false && "Unknown type trait");
1237 case UTT_HasNothrowAssign: return "__has_nothrow_assign";
1238 case UTT_HasNothrowCopy: return "__has_nothrow_copy";
1239 case UTT_HasNothrowConstructor: return "__has_nothrow_constructor";
1240 case UTT_HasTrivialAssign: return "__has_trivial_assign";
1241 case UTT_HasTrivialCopy: return "__has_trivial_copy";
1242 case UTT_HasTrivialConstructor: return "__has_trivial_constructor";
1243 case UTT_HasTrivialDestructor: return "__has_trivial_destructor";
1244 case UTT_HasVirtualDestructor: return "__has_virtual_destructor";
1245 case UTT_IsAbstract: return "__is_abstract";
1246 case UTT_IsClass: return "__is_class";
1247 case UTT_IsEmpty: return "__is_empty";
1248 case UTT_IsEnum: return "__is_enum";
1249 case UTT_IsPOD: return "__is_pod";
1250 case UTT_IsPolymorphic: return "__is_polymorphic";
1251 case UTT_IsUnion: return "__is_union";
1255 void StmtPrinter::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
1256 OS << getTypeTraitName(E->getTrait()) << "("
1257 << E->getQueriedType().getAsString() << ")";
1262 void StmtPrinter::VisitObjCStringLiteral(ObjCStringLiteral *Node) {
1264 VisitStringLiteral(Node->getString());
1267 void StmtPrinter::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) {
1268 OS << "@encode(" << Node->getEncodedType().getAsString() << ')';
1271 void StmtPrinter::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) {
1272 OS << "@selector(" << Node->getSelector().getAsString() << ')';
1275 void StmtPrinter::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) {
1276 OS << "@protocol(" << Node->getProtocol() << ')';
1279 void StmtPrinter::VisitObjCMessageExpr(ObjCMessageExpr *Mess) {
1281 switch (Mess->getReceiverKind()) {
1282 case ObjCMessageExpr::Instance:
1283 PrintExpr(Mess->getInstanceReceiver());
1286 case ObjCMessageExpr::Class:
1287 OS << Mess->getClassReceiver().getAsString(Policy);
1290 case ObjCMessageExpr::SuperInstance:
1291 case ObjCMessageExpr::SuperClass:
1297 Selector selector = Mess->getSelector();
1298 if (selector.isUnarySelector()) {
1299 OS << selector.getIdentifierInfoForSlot(0)->getName();
1301 for (unsigned i = 0, e = Mess->getNumArgs(); i != e; ++i) {
1302 if (i < selector.getNumArgs()) {
1303 if (i > 0) OS << ' ';
1304 if (selector.getIdentifierInfoForSlot(i))
1305 OS << selector.getIdentifierInfoForSlot(i)->getName() << ':';
1309 else OS << ", "; // Handle variadic methods.
1311 PrintExpr(Mess->getArg(i));
1317 void StmtPrinter::VisitObjCSuperExpr(ObjCSuperExpr *) {
1321 void StmtPrinter::VisitBlockExpr(BlockExpr *Node) {
1322 BlockDecl *BD = Node->getBlockDecl();
1325 const FunctionType *AFT = Node->getFunctionType();
1327 if (isa<FunctionNoProtoType>(AFT)) {
1329 } else if (!BD->param_empty() || cast<FunctionProtoType>(AFT)->isVariadic()) {
1331 std::string ParamStr;
1332 for (BlockDecl::param_iterator AI = BD->param_begin(),
1333 E = BD->param_end(); AI != E; ++AI) {
1334 if (AI != BD->param_begin()) OS << ", ";
1335 ParamStr = (*AI)->getNameAsString();
1336 (*AI)->getType().getAsStringInternal(ParamStr, Policy);
1340 const FunctionProtoType *FT = cast<FunctionProtoType>(AFT);
1341 if (FT->isVariadic()) {
1342 if (!BD->param_empty()) OS << ", ";
1349 void StmtPrinter::VisitBlockDeclRefExpr(BlockDeclRefExpr *Node) {
1350 OS << Node->getDecl();
1352 //===----------------------------------------------------------------------===//
1353 // Stmt method implementations
1354 //===----------------------------------------------------------------------===//
1356 void Stmt::dumpPretty(ASTContext& Context) const {
1357 printPretty(llvm::errs(), Context, 0,
1358 PrintingPolicy(Context.getLangOptions()));
1361 void Stmt::printPretty(llvm::raw_ostream &OS, ASTContext& Context,
1362 PrinterHelper* Helper,
1363 const PrintingPolicy &Policy,
1364 unsigned Indentation) const {
1370 if (Policy.Dump && &Context) {
1371 dump(Context.getSourceManager());
1375 StmtPrinter P(OS, Context, Helper, Policy, Indentation);
1376 P.Visit(const_cast<Stmt*>(this));
1379 //===----------------------------------------------------------------------===//
1381 //===----------------------------------------------------------------------===//
1383 // Implement virtual destructor.
1384 PrinterHelper::~PrinterHelper() {}