@babel/traverse 7.17.9 → 7.23.3
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.
- package/README.md +1 -1
- package/lib/cache.js +27 -9
- package/lib/cache.js.map +1 -0
- package/lib/context.js +9 -31
- package/lib/context.js.map +1 -0
- package/lib/hub.js +2 -6
- package/lib/hub.js.map +1 -0
- package/lib/index.js +18 -35
- package/lib/index.js.map +1 -0
- package/lib/path/ancestry.js +3 -42
- package/lib/path/ancestry.js.map +1 -0
- package/lib/path/comments.js +23 -11
- package/lib/path/comments.js.map +1 -0
- package/lib/path/context.js +24 -65
- package/lib/path/context.js.map +1 -0
- package/lib/path/conversion.js +37 -100
- package/lib/path/conversion.js.map +1 -0
- package/lib/path/evaluation.js +69 -123
- package/lib/path/evaluation.js.map +1 -0
- package/lib/path/family.js +5 -76
- package/lib/path/family.js.map +1 -0
- package/lib/path/index.js +28 -96
- package/lib/path/index.js.map +1 -0
- package/lib/path/inference/index.js +26 -33
- package/lib/path/inference/index.js.map +1 -0
- package/lib/path/inference/inferer-reference.js +6 -61
- package/lib/path/inference/inferer-reference.js.map +1 -0
- package/lib/path/inference/inferers.js +32 -86
- package/lib/path/inference/inferers.js.map +1 -0
- package/lib/path/inference/util.js +30 -0
- package/lib/path/inference/util.js.map +1 -0
- package/lib/path/introspection.js +55 -107
- package/lib/path/introspection.js.map +1 -0
- package/lib/path/lib/hoister.js +2 -37
- package/lib/path/lib/hoister.js.map +1 -0
- package/lib/path/lib/removal-hooks.js +4 -5
- package/lib/path/lib/removal-hooks.js.map +1 -0
- package/lib/path/lib/virtual-types-validator.js +161 -0
- package/lib/path/lib/virtual-types-validator.js.map +1 -0
- package/lib/path/lib/virtual-types.js +20 -224
- package/lib/path/lib/virtual-types.js.map +1 -0
- package/lib/path/modification.js +17 -61
- package/lib/path/modification.js.map +1 -0
- package/lib/path/removal.js +9 -22
- package/lib/path/removal.js.map +1 -0
- package/lib/path/replacement.js +80 -76
- package/lib/path/replacement.js.map +1 -0
- package/lib/scope/binding.js +20 -12
- package/lib/scope/binding.js.map +1 -0
- package/lib/scope/index.js +117 -247
- package/lib/scope/index.js.map +1 -0
- package/lib/scope/lib/renamer.js +41 -74
- package/lib/scope/lib/renamer.js.map +1 -0
- package/lib/traverse-node.js +10 -11
- package/lib/traverse-node.js.map +1 -0
- package/lib/types.js +1 -3
- package/lib/types.js.map +1 -0
- package/lib/visitors.js +62 -83
- package/lib/visitors.js.map +1 -0
- package/package.json +13 -11
- package/lib/path/generated/asserts.js +0 -5
- package/lib/path/generated/validators.js +0 -5
- package/lib/path/generated/virtual-types.js +0 -3
- package/scripts/generators/asserts.js +0 -25
- package/scripts/generators/validators.js +0 -42
- package/scripts/generators/virtual-types.js +0 -24
- package/scripts/package.json +0 -1
package/lib/path/replacement.js
CHANGED
@@ -9,73 +9,67 @@ exports.replaceInline = replaceInline;
|
|
9
9
|
exports.replaceWith = replaceWith;
|
10
10
|
exports.replaceWithMultiple = replaceWithMultiple;
|
11
11
|
exports.replaceWithSourceString = replaceWithSourceString;
|
12
|
-
|
13
12
|
var _codeFrame = require("@babel/code-frame");
|
14
|
-
|
15
|
-
var
|
16
|
-
|
17
|
-
var _index2 = require("./index");
|
18
|
-
|
19
|
-
var _cache = require("../cache");
|
20
|
-
|
13
|
+
var _index = require("../index.js");
|
14
|
+
var _index2 = require("./index.js");
|
15
|
+
var _cache = require("../cache.js");
|
21
16
|
var _parser = require("@babel/parser");
|
22
|
-
|
23
17
|
var _t = require("@babel/types");
|
24
|
-
|
25
18
|
var _helperHoistVariables = require("@babel/helper-hoist-variables");
|
26
|
-
|
27
19
|
const {
|
28
20
|
FUNCTION_TYPES,
|
29
21
|
arrowFunctionExpression,
|
30
22
|
assignmentExpression,
|
31
23
|
awaitExpression,
|
32
24
|
blockStatement,
|
25
|
+
buildUndefinedNode,
|
33
26
|
callExpression,
|
34
27
|
cloneNode,
|
28
|
+
conditionalExpression,
|
35
29
|
expressionStatement,
|
30
|
+
getBindingIdentifiers,
|
36
31
|
identifier,
|
37
32
|
inheritLeadingComments,
|
38
33
|
inheritTrailingComments,
|
39
34
|
inheritsComments,
|
35
|
+
isBlockStatement,
|
36
|
+
isEmptyStatement,
|
40
37
|
isExpression,
|
38
|
+
isExpressionStatement,
|
39
|
+
isIfStatement,
|
41
40
|
isProgram,
|
42
41
|
isStatement,
|
42
|
+
isVariableDeclaration,
|
43
43
|
removeComments,
|
44
44
|
returnStatement,
|
45
|
-
|
45
|
+
sequenceExpression,
|
46
46
|
validate,
|
47
47
|
yieldExpression
|
48
48
|
} = _t;
|
49
|
-
|
50
49
|
function replaceWithMultiple(nodes) {
|
51
|
-
var
|
52
|
-
|
50
|
+
var _getCachedPaths;
|
53
51
|
this.resync();
|
54
52
|
nodes = this._verifyNodeList(nodes);
|
55
53
|
inheritLeadingComments(nodes[0], this.node);
|
56
54
|
inheritTrailingComments(nodes[nodes.length - 1], this.node);
|
57
|
-
(
|
55
|
+
(_getCachedPaths = (0, _cache.getCachedPaths)(this.hub, this.parent)) == null || _getCachedPaths.delete(this.node);
|
58
56
|
this.node = this.container[this.key] = null;
|
59
57
|
const paths = this.insertAfter(nodes);
|
60
|
-
|
61
58
|
if (this.node) {
|
62
59
|
this.requeue();
|
63
60
|
} else {
|
64
61
|
this.remove();
|
65
62
|
}
|
66
|
-
|
67
63
|
return paths;
|
68
64
|
}
|
69
|
-
|
70
65
|
function replaceWithSourceString(replacement) {
|
71
66
|
this.resync();
|
72
|
-
|
67
|
+
let ast;
|
73
68
|
try {
|
74
69
|
replacement = `(${replacement})`;
|
75
|
-
|
70
|
+
ast = (0, _parser.parse)(replacement);
|
76
71
|
} catch (err) {
|
77
72
|
const loc = err.loc;
|
78
|
-
|
79
73
|
if (loc) {
|
80
74
|
err.message += " - make sure this is an expression.\n" + (0, _codeFrame.codeFrameColumns)(replacement, {
|
81
75
|
start: {
|
@@ -85,104 +79,80 @@ function replaceWithSourceString(replacement) {
|
|
85
79
|
});
|
86
80
|
err.code = "BABEL_REPLACE_SOURCE_ERROR";
|
87
81
|
}
|
88
|
-
|
89
82
|
throw err;
|
90
83
|
}
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
_index.default.removeProperties(replacement);
|
95
|
-
|
96
|
-
return this.replaceWith(replacement);
|
84
|
+
const expressionAST = ast.program.body[0].expression;
|
85
|
+
_index.default.removeProperties(expressionAST);
|
86
|
+
return this.replaceWith(expressionAST);
|
97
87
|
}
|
98
|
-
|
99
|
-
function replaceWith(replacement) {
|
88
|
+
function replaceWith(replacementPath) {
|
100
89
|
this.resync();
|
101
|
-
|
102
90
|
if (this.removed) {
|
103
91
|
throw new Error("You can't replace this node, we've already removed it");
|
104
92
|
}
|
105
|
-
|
106
|
-
if (replacement instanceof _index2.default) {
|
107
|
-
replacement = replacement.node;
|
108
|
-
}
|
109
|
-
|
93
|
+
let replacement = replacementPath instanceof _index2.default ? replacementPath.node : replacementPath;
|
110
94
|
if (!replacement) {
|
111
95
|
throw new Error("You passed `path.replaceWith()` a falsy node, use `path.remove()` instead");
|
112
96
|
}
|
113
|
-
|
114
97
|
if (this.node === replacement) {
|
115
98
|
return [this];
|
116
99
|
}
|
117
|
-
|
118
100
|
if (this.isProgram() && !isProgram(replacement)) {
|
119
101
|
throw new Error("You can only replace a Program root node with another Program node");
|
120
102
|
}
|
121
|
-
|
122
103
|
if (Array.isArray(replacement)) {
|
123
104
|
throw new Error("Don't use `path.replaceWith()` with an array of nodes, use `path.replaceWithMultiple()`");
|
124
105
|
}
|
125
|
-
|
126
106
|
if (typeof replacement === "string") {
|
127
107
|
throw new Error("Don't use `path.replaceWith()` with a source string, use `path.replaceWithSourceString()`");
|
128
108
|
}
|
129
|
-
|
130
109
|
let nodePath = "";
|
131
|
-
|
132
110
|
if (this.isNodeType("Statement") && isExpression(replacement)) {
|
133
111
|
if (!this.canHaveVariableDeclarationOrExpression() && !this.canSwapBetweenExpressionAndStatement(replacement) && !this.parentPath.isExportDefaultDeclaration()) {
|
134
112
|
replacement = expressionStatement(replacement);
|
135
113
|
nodePath = "expression";
|
136
114
|
}
|
137
115
|
}
|
138
|
-
|
139
116
|
if (this.isNodeType("Expression") && isStatement(replacement)) {
|
140
117
|
if (!this.canHaveVariableDeclarationOrExpression() && !this.canSwapBetweenExpressionAndStatement(replacement)) {
|
141
118
|
return this.replaceExpressionWithStatements([replacement]);
|
142
119
|
}
|
143
120
|
}
|
144
|
-
|
145
121
|
const oldNode = this.node;
|
146
|
-
|
147
122
|
if (oldNode) {
|
148
123
|
inheritsComments(replacement, oldNode);
|
149
124
|
removeComments(oldNode);
|
150
125
|
}
|
151
|
-
|
152
126
|
this._replaceWith(replacement);
|
153
|
-
|
154
127
|
this.type = replacement.type;
|
155
128
|
this.setScope();
|
156
129
|
this.requeue();
|
157
130
|
return [nodePath ? this.get(nodePath) : this];
|
158
131
|
}
|
159
|
-
|
160
132
|
function _replaceWith(node) {
|
161
|
-
var
|
162
|
-
|
133
|
+
var _getCachedPaths2;
|
163
134
|
if (!this.container) {
|
164
135
|
throw new ReferenceError("Container is falsy");
|
165
136
|
}
|
166
|
-
|
167
137
|
if (this.inList) {
|
168
138
|
validate(this.parent, this.key, [node]);
|
169
139
|
} else {
|
170
140
|
validate(this.parent, this.key, node);
|
171
141
|
}
|
172
|
-
|
173
142
|
this.debug(`Replace with ${node == null ? void 0 : node.type}`);
|
174
|
-
(
|
143
|
+
(_getCachedPaths2 = (0, _cache.getCachedPaths)(this.hub, this.parent)) == null || _getCachedPaths2.set(node, this).delete(this.node);
|
175
144
|
this.node = this.container[this.key] = node;
|
176
145
|
}
|
177
|
-
|
178
146
|
function replaceExpressionWithStatements(nodes) {
|
179
147
|
this.resync();
|
180
|
-
const
|
181
|
-
|
182
|
-
if (
|
183
|
-
|
148
|
+
const declars = [];
|
149
|
+
const nodesAsSingleExpression = gatherSequenceExpressions(nodes, declars);
|
150
|
+
if (nodesAsSingleExpression) {
|
151
|
+
for (const id of declars) this.scope.push({
|
152
|
+
id
|
153
|
+
});
|
154
|
+
return this.replaceWith(nodesAsSingleExpression)[0].get("expressions");
|
184
155
|
}
|
185
|
-
|
186
156
|
const functionParent = this.getFunctionParent();
|
187
157
|
const isParentAsync = functionParent == null ? void 0 : functionParent.is("async");
|
188
158
|
const isParentGenerator = functionParent == null ? void 0 : functionParent.is("generator");
|
@@ -195,14 +165,11 @@ function replaceExpressionWithStatements(nodes) {
|
|
195
165
|
});
|
196
166
|
}, "var");
|
197
167
|
const completionRecords = this.get("callee").getCompletionRecords();
|
198
|
-
|
199
168
|
for (const path of completionRecords) {
|
200
169
|
if (!path.isExpressionStatement()) continue;
|
201
170
|
const loop = path.findParent(path => path.isLoop());
|
202
|
-
|
203
171
|
if (loop) {
|
204
172
|
let uid = loop.getData("expressionReplacementReturnUid");
|
205
|
-
|
206
173
|
if (!uid) {
|
207
174
|
uid = callee.scope.generateDeclaredUidIdentifier("ret");
|
208
175
|
callee.get("body").pushContainer("body", returnStatement(cloneNode(uid)));
|
@@ -210,45 +177,80 @@ function replaceExpressionWithStatements(nodes) {
|
|
210
177
|
} else {
|
211
178
|
uid = identifier(uid.name);
|
212
179
|
}
|
213
|
-
|
214
180
|
path.get("expression").replaceWith(assignmentExpression("=", cloneNode(uid), path.node.expression));
|
215
181
|
} else {
|
216
182
|
path.replaceWith(returnStatement(path.node.expression));
|
217
183
|
}
|
218
184
|
}
|
219
|
-
|
220
185
|
callee.arrowFunctionToExpression();
|
221
186
|
const newCallee = callee;
|
222
|
-
|
223
187
|
const needToAwaitFunction = isParentAsync && _index.default.hasType(this.get("callee.body").node, "AwaitExpression", FUNCTION_TYPES);
|
224
|
-
|
225
188
|
const needToYieldFunction = isParentGenerator && _index.default.hasType(this.get("callee.body").node, "YieldExpression", FUNCTION_TYPES);
|
226
|
-
|
227
189
|
if (needToAwaitFunction) {
|
228
190
|
newCallee.set("async", true);
|
229
|
-
|
230
191
|
if (!needToYieldFunction) {
|
231
192
|
this.replaceWith(awaitExpression(this.node));
|
232
193
|
}
|
233
194
|
}
|
234
|
-
|
235
195
|
if (needToYieldFunction) {
|
236
196
|
newCallee.set("generator", true);
|
237
197
|
this.replaceWith(yieldExpression(this.node, true));
|
238
198
|
}
|
239
|
-
|
240
199
|
return newCallee.get("body.body");
|
241
200
|
}
|
242
|
-
|
201
|
+
function gatherSequenceExpressions(nodes, declars) {
|
202
|
+
const exprs = [];
|
203
|
+
let ensureLastUndefined = true;
|
204
|
+
for (const node of nodes) {
|
205
|
+
if (!isEmptyStatement(node)) {
|
206
|
+
ensureLastUndefined = false;
|
207
|
+
}
|
208
|
+
if (isExpression(node)) {
|
209
|
+
exprs.push(node);
|
210
|
+
} else if (isExpressionStatement(node)) {
|
211
|
+
exprs.push(node.expression);
|
212
|
+
} else if (isVariableDeclaration(node)) {
|
213
|
+
if (node.kind !== "var") return;
|
214
|
+
for (const declar of node.declarations) {
|
215
|
+
const bindings = getBindingIdentifiers(declar);
|
216
|
+
for (const key of Object.keys(bindings)) {
|
217
|
+
declars.push(cloneNode(bindings[key]));
|
218
|
+
}
|
219
|
+
if (declar.init) {
|
220
|
+
exprs.push(assignmentExpression("=", declar.id, declar.init));
|
221
|
+
}
|
222
|
+
}
|
223
|
+
ensureLastUndefined = true;
|
224
|
+
} else if (isIfStatement(node)) {
|
225
|
+
const consequent = node.consequent ? gatherSequenceExpressions([node.consequent], declars) : buildUndefinedNode();
|
226
|
+
const alternate = node.alternate ? gatherSequenceExpressions([node.alternate], declars) : buildUndefinedNode();
|
227
|
+
if (!consequent || !alternate) return;
|
228
|
+
exprs.push(conditionalExpression(node.test, consequent, alternate));
|
229
|
+
} else if (isBlockStatement(node)) {
|
230
|
+
const body = gatherSequenceExpressions(node.body, declars);
|
231
|
+
if (!body) return;
|
232
|
+
exprs.push(body);
|
233
|
+
} else if (isEmptyStatement(node)) {
|
234
|
+
if (nodes.indexOf(node) === 0) {
|
235
|
+
ensureLastUndefined = true;
|
236
|
+
}
|
237
|
+
} else {
|
238
|
+
return;
|
239
|
+
}
|
240
|
+
}
|
241
|
+
if (ensureLastUndefined) exprs.push(buildUndefinedNode());
|
242
|
+
if (exprs.length === 1) {
|
243
|
+
return exprs[0];
|
244
|
+
} else {
|
245
|
+
return sequenceExpression(exprs);
|
246
|
+
}
|
247
|
+
}
|
243
248
|
function replaceInline(nodes) {
|
244
249
|
this.resync();
|
245
|
-
|
246
250
|
if (Array.isArray(nodes)) {
|
247
251
|
if (Array.isArray(this.container)) {
|
248
252
|
nodes = this._verifyNodeList(nodes);
|
249
|
-
|
250
253
|
const paths = this._containerInsertAfter(nodes);
|
251
|
-
|
252
254
|
this.remove();
|
253
255
|
return paths;
|
254
256
|
} else {
|
@@ -257,4 +259,6 @@ function replaceInline(nodes) {
|
|
257
259
|
} else {
|
258
260
|
return this.replaceWith(nodes);
|
259
261
|
}
|
260
|
-
}
|
262
|
+
}
|
263
|
+
|
264
|
+
//# sourceMappingURL=replacement.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["_codeFrame","require","_index","_index2","_cache","_parser","_t","_helperHoistVariables","FUNCTION_TYPES","arrowFunctionExpression","assignmentExpression","awaitExpression","blockStatement","buildUndefinedNode","callExpression","cloneNode","conditionalExpression","expressionStatement","getBindingIdentifiers","identifier","inheritLeadingComments","inheritTrailingComments","inheritsComments","isBlockStatement","isEmptyStatement","isExpression","isExpressionStatement","isIfStatement","isProgram","isStatement","isVariableDeclaration","removeComments","returnStatement","sequenceExpression","validate","yieldExpression","replaceWithMultiple","nodes","_getCachedPaths","resync","_verifyNodeList","node","length","getCachedPaths","hub","parent","delete","container","key","paths","insertAfter","requeue","remove","replaceWithSourceString","replacement","ast","parse","err","loc","message","codeFrameColumns","start","line","column","code","expressionAST","program","body","expression","traverse","removeProperties","replaceWith","replacementPath","removed","Error","NodePath","Array","isArray","nodePath","isNodeType","canHaveVariableDeclarationOrExpression","canSwapBetweenExpressionAndStatement","parentPath","isExportDefaultDeclaration","replaceExpressionWithStatements","oldNode","_replaceWith","type","setScope","get","_getCachedPaths2","ReferenceError","inList","debug","set","declars","nodesAsSingleExpression","gatherSequenceExpressions","id","scope","push","functionParent","getFunctionParent","isParentAsync","is","isParentGenerator","callee","hoistVariables","completionRecords","getCompletionRecords","path","loop","findParent","isLoop","uid","getData","generateDeclaredUidIdentifier","pushContainer","setData","name","arrowFunctionToExpression","newCallee","needToAwaitFunction","hasType","needToYieldFunction","exprs","ensureLastUndefined","kind","declar","declarations","bindings","Object","keys","init","consequent","alternate","test","indexOf","replaceInline","_containerInsertAfter"],"sources":["../../src/path/replacement.ts"],"sourcesContent":["// This file contains methods responsible for replacing a node with another.\n\nimport { codeFrameColumns } from \"@babel/code-frame\";\nimport traverse from \"../index.ts\";\nimport NodePath from \"./index.ts\";\nimport { getCachedPaths } from \"../cache.ts\";\nimport { parse } from \"@babel/parser\";\nimport {\n FUNCTION_TYPES,\n arrowFunctionExpression,\n assignmentExpression,\n awaitExpression,\n blockStatement,\n buildUndefinedNode,\n callExpression,\n cloneNode,\n conditionalExpression,\n expressionStatement,\n getBindingIdentifiers,\n identifier,\n inheritLeadingComments,\n inheritTrailingComments,\n inheritsComments,\n isBlockStatement,\n isEmptyStatement,\n isExpression,\n isExpressionStatement,\n isIfStatement,\n isProgram,\n isStatement,\n isVariableDeclaration,\n removeComments,\n returnStatement,\n sequenceExpression,\n validate,\n yieldExpression,\n} from \"@babel/types\";\nimport type * as t from \"@babel/types\";\nimport hoistVariables from \"@babel/helper-hoist-variables\";\n\n/**\n * Replace a node with an array of multiple. This method performs the following steps:\n *\n * - Inherit the comments of first provided node with that of the current node.\n * - Insert the provided nodes after the current node.\n * - Remove the current node.\n */\n\nexport function replaceWithMultiple(\n this: NodePath,\n nodes: t.Node | t.Node[],\n): NodePath[] {\n this.resync();\n\n nodes = this._verifyNodeList(nodes);\n inheritLeadingComments(nodes[0], this.node);\n inheritTrailingComments(nodes[nodes.length - 1], this.node);\n getCachedPaths(this.hub, this.parent)?.delete(this.node);\n this.node =\n // @ts-expect-error this.key must present in this.container\n this.container[this.key] = null;\n const paths = this.insertAfter(nodes);\n\n if (this.node) {\n this.requeue();\n } else {\n this.remove();\n }\n return paths;\n}\n\n/**\n * Parse a string as an expression and replace the current node with the result.\n *\n * NOTE: This is typically not a good idea to use. Building source strings when\n * transforming ASTs is an antipattern and SHOULD NOT be encouraged. Even if it's\n * easier to use, your transforms will be extremely brittle.\n */\n\nexport function replaceWithSourceString(this: NodePath, replacement: string) {\n this.resync();\n let ast: t.File;\n\n try {\n replacement = `(${replacement})`;\n // @ts-expect-error todo: use babel-types ast typings in Babel parser\n ast = parse(replacement);\n } catch (err) {\n const loc = err.loc;\n if (loc) {\n err.message +=\n \" - make sure this is an expression.\\n\" +\n codeFrameColumns(replacement, {\n start: {\n line: loc.line,\n column: loc.column + 1,\n },\n });\n err.code = \"BABEL_REPLACE_SOURCE_ERROR\";\n }\n throw err;\n }\n\n const expressionAST = (ast.program.body[0] as t.ExpressionStatement)\n .expression;\n traverse.removeProperties(expressionAST);\n return this.replaceWith(expressionAST);\n}\n\n/**\n * Replace the current node with another.\n */\n\nexport function replaceWith<R extends t.Node>(\n this: NodePath,\n replacementPath: R | NodePath<R>,\n): [NodePath<R>] {\n this.resync();\n\n if (this.removed) {\n throw new Error(\"You can't replace this node, we've already removed it\");\n }\n\n let replacement: t.Node =\n replacementPath instanceof NodePath\n ? replacementPath.node\n : replacementPath;\n\n if (!replacement) {\n throw new Error(\n \"You passed `path.replaceWith()` a falsy node, use `path.remove()` instead\",\n );\n }\n\n if (this.node === replacement) {\n return [this as NodePath<R>];\n }\n\n if (this.isProgram() && !isProgram(replacement)) {\n throw new Error(\n \"You can only replace a Program root node with another Program node\",\n );\n }\n\n if (Array.isArray(replacement)) {\n throw new Error(\n \"Don't use `path.replaceWith()` with an array of nodes, use `path.replaceWithMultiple()`\",\n );\n }\n\n if (typeof replacement === \"string\") {\n throw new Error(\n \"Don't use `path.replaceWith()` with a source string, use `path.replaceWithSourceString()`\",\n );\n }\n\n let nodePath = \"\";\n\n if (this.isNodeType(\"Statement\") && isExpression(replacement)) {\n if (\n !this.canHaveVariableDeclarationOrExpression() &&\n !this.canSwapBetweenExpressionAndStatement(replacement) &&\n !this.parentPath.isExportDefaultDeclaration()\n ) {\n // replacing a statement with an expression so wrap it in an expression statement\n replacement = expressionStatement(replacement);\n nodePath = \"expression\";\n }\n }\n\n if (this.isNodeType(\"Expression\") && isStatement(replacement)) {\n if (\n !this.canHaveVariableDeclarationOrExpression() &&\n !this.canSwapBetweenExpressionAndStatement(replacement)\n ) {\n // replacing an expression with a statement so let's explode it\n return this.replaceExpressionWithStatements([replacement]) as [\n NodePath<R>,\n ];\n }\n }\n\n const oldNode = this.node;\n if (oldNode) {\n inheritsComments(replacement, oldNode);\n removeComments(oldNode);\n }\n\n // replace the node\n this._replaceWith(replacement);\n this.type = replacement.type;\n\n // potentially create new scope\n this.setScope();\n\n // requeue for visiting\n this.requeue();\n\n return [\n nodePath ? (this.get(nodePath) as NodePath<R>) : (this as NodePath<R>),\n ];\n}\n\n/**\n * Description\n */\n\nexport function _replaceWith(this: NodePath, node: t.Node) {\n if (!this.container) {\n throw new ReferenceError(\"Container is falsy\");\n }\n\n if (this.inList) {\n // @ts-expect-error todo(flow->ts): check if validate accepts a numeric key\n validate(this.parent, this.key, [node]);\n } else {\n validate(this.parent, this.key as string, node);\n }\n\n this.debug(`Replace with ${node?.type}`);\n getCachedPaths(this.hub, this.parent)?.set(node, this).delete(this.node);\n\n this.node =\n // @ts-expect-error this.key must present in this.container\n this.container[this.key] = node;\n}\n\n/**\n * This method takes an array of statements nodes and then explodes it\n * into expressions. This method retains completion records which is\n * extremely important to retain original semantics.\n */\n\nexport function replaceExpressionWithStatements(\n this: NodePath,\n nodes: Array<t.Statement>,\n) {\n this.resync();\n\n const declars: t.Identifier[] = [];\n const nodesAsSingleExpression = gatherSequenceExpressions(nodes, declars);\n if (nodesAsSingleExpression) {\n for (const id of declars) this.scope.push({ id });\n return this.replaceWith(nodesAsSingleExpression)[0].get(\"expressions\");\n }\n\n const functionParent = this.getFunctionParent();\n const isParentAsync = functionParent?.is(\"async\");\n const isParentGenerator = functionParent?.is(\"generator\");\n\n const container = arrowFunctionExpression([], blockStatement(nodes));\n\n this.replaceWith(callExpression(container, []));\n // replaceWith changes the type of \"this\", but it isn't trackable by TS\n type ThisType = NodePath<\n t.CallExpression & {\n callee: t.ArrowFunctionExpression & { body: t.BlockStatement };\n }\n >;\n\n // hoist variable declaration in do block\n // `(do { var x = 1; x;})` -> `var x; (() => { x = 1; return x; })()`\n const callee = (this as ThisType).get(\"callee\");\n hoistVariables(\n callee.get(\"body\"),\n (id: t.Identifier) => {\n this.scope.push({ id });\n },\n \"var\",\n );\n\n // add implicit returns to all ending expression statements\n const completionRecords: Array<NodePath> = (this as ThisType)\n .get(\"callee\")\n .getCompletionRecords();\n for (const path of completionRecords) {\n if (!path.isExpressionStatement()) continue;\n\n const loop = path.findParent(path => path.isLoop());\n if (loop) {\n let uid = loop.getData(\"expressionReplacementReturnUid\");\n\n if (!uid) {\n uid = callee.scope.generateDeclaredUidIdentifier(\"ret\");\n callee\n .get(\"body\")\n .pushContainer(\"body\", returnStatement(cloneNode(uid)));\n loop.setData(\"expressionReplacementReturnUid\", uid);\n } else {\n uid = identifier(uid.name);\n }\n\n path\n .get(\"expression\")\n .replaceWith(\n assignmentExpression(\"=\", cloneNode(uid), path.node.expression),\n );\n } else {\n path.replaceWith(returnStatement(path.node.expression));\n }\n }\n\n // This is an IIFE, so we don't need to worry about the noNewArrows assumption\n callee.arrowFunctionToExpression();\n // Fixme: we can not `assert this is NodePath<t.FunctionExpression>` in `arrowFunctionToExpression`\n // because it is not a class method known at compile time.\n const newCallee = callee as unknown as NodePath<t.FunctionExpression>;\n\n // (() => await xxx)() -> await (async () => await xxx)();\n const needToAwaitFunction =\n isParentAsync &&\n traverse.hasType(\n (this.get(\"callee.body\") as NodePath<t.BlockStatement>).node,\n \"AwaitExpression\",\n FUNCTION_TYPES,\n );\n const needToYieldFunction =\n isParentGenerator &&\n traverse.hasType(\n (this.get(\"callee.body\") as NodePath<t.BlockStatement>).node,\n \"YieldExpression\",\n FUNCTION_TYPES,\n );\n if (needToAwaitFunction) {\n newCallee.set(\"async\", true);\n // yield* will await the generator return result\n if (!needToYieldFunction) {\n this.replaceWith(awaitExpression((this as ThisType).node));\n }\n }\n if (needToYieldFunction) {\n newCallee.set(\"generator\", true);\n this.replaceWith(yieldExpression((this as ThisType).node, true));\n }\n\n return newCallee.get(\"body.body\");\n}\n\nfunction gatherSequenceExpressions(\n nodes: ReadonlyArray<t.Node>,\n declars: Array<t.Identifier>,\n) {\n const exprs: t.Expression[] = [];\n let ensureLastUndefined = true;\n\n for (const node of nodes) {\n // if we encounter emptyStatement before a non-emptyStatement\n // we want to disregard that\n if (!isEmptyStatement(node)) {\n ensureLastUndefined = false;\n }\n\n if (isExpression(node)) {\n exprs.push(node);\n } else if (isExpressionStatement(node)) {\n exprs.push(node.expression);\n } else if (isVariableDeclaration(node)) {\n if (node.kind !== \"var\") return; // bailed\n\n for (const declar of node.declarations) {\n const bindings = getBindingIdentifiers(declar);\n for (const key of Object.keys(bindings)) {\n declars.push(cloneNode(bindings[key]));\n }\n\n if (declar.init) {\n exprs.push(assignmentExpression(\"=\", declar.id, declar.init));\n }\n }\n\n ensureLastUndefined = true;\n } else if (isIfStatement(node)) {\n const consequent = node.consequent\n ? gatherSequenceExpressions([node.consequent], declars)\n : buildUndefinedNode();\n const alternate = node.alternate\n ? gatherSequenceExpressions([node.alternate], declars)\n : buildUndefinedNode();\n if (!consequent || !alternate) return; // bailed\n\n exprs.push(conditionalExpression(node.test, consequent, alternate));\n } else if (isBlockStatement(node)) {\n const body = gatherSequenceExpressions(node.body, declars);\n if (!body) return; // bailed\n\n exprs.push(body);\n } else if (isEmptyStatement(node)) {\n // empty statement so ensure the last item is undefined if we're last\n // checks if emptyStatement is first\n if (nodes.indexOf(node) === 0) {\n ensureLastUndefined = true;\n }\n } else {\n // bailed, we can't turn this statement into an expression\n return;\n }\n }\n\n if (ensureLastUndefined) exprs.push(buildUndefinedNode());\n\n if (exprs.length === 1) {\n return exprs[0];\n } else {\n return sequenceExpression(exprs);\n }\n}\n\nexport function replaceInline(this: NodePath, nodes: t.Node | Array<t.Node>) {\n this.resync();\n\n if (Array.isArray(nodes)) {\n if (Array.isArray(this.container)) {\n nodes = this._verifyNodeList(nodes);\n const paths = this._containerInsertAfter(nodes);\n this.remove();\n return paths;\n } else {\n return this.replaceWithMultiple(nodes);\n }\n } else {\n return this.replaceWith(nodes);\n }\n}\n"],"mappings":"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"}
|
package/lib/scope/binding.js
CHANGED
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
5
5
|
});
|
6
6
|
exports.default = void 0;
|
7
|
-
|
8
7
|
class Binding {
|
9
8
|
constructor({
|
10
9
|
identifier,
|
@@ -25,51 +24,60 @@ class Binding {
|
|
25
24
|
this.scope = scope;
|
26
25
|
this.path = path;
|
27
26
|
this.kind = kind;
|
27
|
+
if ((kind === "var" || kind === "hoisted") && isDeclaredInLoop(path)) {
|
28
|
+
this.reassign(path);
|
29
|
+
}
|
28
30
|
this.clearValue();
|
29
31
|
}
|
30
|
-
|
31
32
|
deoptValue() {
|
32
33
|
this.clearValue();
|
33
34
|
this.hasDeoptedValue = true;
|
34
35
|
}
|
35
|
-
|
36
36
|
setValue(value) {
|
37
37
|
if (this.hasDeoptedValue) return;
|
38
38
|
this.hasValue = true;
|
39
39
|
this.value = value;
|
40
40
|
}
|
41
|
-
|
42
41
|
clearValue() {
|
43
42
|
this.hasDeoptedValue = false;
|
44
43
|
this.hasValue = false;
|
45
44
|
this.value = null;
|
46
45
|
}
|
47
|
-
|
48
46
|
reassign(path) {
|
49
47
|
this.constant = false;
|
50
|
-
|
51
48
|
if (this.constantViolations.indexOf(path) !== -1) {
|
52
49
|
return;
|
53
50
|
}
|
54
|
-
|
55
51
|
this.constantViolations.push(path);
|
56
52
|
}
|
57
|
-
|
58
53
|
reference(path) {
|
59
54
|
if (this.referencePaths.indexOf(path) !== -1) {
|
60
55
|
return;
|
61
56
|
}
|
62
|
-
|
63
57
|
this.referenced = true;
|
64
58
|
this.references++;
|
65
59
|
this.referencePaths.push(path);
|
66
60
|
}
|
67
|
-
|
68
61
|
dereference() {
|
69
62
|
this.references--;
|
70
63
|
this.referenced = !!this.references;
|
71
64
|
}
|
72
|
-
|
65
|
+
}
|
66
|
+
exports.default = Binding;
|
67
|
+
function isDeclaredInLoop(path) {
|
68
|
+
for (let {
|
69
|
+
parentPath,
|
70
|
+
key
|
71
|
+
} = path; parentPath; ({
|
72
|
+
parentPath,
|
73
|
+
key
|
74
|
+
} = parentPath)) {
|
75
|
+
if (parentPath.isFunctionParent()) return false;
|
76
|
+
if (parentPath.isWhile() || parentPath.isForXStatement() || parentPath.isForStatement() && key === "body") {
|
77
|
+
return true;
|
78
|
+
}
|
79
|
+
}
|
80
|
+
return false;
|
73
81
|
}
|
74
82
|
|
75
|
-
|
83
|
+
//# sourceMappingURL=binding.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["Binding","constructor","identifier","scope","path","kind","constantViolations","constant","referencePaths","referenced","references","isDeclaredInLoop","reassign","clearValue","deoptValue","hasDeoptedValue","setValue","value","hasValue","indexOf","push","reference","dereference","exports","default","parentPath","key","isFunctionParent","isWhile","isForXStatement","isForStatement"],"sources":["../../src/scope/binding.ts"],"sourcesContent":["import type NodePath from \"../path/index.ts\";\nimport type * as t from \"@babel/types\";\nimport type Scope from \"./index.ts\";\n\nexport type BindingKind =\n | \"var\" /* var declarator */\n | \"let\" /* let declarator, class declaration id, catch clause parameters */\n | \"const\" /* const/using declarator */\n | \"module\" /* import specifiers */\n | \"hoisted\" /* function declaration id */\n | \"param\" /* function declaration parameters */\n | \"local\" /* function expression id, class expression id */\n | \"unknown\"; /* export specifiers */\n/**\n * This class is responsible for a binding inside of a scope.\n *\n * It tracks the following:\n *\n * * Node path.\n * * Amount of times referenced by other nodes.\n * * Paths to nodes that reassign or modify this binding.\n * * The kind of binding. (Is it a parameter, declaration etc)\n */\n\nexport default class Binding {\n identifier: t.Identifier;\n scope: Scope;\n path: NodePath;\n kind: BindingKind;\n\n constructor({\n identifier,\n scope,\n path,\n kind,\n }: {\n identifier: t.Identifier;\n scope: Scope;\n path: NodePath;\n kind: BindingKind;\n }) {\n this.identifier = identifier;\n this.scope = scope;\n this.path = path;\n this.kind = kind;\n\n if ((kind === \"var\" || kind === \"hoisted\") && isDeclaredInLoop(path)) {\n this.reassign(path);\n }\n\n this.clearValue();\n }\n\n constantViolations: Array<NodePath> = [];\n constant: boolean = true;\n\n referencePaths: Array<NodePath> = [];\n referenced: boolean = false;\n references: number = 0;\n\n declare hasDeoptedValue: boolean;\n declare hasValue: boolean;\n declare value: any;\n\n deoptValue() {\n this.clearValue();\n this.hasDeoptedValue = true;\n }\n\n setValue(value: any) {\n if (this.hasDeoptedValue) return;\n this.hasValue = true;\n this.value = value;\n }\n\n clearValue() {\n this.hasDeoptedValue = false;\n this.hasValue = false;\n this.value = null;\n }\n\n /**\n * Register a constant violation with the provided `path`.\n */\n\n reassign(path: NodePath) {\n this.constant = false;\n if (this.constantViolations.indexOf(path) !== -1) {\n return;\n }\n this.constantViolations.push(path);\n }\n\n /**\n * Increment the amount of references to this binding.\n */\n\n reference(path: NodePath) {\n if (this.referencePaths.indexOf(path) !== -1) {\n return;\n }\n this.referenced = true;\n this.references++;\n this.referencePaths.push(path);\n }\n\n /**\n * Decrement the amount of references to this binding.\n */\n\n dereference() {\n this.references--;\n this.referenced = !!this.references;\n }\n}\n\nfunction isDeclaredInLoop(path: NodePath) {\n for (\n let { parentPath, key } = path;\n parentPath;\n { parentPath, key } = parentPath\n ) {\n if (parentPath.isFunctionParent()) return false;\n if (\n parentPath.isWhile() ||\n parentPath.isForXStatement() ||\n (parentPath.isForStatement() && key === \"body\")\n ) {\n return true;\n }\n }\n return false;\n}\n"],"mappings":";;;;;;AAwBe,MAAMA,OAAO,CAAC;EAM3BC,WAAWA,CAAC;IACVC,UAAU;IACVC,KAAK;IACLC,IAAI;IACJC;EAMF,CAAC,EAAE;IAAA,KAfHH,UAAU;IAAA,KACVC,KAAK;IAAA,KACLC,IAAI;IAAA,KACJC,IAAI;IAAA,KAyBJC,kBAAkB,GAAoB,EAAE;IAAA,KACxCC,QAAQ,GAAY,IAAI;IAAA,KAExBC,cAAc,GAAoB,EAAE;IAAA,KACpCC,UAAU,GAAY,KAAK;IAAA,KAC3BC,UAAU,GAAW,CAAC;IAjBpB,IAAI,CAACR,UAAU,GAAGA,UAAU;IAC5B,IAAI,CAACC,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACC,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACC,IAAI,GAAGA,IAAI;IAEhB,IAAI,CAACA,IAAI,KAAK,KAAK,IAAIA,IAAI,KAAK,SAAS,KAAKM,gBAAgB,CAACP,IAAI,CAAC,EAAE;MACpE,IAAI,CAACQ,QAAQ,CAACR,IAAI,CAAC;IACrB;IAEA,IAAI,CAACS,UAAU,CAAC,CAAC;EACnB;EAaAC,UAAUA,CAAA,EAAG;IACX,IAAI,CAACD,UAAU,CAAC,CAAC;IACjB,IAAI,CAACE,eAAe,GAAG,IAAI;EAC7B;EAEAC,QAAQA,CAACC,KAAU,EAAE;IACnB,IAAI,IAAI,CAACF,eAAe,EAAE;IAC1B,IAAI,CAACG,QAAQ,GAAG,IAAI;IACpB,IAAI,CAACD,KAAK,GAAGA,KAAK;EACpB;EAEAJ,UAAUA,CAAA,EAAG;IACX,IAAI,CAACE,eAAe,GAAG,KAAK;IAC5B,IAAI,CAACG,QAAQ,GAAG,KAAK;IACrB,IAAI,CAACD,KAAK,GAAG,IAAI;EACnB;EAMAL,QAAQA,CAACR,IAAc,EAAE;IACvB,IAAI,CAACG,QAAQ,GAAG,KAAK;IACrB,IAAI,IAAI,CAACD,kBAAkB,CAACa,OAAO,CAACf,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;MAChD;IACF;IACA,IAAI,CAACE,kBAAkB,CAACc,IAAI,CAAChB,IAAI,CAAC;EACpC;EAMAiB,SAASA,CAACjB,IAAc,EAAE;IACxB,IAAI,IAAI,CAACI,cAAc,CAACW,OAAO,CAACf,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;MAC5C;IACF;IACA,IAAI,CAACK,UAAU,GAAG,IAAI;IACtB,IAAI,CAACC,UAAU,EAAE;IACjB,IAAI,CAACF,cAAc,CAACY,IAAI,CAAChB,IAAI,CAAC;EAChC;EAMAkB,WAAWA,CAAA,EAAG;IACZ,IAAI,CAACZ,UAAU,EAAE;IACjB,IAAI,CAACD,UAAU,GAAG,CAAC,CAAC,IAAI,CAACC,UAAU;EACrC;AACF;AAACa,OAAA,CAAAC,OAAA,GAAAxB,OAAA;AAED,SAASW,gBAAgBA,CAACP,IAAc,EAAE;EACxC,KACE,IAAI;IAAEqB,UAAU;IAAEC;EAAI,CAAC,GAAGtB,IAAI,EAC9BqB,UAAU,GACV;IAAEA,UAAU;IAAEC;EAAI,CAAC,GAAGD,UAAU,GAChC;IACA,IAAIA,UAAU,CAACE,gBAAgB,CAAC,CAAC,EAAE,OAAO,KAAK;IAC/C,IACEF,UAAU,CAACG,OAAO,CAAC,CAAC,IACpBH,UAAU,CAACI,eAAe,CAAC,CAAC,IAC3BJ,UAAU,CAACK,cAAc,CAAC,CAAC,IAAIJ,GAAG,KAAK,MAAO,EAC/C;MACA,OAAO,IAAI;IACb;EACF;EACA,OAAO,KAAK;AACd"}
|