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