From: George Karpenkov Date: Sat, 15 Sep 2018 02:02:31 +0000 (+0000) Subject: StmtPrinter: allow customizing the end-of-line character X-Git-Tag: llvmorg-8.0.0-rc1~8635 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=64885ae9c06c9a430395685cb6b9a8f1bce080da;p=platform%2Fupstream%2Fllvm.git StmtPrinter: allow customizing the end-of-line character Differential Revision: https://reviews.llvm.org/D51824 llvm-svn: 342311 --- diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h index 33d4e70..b4e0fd5 100644 --- a/clang/include/clang/AST/Stmt.h +++ b/clang/include/clang/AST/Stmt.h @@ -424,6 +424,7 @@ public: void dumpPretty(const ASTContext &Context) const; void printPretty(raw_ostream &OS, PrinterHelper *Helper, const PrintingPolicy &Policy, unsigned Indentation = 0, + StringRef NewlineSymbol = "\n", const ASTContext *Context = nullptr) const; /// viewAST - Visualize an AST rooted at this Stmt* using GraphViz. Only diff --git a/clang/lib/AST/DeclPrinter.cpp b/clang/lib/AST/DeclPrinter.cpp index 5548561..9f4cfb2 100644 --- a/clang/lib/AST/DeclPrinter.cpp +++ b/clang/lib/AST/DeclPrinter.cpp @@ -544,7 +544,7 @@ void DeclPrinter::VisitEnumConstantDecl(EnumConstantDecl *D) { prettyPrintAttributes(D); if (Expr *Init = D->getInitExpr()) { Out << " = "; - Init->printPretty(Out, nullptr, Policy, Indentation, &Context); + Init->printPretty(Out, nullptr, Policy, Indentation, "\n", &Context); } } diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp index a1036cf..d540fad 100644 --- a/clang/lib/AST/StmtPrinter.cpp +++ b/clang/lib/AST/StmtPrinter.cpp @@ -69,14 +69,16 @@ namespace { unsigned IndentLevel; PrinterHelper* Helper; PrintingPolicy Policy; + std::string NL; const ASTContext *Context; public: StmtPrinter(raw_ostream &os, PrinterHelper *helper, const PrintingPolicy &Policy, unsigned Indentation = 0, + StringRef NL = "\n", const ASTContext *Context = nullptr) : OS(os), IndentLevel(Indentation), Helper(helper), Policy(Policy), - Context(Context) {} + NL(NL), Context(Context) {} void PrintStmt(Stmt *S) { PrintStmt(S, Policy.Indentation); @@ -88,11 +90,11 @@ namespace { // If this is an expr used in a stmt context, indent and newline it. Indent(); Visit(S); - OS << ";\n"; + OS << ";" << NL; } else if (S) { Visit(S); } else { - Indent() << "<<>>\n"; + Indent() << "<<>>" << NL; } IndentLevel -= SubIndent; } @@ -128,7 +130,7 @@ namespace { } void VisitStmt(Stmt *Node) LLVM_ATTRIBUTE_UNUSED { - Indent() << "<>\n"; + Indent() << "<>" << NL; } void VisitExpr(Expr *Node) LLVM_ATTRIBUTE_UNUSED { @@ -152,7 +154,7 @@ namespace { /// PrintRawCompoundStmt - Print a compound stmt without indenting the {, and /// with no newline after the }. void StmtPrinter::PrintRawCompoundStmt(CompoundStmt *Node) { - OS << "{\n"; + OS << "{" << NL; for (auto *I : Node->body()) PrintStmt(I); @@ -169,19 +171,19 @@ void StmtPrinter::PrintRawDeclStmt(const DeclStmt *S) { } void StmtPrinter::VisitNullStmt(NullStmt *Node) { - Indent() << ";\n"; + Indent() << ";" << NL; } void StmtPrinter::VisitDeclStmt(DeclStmt *Node) { Indent(); PrintRawDeclStmt(Node); - OS << ";\n"; + OS << ";" << NL; } void StmtPrinter::VisitCompoundStmt(CompoundStmt *Node) { Indent(); PrintRawCompoundStmt(Node); - OS << "\n"; + OS << "" << NL; } void StmtPrinter::VisitCaseStmt(CaseStmt *Node) { @@ -191,18 +193,18 @@ void StmtPrinter::VisitCaseStmt(CaseStmt *Node) { OS << " ... "; PrintExpr(Node->getRHS()); } - OS << ":\n"; + OS << ":" << NL; PrintStmt(Node->getSubStmt(), 0); } void StmtPrinter::VisitDefaultStmt(DefaultStmt *Node) { - Indent(-1) << "default:\n"; + Indent(-1) << "default:" << NL; PrintStmt(Node->getSubStmt(), 0); } void StmtPrinter::VisitLabelStmt(LabelStmt *Node) { - Indent(-1) << Node->getName() << ":\n"; + Indent(-1) << Node->getName() << ":" << NL; PrintStmt(Node->getSubStmt(), 0); } @@ -225,9 +227,9 @@ void StmtPrinter::PrintRawIfStmt(IfStmt *If) { if (auto *CS = dyn_cast(If->getThen())) { OS << ' '; PrintRawCompoundStmt(CS); - OS << (If->getElse() ? ' ' : '\n'); + OS << (If->getElse() ? " " : NL); } else { - OS << '\n'; + OS << NL; PrintStmt(If->getThen()); if (If->getElse()) Indent(); } @@ -238,12 +240,12 @@ void StmtPrinter::PrintRawIfStmt(IfStmt *If) { if (auto *CS = dyn_cast(Else)) { OS << ' '; PrintRawCompoundStmt(CS); - OS << '\n'; + OS << NL; } else if (auto *ElseIf = dyn_cast(Else)) { OS << ' '; PrintRawIfStmt(ElseIf); } else { - OS << '\n'; + OS << NL; PrintStmt(If->getElse()); } } @@ -266,9 +268,9 @@ void StmtPrinter::VisitSwitchStmt(SwitchStmt *Node) { if (auto *CS = dyn_cast(Node->getBody())) { OS << " "; PrintRawCompoundStmt(CS); - OS << "\n"; + OS << NL; } else { - OS << "\n"; + OS << NL; PrintStmt(Node->getBody()); } } @@ -279,7 +281,7 @@ void StmtPrinter::VisitWhileStmt(WhileStmt *Node) { PrintRawDeclStmt(DS); else PrintExpr(Node->getCond()); - OS << ")\n"; + OS << ")" << NL; PrintStmt(Node->getBody()); } @@ -289,14 +291,14 @@ void StmtPrinter::VisitDoStmt(DoStmt *Node) { PrintRawCompoundStmt(CS); OS << " "; } else { - OS << "\n"; + OS << NL; PrintStmt(Node->getBody()); Indent(); } OS << "while ("; PrintExpr(Node->getCond()); - OS << ");\n"; + OS << ");" << NL; } void StmtPrinter::VisitForStmt(ForStmt *Node) { @@ -321,9 +323,9 @@ void StmtPrinter::VisitForStmt(ForStmt *Node) { if (auto *CS = dyn_cast(Node->getBody())) { PrintRawCompoundStmt(CS); - OS << "\n"; + OS << NL; } else { - OS << "\n"; + OS << NL; PrintStmt(Node->getBody()); } } @@ -340,9 +342,9 @@ void StmtPrinter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *Node) { if (auto *CS = dyn_cast(Node->getBody())) { PrintRawCompoundStmt(CS); - OS << "\n"; + OS << NL; } else { - OS << "\n"; + OS << NL; PrintStmt(Node->getBody()); } } @@ -354,10 +356,10 @@ void StmtPrinter::VisitCXXForRangeStmt(CXXForRangeStmt *Node) { Node->getLoopVariable()->print(OS, SubPolicy, IndentLevel); OS << " : "; PrintExpr(Node->getRangeInit()); - OS << ") {\n"; + OS << ") {" << NL; PrintStmt(Node->getBody()); Indent() << "}"; - if (Policy.IncludeNewlines) OS << "\n"; + if (Policy.IncludeNewlines) OS << NL; } void StmtPrinter::VisitMSDependentExistsStmt(MSDependentExistsStmt *Node) { @@ -378,24 +380,24 @@ void StmtPrinter::VisitMSDependentExistsStmt(MSDependentExistsStmt *Node) { void StmtPrinter::VisitGotoStmt(GotoStmt *Node) { Indent() << "goto " << Node->getLabel()->getName() << ";"; - if (Policy.IncludeNewlines) OS << "\n"; + if (Policy.IncludeNewlines) OS << NL; } void StmtPrinter::VisitIndirectGotoStmt(IndirectGotoStmt *Node) { Indent() << "goto *"; PrintExpr(Node->getTarget()); OS << ";"; - if (Policy.IncludeNewlines) OS << "\n"; + if (Policy.IncludeNewlines) OS << NL; } void StmtPrinter::VisitContinueStmt(ContinueStmt *Node) { Indent() << "continue;"; - if (Policy.IncludeNewlines) OS << "\n"; + if (Policy.IncludeNewlines) OS << NL; } void StmtPrinter::VisitBreakStmt(BreakStmt *Node) { Indent() << "break;"; - if (Policy.IncludeNewlines) OS << "\n"; + if (Policy.IncludeNewlines) OS << NL; } void StmtPrinter::VisitReturnStmt(ReturnStmt *Node) { @@ -405,7 +407,7 @@ void StmtPrinter::VisitReturnStmt(ReturnStmt *Node) { PrintExpr(Node->getRetValue()); } OS << ";"; - if (Policy.IncludeNewlines) OS << "\n"; + if (Policy.IncludeNewlines) OS << NL; } void StmtPrinter::VisitGCCAsmStmt(GCCAsmStmt *Node) { @@ -470,17 +472,17 @@ void StmtPrinter::VisitGCCAsmStmt(GCCAsmStmt *Node) { } OS << ");"; - if (Policy.IncludeNewlines) OS << "\n"; + if (Policy.IncludeNewlines) OS << NL; } void StmtPrinter::VisitMSAsmStmt(MSAsmStmt *Node) { // FIXME: Implement MS style inline asm statement printer. Indent() << "__asm "; if (Node->hasBraces()) - OS << "{\n"; - OS << Node->getAsmString() << "\n"; + OS << "{" << NL; + OS << Node->getAsmString() << NL; if (Node->hasBraces()) - Indent() << "}\n"; + Indent() << "}" << NL; } void StmtPrinter::VisitCapturedStmt(CapturedStmt *Node) { @@ -491,7 +493,7 @@ void StmtPrinter::VisitObjCAtTryStmt(ObjCAtTryStmt *Node) { Indent() << "@try"; if (auto *TS = dyn_cast(Node->getTryBody())) { PrintRawCompoundStmt(TS); - OS << "\n"; + OS << NL; } for (unsigned I = 0, N = Node->getNumCatchStmts(); I != N; ++I) { @@ -504,14 +506,14 @@ void StmtPrinter::VisitObjCAtTryStmt(ObjCAtTryStmt *Node) { OS << ")"; if (auto *CS = dyn_cast(catchStmt->getCatchBody())) { PrintRawCompoundStmt(CS); - OS << "\n"; + OS << NL; } } if (auto *FS = static_cast(Node->getFinallyStmt())) { Indent() << "@finally"; PrintRawCompoundStmt(dyn_cast(FS->getFinallyBody())); - OS << "\n"; + OS << NL; } } @@ -519,7 +521,7 @@ void StmtPrinter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *Node) { } void StmtPrinter::VisitObjCAtCatchStmt (ObjCAtCatchStmt *Node) { - Indent() << "@catch (...) { /* todo */ } \n"; + Indent() << "@catch (...) { /* todo */ } " << NL; } void StmtPrinter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *Node) { @@ -528,7 +530,7 @@ void StmtPrinter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *Node) { OS << " "; PrintExpr(Node->getThrowExpr()); } - OS << ";\n"; + OS << ";" << NL; } void StmtPrinter::VisitObjCAvailabilityCheckExpr( @@ -541,13 +543,13 @@ void StmtPrinter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *Node) { PrintExpr(Node->getSynchExpr()); OS << ")"; PrintRawCompoundStmt(Node->getSynchBody()); - OS << "\n"; + OS << NL; } void StmtPrinter::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *Node) { Indent() << "@autoreleasepool"; PrintRawCompoundStmt(dyn_cast(Node->getSubStmt())); - OS << "\n"; + OS << NL; } void StmtPrinter::PrintRawCXXCatchStmt(CXXCatchStmt *Node) { @@ -563,7 +565,7 @@ void StmtPrinter::PrintRawCXXCatchStmt(CXXCatchStmt *Node) { void StmtPrinter::VisitCXXCatchStmt(CXXCatchStmt *Node) { Indent(); PrintRawCXXCatchStmt(Node); - OS << "\n"; + OS << NL; } void StmtPrinter::VisitCXXTryStmt(CXXTryStmt *Node) { @@ -573,7 +575,7 @@ void StmtPrinter::VisitCXXTryStmt(CXXTryStmt *Node) { OS << " "; PrintRawCXXCatchStmt(Node->getHandler(i)); } - OS << "\n"; + OS << NL; } void StmtPrinter::VisitSEHTryStmt(SEHTryStmt *Node) { @@ -587,38 +589,38 @@ void StmtPrinter::VisitSEHTryStmt(SEHTryStmt *Node) { assert(F && "Must have a finally block..."); PrintRawSEHFinallyStmt(F); } - OS << "\n"; + OS << NL; } void StmtPrinter::PrintRawSEHFinallyStmt(SEHFinallyStmt *Node) { OS << "__finally "; PrintRawCompoundStmt(Node->getBlock()); - OS << "\n"; + OS << NL; } void StmtPrinter::PrintRawSEHExceptHandler(SEHExceptStmt *Node) { OS << "__except ("; VisitExpr(Node->getFilterExpr()); - OS << ")\n"; + OS << ")" << NL; PrintRawCompoundStmt(Node->getBlock()); - OS << "\n"; + OS << NL; } void StmtPrinter::VisitSEHExceptStmt(SEHExceptStmt *Node) { Indent(); PrintRawSEHExceptHandler(Node); - OS << "\n"; + OS << NL; } void StmtPrinter::VisitSEHFinallyStmt(SEHFinallyStmt *Node) { Indent(); PrintRawSEHFinallyStmt(Node); - OS << "\n"; + OS << NL; } void StmtPrinter::VisitSEHLeaveStmt(SEHLeaveStmt *Node) { Indent() << "__leave;"; - if (Policy.IncludeNewlines) OS << "\n"; + if (Policy.IncludeNewlines) OS << NL; } //===----------------------------------------------------------------------===// @@ -1067,7 +1069,7 @@ void StmtPrinter::PrintOMPExecutableDirective(OMPExecutableDirective *S, OS << ' '; Printer.Visit(Clause); } - OS << "\n"; + OS << NL; if (!ForceNoStmt && S->hasAssociatedStmt()) PrintStmt(S->getInnermostCapturedStmt()->getCapturedStmt()); } @@ -2808,8 +2810,9 @@ void Stmt::dumpPretty(const ASTContext &Context) const { void Stmt::printPretty(raw_ostream &OS, PrinterHelper *Helper, const PrintingPolicy &Policy, unsigned Indentation, + StringRef NL, const ASTContext *Context) const { - StmtPrinter P(OS, Helper, Policy, Indentation, Context); + StmtPrinter P(OS, Helper, Policy, Indentation, NL, Context); P.Visit(const_cast(this)); }