From 33b4ef5d52151b1e9d18483c8951758ae56fc1d4 Mon Sep 17 00:00:00 2001 From: Zachary Miller Date: Fri, 5 Feb 2016 11:22:46 -0600 Subject: [PATCH] Parenthize "in" in for-loop init, even when init has nested for-loop --- packages/babel-generator/src/generators/expressions.js | 2 +- packages/babel-generator/src/generators/statements.js | 4 ++-- packages/babel-generator/src/index.js | 1 + .../test/fixtures/edgecase/for-loop-in/actual.js | 1 + .../test/fixtures/edgecase/for-loop-in/expected.js | 3 +++ 5 files changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/babel-generator/src/generators/expressions.js b/packages/babel-generator/src/generators/expressions.js index f82d409f94..08fd212518 100644 --- a/packages/babel-generator/src/generators/expressions.js +++ b/packages/babel-generator/src/generators/expressions.js @@ -156,7 +156,7 @@ export function AssignmentPattern(node: Object) { export function AssignmentExpression(node: Object, parent: Object) { // Somewhere inside a for statement `init` node but doesn't usually // needs a paren except for `in` expressions: `for (a in b ? a : b;;)` - let parens = this._inForStatementInit && node.operator === "in" && + let parens = this._inForStatementInitCounter && node.operator === "in" && !n.needsParens(node, parent); if (parens) { diff --git a/packages/babel-generator/src/generators/statements.js b/packages/babel-generator/src/generators/statements.js index 7e8a117616..dea6898f71 100644 --- a/packages/babel-generator/src/generators/statements.js +++ b/packages/babel-generator/src/generators/statements.js @@ -52,9 +52,9 @@ export function ForStatement(node: Object) { this.keyword("for"); this.push("("); - this._inForStatementInit = true; + this._inForStatementInitCounter++; this.print(node.init, node); - this._inForStatementInit = false; + this._inForStatementInitCounter--; this.push(";"); if (node.test) { diff --git a/packages/babel-generator/src/index.js b/packages/babel-generator/src/index.js index b5b7305f25..f65d065520 100644 --- a/packages/babel-generator/src/index.js +++ b/packages/babel-generator/src/index.js @@ -28,6 +28,7 @@ export class CodeGenerator extends Printer { this.format = format; this.opts = opts; this.ast = ast; + this._inForStatementInitCounter = 0; this.whitespace = new Whitespace(tokens); this.map = new SourceMap(position, opts, code); diff --git a/packages/babel-generator/test/fixtures/edgecase/for-loop-in/actual.js b/packages/babel-generator/test/fixtures/edgecase/for-loop-in/actual.js index da5079a95f..9c279089c2 100644 --- a/packages/babel-generator/test/fixtures/edgecase/for-loop-in/actual.js +++ b/packages/babel-generator/test/fixtures/edgecase/for-loop-in/actual.js @@ -1 +1,2 @@ for ((a in b) ? a : b; i;); +for (function(){for(;;);} && (a in b);;); diff --git a/packages/babel-generator/test/fixtures/edgecase/for-loop-in/expected.js b/packages/babel-generator/test/fixtures/edgecase/for-loop-in/expected.js index da5079a95f..2a24aad352 100644 --- a/packages/babel-generator/test/fixtures/edgecase/for-loop-in/expected.js +++ b/packages/babel-generator/test/fixtures/edgecase/for-loop-in/expected.js @@ -1 +1,4 @@ for ((a in b) ? a : b; i;); +for (function () { + for (;;); +} && (a in b);;);