66f0bcee2745ddb1b34a54797721f7220d59ccf494d34308136e31b5ee05bcb1afdd416c9b33b9e4f07733f4c7d678b50bb4f847cf9e379d273e80f8b53a67 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. "use strict";
  2. exports.__esModule = true;
  3. var _keys = require("babel-runtime/core-js/object/keys");
  4. var _keys2 = _interopRequireDefault(_keys);
  5. var _typeof2 = require("babel-runtime/helpers/typeof");
  6. var _typeof3 = _interopRequireDefault(_typeof2);
  7. var _getIterator2 = require("babel-runtime/core-js/get-iterator");
  8. var _getIterator3 = _interopRequireDefault(_getIterator2);
  9. exports.isBinding = isBinding;
  10. exports.isReferenced = isReferenced;
  11. exports.isValidIdentifier = isValidIdentifier;
  12. exports.isLet = isLet;
  13. exports.isBlockScoped = isBlockScoped;
  14. exports.isVar = isVar;
  15. exports.isSpecifierDefault = isSpecifierDefault;
  16. exports.isScope = isScope;
  17. exports.isImmutable = isImmutable;
  18. exports.isNodesEquivalent = isNodesEquivalent;
  19. var _retrievers = require("./retrievers");
  20. var _esutils = require("esutils");
  21. var _esutils2 = _interopRequireDefault(_esutils);
  22. var _index = require("./index");
  23. var t = _interopRequireWildcard(_index);
  24. var _constants = require("./constants");
  25. function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
  26. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  27. function isBinding(node, parent) {
  28. var keys = _retrievers.getBindingIdentifiers.keys[parent.type];
  29. if (keys) {
  30. for (var i = 0; i < keys.length; i++) {
  31. var key = keys[i];
  32. var val = parent[key];
  33. if (Array.isArray(val)) {
  34. if (val.indexOf(node) >= 0) return true;
  35. } else {
  36. if (val === node) return true;
  37. }
  38. }
  39. }
  40. return false;
  41. }
  42. function isReferenced(node, parent) {
  43. switch (parent.type) {
  44. case "BindExpression":
  45. return parent.object === node || parent.callee === node;
  46. case "MemberExpression":
  47. case "JSXMemberExpression":
  48. if (parent.property === node && parent.computed) {
  49. return true;
  50. } else if (parent.object === node) {
  51. return true;
  52. } else {
  53. return false;
  54. }
  55. case "MetaProperty":
  56. return false;
  57. case "ObjectProperty":
  58. if (parent.key === node) {
  59. return parent.computed;
  60. }
  61. case "VariableDeclarator":
  62. return parent.id !== node;
  63. case "ArrowFunctionExpression":
  64. case "FunctionDeclaration":
  65. case "FunctionExpression":
  66. for (var _iterator = parent.params, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : (0, _getIterator3.default)(_iterator);;) {
  67. var _ref;
  68. if (_isArray) {
  69. if (_i >= _iterator.length) break;
  70. _ref = _iterator[_i++];
  71. } else {
  72. _i = _iterator.next();
  73. if (_i.done) break;
  74. _ref = _i.value;
  75. }
  76. var param = _ref;
  77. if (param === node) return false;
  78. }
  79. return parent.id !== node;
  80. case "ExportSpecifier":
  81. if (parent.source) {
  82. return false;
  83. } else {
  84. return parent.local === node;
  85. }
  86. case "ExportNamespaceSpecifier":
  87. case "ExportDefaultSpecifier":
  88. return false;
  89. case "JSXAttribute":
  90. return parent.name !== node;
  91. case "ClassProperty":
  92. if (parent.key === node) {
  93. return parent.computed;
  94. } else {
  95. return parent.value === node;
  96. }
  97. case "ImportDefaultSpecifier":
  98. case "ImportNamespaceSpecifier":
  99. case "ImportSpecifier":
  100. return false;
  101. case "ClassDeclaration":
  102. case "ClassExpression":
  103. return parent.id !== node;
  104. case "ClassMethod":
  105. case "ObjectMethod":
  106. return parent.key === node && parent.computed;
  107. case "LabeledStatement":
  108. return false;
  109. case "CatchClause":
  110. return parent.param !== node;
  111. case "RestElement":
  112. return false;
  113. case "AssignmentExpression":
  114. return parent.right === node;
  115. case "AssignmentPattern":
  116. return parent.right === node;
  117. case "ObjectPattern":
  118. case "ArrayPattern":
  119. return false;
  120. }
  121. return true;
  122. }
  123. function isValidIdentifier(name) {
  124. if (typeof name !== "string" || _esutils2.default.keyword.isReservedWordES6(name, true)) {
  125. return false;
  126. } else if (name === "await") {
  127. return false;
  128. } else {
  129. return _esutils2.default.keyword.isIdentifierNameES6(name);
  130. }
  131. }
  132. function isLet(node) {
  133. return t.isVariableDeclaration(node) && (node.kind !== "var" || node[_constants.BLOCK_SCOPED_SYMBOL]);
  134. }
  135. function isBlockScoped(node) {
  136. return t.isFunctionDeclaration(node) || t.isClassDeclaration(node) || t.isLet(node);
  137. }
  138. function isVar(node) {
  139. return t.isVariableDeclaration(node, { kind: "var" }) && !node[_constants.BLOCK_SCOPED_SYMBOL];
  140. }
  141. function isSpecifierDefault(specifier) {
  142. return t.isImportDefaultSpecifier(specifier) || t.isIdentifier(specifier.imported || specifier.exported, { name: "default" });
  143. }
  144. function isScope(node, parent) {
  145. if (t.isBlockStatement(node) && t.isFunction(parent, { body: node })) {
  146. return false;
  147. }
  148. return t.isScopable(node);
  149. }
  150. function isImmutable(node) {
  151. if (t.isType(node.type, "Immutable")) return true;
  152. if (t.isIdentifier(node)) {
  153. if (node.name === "undefined") {
  154. return true;
  155. } else {
  156. return false;
  157. }
  158. }
  159. return false;
  160. }
  161. function isNodesEquivalent(a, b) {
  162. if ((typeof a === "undefined" ? "undefined" : (0, _typeof3.default)(a)) !== "object" || (typeof a === "undefined" ? "undefined" : (0, _typeof3.default)(a)) !== "object" || a == null || b == null) {
  163. return a === b;
  164. }
  165. if (a.type !== b.type) {
  166. return false;
  167. }
  168. var fields = (0, _keys2.default)(t.NODE_FIELDS[a.type] || a.type);
  169. for (var _iterator2 = fields, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : (0, _getIterator3.default)(_iterator2);;) {
  170. var _ref2;
  171. if (_isArray2) {
  172. if (_i2 >= _iterator2.length) break;
  173. _ref2 = _iterator2[_i2++];
  174. } else {
  175. _i2 = _iterator2.next();
  176. if (_i2.done) break;
  177. _ref2 = _i2.value;
  178. }
  179. var field = _ref2;
  180. if ((0, _typeof3.default)(a[field]) !== (0, _typeof3.default)(b[field])) {
  181. return false;
  182. }
  183. if (Array.isArray(a[field])) {
  184. if (!Array.isArray(b[field])) {
  185. return false;
  186. }
  187. if (a[field].length !== b[field].length) {
  188. return false;
  189. }
  190. for (var i = 0; i < a[field].length; i++) {
  191. if (!isNodesEquivalent(a[field][i], b[field][i])) {
  192. return false;
  193. }
  194. }
  195. continue;
  196. }
  197. if (!isNodesEquivalent(a[field], b[field])) {
  198. return false;
  199. }
  200. }
  201. return true;
  202. }