clean up constants transformer

This commit is contained in:
Sebastian McKenzie 2014-11-16 14:33:37 +11:00
parent 69db46f96b
commit d0a2bd170e

View File

@ -9,24 +9,27 @@ exports.ForOfStatement =
exports.ForStatement = function (node, parent, file) {
var constants = {};
var check = function (node, names, parent) {
_.each(names, function (name) {
var check = function (parent, names) {
_.each(names, function (nameNode, name) {
if (!_.has(constants, name)) return;
if (parent && t.isBlockStatement(parent) && parent !== constants[name]) return;
throw file.errorWithNode(node, name + " is read-only");
throw file.errorWithNode(nameNode, name + " is read-only");
});
};
var getIds = function (node) {
return t.getIds(node, false, ["MemberExpression"]);
return t.getIds(node, true, ["MemberExpression"]);
};
_.each(node.body, function (child, parent) {
if (child && t.isVariableDeclaration(child, { kind: "const" })) {
_.each(child.declarations, function (declar) {
_.each(getIds(declar), function (name) {
check(declar, [name], parent);
_.each(getIds(declar), function (nameNode, name) {
var names = {};
names[name] = nameNode;
check(parent, names);
constants[name] = parent;
});
@ -42,9 +45,10 @@ exports.ForStatement = function (node, parent, file) {
traverse(node, function (child, parent) {
if (child._ignoreConstant) return;
if (t.isVariableDeclaration(child)) return;
if (t.isDeclaration(child) || t.isAssignmentExpression(child)) {
check(child, getIds(child), parent);
if (t.isVariableDeclarator(child) || t.isDeclaration(child) || t.isAssignmentExpression(child)) {
check(parent, getIds(child));
}
});
};