From 3c808fcef27df46a95aa8fe0fbbfe57391d0269e Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Wed, 26 Nov 2014 17:23:33 +1100 Subject: [PATCH] merge pretzel maps and method binding --- CHANGELOG.md | 4 +++ doc/playground.md | 14 ++------- lib/6to5/generation/generators/playground.js | 2 +- lib/6to5/patch.js | 2 +- lib/6to5/transformation/transform.js | 1 - .../transformers/playground-method-binding.js | 28 ++++++++++++++++++ .../transformers/playground-pretzel-map.js | 29 ------------------- lib/6to5/types/visitor-keys.json | 2 +- package.json | 2 +- .../playground/method-binding/actual.js | 8 +++++ .../playground/method-binding/exec.js | 8 +++++ .../playground/method-binding/expected.js | 16 +++++++++- .../playground/pretzel-map/actual.js | 7 ----- .../playground/pretzel-map/exec.js | 7 ----- .../playground/pretzel-map/expected.js | 16 ---------- 15 files changed, 70 insertions(+), 76 deletions(-) delete mode 100644 lib/6to5/transformation/transformers/playground-pretzel-map.js delete mode 100644 test/fixtures/transformation/playground/pretzel-map/actual.js delete mode 100644 test/fixtures/transformation/playground/pretzel-map/exec.js delete mode 100644 test/fixtures/transformation/playground/pretzel-map/expected.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c0467ca06..2d5bd889b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 1.14.4 + + * Merge pretzel maps and method binding. + # 1.14.3 * Add playground pretzel maps. diff --git a/doc/playground.md b/doc/playground.md index 79a3c23540..e07a27f32c 100644 --- a/doc/playground.md +++ b/doc/playground.md @@ -53,18 +53,7 @@ if (!Object.prototype.hasOwnProperty.call(obj, "x")) obj.x = 2; ```javascript var fn = obj:method; var fn = obj:method("foob"); -``` -equivalent to: - -```javascript -var fn = obj.method.bind(obj); -var fn = obj.method.bind(obj, "foob"); -``` - -### Pretzel map - -```javascript ["foo", "bar"].map(:toUpperCase); // ["FOO", "BAR"] [1.1234, 23.53245, 3].map(:toFixed(2)); // ["1.12", "23.53", "3.00"] ``` @@ -72,6 +61,9 @@ var fn = obj.method.bind(obj, "foob"); equivalent to: ```javascript +var fn = obj.method.bind(obj); +var fn = obj.method.bind(obj, "foob"); + ["foo", "bar"].map(function (val) { return val.toUpperCase(); }); [1.1234, 23.53245, 3].map(function (val) { return val.toFixed(2); }); ``` diff --git a/lib/6to5/generation/generators/playground.js b/lib/6to5/generation/generators/playground.js index cbc57fbc0e..b97e2d6184 100644 --- a/lib/6to5/generation/generators/playground.js +++ b/lib/6to5/generation/generators/playground.js @@ -1,6 +1,6 @@ var _ = require("lodash"); -_.each(["BindMemberExpression", "PretzelMapExpression"], function (type) { +_.each(["BindMemberExpression", "BindFunctionExpression"], function (type) { exports[type] = function () { throw new ReferenceError("Trying to render non-standard playground node " + JSON.stringify(type)); }; diff --git a/lib/6to5/patch.js b/lib/6to5/patch.js index d7251fca26..b50b96718a 100644 --- a/lib/6to5/patch.js +++ b/lib/6to5/patch.js @@ -38,7 +38,7 @@ def("BindMemberExpression") .field("property", or(def("Identifier"), def("Expression"))) .field("arguments", [def("Expression")]); -def("PretzelMapExpression") +def("BindFunctionExpression") .bases("Expression") .build("callee", "arguments") .field("callee", def("Expression")) diff --git a/lib/6to5/transformation/transform.js b/lib/6to5/transformation/transform.js index ad73d6f8af..baf69321e1 100644 --- a/lib/6to5/transformation/transform.js +++ b/lib/6to5/transformation/transform.js @@ -59,7 +59,6 @@ _.each({ // plyground methodBinding: require("./transformers/playground-method-binding"), memoizationOperator: require("./transformers/playground-memoization-operator"), - pretzelMap: require("./transformers/playground-pretzel-map"), _blockHoist: require("./transformers/_block-hoist"), _declarations: require("./transformers/_declarations"), diff --git a/lib/6to5/transformation/transformers/playground-method-binding.js b/lib/6to5/transformation/transformers/playground-method-binding.js index 2faad64af9..bbe1e52eae 100644 --- a/lib/6to5/transformation/transformers/playground-method-binding.js +++ b/lib/6to5/transformation/transformers/playground-method-binding.js @@ -1,4 +1,5 @@ var t = require("../../types"); +var _ = require("lodash"); exports.BindMemberExpression = function (node, parent, file, scope) { var object = node.object; @@ -28,3 +29,30 @@ exports.BindMemberExpression = function (node, parent, file, scope) { return call; } }; + +exports.BindFunctionExpression = function (node, parent, file, scope) { + var buildCall = function (args) { + var param = file.generateUidIdentifier("val", scope); + return t.functionExpression(null, [param], t.blockStatement([ + t.returnStatement(t.callExpression(t.memberExpression(param, node.callee), args)) + ])); + }; + + if (_.find(node.arguments, t.isDynamic)) { + var argsIdName = file.generateUid("args", scope); + var argsId = t.identifier(argsIdName); + scope.push({ + key: argsIdName, + id: argsId + }); + + return t.sequenceExpression([ + t.assignmentExpression("=", argsId, t.arrayExpression(node.arguments)), + buildCall(node.arguments.map(function (node, i) { + return t.memberExpression(argsId, t.literal(i), true); + })) + ]); + } else { + return buildCall(node.arguments); + } +}; diff --git a/lib/6to5/transformation/transformers/playground-pretzel-map.js b/lib/6to5/transformation/transformers/playground-pretzel-map.js deleted file mode 100644 index ad224793ea..0000000000 --- a/lib/6to5/transformation/transformers/playground-pretzel-map.js +++ /dev/null @@ -1,29 +0,0 @@ -var t = require("../../types"); -var _ = require("lodash"); - -exports.PretzelMapExpression = function (node, parent, file, scope) { - var buildCall = function (args) { - var param = file.generateUidIdentifier("val", scope); - return t.functionExpression(null, [param], t.blockStatement([ - t.returnStatement(t.callExpression(t.memberExpression(param, node.callee), args)) - ])); - }; - - if (_.find(node.arguments, t.isDynamic)) { - var argsIdName = file.generateUid("args", scope); - var argsId = t.identifier(argsIdName); - scope.push({ - key: argsIdName, - id: argsId - }); - - return t.sequenceExpression([ - t.assignmentExpression("=", argsId, t.arrayExpression(node.arguments)), - buildCall(node.arguments.map(function (node, i) { - return t.memberExpression(argsId, t.literal(i), true); - })) - ]); - } else { - return buildCall(node.arguments); - } -}; diff --git a/lib/6to5/types/visitor-keys.json b/lib/6to5/types/visitor-keys.json index e9f57e15ca..fc78a716e5 100644 --- a/lib/6to5/types/visitor-keys.json +++ b/lib/6to5/types/visitor-keys.json @@ -44,7 +44,7 @@ "ObjectExpression": ["properties"], "ObjectPattern": ["properties"], "ParenthesizedExpression": ["expression"], - "PretzelMapExpression": ["callee", "arguments"], + "BindFunctionExpression": ["callee", "arguments"], "Program": ["body"], "Property": ["key", "value"], "ReturnStatement": ["argument"], diff --git a/package.json b/package.json index 3830710e45..f7b91c1fed 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "chokidar": "0.11.1", "source-map-support": "0.2.8", "esutils": "1.1.6", - "acorn-6to5": "0.9.1-9", + "acorn-6to5": "0.9.1-10", "estraverse": "1.8.0", "private": "0.1.6" }, diff --git a/test/fixtures/transformation/playground/method-binding/actual.js b/test/fixtures/transformation/playground/method-binding/actual.js index c3f896ba9a..1457513da0 100644 --- a/test/fixtures/transformation/playground/method-binding/actual.js +++ b/test/fixtures/transformation/playground/method-binding/actual.js @@ -3,3 +3,11 @@ var fn = obj:method("foob"); var fn = obj[foo]:method; var fn = obj.foo:method; var fn = obj[foo()]:method; + +["foo", "bar"].map(:toUpperCase); +[1.1234, 23.53245, 3].map(:toFixed(2)); + +var get = function () { + return 2; +}; +[1.1234, 23.53245, 3].map(:toFixed(get())); diff --git a/test/fixtures/transformation/playground/method-binding/exec.js b/test/fixtures/transformation/playground/method-binding/exec.js index 3446ce1a25..77a2949ab4 100644 --- a/test/fixtures/transformation/playground/method-binding/exec.js +++ b/test/fixtures/transformation/playground/method-binding/exec.js @@ -20,3 +20,11 @@ assert.equal(bar(), "foo bar"); var zoo = obj:getZoo("foo"); assert.equal(zoo("bar"), "foo bar foo bar"); + +assert.deepEqual(["foo", "bar"].map(:toUpperCase), ["FOO", "BAR"]); +assert.deepEqual([1.1234, 23.53245, 3].map(:toFixed(2)), ["1.12", "23.53", "3.00"]); + +var get = function () { + return 2; +} +assert.deepEqual([1.1234, 23.53245, 3].map(:toFixed(get())), ["1.12", "23.53", "3.00"]); diff --git a/test/fixtures/transformation/playground/method-binding/expected.js b/test/fixtures/transformation/playground/method-binding/expected.js index eed4dfd16e..9e811ba21e 100644 --- a/test/fixtures/transformation/playground/method-binding/expected.js +++ b/test/fixtures/transformation/playground/method-binding/expected.js @@ -1,8 +1,22 @@ "use strict"; -var _temp; +var _temp, _args; var fn = obj.method.bind(obj); var fn = obj.method.bind(obj, "foob"); var fn = obj[foo].method.bind(obj[foo]); var fn = obj.foo.method.bind(obj.foo); var fn = (_temp = obj[foo()], _temp.method.bind(_temp)); + +["foo", "bar"].map(function (_val) { + return _val.toUpperCase(); +}); +[1.1234, 23.53245, 3].map(function (_val2) { + return _val2.toFixed(2); +}); + +var get = function () { + return 2; +}; +[1.1234, 23.53245, 3].map((_args = [get()], function (_val3) { + return _val3.toFixed(_args[0]); +})); diff --git a/test/fixtures/transformation/playground/pretzel-map/actual.js b/test/fixtures/transformation/playground/pretzel-map/actual.js deleted file mode 100644 index 8fc19dd7da..0000000000 --- a/test/fixtures/transformation/playground/pretzel-map/actual.js +++ /dev/null @@ -1,7 +0,0 @@ -["foo", "bar"].map(:toUpperCase); -[1.1234, 23.53245, 3].map(:toFixed(2)); - -var get = function () { - return 2; -}; -[1.1234, 23.53245, 3].map(:toFixed(get())); diff --git a/test/fixtures/transformation/playground/pretzel-map/exec.js b/test/fixtures/transformation/playground/pretzel-map/exec.js deleted file mode 100644 index e9d7e3b836..0000000000 --- a/test/fixtures/transformation/playground/pretzel-map/exec.js +++ /dev/null @@ -1,7 +0,0 @@ -assert.deepEqual(["foo", "bar"].map(:toUpperCase), ["FOO", "BAR"]); -assert.deepEqual([1.1234, 23.53245, 3].map(:toFixed(2)), ["1.12", "23.53", "3.00"]); - -var get = function () { - return 2; -} -assert.deepEqual([1.1234, 23.53245, 3].map(:toFixed(get())), ["1.12", "23.53", "3.00"]); diff --git a/test/fixtures/transformation/playground/pretzel-map/expected.js b/test/fixtures/transformation/playground/pretzel-map/expected.js deleted file mode 100644 index 9126e9810f..0000000000 --- a/test/fixtures/transformation/playground/pretzel-map/expected.js +++ /dev/null @@ -1,16 +0,0 @@ -"use strict"; - -var _args; -["foo", "bar"].map(function (_val) { - return _val.toUpperCase(); -}); -[1.1234, 23.53245, 3].map(function (_val2) { - return _val2.toFixed(2); -}); - -var get = function () { - return 2; -}; -[1.1234, 23.53245, 3].map((_args = [get()], function (_val3) { - return _val3.toFixed(_args[0]); -}));