diff --git a/packages/babel/src/generation/generators/expressions.js b/packages/babel/src/generation/generators/expressions.js index ebfb6d0211..6157673492 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,7 +221,16 @@ 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); @@ -241,6 +251,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;);