meta.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.hasSideEffects = exports.containsLeap = void 0;
  6. var _assert = require("assert");
  7. var _util = require("./util.js");
  8. const mMap = new WeakMap();
  9. function m(node) {
  10. if (!mMap.has(node)) {
  11. mMap.set(node, {});
  12. }
  13. return mMap.get(node);
  14. }
  15. const hasOwn = Object.prototype.hasOwnProperty;
  16. function makePredicate(propertyName, knownTypes) {
  17. function onlyChildren(node) {
  18. const t = (0, _util.getTypes)();
  19. t.assertNode(node);
  20. let result = false;
  21. function check(child) {
  22. if (result) {} else if (Array.isArray(child)) {
  23. child.some(check);
  24. } else if (t.isNode(child)) {
  25. _assert.strictEqual(result, false);
  26. result = predicate(child);
  27. }
  28. return result;
  29. }
  30. const keys = t.VISITOR_KEYS[node.type];
  31. if (keys) {
  32. for (let i = 0; i < keys.length; i++) {
  33. const key = keys[i];
  34. const child = node[key];
  35. check(child);
  36. }
  37. }
  38. return result;
  39. }
  40. function predicate(node) {
  41. (0, _util.getTypes)().assertNode(node);
  42. const meta = m(node);
  43. if (hasOwn.call(meta, propertyName)) return meta[propertyName];
  44. if (hasOwn.call(opaqueTypes, node.type)) return meta[propertyName] = false;
  45. if (hasOwn.call(knownTypes, node.type)) return meta[propertyName] = true;
  46. return meta[propertyName] = onlyChildren(node);
  47. }
  48. predicate.onlyChildren = onlyChildren;
  49. return predicate;
  50. }
  51. const opaqueTypes = {
  52. FunctionExpression: true,
  53. ArrowFunctionExpression: true
  54. };
  55. const sideEffectTypes = {
  56. CallExpression: true,
  57. ForInStatement: true,
  58. UnaryExpression: true,
  59. BinaryExpression: true,
  60. AssignmentExpression: true,
  61. UpdateExpression: true,
  62. NewExpression: true
  63. };
  64. const leapTypes = {
  65. YieldExpression: true,
  66. BreakStatement: true,
  67. ContinueStatement: true,
  68. ReturnStatement: true,
  69. ThrowStatement: true
  70. };
  71. for (const type in leapTypes) {
  72. if (hasOwn.call(leapTypes, type)) {
  73. sideEffectTypes[type] = leapTypes[type];
  74. }
  75. }
  76. const hasSideEffects = exports.hasSideEffects = makePredicate("hasSideEffects", sideEffectTypes);
  77. const containsLeap = exports.containsLeap = makePredicate("containsLeap", leapTypes);
  78. //# sourceMappingURL=meta.js.map