diff options
Diffstat (limited to 'node_modules/regenerator-transform/lib/meta.js')
| -rw-r--r-- | node_modules/regenerator-transform/lib/meta.js | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/node_modules/regenerator-transform/lib/meta.js b/node_modules/regenerator-transform/lib/meta.js new file mode 100644 index 00000000..ad6cec20 --- /dev/null +++ b/node_modules/regenerator-transform/lib/meta.js @@ -0,0 +1,102 @@ +"use strict"; + +var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); +var _assert = _interopRequireDefault(require("assert")); +var _util = require("./util.js"); +/** + * Copyright (c) 2014-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +var mMap = new WeakMap(); +function m(node) { + if (!mMap.has(node)) { + mMap.set(node, {}); + } + return mMap.get(node); +} +var hasOwn = Object.prototype.hasOwnProperty; +function makePredicate(propertyName, knownTypes) { + function onlyChildren(node) { + var t = (0, _util.getTypes)(); + t.assertNode(node); + + // Assume no side effects until we find out otherwise. + var result = false; + function check(child) { + if (result) { + // Do nothing. + } else if (Array.isArray(child)) { + child.some(check); + } else if (t.isNode(child)) { + _assert["default"].strictEqual(result, false); + result = predicate(child); + } + return result; + } + var keys = t.VISITOR_KEYS[node.type]; + if (keys) { + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var child = node[key]; + check(child); + } + } + return result; + } + function predicate(node) { + (0, _util.getTypes)().assertNode(node); + var meta = m(node); + if (hasOwn.call(meta, propertyName)) return meta[propertyName]; + + // Certain types are "opaque," which means they have no side + // effects or leaps and we don't care about their subexpressions. + if (hasOwn.call(opaqueTypes, node.type)) return meta[propertyName] = false; + if (hasOwn.call(knownTypes, node.type)) return meta[propertyName] = true; + return meta[propertyName] = onlyChildren(node); + } + predicate.onlyChildren = onlyChildren; + return predicate; +} +var opaqueTypes = { + FunctionExpression: true, + ArrowFunctionExpression: true +}; + +// These types potentially have side effects regardless of what side +// effects their subexpressions have. +var sideEffectTypes = { + CallExpression: true, + // Anything could happen! + ForInStatement: true, + // Modifies the key variable. + UnaryExpression: true, + // Think delete. + BinaryExpression: true, + // Might invoke .toString() or .valueOf(). + AssignmentExpression: true, + // Side-effecting by definition. + UpdateExpression: true, + // Updates are essentially assignments. + NewExpression: true // Similar to CallExpression. +}; + +// These types are the direct cause of all leaps in control flow. +var leapTypes = { + YieldExpression: true, + BreakStatement: true, + ContinueStatement: true, + ReturnStatement: true, + ThrowStatement: true +}; + +// All leap types are also side effect types. +for (var type in leapTypes) { + if (hasOwn.call(leapTypes, type)) { + sideEffectTypes[type] = leapTypes[type]; + } +} +exports.hasSideEffects = makePredicate("hasSideEffects", sideEffectTypes); +exports.containsLeap = makePredicate("containsLeap", leapTypes);
\ No newline at end of file |
