52 lines
1.2 KiB
JavaScript
52 lines
1.2 KiB
JavaScript
var traverse = require("../traverse");
|
|
var util = require("../util");
|
|
var b = require("ast-types").builders;
|
|
var _ = require("lodash");
|
|
|
|
exports.ObjectExpression = function (node, parent, opts, generateUid) {
|
|
var hasComputed = false;
|
|
var hasThis = false;
|
|
|
|
var computed = [];
|
|
|
|
node.properties = node.properties.filter(function (prop) {
|
|
if (prop.computed) {
|
|
hasComputed = true;
|
|
computed.unshift(prop);
|
|
hasThis = hasThis || traverse.hasType(prop, "ThisExpression");
|
|
return false;
|
|
} else {
|
|
return true;
|
|
}
|
|
});
|
|
|
|
if (!hasComputed) return;
|
|
|
|
var templateName = "function-return-obj";
|
|
if (hasThis) templateName += "-this";
|
|
|
|
var objId = b.identifier(generateUid("ref"));
|
|
|
|
var container = util.template(templateName, {
|
|
KEY: objId,
|
|
OBJECT: node
|
|
});
|
|
|
|
var containerBody;
|
|
if (templateName === "function-return-obj") {
|
|
containerBody = container.callee.body.body;
|
|
} else {
|
|
containerBody = container.callee.object.body.body;
|
|
}
|
|
|
|
_.each(computed, function (prop) {
|
|
containerBody.unshift(util.template("obj-key-set", {
|
|
OBJECT_KEY: objId,
|
|
KEY: prop.key,
|
|
VALUE: prop.value
|
|
}, true));
|
|
});
|
|
|
|
return container;
|
|
};
|