diff --git a/packages/babel-generator/src/generators/expressions.js b/packages/babel-generator/src/generators/expressions.js index b5d9ecb860..2e39f6f070 100644 --- a/packages/babel-generator/src/generators/expressions.js +++ b/packages/babel-generator/src/generators/expressions.js @@ -155,8 +155,10 @@ 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;;)` + // and for `ObjectPattern`: `({ f } = { f: 2 };` let parens = this._inForStatementInit && node.operator === "in" && - !n.needsParens(node, parent); + !n.needsParens(node, parent) || + t.isObjectPattern(node.left); if (parens) { this.push("("); diff --git a/packages/babel-generator/src/node/parentheses.js b/packages/babel-generator/src/node/parentheses.js index e29411e65c..253dca87d5 100644 --- a/packages/babel-generator/src/node/parentheses.js +++ b/packages/babel-generator/src/node/parentheses.js @@ -66,7 +66,7 @@ export function Binary(node: Object, parent: Object): boolean { return true; } - if (t.isBinary(parent)) { + if (t.isBinary(parent) && !t.isAssignmentExpression(parent)) { let parentOp = parent.operator; let parentPos = PRECEDENCE[parentOp]; @@ -212,7 +212,7 @@ export function ConditionalExpression(node: Object, parent: Object): boolean { return true; } - if (t.isBinary(parent)) { + if (t.isBinary(parent) && !t.isAssignmentExpression(parent)) { return true; } diff --git a/packages/babel-types/src/definitions/core.js b/packages/babel-types/src/definitions/core.js index f817dd5da4..89e5572c78 100644 --- a/packages/babel-types/src/definitions/core.js +++ b/packages/babel-types/src/definitions/core.js @@ -42,7 +42,7 @@ defineType("AssignmentExpression", { }, builder: ["operator", "left", "right"], visitor: ["left", "right"], - aliases: ["Expression"] + aliases: ["Binary", "Expression"] }); defineType("BinaryExpression", {