Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(61)

Unified Diff: pkg/js_ast/lib/src/printer.dart

Issue 949753004: Avoid printing braces for one-statement blocks in js-printer. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: label: break label; => ; and update unittest Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/js_ast/lib/src/nodes.dart ('k') | tests/compiler/dart2js/async_await_js_transform_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/js_ast/lib/src/printer.dart
diff --git a/pkg/js_ast/lib/src/printer.dart b/pkg/js_ast/lib/src/printer.dart
index b1acebaa8f82e18b0159660b79714a7ba7637f7c..f362be5646b37857287498760cd5c6115d57283e 100644
--- a/pkg/js_ast/lib/src/printer.dart
+++ b/pkg/js_ast/lib/src/printer.dart
@@ -204,10 +204,20 @@ class Printer implements NodeVisitor {
visitAll(program.body);
}
- bool blockBody(Node body, {bool needsSeparation, bool needsNewline}) {
+ Statement unwrapBlockIfSingleStatement(Statement body) {
+ Statement result = body;
+ while (result is Block) {
+ Block block = result;
+ if (block.statements.length != 1) break;
+ result = block.statements.single;
+ }
+ return result;
+ }
+
+ bool blockBody(Statement body, {bool needsSeparation, bool needsNewline}) {
if (body is Block) {
spaceOut();
- blockOut(body, false, needsNewline);
+ blockOut(body, shouldIndent: false, needsNewline: needsNewline);
return true;
}
if (shouldCompressOutput && needsSeparation) {
@@ -234,7 +244,7 @@ class Printer implements NodeVisitor {
}
}
- void blockOut(Block node, bool shouldIndent, bool needsNewline) {
+ void blockOut(Block node, {bool shouldIndent, bool needsNewline}) {
if (shouldIndent) indent();
context.enterNode(node);
out("{");
@@ -249,7 +259,7 @@ class Printer implements NodeVisitor {
}
visitBlock(Block block) {
- blockOut(block, true, true);
+ blockOut(block, shouldIndent: true, needsNewline: true);
}
visitExpressionStatement(ExpressionStatement expressionStatement) {
@@ -264,15 +274,15 @@ class Printer implements NodeVisitor {
}
void ifOut(If node, bool shouldIndent) {
- Node then = node.then;
- Node elsePart = node.otherwise;
+ Statement then = unwrapBlockIfSingleStatement(node.then);
+ Statement elsePart = node.otherwise;
bool hasElse = node.hasElse;
// Handle dangling elses and a work-around for Android 4.0 stock browser.
// Android 4.0 requires braces for a single do-while in the `then` branch.
// See issue 10923.
if (hasElse) {
- bool needsBraces = node.then.accept(danglingElseVisitor) || then is Do;
+ bool needsBraces = then.accept(danglingElseVisitor) || then is Do;
if (needsBraces) {
then = new Block(<Statement>[then]);
}
@@ -297,7 +307,8 @@ class Printer implements NodeVisitor {
pendingSpace = true;
ifOut(elsePart, false);
} else {
- blockBody(elsePart, needsSeparation: true, needsNewline: true);
+ blockBody(unwrapBlockIfSingleStatement(elsePart),
+ needsSeparation: true, needsNewline: true);
}
}
}
@@ -327,7 +338,8 @@ class Printer implements NodeVisitor {
newInForInit: false, newAtStatementBegin: false);
}
out(")");
- blockBody(loop.body, needsSeparation: false, needsNewline: true);
+ blockBody(unwrapBlockIfSingleStatement(loop.body),
+ needsSeparation: false, needsNewline: true);
}
visitForIn(ForIn loop) {
@@ -341,7 +353,8 @@ class Printer implements NodeVisitor {
visitNestedExpression(loop.object, EXPRESSION,
newInForInit: false, newAtStatementBegin: false);
out(")");
- blockBody(loop.body, needsSeparation: false, needsNewline: true);
+ blockBody(unwrapBlockIfSingleStatement(loop.body),
+ needsSeparation: false, needsNewline: true);
}
visitWhile(While loop) {
@@ -351,12 +364,14 @@ class Printer implements NodeVisitor {
visitNestedExpression(loop.condition, EXPRESSION,
newInForInit: false, newAtStatementBegin: false);
out(")");
- blockBody(loop.body, needsSeparation: false, needsNewline: true);
+ blockBody(unwrapBlockIfSingleStatement(loop.body),
+ needsSeparation: false, needsNewline: true);
}
visitDo(Do loop) {
outIndent("do");
- if (blockBody(loop.body, needsSeparation: true, needsNewline: false)) {
+ if (blockBody(unwrapBlockIfSingleStatement(loop.body),
+ needsSeparation: true, needsNewline: false)) {
spaceOut();
} else {
indent();
@@ -444,7 +459,7 @@ class Printer implements NodeVisitor {
visitNestedExpression(node.declaration, EXPRESSION,
newInForInit: false, newAtStatementBegin: false);
out(")");
- blockBody(node.body, needsSeparation: false, needsNewline: true);
+ blockBody(node.body, needsSeparation: false, needsNewline: false);
}
visitSwitch(Switch node) {
@@ -485,8 +500,18 @@ class Printer implements NodeVisitor {
}
visitLabeledStatement(LabeledStatement node) {
+ Statement body = unwrapBlockIfSingleStatement(node.body);
+ // `label: break label;`
+ // Does not work on IE. The statement is a nop, so replace it by an empty
+ // statement.
+ // See:
+ // https://connect.microsoft.com/IE/feedback/details/891889/parser-bugs
+ if (body is Break && body.targetLabel == node.label) {
+ visit(new EmptyStatement());
+ return;
+ }
outIndent("${node.label}:");
- blockBody(node.body, needsSeparation: false, needsNewline: true);
+ blockBody(body, needsSeparation: false, needsNewline: true);
}
void functionOut(Fun fun, Node name, VarCollector vars) {
« no previous file with comments | « pkg/js_ast/lib/src/nodes.dart ('k') | tests/compiler/dart2js/async_await_js_transform_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698