From a286a86b6dd40d8da14f1b51271d0c946ef4157a Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Mon, 13 Jul 2015 20:45:49 +0100 Subject: [PATCH] Revert "remove do expressions" This reverts commit 420492388b06ff295a638adbea0f34c726056607. --- CHANGELOG.md | 4 --- src/acorn/src/expression.js | 14 ++++++++++ .../transformers/es7/do-expressions.js | 26 +++++++++++++++++++ .../transformation/transformers/index.js | 1 + src/babel/types/alias-keys.json | 1 + src/babel/types/visitor-keys.json | 1 + .../es7.do-expressions/do-while.js | 5 ++++ .../es7.do-expressions/empty.js | 1 + .../es7.do-expressions/for-in.js | 6 +++++ .../transformation/es7.do-expressions/for.js | 5 ++++ .../es7.do-expressions/if-else-if.js | 7 +++++ .../es7.do-expressions/if-else.js | 7 +++++ .../transformation/es7.do-expressions/if.js | 5 ++++ .../es7.do-expressions/options.json | 3 +++ .../es7.do-expressions/single-expression.js | 3 +++ .../variable-declaration-end.js | 3 +++ .../variable-declaration-start.js | 4 +++ .../es7.do-expressions/while.js | 5 ++++ 18 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 src/babel/transformation/transformers/es7/do-expressions.js create mode 100644 test/core/fixtures/transformation/es7.do-expressions/do-while.js create mode 100644 test/core/fixtures/transformation/es7.do-expressions/empty.js create mode 100644 test/core/fixtures/transformation/es7.do-expressions/for-in.js create mode 100644 test/core/fixtures/transformation/es7.do-expressions/for.js create mode 100644 test/core/fixtures/transformation/es7.do-expressions/if-else-if.js create mode 100644 test/core/fixtures/transformation/es7.do-expressions/if-else.js create mode 100644 test/core/fixtures/transformation/es7.do-expressions/if.js create mode 100644 test/core/fixtures/transformation/es7.do-expressions/options.json create mode 100644 test/core/fixtures/transformation/es7.do-expressions/single-expression.js create mode 100644 test/core/fixtures/transformation/es7.do-expressions/variable-declaration-end.js create mode 100644 test/core/fixtures/transformation/es7.do-expressions/variable-declaration-start.js create mode 100644 test/core/fixtures/transformation/es7.do-expressions/while.js diff --git a/CHANGELOG.md b/CHANGELOG.md index e8eed872d0..e999f7c1ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,10 +13,6 @@ _Note: Gaps between patch versions are faulty, broken or test releases._ See [CHANGELOG - 6to5](CHANGELOG-6to5.md) for the pre-4.0.0 version changelog. -## 5.6.19 - - * Removed do expressions. - ## 5.6.17 * **Bug Fix** diff --git a/src/acorn/src/expression.js b/src/acorn/src/expression.js index 1c45840f95..ba94cd5249 100755 --- a/src/acorn/src/expression.js +++ b/src/acorn/src/expression.js @@ -281,6 +281,20 @@ pp.parseExprAtom = function(refShorthandDefaultPos) { case tt._yield: if (this.inGenerator) this.unexpected() + case tt._do: + if (this.options.features["es7.doExpressions"]) { + let node = this.startNode() + this.next() + var oldInFunction = this.inFunction + var oldLabels = this.labels + this.labels = [] + this.inFunction = false + node.body = this.parseBlock() + this.inFunction = oldInFunction + this.labels = oldLabels + return this.finishNode(node, "DoExpression") + } + case tt.name: let start = this.markPosition() node = this.startNode() diff --git a/src/babel/transformation/transformers/es7/do-expressions.js b/src/babel/transformation/transformers/es7/do-expressions.js new file mode 100644 index 0000000000..823389ae0e --- /dev/null +++ b/src/babel/transformation/transformers/es7/do-expressions.js @@ -0,0 +1,26 @@ +import * as t from "../../../types"; + +export var metadata = { + optional: true, + stage: 0 +}; + +/** + * [Please add a description.] + */ + +export var visitor = { + + /** + * [Please add a description.] + */ + + DoExpression(node) { + var body = node.body.body; + if (body.length) { + return body; + } else { + return t.identifier("undefined"); + } + } +}; diff --git a/src/babel/transformation/transformers/index.js b/src/babel/transformation/transformers/index.js index 6b0bd0d2d0..9dacb52d1e 100644 --- a/src/babel/transformation/transformers/index.js +++ b/src/babel/transformation/transformers/index.js @@ -48,6 +48,7 @@ export default { "es6.constants": require("./es6/constants"), "es7.exportExtensions": require("./es7/export-extensions"), "spec.protoToAssign": require("babel-plugin-proto-to-assign"), + "es7.doExpressions": require("./es7/do-expressions"), "es6.spec.symbols": require("./es6/spec.symbols"), "es7.functionBind": require("./es7/function-bind"), "spec.undefinedToVoid": require("babel-plugin-undefined-to-void"), diff --git a/src/babel/types/alias-keys.json b/src/babel/types/alias-keys.json index 242d2cf1c1..7c1d27be6d 100644 --- a/src/babel/types/alias-keys.json +++ b/src/babel/types/alias-keys.json @@ -64,6 +64,7 @@ "CallExpression": ["Expression"], "ComprehensionExpression": ["Expression", "Scopable"], "ConditionalExpression": ["Expression"], + "DoExpression": ["Expression"], "Identifier": ["Expression"], "Literal": ["Expression", "Pure"], "MemberExpression": ["Expression"], diff --git a/src/babel/types/visitor-keys.json b/src/babel/types/visitor-keys.json index 596367ee3a..8d99ae7918 100644 --- a/src/babel/types/visitor-keys.json +++ b/src/babel/types/visitor-keys.json @@ -21,6 +21,7 @@ "Decorator": ["expression"], "DebuggerStatement": [], "DoWhileStatement": ["body", "test"], + "DoExpression": ["body"], "EmptyStatement": [], "ExpressionStatement": ["expression"], "File": ["program"], diff --git a/test/core/fixtures/transformation/es7.do-expressions/do-while.js b/test/core/fixtures/transformation/es7.do-expressions/do-while.js new file mode 100644 index 0000000000..e53fac45bb --- /dev/null +++ b/test/core/fixtures/transformation/es7.do-expressions/do-while.js @@ -0,0 +1,5 @@ +assert.equal(do { + var i = 5; + do { i--; } while(i > 3); + i; +}, 3); diff --git a/test/core/fixtures/transformation/es7.do-expressions/empty.js b/test/core/fixtures/transformation/es7.do-expressions/empty.js new file mode 100644 index 0000000000..906776c43b --- /dev/null +++ b/test/core/fixtures/transformation/es7.do-expressions/empty.js @@ -0,0 +1 @@ +assert.equal(do {}, undefined); diff --git a/test/core/fixtures/transformation/es7.do-expressions/for-in.js b/test/core/fixtures/transformation/es7.do-expressions/for-in.js new file mode 100644 index 0000000000..9945600d55 --- /dev/null +++ b/test/core/fixtures/transformation/es7.do-expressions/for-in.js @@ -0,0 +1,6 @@ +assert.equal(do { + var obj = { foo: "bar", bar: "foo" }; + for (var key in obj) { + obj[key]; + } +}, "foo"); diff --git a/test/core/fixtures/transformation/es7.do-expressions/for.js b/test/core/fixtures/transformation/es7.do-expressions/for.js new file mode 100644 index 0000000000..2dd68d55fe --- /dev/null +++ b/test/core/fixtures/transformation/es7.do-expressions/for.js @@ -0,0 +1,5 @@ +assert.equal(do { + for (var i = 0; i < 5; i++) { + i; + } +}, 4); diff --git a/test/core/fixtures/transformation/es7.do-expressions/if-else-if.js b/test/core/fixtures/transformation/es7.do-expressions/if-else-if.js new file mode 100644 index 0000000000..ce324555ac --- /dev/null +++ b/test/core/fixtures/transformation/es7.do-expressions/if-else-if.js @@ -0,0 +1,7 @@ +assert.equal(do { + if (false) { + "foo"; + } else if (true) { + "bar"; + } +}, "bar"); diff --git a/test/core/fixtures/transformation/es7.do-expressions/if-else.js b/test/core/fixtures/transformation/es7.do-expressions/if-else.js new file mode 100644 index 0000000000..7f29ff878a --- /dev/null +++ b/test/core/fixtures/transformation/es7.do-expressions/if-else.js @@ -0,0 +1,7 @@ +assert.equal(do { + if (false) { + "foo"; + } else { + "bar"; + } +}, "bar"); diff --git a/test/core/fixtures/transformation/es7.do-expressions/if.js b/test/core/fixtures/transformation/es7.do-expressions/if.js new file mode 100644 index 0000000000..1db4e45884 --- /dev/null +++ b/test/core/fixtures/transformation/es7.do-expressions/if.js @@ -0,0 +1,5 @@ +assert.equal(do { + if (true) { + "bar"; + } +}, "bar"); diff --git a/test/core/fixtures/transformation/es7.do-expressions/options.json b/test/core/fixtures/transformation/es7.do-expressions/options.json new file mode 100644 index 0000000000..560a4cc08d --- /dev/null +++ b/test/core/fixtures/transformation/es7.do-expressions/options.json @@ -0,0 +1,3 @@ +{ + "optional": ["es7.doExpressions"] +} diff --git a/test/core/fixtures/transformation/es7.do-expressions/single-expression.js b/test/core/fixtures/transformation/es7.do-expressions/single-expression.js new file mode 100644 index 0000000000..c528da6f0f --- /dev/null +++ b/test/core/fixtures/transformation/es7.do-expressions/single-expression.js @@ -0,0 +1,3 @@ +assert.equal(do { + "foo"; +}, "foo"); diff --git a/test/core/fixtures/transformation/es7.do-expressions/variable-declaration-end.js b/test/core/fixtures/transformation/es7.do-expressions/variable-declaration-end.js new file mode 100644 index 0000000000..8001c7af88 --- /dev/null +++ b/test/core/fixtures/transformation/es7.do-expressions/variable-declaration-end.js @@ -0,0 +1,3 @@ +assert.equal(do { + var bar = "foo"; +}, undefined); diff --git a/test/core/fixtures/transformation/es7.do-expressions/variable-declaration-start.js b/test/core/fixtures/transformation/es7.do-expressions/variable-declaration-start.js new file mode 100644 index 0000000000..2dad90a410 --- /dev/null +++ b/test/core/fixtures/transformation/es7.do-expressions/variable-declaration-start.js @@ -0,0 +1,4 @@ +assert.equal(do { + var bar = "foo"; + bar; +}, "foo"); diff --git a/test/core/fixtures/transformation/es7.do-expressions/while.js b/test/core/fixtures/transformation/es7.do-expressions/while.js new file mode 100644 index 0000000000..f902109ca4 --- /dev/null +++ b/test/core/fixtures/transformation/es7.do-expressions/while.js @@ -0,0 +1,5 @@ +assert.equal(do { + var i = 5; + while (i > 3) i--; + i; +}, 3);