1"use strict";
2
3exports.__esModule = true;
4
5var _create = require("babel-runtime/core-js/object/create");
6
7var _create2 = _interopRequireDefault(_create);
8
9exports.getBindingIdentifiers = getBindingIdentifiers;
10exports.getOuterBindingIdentifiers = getOuterBindingIdentifiers;
11
12var _index = require("./index");
13
14var t = _interopRequireWildcard(_index);
15
16function _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; } }
17
18function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
20function getBindingIdentifiers(node, duplicates, outerOnly) {
21  var search = [].concat(node);
22  var ids = (0, _create2.default)(null);
23
24  while (search.length) {
25    var id = search.shift();
26    if (!id) continue;
27
28    var keys = t.getBindingIdentifiers.keys[id.type];
29
30    if (t.isIdentifier(id)) {
31      if (duplicates) {
32        var _ids = ids[id.name] = ids[id.name] || [];
33        _ids.push(id);
34      } else {
35        ids[id.name] = id;
36      }
37      continue;
38    }
39
40    if (t.isExportDeclaration(id)) {
41      if (t.isDeclaration(id.declaration)) {
42        search.push(id.declaration);
43      }
44      continue;
45    }
46
47    if (outerOnly) {
48      if (t.isFunctionDeclaration(id)) {
49        search.push(id.id);
50        continue;
51      }
52
53      if (t.isFunctionExpression(id)) {
54        continue;
55      }
56    }
57
58    if (keys) {
59      for (var i = 0; i < keys.length; i++) {
60        var key = keys[i];
61        if (id[key]) {
62          search = search.concat(id[key]);
63        }
64      }
65    }
66  }
67
68  return ids;
69}
70
71getBindingIdentifiers.keys = {
72  DeclareClass: ["id"],
73  DeclareFunction: ["id"],
74  DeclareModule: ["id"],
75  DeclareVariable: ["id"],
76  InterfaceDeclaration: ["id"],
77  TypeAlias: ["id"],
78  OpaqueType: ["id"],
79
80  CatchClause: ["param"],
81  LabeledStatement: ["label"],
82  UnaryExpression: ["argument"],
83  AssignmentExpression: ["left"],
84
85  ImportSpecifier: ["local"],
86  ImportNamespaceSpecifier: ["local"],
87  ImportDefaultSpecifier: ["local"],
88  ImportDeclaration: ["specifiers"],
89
90  ExportSpecifier: ["exported"],
91  ExportNamespaceSpecifier: ["exported"],
92  ExportDefaultSpecifier: ["exported"],
93
94  FunctionDeclaration: ["id", "params"],
95  FunctionExpression: ["id", "params"],
96
97  ClassDeclaration: ["id"],
98  ClassExpression: ["id"],
99
100  RestElement: ["argument"],
101  UpdateExpression: ["argument"],
102
103  RestProperty: ["argument"],
104  ObjectProperty: ["value"],
105
106  AssignmentPattern: ["left"],
107  ArrayPattern: ["elements"],
108  ObjectPattern: ["properties"],
109
110  VariableDeclaration: ["declarations"],
111  VariableDeclarator: ["id"]
112};
113
114function getOuterBindingIdentifiers(node, duplicates) {
115  return getBindingIdentifiers(node, duplicates, true);
116}