From 6caaf680248ad339a9b61c11d48b7b974d7187ee Mon Sep 17 00:00:00 2001 From: Amjad Masad Date: Tue, 27 Oct 2015 16:04:46 -0700 Subject: [PATCH 1/2] Special case paren printing in for-loop init node The printer doesn't have ancestry information so we have to set a flag before printing for's `node.init`. We also need to make sure we're not printing extra parens so we check `node.needsParens` before adding them. --- .../src/generation/generators/expressions.js | 17 ++++++++++++++++- .../src/generation/generators/statements.js | 2 ++ .../generation/edgecase/for-loop-in/actual.js | 1 + .../generation/edgecase/for-loop-in/expected.js | 1 + 4 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 packages/babel/test/fixtures/generation/edgecase/for-loop-in/actual.js create mode 100644 packages/babel/test/fixtures/generation/edgecase/for-loop-in/expected.js diff --git a/packages/babel/src/generation/generators/expressions.js b/packages/babel/src/generation/generators/expressions.js index ebfb6d0211..344f26a905 100644 --- a/packages/babel/src/generation/generators/expressions.js +++ b/packages/babel/src/generation/generators/expressions.js @@ -1,5 +1,6 @@ import isInteger from "is-integer"; import isNumber from "lodash/lang/isNumber"; +import n from "../node" import * as t from "../../types"; /** @@ -220,10 +221,20 @@ export function AssignmentPattern(node, print) { * Prints AssignmentExpression, prints left, operator, and right. */ -export function AssignmentExpression(node, print) { +export function AssignmentExpression(node, print, parent) { + // Somewhere inside a for statement `init` node but doesn't usually + // needs a paren except for `in` expressions: `for (a in b ? a : b;;)` + var parens = this._inForStatementInit && node.operator === "in" && + !n.needsParens(node, parent); + + if (parens) { + this.push("("); + } + // todo: add cases where the spaces can be dropped when in compact mode print.plain(node.left); + var spaces = node.operator === "in" || node.operator === "instanceof"; spaces = true; // todo: https://github.com/babel/babel/issues/1835 this.space(spaces); @@ -241,6 +252,10 @@ export function AssignmentExpression(node, print) { this.space(spaces); print.plain(node.right); + + if (parens) { + this.push(")"); + } } /** diff --git a/packages/babel/src/generation/generators/statements.js b/packages/babel/src/generation/generators/statements.js index d6c1e4f0ed..cb3818d198 100644 --- a/packages/babel/src/generation/generators/statements.js +++ b/packages/babel/src/generation/generators/statements.js @@ -41,7 +41,9 @@ export function ForStatement(node, print) { this.keyword("for"); this.push("("); + this._inForStatementInit = true; print.plain(node.init); + this._inForStatementInit = false; this.push(";"); if (node.test) { diff --git a/packages/babel/test/fixtures/generation/edgecase/for-loop-in/actual.js b/packages/babel/test/fixtures/generation/edgecase/for-loop-in/actual.js new file mode 100644 index 0000000000..da5079a95f --- /dev/null +++ b/packages/babel/test/fixtures/generation/edgecase/for-loop-in/actual.js @@ -0,0 +1 @@ +for ((a in b) ? a : b; i;); diff --git a/packages/babel/test/fixtures/generation/edgecase/for-loop-in/expected.js b/packages/babel/test/fixtures/generation/edgecase/for-loop-in/expected.js new file mode 100644 index 0000000000..da5079a95f --- /dev/null +++ b/packages/babel/test/fixtures/generation/edgecase/for-loop-in/expected.js @@ -0,0 +1 @@ +for ((a in b) ? a : b; i;); From 50289bd2b013d3f05be1d577f8eb15f7e3e56862 Mon Sep 17 00:00:00 2001 From: Amjad Masad Date: Tue, 27 Oct 2015 16:11:37 -0700 Subject: [PATCH 2/2] whitespace --- packages/babel/src/generation/generators/expressions.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/babel/src/generation/generators/expressions.js b/packages/babel/src/generation/generators/expressions.js index 344f26a905..6157673492 100644 --- a/packages/babel/src/generation/generators/expressions.js +++ b/packages/babel/src/generation/generators/expressions.js @@ -234,7 +234,6 @@ export function AssignmentExpression(node, print, parent) { // todo: add cases where the spaces can be dropped when in compact mode print.plain(node.left); - var spaces = node.operator === "in" || node.operator === "instanceof"; spaces = true; // todo: https://github.com/babel/babel/issues/1835 this.space(spaces);