From 44d5552840d54a254be735c531378d07445daa33 Mon Sep 17 00:00:00 2001 From: Amjad Masad Date: Mon, 23 Nov 2015 21:32:44 -0800 Subject: [PATCH 1/4] Fix up semicolon omission in compact mode --- packages/babel-generator/src/buffer.js | 4 +++- .../babel-generator/src/generators/expressions.js | 1 + packages/babel-generator/src/printer.js | 11 ++++++----- .../test/fixtures/compact/no-semicolon/actual.js | 6 ++++++ .../test/fixtures/compact/no-semicolon/expected.js | 2 +- .../expected.js | 2 +- 6 files changed, 18 insertions(+), 8 deletions(-) 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)} From 86287a7a8c5ad1469fc88dd0df24e23ac76cce59 Mon Sep 17 00:00:00 2001 From: James Kyle Date: Tue, 24 Nov 2015 15:00:04 -0800 Subject: [PATCH 2/4] Add ObjectMember abstract type --- doc/ast/spec.md | 28 +++++++++++--------- packages/babel-types/src/definitions/core.js | 4 +-- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/doc/ast/spec.md b/doc/ast/spec.md index 87b6db5e0b..7e607ca2f3 100644 --- a/doc/ast/spec.md +++ b/doc/ast/spec.md @@ -53,8 +53,9 @@ This document specifies the core ESTree AST node types that support the ES5 gram - [AwaitExpression](#awaitexpression) - [ArrayExpression](#arrayexpression) - [ObjectExpression](#objectexpression) - - [ObjectProperty](#objectproperty) - - [ObjectMethod](#objectmethod) + - [ObjectMember](#objectmember) + - [ObjectProperty](#objectproperty) + - [ObjectMethod](#objectmethod) - [RestProperty](#restproperty) - [SpreadProperty](#spreadproperty) - [FunctionExpression](#functionexpression) @@ -631,29 +632,32 @@ interface ObjectExpression <: Expression { An object expression. -### ObjectProperty +### ObjectMember ```js -interface ObjectProperty <: Node { - type: "ObjectProperty"; +interface ObjectMember <: Node { key: Expression; computed: boolean; value: Expression; - shorthand: boolean; decorators: [ Decorator ]; } ``` -### ObjectMethod +#### ObjectProperty ```js -interface ObjectMethod <: Function { +interface ObjectProperty <: ObjectMember { + type: "ObjectProperty"; + shorthand: boolean; +} +``` + +#### ObjectMethod + +```js +interface ObjectMethod <: ObjectMember, Function { type: "ObjectMethod"; - key: Expression; - computed: boolean; - value: Expression; kind: "get" | "set" | "method"; - decorators: [ Decorator ]; } ``` diff --git a/packages/babel-types/src/definitions/core.js b/packages/babel-types/src/definitions/core.js index 825565b588..49228d692c 100644 --- a/packages/babel-types/src/definitions/core.js +++ b/packages/babel-types/src/definitions/core.js @@ -498,7 +498,7 @@ defineType("ObjectMethod", { } }, visitor: ["key", "params", "body", "decorators", "returnType", "typeParameters"], - aliases: ["UserWhitespacable", "Function", "Scopable", "BlockParent", "FunctionParent", "Method"] + aliases: ["UserWhitespacable", "Function", "Scopable", "BlockParent", "FunctionParent", "Method", "ObjectMember"] }); defineType("ObjectProperty", { @@ -527,7 +527,7 @@ defineType("ObjectProperty", { } }, visitor: ["key", "value", "decorators"], - aliases: ["UserWhitespacable", "Property"] + aliases: ["UserWhitespacable", "Property", "ObjectMember"] }); defineType("RestElement", { From e4c5d9dcb381bc5db5669b9ac8f75dae7a9c5287 Mon Sep 17 00:00:00 2001 From: Amjad Masad Date: Mon, 23 Nov 2015 20:01:43 -0800 Subject: [PATCH 3/4] Respect compact mode in spacing --- .../babel-generator/src/generators/expressions.js | 11 ++++++++--- packages/babel-generator/src/printer.js | 1 + .../test/fixtures/compact/assignment/actual.js | 2 ++ .../test/fixtures/compact/assignment/expected.js | 1 + .../fixtures/compact/binary-expressions/actual.js | 4 ++++ .../fixtures/compact/binary-expressions/expected.js | 1 + .../test/fixtures/compact/while/actual.js | 1 + .../test/fixtures/compact/while/expected.js | 1 + 8 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 packages/babel-generator/test/fixtures/compact/assignment/actual.js create mode 100644 packages/babel-generator/test/fixtures/compact/assignment/expected.js create mode 100644 packages/babel-generator/test/fixtures/compact/binary-expressions/actual.js create mode 100644 packages/babel-generator/test/fixtures/compact/binary-expressions/expected.js create mode 100644 packages/babel-generator/test/fixtures/compact/while/actual.js create mode 100644 packages/babel-generator/test/fixtures/compact/while/expected.js diff --git a/packages/babel-generator/src/generators/expressions.js b/packages/babel-generator/src/generators/expressions.js index 01683fd9e0..f564f2ab7a 100644 --- a/packages/babel-generator/src/generators/expressions.js +++ b/packages/babel-generator/src/generators/expressions.js @@ -141,7 +141,9 @@ export function ExpressionStatement(node: Object) { export function AssignmentPattern(node: Object) { this.print(node.left, node); - this.push(" = "); + this.space(); + this.push("="); + this.space(); this.print(node.right, node); } @@ -158,7 +160,6 @@ export function AssignmentExpression(node: Object, parent: Object) { this.print(node.left, node); let spaces = !this.format.compact || node.operator === "in" || node.operator === "instanceof"; - spaces = true; // todo: https://github.com/babel/babel/issues/1835 if (spaces) this.push(" "); this.push(node.operator); @@ -168,7 +169,11 @@ export function AssignmentExpression(node: Object, parent: Object) { // http://javascript.spec.whatwg.org/#comment-syntax spaces = node.operator === "<" && t.isUnaryExpression(node.right, { prefix: true, operator: "!" }) && - t.isUnaryExpression(node.right.argument, { prefix: true, operator: "--" }); + t.isUnaryExpression(node.right.argument, { prefix: true, operator: "--" }) || + // Need spaces for operators of the same kind to avoid: `a+++b` + t.isUnaryExpression(node.right, { prefix: true, operator: node.operator }) || + t.isUpdateExpression(node.right, { prefix: true, operator: `${node.operator}${node.operator}` }); + } if (spaces) this.push(" "); diff --git a/packages/babel-generator/src/printer.js b/packages/babel-generator/src/printer.js index d964ac6736..33f15d2325 100644 --- a/packages/babel-generator/src/printer.js +++ b/packages/babel-generator/src/printer.js @@ -146,6 +146,7 @@ export default class Printer extends Buffer { printBlock(parent) { let node = parent.body; + if (!t.isEmptyStatement(node)) { this.space(); } diff --git a/packages/babel-generator/test/fixtures/compact/assignment/actual.js b/packages/babel-generator/test/fixtures/compact/assignment/actual.js new file mode 100644 index 0000000000..e42dbc54a5 --- /dev/null +++ b/packages/babel-generator/test/fixtures/compact/assignment/actual.js @@ -0,0 +1,2 @@ +x = 1; +var { y = 1 } = obj; diff --git a/packages/babel-generator/test/fixtures/compact/assignment/expected.js b/packages/babel-generator/test/fixtures/compact/assignment/expected.js new file mode 100644 index 0000000000..8db440a0f9 --- /dev/null +++ b/packages/babel-generator/test/fixtures/compact/assignment/expected.js @@ -0,0 +1 @@ +x=1;var {y=1}=obj; diff --git a/packages/babel-generator/test/fixtures/compact/binary-expressions/actual.js b/packages/babel-generator/test/fixtures/compact/binary-expressions/actual.js new file mode 100644 index 0000000000..bf66e42564 --- /dev/null +++ b/packages/babel-generator/test/fixtures/compact/binary-expressions/actual.js @@ -0,0 +1,4 @@ +1 * 1; +1 && 1; +1 + +1; +x + ++y; diff --git a/packages/babel-generator/test/fixtures/compact/binary-expressions/expected.js b/packages/babel-generator/test/fixtures/compact/binary-expressions/expected.js new file mode 100644 index 0000000000..169312ebfc --- /dev/null +++ b/packages/babel-generator/test/fixtures/compact/binary-expressions/expected.js @@ -0,0 +1 @@ +1*1;1&&1;1+ +1;x+ ++y; diff --git a/packages/babel-generator/test/fixtures/compact/while/actual.js b/packages/babel-generator/test/fixtures/compact/while/actual.js new file mode 100644 index 0000000000..9032d78ce7 --- /dev/null +++ b/packages/babel-generator/test/fixtures/compact/while/actual.js @@ -0,0 +1 @@ +while(true) x(); diff --git a/packages/babel-generator/test/fixtures/compact/while/expected.js b/packages/babel-generator/test/fixtures/compact/while/expected.js new file mode 100644 index 0000000000..fb2b8f3518 --- /dev/null +++ b/packages/babel-generator/test/fixtures/compact/while/expected.js @@ -0,0 +1 @@ +while(true)x(); From e481c5b570341bc1e3c88d5a1df311edf0e2b6b1 Mon Sep 17 00:00:00 2001 From: Amjad Masad Date: Tue, 24 Nov 2015 18:58:21 -0800 Subject: [PATCH 4/4] use + instead of template string --- packages/babel-generator/src/generators/expressions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-generator/src/generators/expressions.js b/packages/babel-generator/src/generators/expressions.js index f564f2ab7a..ffe55eb3f1 100644 --- a/packages/babel-generator/src/generators/expressions.js +++ b/packages/babel-generator/src/generators/expressions.js @@ -172,7 +172,7 @@ export function AssignmentExpression(node: Object, parent: Object) { t.isUnaryExpression(node.right.argument, { prefix: true, operator: "--" }) || // Need spaces for operators of the same kind to avoid: `a+++b` t.isUnaryExpression(node.right, { prefix: true, operator: node.operator }) || - t.isUpdateExpression(node.right, { prefix: true, operator: `${node.operator}${node.operator}` }); + t.isUpdateExpression(node.right, { prefix: true, operator: node.operator + node.operator }); }