| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 | "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);
 |