Opal-Estate-Pro/node_modules/babel-plugin-transform-function-bind/lib/index.js
2019-09-13 11:27:52 +07:00

60 lines
1.7 KiB
JavaScript
Executable File

"use strict";
exports.__esModule = true;
exports.default = function (_ref) {
var t = _ref.types;
function getTempId(scope) {
var id = scope.path.getData("functionBind");
if (id) return id;
id = scope.generateDeclaredUidIdentifier("context");
return scope.path.setData("functionBind", id);
}
function getStaticContext(bind, scope) {
var object = bind.object || bind.callee.object;
return scope.isStatic(object) && object;
}
function inferBindContext(bind, scope) {
var staticContext = getStaticContext(bind, scope);
if (staticContext) return staticContext;
var tempId = getTempId(scope);
if (bind.object) {
bind.callee = t.sequenceExpression([t.assignmentExpression("=", tempId, bind.object), bind.callee]);
} else {
bind.callee.object = t.assignmentExpression("=", tempId, bind.callee.object);
}
return tempId;
}
return {
inherits: require("babel-plugin-syntax-function-bind"),
visitor: {
CallExpression: function CallExpression(_ref2) {
var node = _ref2.node,
scope = _ref2.scope;
var bind = node.callee;
if (!t.isBindExpression(bind)) return;
var context = inferBindContext(bind, scope);
node.callee = t.memberExpression(bind.callee, t.identifier("call"));
node.arguments.unshift(context);
},
BindExpression: function BindExpression(path) {
var node = path.node,
scope = path.scope;
var context = inferBindContext(node, scope);
path.replaceWith(t.callExpression(t.memberExpression(node.callee, t.identifier("bind")), [context]));
}
}
};
};
module.exports = exports["default"];