@babel/traverse 7.15.0 → 7.15.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of @babel/traverse might be problematic. Click here for more details.
- package/lib/context.js +6 -2
- package/lib/index.js +12 -6
- package/lib/path/ancestry.js +6 -2
- package/lib/path/comments.js +8 -3
- package/lib/path/conversion.js +57 -32
- package/lib/path/family.js +52 -29
- package/lib/path/index.js +8 -2
- package/lib/path/inference/index.js +36 -18
- package/lib/path/inference/inferer-reference.js +28 -17
- package/lib/path/inference/inferers.js +69 -45
- package/lib/path/introspection.js +23 -11
- package/lib/path/lib/hoister.js +17 -7
- package/lib/path/lib/virtual-types.js +45 -21
- package/lib/path/modification.js +19 -8
- package/lib/path/replacement.js +47 -24
- package/lib/scope/index.js +97 -51
- package/lib/scope/lib/renamer.js +16 -8
- package/lib/types.js +0 -2
- package/lib/visitors.js +10 -4
- package/package.json +7 -7
package/lib/context.js
CHANGED
@@ -7,7 +7,11 @@ exports.default = void 0;
|
|
7
7
|
|
8
8
|
var _path = require("./path");
|
9
9
|
|
10
|
-
var
|
10
|
+
var _t = require("@babel/types");
|
11
|
+
|
12
|
+
const {
|
13
|
+
VISITOR_KEYS
|
14
|
+
} = _t;
|
11
15
|
|
12
16
|
class TraversalContext {
|
13
17
|
constructor(scope, opts, state, parentPath) {
|
@@ -23,7 +27,7 @@ class TraversalContext {
|
|
23
27
|
const opts = this.opts;
|
24
28
|
if (opts.enter || opts.exit) return true;
|
25
29
|
if (opts[node.type]) return true;
|
26
|
-
const keys =
|
30
|
+
const keys = VISITOR_KEYS[node.type];
|
27
31
|
if (!(keys != null && keys.length)) return false;
|
28
32
|
|
29
33
|
for (const key of keys) {
|
package/lib/index.js
CHANGED
@@ -29,7 +29,7 @@ var visitors = require("./visitors");
|
|
29
29
|
|
30
30
|
exports.visitors = visitors;
|
31
31
|
|
32
|
-
var
|
32
|
+
var _t = require("@babel/types");
|
33
33
|
|
34
34
|
var cache = require("./cache");
|
35
35
|
|
@@ -39,6 +39,12 @@ var _scope = require("./scope");
|
|
39
39
|
|
40
40
|
var _hub = require("./hub");
|
41
41
|
|
42
|
+
const {
|
43
|
+
VISITOR_KEYS,
|
44
|
+
removeProperties,
|
45
|
+
traverseFast
|
46
|
+
} = _t;
|
47
|
+
|
42
48
|
function traverse(parent, opts = {}, scope, state, parentPath) {
|
43
49
|
if (!parent) return;
|
44
50
|
|
@@ -48,7 +54,7 @@ function traverse(parent, opts = {}, scope, state, parentPath) {
|
|
48
54
|
}
|
49
55
|
}
|
50
56
|
|
51
|
-
if (!
|
57
|
+
if (!VISITOR_KEYS[parent.type]) {
|
52
58
|
return;
|
53
59
|
}
|
54
60
|
|
@@ -63,11 +69,11 @@ traverse.verify = visitors.verify;
|
|
63
69
|
traverse.explode = visitors.explode;
|
64
70
|
|
65
71
|
traverse.cheap = function (node, enter) {
|
66
|
-
return
|
72
|
+
return traverseFast(node, enter);
|
67
73
|
};
|
68
74
|
|
69
75
|
traverse.node = function (node, opts, scope, state, parentPath, skipKeys) {
|
70
|
-
const keys =
|
76
|
+
const keys = VISITOR_KEYS[node.type];
|
71
77
|
if (!keys) return;
|
72
78
|
const context = new _context.default(scope, opts, state, parentPath);
|
73
79
|
|
@@ -78,12 +84,12 @@ traverse.node = function (node, opts, scope, state, parentPath, skipKeys) {
|
|
78
84
|
};
|
79
85
|
|
80
86
|
traverse.clearNode = function (node, opts) {
|
81
|
-
|
87
|
+
removeProperties(node, opts);
|
82
88
|
cache.path.delete(node);
|
83
89
|
};
|
84
90
|
|
85
91
|
traverse.removeProperties = function (tree, opts) {
|
86
|
-
|
92
|
+
traverseFast(tree, traverse.clearNode, opts);
|
87
93
|
return tree;
|
88
94
|
};
|
89
95
|
|
package/lib/path/ancestry.js
CHANGED
@@ -14,10 +14,14 @@ exports.isAncestor = isAncestor;
|
|
14
14
|
exports.isDescendant = isDescendant;
|
15
15
|
exports.inType = inType;
|
16
16
|
|
17
|
-
var
|
17
|
+
var _t = require("@babel/types");
|
18
18
|
|
19
19
|
var _index = require("./index");
|
20
20
|
|
21
|
+
const {
|
22
|
+
VISITOR_KEYS
|
23
|
+
} = _t;
|
24
|
+
|
21
25
|
function findParent(callback) {
|
22
26
|
let path = this;
|
23
27
|
|
@@ -63,7 +67,7 @@ function getStatementParent() {
|
|
63
67
|
function getEarliestCommonAncestorFrom(paths) {
|
64
68
|
return this.getDeepestCommonAncestorFrom(paths, function (deepest, i, ancestries) {
|
65
69
|
let earliest;
|
66
|
-
const keys =
|
70
|
+
const keys = VISITOR_KEYS[deepest.type];
|
67
71
|
|
68
72
|
for (const ancestry of ancestries) {
|
69
73
|
const path = ancestry[i + 1];
|
package/lib/path/comments.js
CHANGED
@@ -7,7 +7,12 @@ exports.shareCommentsWithSiblings = shareCommentsWithSiblings;
|
|
7
7
|
exports.addComment = addComment;
|
8
8
|
exports.addComments = addComments;
|
9
9
|
|
10
|
-
var
|
10
|
+
var _t = require("@babel/types");
|
11
|
+
|
12
|
+
const {
|
13
|
+
addComment: _addComment,
|
14
|
+
addComments: _addComments
|
15
|
+
} = _t;
|
11
16
|
|
12
17
|
function shareCommentsWithSiblings() {
|
13
18
|
if (typeof this.key === "string") return;
|
@@ -29,9 +34,9 @@ function shareCommentsWithSiblings() {
|
|
29
34
|
}
|
30
35
|
|
31
36
|
function addComment(type, content, line) {
|
32
|
-
|
37
|
+
_addComment(this.node, type, content, line);
|
33
38
|
}
|
34
39
|
|
35
40
|
function addComments(type, comments) {
|
36
|
-
|
41
|
+
_addComments(this.node, type, comments);
|
37
42
|
}
|
package/lib/path/conversion.js
CHANGED
@@ -9,10 +9,35 @@ exports.arrowFunctionToShadowed = arrowFunctionToShadowed;
|
|
9
9
|
exports.unwrapFunctionEnvironment = unwrapFunctionEnvironment;
|
10
10
|
exports.arrowFunctionToExpression = arrowFunctionToExpression;
|
11
11
|
|
12
|
-
var
|
12
|
+
var _t = require("@babel/types");
|
13
13
|
|
14
14
|
var _helperFunctionName = require("@babel/helper-function-name");
|
15
15
|
|
16
|
+
const {
|
17
|
+
arrowFunctionExpression,
|
18
|
+
assignmentExpression,
|
19
|
+
binaryExpression,
|
20
|
+
blockStatement,
|
21
|
+
callExpression,
|
22
|
+
conditionalExpression,
|
23
|
+
expressionStatement,
|
24
|
+
identifier,
|
25
|
+
isIdentifier,
|
26
|
+
jsxIdentifier,
|
27
|
+
memberExpression,
|
28
|
+
metaProperty,
|
29
|
+
numericLiteral,
|
30
|
+
objectExpression,
|
31
|
+
restElement,
|
32
|
+
returnStatement,
|
33
|
+
sequenceExpression,
|
34
|
+
spreadElement,
|
35
|
+
stringLiteral,
|
36
|
+
super: _super,
|
37
|
+
thisExpression,
|
38
|
+
unaryExpression
|
39
|
+
} = _t;
|
40
|
+
|
16
41
|
function toComputedKey() {
|
17
42
|
let key;
|
18
43
|
|
@@ -25,7 +50,7 @@ function toComputedKey() {
|
|
25
50
|
}
|
26
51
|
|
27
52
|
if (!this.node.computed) {
|
28
|
-
if (
|
53
|
+
if (isIdentifier(key)) key = stringLiteral(key.name);
|
29
54
|
}
|
30
55
|
|
31
56
|
return key;
|
@@ -61,14 +86,14 @@ function ensureBlock() {
|
|
61
86
|
|
62
87
|
if (this.isFunction()) {
|
63
88
|
key = "argument";
|
64
|
-
statements.push(
|
89
|
+
statements.push(returnStatement(body.node));
|
65
90
|
} else {
|
66
91
|
key = "expression";
|
67
|
-
statements.push(
|
92
|
+
statements.push(expressionStatement(body.node));
|
68
93
|
}
|
69
94
|
}
|
70
95
|
|
71
|
-
this.node.body =
|
96
|
+
this.node.body = blockStatement(statements);
|
72
97
|
const parentPath = this.get(stringPath);
|
73
98
|
body.setup(parentPath, listKey ? parentPath.node[listKey] : parentPath.node, listKey, key);
|
74
99
|
return this.node;
|
@@ -106,12 +131,12 @@ function arrowFunctionToExpression({
|
|
106
131
|
if (checkBinding) {
|
107
132
|
this.parentPath.scope.push({
|
108
133
|
id: checkBinding,
|
109
|
-
init:
|
134
|
+
init: objectExpression([])
|
110
135
|
});
|
111
136
|
}
|
112
137
|
|
113
|
-
this.get("body").unshiftContainer("body",
|
114
|
-
this.replaceWith(
|
138
|
+
this.get("body").unshiftContainer("body", expressionStatement(callExpression(this.hub.addHelper("newArrowCheck"), [thisExpression(), checkBinding ? identifier(checkBinding.name) : identifier(thisBinding)])));
|
139
|
+
this.replaceWith(callExpression(memberExpression((0, _helperFunctionName.default)(this, true) || this.node, identifier("bind")), [checkBinding ? identifier(checkBinding.name) : thisExpression()]));
|
115
140
|
}
|
116
141
|
}
|
117
142
|
|
@@ -159,7 +184,7 @@ function hoistFunctionEnvironment(fnPath, noNewArrows = true, allowInsertArrow =
|
|
159
184
|
});
|
160
185
|
const superBinding = getSuperBinding(thisEnvFn);
|
161
186
|
allSuperCalls.forEach(superCall => {
|
162
|
-
const callee =
|
187
|
+
const callee = identifier(superBinding);
|
163
188
|
callee.loc = superCall.node.callee.loc;
|
164
189
|
superCall.get("callee").replaceWith(callee);
|
165
190
|
});
|
@@ -167,25 +192,25 @@ function hoistFunctionEnvironment(fnPath, noNewArrows = true, allowInsertArrow =
|
|
167
192
|
|
168
193
|
if (argumentsPaths.length > 0) {
|
169
194
|
const argumentsBinding = getBinding(thisEnvFn, "arguments", () => {
|
170
|
-
const args = () =>
|
195
|
+
const args = () => identifier("arguments");
|
171
196
|
|
172
197
|
if (thisEnvFn.scope.path.isProgram()) {
|
173
|
-
return
|
198
|
+
return conditionalExpression(binaryExpression("===", unaryExpression("typeof", args()), stringLiteral("undefined")), thisEnvFn.scope.buildUndefinedNode(), args());
|
174
199
|
} else {
|
175
200
|
return args();
|
176
201
|
}
|
177
202
|
});
|
178
203
|
argumentsPaths.forEach(argumentsChild => {
|
179
|
-
const argsRef =
|
204
|
+
const argsRef = identifier(argumentsBinding);
|
180
205
|
argsRef.loc = argumentsChild.node.loc;
|
181
206
|
argumentsChild.replaceWith(argsRef);
|
182
207
|
});
|
183
208
|
}
|
184
209
|
|
185
210
|
if (newTargetPaths.length > 0) {
|
186
|
-
const newTargetBinding = getBinding(thisEnvFn, "newtarget", () =>
|
211
|
+
const newTargetBinding = getBinding(thisEnvFn, "newtarget", () => metaProperty(identifier("new"), identifier("target")));
|
187
212
|
newTargetPaths.forEach(targetChild => {
|
188
|
-
const targetRef =
|
213
|
+
const targetRef = identifier(newTargetBinding);
|
189
214
|
targetRef.loc = targetChild.node.loc;
|
190
215
|
targetChild.replaceWith(targetRef);
|
191
216
|
});
|
@@ -217,11 +242,11 @@ function hoistFunctionEnvironment(fnPath, noNewArrows = true, allowInsertArrow =
|
|
217
242
|
args.push(value);
|
218
243
|
}
|
219
244
|
|
220
|
-
const call =
|
245
|
+
const call = callExpression(identifier(superBinding), args);
|
221
246
|
|
222
247
|
if (isCall) {
|
223
|
-
superProp.parentPath.unshiftContainer("arguments",
|
224
|
-
superProp.replaceWith(
|
248
|
+
superProp.parentPath.unshiftContainer("arguments", thisExpression());
|
249
|
+
superProp.replaceWith(memberExpression(call, identifier("call")));
|
225
250
|
thisPaths.push(superProp.parentPath.get("arguments.0"));
|
226
251
|
} else if (isAssignment) {
|
227
252
|
superProp.parentPath.replaceWith(call);
|
@@ -238,7 +263,7 @@ function hoistFunctionEnvironment(fnPath, noNewArrows = true, allowInsertArrow =
|
|
238
263
|
|
239
264
|
if (noNewArrows || inConstructor && hasSuperClass(thisEnvFn)) {
|
240
265
|
thisPaths.forEach(thisChild => {
|
241
|
-
const thisRef = thisChild.isJSX() ?
|
266
|
+
const thisRef = thisChild.isJSX() ? jsxIdentifier(thisBinding) : identifier(thisBinding);
|
242
267
|
thisRef.loc = thisChild.node.loc;
|
243
268
|
thisChild.replaceWith(thisRef);
|
244
269
|
});
|
@@ -258,11 +283,11 @@ function standardizeSuperProperty(superProp) {
|
|
258
283
|
|
259
284
|
if (superProp.node.computed) {
|
260
285
|
const tmp = superProp.scope.generateDeclaredUidIdentifier("tmp");
|
261
|
-
assignmentPath.get("left").replaceWith(
|
262
|
-
assignmentPath.get("right").replaceWith(
|
286
|
+
assignmentPath.get("left").replaceWith(memberExpression(superProp.node.object, assignmentExpression("=", tmp, superProp.node.property), true));
|
287
|
+
assignmentPath.get("right").replaceWith(binaryExpression(op, memberExpression(superProp.node.object, identifier(tmp.name), true), value));
|
263
288
|
} else {
|
264
|
-
assignmentPath.get("left").replaceWith(
|
265
|
-
assignmentPath.get("right").replaceWith(
|
289
|
+
assignmentPath.get("left").replaceWith(memberExpression(superProp.node.object, superProp.node.property));
|
290
|
+
assignmentPath.get("right").replaceWith(binaryExpression(op, memberExpression(superProp.node.object, identifier(superProp.node.property.name)), value));
|
266
291
|
}
|
267
292
|
|
268
293
|
return [assignmentPath.get("left"), assignmentPath.get("right").get("left")];
|
@@ -270,13 +295,13 @@ function standardizeSuperProperty(superProp) {
|
|
270
295
|
const updateExpr = superProp.parentPath;
|
271
296
|
const tmp = superProp.scope.generateDeclaredUidIdentifier("tmp");
|
272
297
|
const computedKey = superProp.node.computed ? superProp.scope.generateDeclaredUidIdentifier("prop") : null;
|
273
|
-
const parts = [
|
298
|
+
const parts = [assignmentExpression("=", tmp, memberExpression(superProp.node.object, computedKey ? assignmentExpression("=", computedKey, superProp.node.property) : superProp.node.property, superProp.node.computed)), assignmentExpression("=", memberExpression(superProp.node.object, computedKey ? identifier(computedKey.name) : superProp.node.property, superProp.node.computed), binaryExpression("+", identifier(tmp.name), numericLiteral(1)))];
|
274
299
|
|
275
300
|
if (!superProp.parentPath.node.prefix) {
|
276
|
-
parts.push(
|
301
|
+
parts.push(identifier(tmp.name));
|
277
302
|
}
|
278
303
|
|
279
|
-
updateExpr.replaceWith(
|
304
|
+
updateExpr.replaceWith(sequenceExpression(parts));
|
280
305
|
const left = updateExpr.get("expressions.0.right");
|
281
306
|
const right = updateExpr.get("expressions.1.left");
|
282
307
|
return [left, right];
|
@@ -291,7 +316,7 @@ function hasSuperClass(thisEnvFn) {
|
|
291
316
|
|
292
317
|
function getThisBinding(thisEnvFn, inConstructor) {
|
293
318
|
return getBinding(thisEnvFn, "this", thisBinding => {
|
294
|
-
if (!inConstructor || !hasSuperClass(thisEnvFn)) return
|
319
|
+
if (!inConstructor || !hasSuperClass(thisEnvFn)) return thisExpression();
|
295
320
|
const supers = new WeakSet();
|
296
321
|
thisEnvFn.traverse({
|
297
322
|
Function(child) {
|
@@ -307,7 +332,7 @@ function getThisBinding(thisEnvFn, inConstructor) {
|
|
307
332
|
if (!child.get("callee").isSuper()) return;
|
308
333
|
if (supers.has(child.node)) return;
|
309
334
|
supers.add(child.node);
|
310
|
-
child.replaceWithMultiple([child.node,
|
335
|
+
child.replaceWithMultiple([child.node, assignmentExpression("=", identifier(thisBinding), identifier("this"))]);
|
311
336
|
}
|
312
337
|
|
313
338
|
});
|
@@ -317,7 +342,7 @@ function getThisBinding(thisEnvFn, inConstructor) {
|
|
317
342
|
function getSuperBinding(thisEnvFn) {
|
318
343
|
return getBinding(thisEnvFn, "supercall", () => {
|
319
344
|
const argsBinding = thisEnvFn.scope.generateUidIdentifier("args");
|
320
|
-
return
|
345
|
+
return arrowFunctionExpression([restElement(argsBinding)], callExpression(_super(), [spreadElement(identifier(argsBinding.name))]));
|
321
346
|
});
|
322
347
|
}
|
323
348
|
|
@@ -328,20 +353,20 @@ function getSuperPropBinding(thisEnvFn, isAssignment, propName) {
|
|
328
353
|
let fnBody;
|
329
354
|
|
330
355
|
if (propName) {
|
331
|
-
fnBody =
|
356
|
+
fnBody = memberExpression(_super(), identifier(propName));
|
332
357
|
} else {
|
333
358
|
const method = thisEnvFn.scope.generateUidIdentifier("prop");
|
334
359
|
argsList.unshift(method);
|
335
|
-
fnBody =
|
360
|
+
fnBody = memberExpression(_super(), identifier(method.name), true);
|
336
361
|
}
|
337
362
|
|
338
363
|
if (isAssignment) {
|
339
364
|
const valueIdent = thisEnvFn.scope.generateUidIdentifier("value");
|
340
365
|
argsList.push(valueIdent);
|
341
|
-
fnBody =
|
366
|
+
fnBody = assignmentExpression("=", fnBody, identifier(valueIdent.name));
|
342
367
|
}
|
343
368
|
|
344
|
-
return
|
369
|
+
return arrowFunctionExpression(argsList, fnBody);
|
345
370
|
});
|
346
371
|
}
|
347
372
|
|
package/lib/path/family.js
CHANGED
@@ -20,8 +20,15 @@ exports.getOuterBindingIdentifierPaths = getOuterBindingIdentifierPaths;
|
|
20
20
|
|
21
21
|
var _index = require("./index");
|
22
22
|
|
23
|
-
var
|
24
|
-
|
23
|
+
var _t = require("@babel/types");
|
24
|
+
|
25
|
+
const {
|
26
|
+
getBindingIdentifiers: _getBindingIdentifiers,
|
27
|
+
getOuterBindingIdentifiers: _getOuterBindingIdentifiers,
|
28
|
+
isDeclaration,
|
29
|
+
numericLiteral,
|
30
|
+
unaryExpression
|
31
|
+
} = _t;
|
25
32
|
const NORMAL_COMPLETION = 0;
|
26
33
|
const BREAK_COMPLETION = 1;
|
27
34
|
|
@@ -50,7 +57,10 @@ function getOpposite() {
|
|
50
57
|
}
|
51
58
|
|
52
59
|
function addCompletionRecords(path, records, context) {
|
53
|
-
if (path)
|
60
|
+
if (path) {
|
61
|
+
records.push(..._getCompletionRecords(path, context));
|
62
|
+
}
|
63
|
+
|
54
64
|
return records;
|
55
65
|
}
|
56
66
|
|
@@ -79,10 +89,10 @@ function completionRecordForSwitch(cases, records, context) {
|
|
79
89
|
lastNormalCompletions = normalCompletions;
|
80
90
|
}
|
81
91
|
|
82
|
-
records
|
92
|
+
records.push(...breakCompletions);
|
83
93
|
}
|
84
94
|
|
85
|
-
records
|
95
|
+
records.push(...lastNormalCompletions);
|
86
96
|
return records;
|
87
97
|
}
|
88
98
|
|
@@ -98,7 +108,7 @@ function replaceBreakStatementInBreakCompletion(completions, reachable) {
|
|
98
108
|
label: null
|
99
109
|
})) {
|
100
110
|
if (reachable) {
|
101
|
-
c.path.replaceWith(
|
111
|
+
c.path.replaceWith(unaryExpression("void", numericLiteral(0)));
|
102
112
|
} else {
|
103
113
|
c.path.remove();
|
104
114
|
}
|
@@ -107,7 +117,7 @@ function replaceBreakStatementInBreakCompletion(completions, reachable) {
|
|
107
117
|
}
|
108
118
|
|
109
119
|
function getStatementListCompletion(paths, context) {
|
110
|
-
|
120
|
+
const completions = [];
|
111
121
|
|
112
122
|
if (context.canHaveBreak) {
|
113
123
|
let lastNormalCompletions = [];
|
@@ -119,8 +129,8 @@ function getStatementListCompletion(paths, context) {
|
|
119
129
|
});
|
120
130
|
|
121
131
|
if (path.isBlockStatement() && (context.inCaseClause || context.shouldPopulateBreak)) {
|
122
|
-
|
123
|
-
|
132
|
+
newContext.shouldPopulateBreak = true;
|
133
|
+
} else {
|
124
134
|
newContext.shouldPopulateBreak = false;
|
125
135
|
}
|
126
136
|
|
@@ -131,16 +141,16 @@ function getStatementListCompletion(paths, context) {
|
|
131
141
|
label: null
|
132
142
|
}))) {
|
133
143
|
normalCompletionToBreak(lastNormalCompletions);
|
134
|
-
completions
|
144
|
+
completions.push(...lastNormalCompletions);
|
135
145
|
|
136
146
|
if (lastNormalCompletions.some(c => c.path.isDeclaration())) {
|
137
|
-
completions
|
147
|
+
completions.push(...statementCompletions);
|
138
148
|
replaceBreakStatementInBreakCompletion(statementCompletions, true);
|
139
149
|
}
|
140
150
|
|
141
151
|
replaceBreakStatementInBreakCompletion(statementCompletions, false);
|
142
152
|
} else {
|
143
|
-
completions
|
153
|
+
completions.push(...statementCompletions);
|
144
154
|
|
145
155
|
if (!context.shouldPopulateBreak) {
|
146
156
|
replaceBreakStatementInBreakCompletion(statementCompletions, true);
|
@@ -151,10 +161,21 @@ function getStatementListCompletion(paths, context) {
|
|
151
161
|
}
|
152
162
|
|
153
163
|
if (i === paths.length - 1) {
|
154
|
-
completions
|
164
|
+
completions.push(...statementCompletions);
|
155
165
|
} else {
|
156
|
-
|
157
|
-
|
166
|
+
lastNormalCompletions = [];
|
167
|
+
|
168
|
+
for (let i = 0; i < statementCompletions.length; i++) {
|
169
|
+
const c = statementCompletions[i];
|
170
|
+
|
171
|
+
if (c.type === BREAK_COMPLETION) {
|
172
|
+
completions.push(c);
|
173
|
+
}
|
174
|
+
|
175
|
+
if (c.type === NORMAL_COMPLETION) {
|
176
|
+
lastNormalCompletions.push(c);
|
177
|
+
}
|
178
|
+
}
|
158
179
|
}
|
159
180
|
}
|
160
181
|
} else if (paths.length) {
|
@@ -162,7 +183,7 @@ function getStatementListCompletion(paths, context) {
|
|
162
183
|
const pathCompletions = _getCompletionRecords(paths[i], context);
|
163
184
|
|
164
185
|
if (pathCompletions.length > 1 || pathCompletions.length === 1 && !pathCompletions[0].path.isVariableDeclaration()) {
|
165
|
-
completions
|
186
|
+
completions.push(...pathCompletions);
|
166
187
|
break;
|
167
188
|
}
|
168
189
|
}
|
@@ -178,24 +199,24 @@ function _getCompletionRecords(path, context) {
|
|
178
199
|
records = addCompletionRecords(path.get("consequent"), records, context);
|
179
200
|
records = addCompletionRecords(path.get("alternate"), records, context);
|
180
201
|
} else if (path.isDoExpression() || path.isFor() || path.isWhile() || path.isLabeledStatement()) {
|
181
|
-
|
202
|
+
return addCompletionRecords(path.get("body"), records, context);
|
182
203
|
} else if (path.isProgram() || path.isBlockStatement()) {
|
183
|
-
|
204
|
+
return getStatementListCompletion(path.get("body"), context);
|
184
205
|
} else if (path.isFunction()) {
|
185
206
|
return _getCompletionRecords(path.get("body"), context);
|
186
207
|
} else if (path.isTryStatement()) {
|
187
208
|
records = addCompletionRecords(path.get("block"), records, context);
|
188
209
|
records = addCompletionRecords(path.get("handler"), records, context);
|
189
210
|
} else if (path.isCatchClause()) {
|
190
|
-
|
211
|
+
return addCompletionRecords(path.get("body"), records, context);
|
191
212
|
} else if (path.isSwitchStatement()) {
|
192
|
-
|
213
|
+
return completionRecordForSwitch(path.get("cases"), records, context);
|
193
214
|
} else if (path.isSwitchCase()) {
|
194
|
-
|
215
|
+
return getStatementListCompletion(path.get("consequent"), {
|
195
216
|
canHaveBreak: true,
|
196
217
|
shouldPopulateBreak: false,
|
197
218
|
inCaseClause: true
|
198
|
-
})
|
219
|
+
});
|
199
220
|
} else if (path.isBreakStatement()) {
|
200
221
|
records.push(BreakCompletion(path));
|
201
222
|
} else {
|
@@ -313,23 +334,23 @@ function _getPattern(parts, context) {
|
|
313
334
|
}
|
314
335
|
|
315
336
|
function getBindingIdentifiers(duplicates) {
|
316
|
-
return
|
337
|
+
return _getBindingIdentifiers(this.node, duplicates);
|
317
338
|
}
|
318
339
|
|
319
340
|
function getOuterBindingIdentifiers(duplicates) {
|
320
|
-
return
|
341
|
+
return _getOuterBindingIdentifiers(this.node, duplicates);
|
321
342
|
}
|
322
343
|
|
323
344
|
function getBindingIdentifierPaths(duplicates = false, outerOnly = false) {
|
324
345
|
const path = this;
|
325
|
-
|
346
|
+
const search = [path];
|
326
347
|
const ids = Object.create(null);
|
327
348
|
|
328
349
|
while (search.length) {
|
329
350
|
const id = search.shift();
|
330
351
|
if (!id) continue;
|
331
352
|
if (!id.node) continue;
|
332
|
-
const keys =
|
353
|
+
const keys = _getBindingIdentifiers.keys[id.node.type];
|
333
354
|
|
334
355
|
if (id.isIdentifier()) {
|
335
356
|
if (duplicates) {
|
@@ -346,7 +367,7 @@ function getBindingIdentifierPaths(duplicates = false, outerOnly = false) {
|
|
346
367
|
if (id.isExportDeclaration()) {
|
347
368
|
const declaration = id.get("declaration");
|
348
369
|
|
349
|
-
if (
|
370
|
+
if (isDeclaration(declaration)) {
|
350
371
|
search.push(declaration);
|
351
372
|
}
|
352
373
|
|
@@ -369,8 +390,10 @@ function getBindingIdentifierPaths(duplicates = false, outerOnly = false) {
|
|
369
390
|
const key = keys[i];
|
370
391
|
const child = id.get(key);
|
371
392
|
|
372
|
-
if (Array.isArray(child)
|
373
|
-
search
|
393
|
+
if (Array.isArray(child)) {
|
394
|
+
search.push(...child);
|
395
|
+
} else if (child.node) {
|
396
|
+
search.push(child);
|
374
397
|
}
|
375
398
|
}
|
376
399
|
}
|
package/lib/path/index.js
CHANGED
@@ -13,7 +13,9 @@ var _index = require("../index");
|
|
13
13
|
|
14
14
|
var _scope = require("../scope");
|
15
15
|
|
16
|
-
var
|
16
|
+
var _t = require("@babel/types");
|
17
|
+
|
18
|
+
var t = _t;
|
17
19
|
|
18
20
|
var _cache = require("../cache");
|
19
21
|
|
@@ -41,6 +43,10 @@ var NodePath_family = require("./family");
|
|
41
43
|
|
42
44
|
var NodePath_comments = require("./comments");
|
43
45
|
|
46
|
+
const {
|
47
|
+
validate
|
48
|
+
} = _t;
|
49
|
+
|
44
50
|
const debug = _debug("babel");
|
45
51
|
|
46
52
|
const REMOVED = 1 << 0;
|
@@ -138,7 +144,7 @@ class NodePath {
|
|
138
144
|
}
|
139
145
|
|
140
146
|
set(key, node) {
|
141
|
-
|
147
|
+
validate(this.node, key, node);
|
142
148
|
this.node[key] = node;
|
143
149
|
}
|
144
150
|
|