diff --git a/packages/babel-generator/src/generators/methods.js b/packages/babel-generator/src/generators/methods.js index cb5cf36e29..b7385f3844 100644 --- a/packages/babel-generator/src/generators/methods.js +++ b/packages/babel-generator/src/generators/methods.js @@ -77,15 +77,5 @@ export function ArrowFunctionExpression(node: Object) { this.push(" => "); - const bodyNeedsParens = t.isObjectExpression(node.body); - - if (bodyNeedsParens) { - this.push("("); - } - this.print(node.body, node); - - if (bodyNeedsParens) { - this.push(")"); - } } diff --git a/packages/babel-generator/src/node/parentheses.js b/packages/babel-generator/src/node/parentheses.js index 4755902855..d5d098c66f 100644 --- a/packages/babel-generator/src/node/parentheses.js +++ b/packages/babel-generator/src/node/parentheses.js @@ -50,7 +50,7 @@ export function ObjectExpression(node: Object, parent: Object, printStack: Array return true; } - return isFirstInStatement(printStack); + return isFirstInStatement(printStack, true); } export function Binary(node: Object, parent: Object): boolean { @@ -233,7 +233,7 @@ export function AssignmentExpression(node: Object): boolean { // Walk up the print stack to deterimine if our node can come first // in statement. -function isFirstInStatement(printStack: Array): boolean { +function isFirstInStatement(printStack: Array, considerArrow: bool = false): boolean { let i = printStack.length - 1; let node = printStack[i]; i--; @@ -243,6 +243,10 @@ function isFirstInStatement(printStack: Array): boolean { return true; } + if (considerArrow && t.isArrowFunctionExpression(parent, { body: node })) { + return true; + } + if ((t.isCallExpression(parent, { callee: node })) || (t.isSequenceExpression(parent) && parent.expressions[0] === node) || (t.isMemberExpression(parent, { object: node })) || diff --git a/packages/babel-generator/test/fixtures/parentheses/arrow-function-object-body/actual.js b/packages/babel-generator/test/fixtures/parentheses/arrow-function-object-body/actual.js index d9187763fe..762286ee90 100644 --- a/packages/babel-generator/test/fixtures/parentheses/arrow-function-object-body/actual.js +++ b/packages/babel-generator/test/fixtures/parentheses/arrow-function-object-body/actual.js @@ -2,3 +2,4 @@ var foo = arr.map(v => ({ x: v.bar, y: v.bar*2 })); +var fn = () => ({}).key; diff --git a/packages/babel-generator/test/fixtures/parentheses/arrow-function-object-body/expected.js b/packages/babel-generator/test/fixtures/parentheses/arrow-function-object-body/expected.js index 18f4fa7da5..01dc51bdf1 100644 --- a/packages/babel-generator/test/fixtures/parentheses/arrow-function-object-body/expected.js +++ b/packages/babel-generator/test/fixtures/parentheses/arrow-function-object-body/expected.js @@ -2,3 +2,4 @@ var foo = arr.map(v => ({ x: v.bar, y: v.bar * 2 })); +var fn = () => ({}).key;