diff --git a/packages/babel-generator/src/node/parentheses.js b/packages/babel-generator/src/node/parentheses.js index 29b0d1448d..d4c8e335c2 100644 --- a/packages/babel-generator/src/node/parentheses.js +++ b/packages/babel-generator/src/node/parentheses.js @@ -43,12 +43,7 @@ export function UpdateExpression(node: Object, parent: Object): boolean { } export function ObjectExpression(node: Object, parent: Object, printStack: Array): boolean { - if (t.isExpressionStatement(parent)) { - // ({ foo: "bar" }); - return true; - } - - return isFirstInStatement(printStack, true); + return isFirstInStatement(printStack, {considerArrow: true}); } export function Binary(node: Object, parent: Object): boolean { @@ -152,18 +147,8 @@ export function YieldExpression(node: Object, parent: Object): boolean { export { YieldExpression as AwaitExpression }; -export function ClassExpression(node: Object, parent: Object): boolean { - // (class {}); - if (t.isExpressionStatement(parent)) { - return true; - } - - // export default (class () {}); - if (t.isExportDeclaration(parent)) { - return true; - } - - return false; +export function ClassExpression(node: Object, parent: Object, printStack: Array): boolean { + return isFirstInStatement(printStack, {considerDefaultExports: true}); } export function UnaryLike(node: Object, parent: Object): boolean { @@ -179,17 +164,7 @@ export function UnaryLike(node: Object, parent: Object): boolean { } export function FunctionExpression(node: Object, parent: Object, printStack: Array): boolean { - // (function () {}); - if (t.isExpressionStatement(parent)) { - return true; - } - - // export default (function () {}); - if (t.isExportDeclaration(parent)) { - return true; - } - - return isFirstInStatement(printStack); + return isFirstInStatement(printStack, {considerDefaultExports: true}); } export function ArrowFunctionExpression(node: Object, parent: Object): boolean { @@ -235,7 +210,10 @@ 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, considerArrow: bool = false): boolean { +function isFirstInStatement(printStack: Array, { + considerArrow = false, + considerDefaultExports = false + } = {}): boolean { let i = printStack.length - 1; let node = printStack[i]; i--; @@ -245,6 +223,10 @@ function isFirstInStatement(printStack: Array, considerArrow: bool = fal return true; } + if (considerDefaultExports && t.isExportDefaultDeclaration(parent, { declaration: node })) { + return true; + } + if (considerArrow && t.isArrowFunctionExpression(parent, { body: node })) { return true; } diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/exports/actual.js b/packages/babel-generator/test/fixtures/harmony-edgecase/exports/actual.js index d76fe5a8ad..d0a7acc81f 100644 --- a/packages/babel-generator/test/fixtures/harmony-edgecase/exports/actual.js +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/exports/actual.js @@ -5,5 +5,16 @@ export { a as b, c as d } export { } export default i = 20 export function test() { } +export class test2 { } export var i = 20 export let i = 42 + +export default (function(){})(); +export default (class {})(); +export default {}; + +export default function test3(){} +export default class test4 {} + +export default function(){} +export default class {} diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/exports/expected.js b/packages/babel-generator/test/fixtures/harmony-edgecase/exports/expected.js index 269678f691..90f50494b8 100644 --- a/packages/babel-generator/test/fixtures/harmony-edgecase/exports/expected.js +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/exports/expected.js @@ -5,5 +5,16 @@ export { a as b, c as d }; export {}; export default i = 20; export function test() {} +export class test2 {} export var i = 20; export let i = 42; + +export default (function () {})(); +export default (class {})(); +export default {}; + +export default function test3() {} +export default class test4 {} + +export default function () {} +export default class {}