From ed5a057e4e8db34f630dc6e0bff60b4cddeaa280 Mon Sep 17 00:00:00 2001 From: Amjad Masad Date: Sun, 27 Dec 2015 01:23:45 -0800 Subject: [PATCH] Fix various print inefficiencies/bugs --- .../babel-generator/src/generators/statements.js | 10 ++++++++-- packages/babel-generator/src/node/parentheses.js | 16 ++++++++++++++++ .../minified/labeled-statement/actual.js | 7 +++++++ .../minified/labeled-statement/expected.js | 1 + .../parentheses/sequence-expressions/actual.js | 13 +++++++++++++ .../parentheses/sequence-expressions/expected.js | 13 +++++++++++++ 6 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 packages/babel-generator/test/fixtures/minified/labeled-statement/actual.js create mode 100644 packages/babel-generator/test/fixtures/minified/labeled-statement/expected.js create mode 100644 packages/babel-generator/test/fixtures/parentheses/sequence-expressions/actual.js create mode 100644 packages/babel-generator/test/fixtures/parentheses/sequence-expressions/expected.js diff --git a/packages/babel-generator/src/generators/statements.js b/packages/babel-generator/src/generators/statements.js index 611754a2d2..cc373657c4 100644 --- a/packages/babel-generator/src/generators/statements.js +++ b/packages/babel-generator/src/generators/statements.js @@ -107,7 +107,12 @@ function buildLabelStatement(prefix, key = "label") { let label = node[key]; if (label) { - this.push(" "); + if (!(this.format.minified && (t.isUnaryExpression(label, { prefix: true }) || + t.isUpdateExpression(label, { prefix: true })))) { + this.push(" "); + + } + let terminatorState = this.startTerminatorless(); this.print(label, node); this.endTerminatorless(terminatorState); @@ -153,7 +158,8 @@ export function CatchClause(node: Object) { this.keyword("catch"); this.push("("); this.print(node.param, node); - this.push(") "); + this.push(")"); + this.space(); this.print(node.body, node); } diff --git a/packages/babel-generator/src/node/parentheses.js b/packages/babel-generator/src/node/parentheses.js index c61488baf9..e29411e65c 100644 --- a/packages/babel-generator/src/node/parentheses.js +++ b/packages/babel-generator/src/node/parentheses.js @@ -123,6 +123,22 @@ export function SequenceExpression(node: Object, parent: Object): boolean { return false; } + if (t.isSwitchStatement(parent) && parent.discriminant === node) { + return false; + } + + if (t.isWhileStatement(parent) && parent.test === node) { + return false; + } + + if (t.isIfStatement(parent) && parent.test === node) { + return false; + } + + if (t.isForInStatement(parent) && parent.right === node) { + return false; + } + // Otherwise err on the side of overparenthesization, adding // explicit exceptions above if this proves overzealous. return true; diff --git a/packages/babel-generator/test/fixtures/minified/labeled-statement/actual.js b/packages/babel-generator/test/fixtures/minified/labeled-statement/actual.js new file mode 100644 index 0000000000..26b572e8c8 --- /dev/null +++ b/packages/babel-generator/test/fixtures/minified/labeled-statement/actual.js @@ -0,0 +1,7 @@ +function x() { + return -1; + return --i; + return !2; +} + +throw -1; diff --git a/packages/babel-generator/test/fixtures/minified/labeled-statement/expected.js b/packages/babel-generator/test/fixtures/minified/labeled-statement/expected.js new file mode 100644 index 0000000000..24fe1a26bf --- /dev/null +++ b/packages/babel-generator/test/fixtures/minified/labeled-statement/expected.js @@ -0,0 +1 @@ +function x(){return-1;return--i;return!2}throw-1; diff --git a/packages/babel-generator/test/fixtures/parentheses/sequence-expressions/actual.js b/packages/babel-generator/test/fixtures/parentheses/sequence-expressions/actual.js new file mode 100644 index 0000000000..8e7c42a00a --- /dev/null +++ b/packages/babel-generator/test/fixtures/parentheses/sequence-expressions/actual.js @@ -0,0 +1,13 @@ +function foo() { + return a, b; +} + +if (a, b, c) d(); + +throw a, b, c; + +switch (a, b, c) {} + +for (a in b, c); + +while (a, b, c); diff --git a/packages/babel-generator/test/fixtures/parentheses/sequence-expressions/expected.js b/packages/babel-generator/test/fixtures/parentheses/sequence-expressions/expected.js new file mode 100644 index 0000000000..8e7c42a00a --- /dev/null +++ b/packages/babel-generator/test/fixtures/parentheses/sequence-expressions/expected.js @@ -0,0 +1,13 @@ +function foo() { + return a, b; +} + +if (a, b, c) d(); + +throw a, b, c; + +switch (a, b, c) {} + +for (a in b, c); + +while (a, b, c);