flint-babel-core
Version:
A compiler for writing next generation JavaScript
99 lines (76 loc) • 2.33 kB
JavaScript
"use strict";
exports.__esModule = true;
// istanbul ignore next
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj["default"] = obj; return newObj; } }
var _types = require("../../../types");
var t = _interopRequireWildcard(_types);
var metadata = {
group: "builtin-trailing"
};
exports.metadata = metadata;
function shouldShadow(path, shadowPath) {
if (path.is("_forceShadow")) {
return true;
} else {
return shadowPath && !shadowPath.isArrowFunctionExpression();
}
}
/**
* [Please add a description.]
*/
function remap(path, key, create) {
// ensure that we're shadowed
var shadowPath = path.inShadow(key);
if (!shouldShadow(path, shadowPath)) return;
var shadowFunction = path.node._shadowedFunctionLiteral;
var currentFunction;
var fnPath = path.findParent(function (path) {
if (path.isProgram() || path.isFunction()) {
// catch current function in case this is the shadowed one and we can ignore it
currentFunction = currentFunction || path;
}
if (path.isProgram()) {
return true;
} else if (path.isFunction()) {
if (shadowFunction) {
return path === shadowFunction || path.node === shadowFunction.node;
} else {
return !path.is("shadow");
}
}
return false;
});
// no point in realiasing if we're in this function
if (fnPath === currentFunction) return;
var cached = fnPath.getData(key);
if (cached) return cached;
var init = create();
var id = path.scope.generateUidIdentifier(key);
fnPath.setData(key, id);
fnPath.scope.push({ id: id, init: init });
return id;
}
/**
* [Please add a description.]
*/
var visitor = {
/**
* [Please add a description.]
*/
ThisExpression: function ThisExpression() {
return remap(this, "this", function () {
return t.thisExpression();
});
},
/**
* [Please add a description.]
*/
ReferencedIdentifier: function ReferencedIdentifier(node) {
if (node.name === "arguments") {
return remap(this, "arguments", function () {
return t.identifier("arguments");
});
}
}
};
exports.visitor = visitor;