UNPKG

babel-core

Version:

Turn ES6 code into readable vanilla ES5 with source maps

113 lines (89 loc) 3.12 kB
"use strict"; var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { "default": obj }; }; exports.AssignmentExpression = AssignmentExpression; exports.UnaryExpression = UnaryExpression; exports.CallExpression = CallExpression; exports.VirtualPropertyExpression = VirtualPropertyExpression; exports.PrivateDeclaration = PrivateDeclaration; // https://github.com/zenparsing/es-abstract-refs var util = _interopRequireWildcard(require("../../../util")); var t = _interopRequireWildcard(require("../../../types")); var experimental = exports.experimental = true; var container = function container(parent, call, ret, file) { if (t.isExpressionStatement(parent) && !file.isConsequenceExpressionStatement(parent)) { // we don't need to worry about return values return call; } else { var exprs = []; if (t.isSequenceExpression(call)) { exprs = call.expressions; } else { exprs.push(call); } exprs.push(ret); return t.sequenceExpression(exprs); } }; function AssignmentExpression(node, parent, scope, file) { var left = node.left; if (!t.isVirtualPropertyExpression(left)) return; var value = node.right; var temp; // we need to return `node.right` if (!t.isExpressionStatement(parent)) { temp = scope.generateTempBasedOnNode(node.right); if (temp) value = temp; } if (node.operator !== "=") { value = t.binaryExpression(node.operator[0], util.template("abstract-expression-get", { PROPERTY: node.property, OBJECT: node.object }), value); } var call = util.template("abstract-expression-set", { PROPERTY: left.property, OBJECT: left.object, VALUE: value }); if (temp) { call = t.sequenceExpression([t.assignmentExpression("=", temp, node.right), call]); } return container(parent, call, value, file); } function UnaryExpression(node, parent, scope, file) { var arg = node.argument; if (!t.isVirtualPropertyExpression(arg)) return; if (node.operator !== "delete") return; var call = util.template("abstract-expression-delete", { PROPERTY: arg.property, OBJECT: arg.object }); return container(parent, call, t.literal(true), file); } function CallExpression(node, parent, scope) { var callee = node.callee; if (!t.isVirtualPropertyExpression(callee)) return; var temp = scope.generateTempBasedOnNode(callee.object); var call = util.template("abstract-expression-call", { PROPERTY: callee.property, OBJECT: temp || callee.object }); call.arguments = call.arguments.concat(node.arguments); if (temp) { return t.sequenceExpression([t.assignmentExpression("=", temp, callee.object), call]); } else { return call; } } function VirtualPropertyExpression(node) { return util.template("abstract-expression-get", { PROPERTY: node.property, OBJECT: node.object }); } function PrivateDeclaration(node) { return t.variableDeclaration("const", node.declarations.map(function (id) { return t.variableDeclarator(id, t.newExpression(t.identifier("WeakMap"), [])); })); } exports.__esModule = true;