merge pretzel maps and method binding

This commit is contained in:
Sebastian McKenzie
2014-11-26 17:23:33 +11:00
parent a29505f75d
commit 3c808fcef2
15 changed files with 70 additions and 76 deletions

View File

@@ -1,3 +1,7 @@
# 1.14.4
* Merge pretzel maps and method binding.
# 1.14.3
* Add playground pretzel maps.

View File

@@ -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); });
```

View File

@@ -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));
};

View File

@@ -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"))

View File

@@ -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"),

View File

@@ -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);
}
};

View File

@@ -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);
}
};

View File

@@ -44,7 +44,7 @@
"ObjectExpression": ["properties"],
"ObjectPattern": ["properties"],
"ParenthesizedExpression": ["expression"],
"PretzelMapExpression": ["callee", "arguments"],
"BindFunctionExpression": ["callee", "arguments"],
"Program": ["body"],
"Property": ["key", "value"],
"ReturnStatement": ["argument"],

View File

@@ -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"
},

View File

@@ -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()));

View File

@@ -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"]);

View File

@@ -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]);
}));

View File

@@ -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()));

View File

@@ -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"]);

View File

@@ -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]);
}));