86 lines
2.1 KiB
JavaScript
86 lines
2.1 KiB
JavaScript
var traverse = require("../../traverse");
|
|
var t = require("../../types");
|
|
|
|
var go = function (getBody, node, file, scope) {
|
|
var argumentsId;
|
|
var thisId;
|
|
|
|
var getArgumentsId = function () {
|
|
return argumentsId = argumentsId || t.identifier(file.generateUid("arguments", scope));
|
|
};
|
|
|
|
var getThisId = function () {
|
|
return thisId = thisId || t.identifier(file.generateUid("this", scope));
|
|
};
|
|
|
|
// traverse the function and find all alias functions so we can alias
|
|
// arguments and this if necessary
|
|
traverse(node, function (node) {
|
|
var _aliasFunction = node._aliasFunction;
|
|
if (!_aliasFunction) {
|
|
if (t.isFunction(node)) {
|
|
// stop traversal of this node as it'll be hit again by this transformer
|
|
return false;
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
|
|
// traverse all child nodes of this function and find arguments and this
|
|
traverse(node, function (node, parent) {
|
|
if (_aliasFunction === "arrows") {
|
|
if (t.isFunction(node) && node._aliasFunction !== "arrows") {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (node._ignoreAliasFunctions) return;
|
|
|
|
var getId;
|
|
|
|
if (t.isIdentifier(node) && node.name === "arguments") {
|
|
getId = getArgumentsId;
|
|
} else if (t.isThisExpression(node)) {
|
|
getId = getThisId;
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
if (t.isReferenced(node, parent)) return getId();
|
|
});
|
|
|
|
return false;
|
|
});
|
|
|
|
var body;
|
|
|
|
var pushDeclaration = function (id, init) {
|
|
body = body || getBody();
|
|
body.unshift(t.variableDeclaration("var", [
|
|
t.variableDeclarator(id, init)
|
|
]));
|
|
};
|
|
|
|
if (argumentsId) {
|
|
pushDeclaration(argumentsId, t.identifier("arguments"));
|
|
}
|
|
|
|
if (thisId) {
|
|
pushDeclaration(thisId, t.identifier("this"));
|
|
}
|
|
};
|
|
|
|
exports.Program = function (node, parent, file, scope) {
|
|
go(function () {
|
|
return node.body;
|
|
}, node, file, scope);
|
|
};
|
|
|
|
exports.FunctionDeclaration =
|
|
exports.FunctionExpression = function (node, parent, file, scope) {
|
|
go(function () {
|
|
t.ensureBlock(node);
|
|
return node.body.body;
|
|
}, node, file, scope);
|
|
};
|