diff --git a/packages/babel-generator/src/buffer.js b/packages/babel-generator/src/buffer.js index 08cef73b09..155b105c90 100644 --- a/packages/babel-generator/src/buffer.js +++ b/packages/babel-generator/src/buffer.js @@ -101,7 +101,9 @@ export default class Buffer { rightBrace() { this.newline(true); - //if (this.format.compact) this._removeLast(";"); + if (this.format.compact && !this._lastPrintedIsEmptyStatement) { + this._removeLast(";"); + } this.push("}"); } diff --git a/packages/babel-generator/src/generators/expressions.js b/packages/babel-generator/src/generators/expressions.js index cb27e684f2..01683fd9e0 100644 --- a/packages/babel-generator/src/generators/expressions.js +++ b/packages/babel-generator/src/generators/expressions.js @@ -130,6 +130,7 @@ export let YieldExpression = buildYieldAwait("yield"); export let AwaitExpression = buildYieldAwait("await"); export function EmptyStatement() { + this._lastPrintedIsEmptyStatement = true; this.semicolon(); } diff --git a/packages/babel-generator/src/printer.js b/packages/babel-generator/src/printer.js index 6aa754e1f4..d964ac6736 100644 --- a/packages/babel-generator/src/printer.js +++ b/packages/babel-generator/src/printer.js @@ -13,6 +13,8 @@ export default class Printer extends Buffer { print(node, parent, opts = {}) { if (!node) return; + this._lastPrintedIsEmptyStatement = false; + if (parent && parent._compact) { node._compact = true; } @@ -144,12 +146,11 @@ export default class Printer extends Buffer { printBlock(parent) { let node = parent.body; - if (t.isEmptyStatement(node)) { - this.semicolon(); - } else { - this.push(" "); - this.print(node, parent); + if (!t.isEmptyStatement(node)) { + this.space(); } + + this.print(node, parent); } generateComment(comment) { diff --git a/packages/babel-generator/test/fixtures/compact/no-semicolon/actual.js b/packages/babel-generator/test/fixtures/compact/no-semicolon/actual.js index 85240b60d1..92db248b8b 100644 --- a/packages/babel-generator/test/fixtures/compact/no-semicolon/actual.js +++ b/packages/babel-generator/test/fixtures/compact/no-semicolon/actual.js @@ -1,6 +1,12 @@ function foo() { + var x = 1; + y(); if (bar) { baz(); } return; } + +function bar() { + for(;;); +} diff --git a/packages/babel-generator/test/fixtures/compact/no-semicolon/expected.js b/packages/babel-generator/test/fixtures/compact/no-semicolon/expected.js index 0fdf371f55..3f61e9f1f3 100644 --- a/packages/babel-generator/test/fixtures/compact/no-semicolon/expected.js +++ b/packages/babel-generator/test/fixtures/compact/no-semicolon/expected.js @@ -1 +1 @@ -function foo(){if(bar){baz();}return;} +function foo(){var x=1;y();if(bar){baz()}return}function bar(){for(;;);} diff --git a/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-and-compact-option/expected.js b/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-and-compact-option/expected.js index 042f71356d..e853654162 100644 --- a/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-and-compact-option/expected.js +++ b/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-and-compact-option/expected.js @@ -1,4 +1,4 @@ function foo(l){ return ( -l);} +l)}