add playground pretzel maps

This commit is contained in:
Sebastian McKenzie
2014-11-26 16:17:27 +11:00
parent f1a2401681
commit be0d4b344b
10 changed files with 83 additions and 4 deletions

View File

@@ -1,6 +1,6 @@
var _ = require("lodash");
_.each(["BindMemberExpression"], function (type) {
_.each(["BindMemberExpression", "PretzelMapExpression"], function (type) {
exports[type] = function () {
throw new ReferenceError("Trying to render non-standard playground node " + JSON.stringify(type));
};

View File

@@ -38,6 +38,12 @@ def("BindMemberExpression")
.field("property", or(def("Identifier"), def("Expression")))
.field("arguments", [def("Expression")]);
def("PretzelMapExpression")
.bases("Expression")
.build("callee", "arguments")
.field("callee", def("Expression"))
.field("arguments", [def("Expression")]);
types.finalize();
var estraverse = require("estraverse");

View File

@@ -59,6 +59,7 @@ _.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

@@ -0,0 +1,29 @@
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,6 +44,7 @@
"ObjectExpression": ["properties"],
"ObjectPattern": ["properties"],
"ParenthesizedExpression": ["expression"],
"PretzelMapExpression": ["callee", "arguments"],
"Program": ["body"],
"Property": ["key", "value"],
"ReturnStatement": ["argument"],