@babel/traverse 7.20.10 → 7.20.12
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 +2 -14
- package/lib/context.js.map +1 -1
- package/lib/index.js +1 -4
- package/lib/index.js.map +1 -1
- package/lib/path/ancestry.js +0 -19
- package/lib/path/ancestry.js.map +1 -1
- package/lib/path/comments.js +0 -2
- package/lib/path/comments.js.map +1 -1
- package/lib/path/context.js +5 -21
- package/lib/path/context.js.map +1 -1
- package/lib/path/conversion.js +6 -30
- package/lib/path/conversion.js.map +1 -1
- package/lib/path/evaluation.js +14 -20
- package/lib/path/evaluation.js.map +1 -1
- package/lib/path/family.js +3 -9
- package/lib/path/family.js.map +1 -1
- package/lib/path/index.js +1 -6
- package/lib/path/index.js.map +1 -1
- package/lib/path/inference/index.js +1 -9
- package/lib/path/inference/index.js.map +1 -1
- package/lib/path/inference/inferer-reference.js +1 -13
- package/lib/path/inference/inferer-reference.js.map +1 -1
- package/lib/path/inference/inferers.js +2 -5
- package/lib/path/inference/inferers.js.map +1 -1
- package/lib/path/introspection.js +1 -45
- package/lib/path/introspection.js.map +1 -1
- package/lib/path/lib/hoister.js +1 -22
- package/lib/path/lib/hoister.js.map +1 -1
- package/lib/path/lib/removal-hooks.js +1 -7
- package/lib/path/lib/removal-hooks.js.map +1 -1
- package/lib/path/lib/virtual-types-validator.js +0 -2
- package/lib/path/lib/virtual-types-validator.js.map +1 -1
- package/lib/path/lib/virtual-types.js +0 -1
- package/lib/path/lib/virtual-types.js.map +1 -1
- package/lib/path/modification.js +7 -24
- package/lib/path/modification.js.map +1 -1
- package/lib/path/removal.js +0 -1
- package/lib/path/removal.js.map +1 -1
- package/lib/path/replacement.js +2 -16
- package/lib/path/replacement.js.map +1 -1
- package/lib/scope/binding.js +1 -6
- package/lib/scope/binding.js.map +1 -1
- package/lib/scope/index.js +5 -50
- package/lib/scope/index.js.map +1 -1
- package/lib/scope/lib/renamer.js +1 -6
- package/lib/scope/lib/renamer.js.map +1 -1
- package/lib/visitors.js +2 -23
- package/lib/visitors.js.map +1 -1
- package/package.json +1 -1
package/lib/path/replacement.js
CHANGED
@@ -38,7 +38,6 @@ const {
|
|
38
38
|
validate,
|
39
39
|
yieldExpression
|
40
40
|
} = _t;
|
41
|
-
|
42
41
|
function replaceWithMultiple(nodes) {
|
43
42
|
var _pathCache$get;
|
44
43
|
this.resync();
|
@@ -46,8 +45,7 @@ function replaceWithMultiple(nodes) {
|
|
46
45
|
inheritLeadingComments(nodes[0], this.node);
|
47
46
|
inheritTrailingComments(nodes[nodes.length - 1], this.node);
|
48
47
|
(_pathCache$get = _cache.path.get(this.parent)) == null ? void 0 : _pathCache$get.delete(this.node);
|
49
|
-
this.node =
|
50
|
-
this.container[this.key] = null;
|
48
|
+
this.node = this.container[this.key] = null;
|
51
49
|
const paths = this.insertAfter(nodes);
|
52
50
|
if (this.node) {
|
53
51
|
this.requeue();
|
@@ -56,7 +54,6 @@ function replaceWithMultiple(nodes) {
|
|
56
54
|
}
|
57
55
|
return paths;
|
58
56
|
}
|
59
|
-
|
60
57
|
function replaceWithSourceString(replacement) {
|
61
58
|
this.resync();
|
62
59
|
let ast;
|
@@ -80,7 +77,6 @@ function replaceWithSourceString(replacement) {
|
|
80
77
|
_index.default.removeProperties(expressionAST);
|
81
78
|
return this.replaceWith(expressionAST);
|
82
79
|
}
|
83
|
-
|
84
80
|
function replaceWith(replacementPath) {
|
85
81
|
this.resync();
|
86
82
|
if (this.removed) {
|
@@ -119,16 +115,12 @@ function replaceWith(replacementPath) {
|
|
119
115
|
inheritsComments(replacement, oldNode);
|
120
116
|
removeComments(oldNode);
|
121
117
|
}
|
122
|
-
|
123
118
|
this._replaceWith(replacement);
|
124
119
|
this.type = replacement.type;
|
125
|
-
|
126
120
|
this.setScope();
|
127
|
-
|
128
121
|
this.requeue();
|
129
122
|
return [nodePath ? this.get(nodePath) : this];
|
130
123
|
}
|
131
|
-
|
132
124
|
function _replaceWith(node) {
|
133
125
|
var _pathCache$get2;
|
134
126
|
if (!this.container) {
|
@@ -141,10 +133,8 @@ function _replaceWith(node) {
|
|
141
133
|
}
|
142
134
|
this.debug(`Replace with ${node == null ? void 0 : node.type}`);
|
143
135
|
(_pathCache$get2 = _cache.path.get(this.parent)) == null ? void 0 : _pathCache$get2.set(node, this).delete(this.node);
|
144
|
-
this.node =
|
145
|
-
this.container[this.key] = node;
|
136
|
+
this.node = this.container[this.key] = node;
|
146
137
|
}
|
147
|
-
|
148
138
|
function replaceExpressionWithStatements(nodes) {
|
149
139
|
this.resync();
|
150
140
|
const nodesAsSequenceExpression = toSequenceExpression(nodes, this.scope);
|
@@ -156,14 +146,12 @@ function replaceExpressionWithStatements(nodes) {
|
|
156
146
|
const isParentGenerator = functionParent == null ? void 0 : functionParent.is("generator");
|
157
147
|
const container = arrowFunctionExpression([], blockStatement(nodes));
|
158
148
|
this.replaceWith(callExpression(container, []));
|
159
|
-
|
160
149
|
const callee = this.get("callee");
|
161
150
|
(0, _helperHoistVariables.default)(callee.get("body"), id => {
|
162
151
|
this.scope.push({
|
163
152
|
id
|
164
153
|
});
|
165
154
|
}, "var");
|
166
|
-
|
167
155
|
const completionRecords = this.get("callee").getCompletionRecords();
|
168
156
|
for (const path of completionRecords) {
|
169
157
|
if (!path.isExpressionStatement()) continue;
|
@@ -182,10 +170,8 @@ function replaceExpressionWithStatements(nodes) {
|
|
182
170
|
path.replaceWith(returnStatement(path.node.expression));
|
183
171
|
}
|
184
172
|
}
|
185
|
-
|
186
173
|
callee.arrowFunctionToExpression();
|
187
174
|
const newCallee = callee;
|
188
|
-
|
189
175
|
const needToAwaitFunction = isParentAsync && _index.default.hasType(this.get("callee.body").node, "AwaitExpression", FUNCTION_TYPES);
|
190
176
|
const needToYieldFunction = isParentGenerator && _index.default.hasType(this.get("callee.body").node, "YieldExpression", FUNCTION_TYPES);
|
191
177
|
if (needToAwaitFunction) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["FUNCTION_TYPES","arrowFunctionExpression","assignmentExpression","awaitExpression","blockStatement","callExpression","cloneNode","expressionStatement","identifier","inheritLeadingComments","inheritTrailingComments","inheritsComments","isExpression","isProgram","isStatement","removeComments","returnStatement","toSequenceExpression","validate","yieldExpression","replaceWithMultiple","nodes","resync","_verifyNodeList","node","length","pathCache","get","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","ReferenceError","inList","debug","set","nodesAsSequenceExpression","scope","functionParent","getFunctionParent","isParentAsync","is","isParentGenerator","callee","hoistVariables","id","push","completionRecords","getCompletionRecords","path","isExpressionStatement","loop","findParent","isLoop","uid","getData","generateDeclaredUidIdentifier","pushContainer","setData","name","arrowFunctionToExpression","newCallee","needToAwaitFunction","hasType","needToYieldFunction","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\";\nimport NodePath from \"./index\";\nimport { path as pathCache } from \"../cache\";\nimport { parse } from \"@babel/parser\";\nimport {\n FUNCTION_TYPES,\n arrowFunctionExpression,\n assignmentExpression,\n awaitExpression,\n blockStatement,\n callExpression,\n cloneNode,\n expressionStatement,\n identifier,\n inheritLeadingComments,\n inheritTrailingComments,\n inheritsComments,\n isExpression,\n isProgram,\n isStatement,\n removeComments,\n returnStatement,\n toSequenceExpression,\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 pathCache.get(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 pathCache.get(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 nodesAsSequenceExpression = toSequenceExpression(nodes, this.scope);\n\n if (nodesAsSequenceExpression) {\n return this.replaceWith(nodesAsSequenceExpression)[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\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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"}
|
1
|
+
{"version":3,"names":["FUNCTION_TYPES","arrowFunctionExpression","assignmentExpression","awaitExpression","blockStatement","callExpression","cloneNode","expressionStatement","identifier","inheritLeadingComments","inheritTrailingComments","inheritsComments","isExpression","isProgram","isStatement","removeComments","returnStatement","toSequenceExpression","validate","yieldExpression","replaceWithMultiple","nodes","resync","_verifyNodeList","node","length","pathCache","get","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","ReferenceError","inList","debug","set","nodesAsSequenceExpression","scope","functionParent","getFunctionParent","isParentAsync","is","isParentGenerator","callee","hoistVariables","id","push","completionRecords","getCompletionRecords","path","isExpressionStatement","loop","findParent","isLoop","uid","getData","generateDeclaredUidIdentifier","pushContainer","setData","name","arrowFunctionToExpression","newCallee","needToAwaitFunction","hasType","needToYieldFunction","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\";\nimport NodePath from \"./index\";\nimport { path as pathCache } from \"../cache\";\nimport { parse } from \"@babel/parser\";\nimport {\n FUNCTION_TYPES,\n arrowFunctionExpression,\n assignmentExpression,\n awaitExpression,\n blockStatement,\n callExpression,\n cloneNode,\n expressionStatement,\n identifier,\n inheritLeadingComments,\n inheritTrailingComments,\n inheritsComments,\n isExpression,\n isProgram,\n isStatement,\n removeComments,\n returnStatement,\n toSequenceExpression,\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 pathCache.get(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 pathCache.get(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 nodesAsSequenceExpression = toSequenceExpression(nodes, this.scope);\n\n if (nodesAsSequenceExpression) {\n return this.replaceWith(nodesAsSequenceExpression)[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\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,8 +24,7 @@ class Binding {
|
|
25
24
|
this.scope = scope;
|
26
25
|
this.path = path;
|
27
26
|
this.kind = kind;
|
28
|
-
if ((kind === "var" || kind === "hoisted") &&
|
29
|
-
isDeclaredInLoop(path || (() => {
|
27
|
+
if ((kind === "var" || kind === "hoisted") && isDeclaredInLoop(path || (() => {
|
30
28
|
throw new Error("Internal Babel error: unreachable ");
|
31
29
|
})())) {
|
32
30
|
this.reassign(path);
|
@@ -47,7 +45,6 @@ class Binding {
|
|
47
45
|
this.hasValue = false;
|
48
46
|
this.value = null;
|
49
47
|
}
|
50
|
-
|
51
48
|
reassign(path) {
|
52
49
|
this.constant = false;
|
53
50
|
if (this.constantViolations.indexOf(path) !== -1) {
|
@@ -55,7 +52,6 @@ class Binding {
|
|
55
52
|
}
|
56
53
|
this.constantViolations.push(path);
|
57
54
|
}
|
58
|
-
|
59
55
|
reference(path) {
|
60
56
|
if (this.referencePaths.indexOf(path) !== -1) {
|
61
57
|
return;
|
@@ -64,7 +60,6 @@ class Binding {
|
|
64
60
|
this.references++;
|
65
61
|
this.referencePaths.push(path);
|
66
62
|
}
|
67
|
-
|
68
63
|
dereference() {
|
69
64
|
this.references--;
|
70
65
|
this.referenced = !!this.references;
|
package/lib/scope/binding.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["Binding","constructor","identifier","scope","path","kind","constantViolations","constant","referencePaths","referenced","references","isDeclaredInLoop","Error","reassign","clearValue","deoptValue","hasDeoptedValue","setValue","value","hasValue","indexOf","push","reference","dereference","parentPath","key","isFunctionParent","isWhile","isForXStatement","isForStatement"],"sources":["../../src/scope/binding.ts"],"sourcesContent":["import type NodePath from \"../path\";\nimport type * as t from \"@babel/types\";\nimport type Scope from \"./index\";\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 (\n (kind === \"var\" || kind === \"hoisted\") &&\n // https://github.com/rollup/rollup/issues/4654\n // Rollup removes the path argument from this call. Add an\n // unreachable IIFE (that rollup doesn't know is unreachable)\n // with side effects, to prevent it from messing up with arguments.\n // You can reproduce this with\n // BABEL_8_BREAKING=true make prepublish-build\n isDeclaredInLoop(\n path ||\n (() => {\n throw new Error(\"Internal Babel error: unreachable \");\n })(),\n )\n ) {\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":"
|
1
|
+
{"version":3,"names":["Binding","constructor","identifier","scope","path","kind","constantViolations","constant","referencePaths","referenced","references","isDeclaredInLoop","Error","reassign","clearValue","deoptValue","hasDeoptedValue","setValue","value","hasValue","indexOf","push","reference","dereference","parentPath","key","isFunctionParent","isWhile","isForXStatement","isForStatement"],"sources":["../../src/scope/binding.ts"],"sourcesContent":["import type NodePath from \"../path\";\nimport type * as t from \"@babel/types\";\nimport type Scope from \"./index\";\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 (\n (kind === \"var\" || kind === \"hoisted\") &&\n // https://github.com/rollup/rollup/issues/4654\n // Rollup removes the path argument from this call. Add an\n // unreachable IIFE (that rollup doesn't know is unreachable)\n // with side effects, to prevent it from messing up with arguments.\n // You can reproduce this with\n // BABEL_8_BREAKING=true make prepublish-build\n isDeclaredInLoop(\n path ||\n (() => {\n throw new Error(\"Internal Babel error: unreachable \");\n })(),\n )\n ) {\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,WAAW,CAAC;IACVC,UAAU;IACVC,KAAK;IACLC,IAAI;IACJC;EAMF,CAAC,EAAE;IAAA,KAfHH,UAAU;IAAA,KACVC,KAAK;IAAA,KACLC,IAAI;IAAA,KACJC,IAAI;IAAA,KAuCJC,kBAAkB,GAAoB,EAAE;IAAA,KACxCC,QAAQ,GAAY,IAAI;IAAA,KAExBC,cAAc,GAAoB,EAAE;IAAA,KACpCC,UAAU,GAAY,KAAK;IAAA,KAC3BC,UAAU,GAAW,CAAC;IA/BpB,IAAI,CAACR,UAAU,GAAGA,UAAU;IAC5B,IAAI,CAACC,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACC,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACC,IAAI,GAAGA,IAAI;IAEhB,IACE,CAACA,IAAI,KAAK,KAAK,IAAIA,IAAI,KAAK,SAAS,KAOrCM,gBAAgB,CACdP,IAAI,IACF,CAAC,MAAM;MACL,MAAM,IAAIQ,KAAK,CAAC,oCAAoC,CAAC;IACvD,CAAC,GAAG,CACP,EACD;MACA,IAAI,CAACC,QAAQ,CAACT,IAAI,CAAC;IACrB;IAEA,IAAI,CAACU,UAAU,EAAE;EACnB;EAaAC,UAAU,GAAG;IACX,IAAI,CAACD,UAAU,EAAE;IACjB,IAAI,CAACE,eAAe,GAAG,IAAI;EAC7B;EAEAC,QAAQ,CAACC,KAAU,EAAE;IACnB,IAAI,IAAI,CAACF,eAAe,EAAE;IAC1B,IAAI,CAACG,QAAQ,GAAG,IAAI;IACpB,IAAI,CAACD,KAAK,GAAGA,KAAK;EACpB;EAEAJ,UAAU,GAAG;IACX,IAAI,CAACE,eAAe,GAAG,KAAK;IAC5B,IAAI,CAACG,QAAQ,GAAG,KAAK;IACrB,IAAI,CAACD,KAAK,GAAG,IAAI;EACnB;EAMAL,QAAQ,CAACT,IAAc,EAAE;IACvB,IAAI,CAACG,QAAQ,GAAG,KAAK;IACrB,IAAI,IAAI,CAACD,kBAAkB,CAACc,OAAO,CAAChB,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;MAChD;IACF;IACA,IAAI,CAACE,kBAAkB,CAACe,IAAI,CAACjB,IAAI,CAAC;EACpC;EAMAkB,SAAS,CAAClB,IAAc,EAAE;IACxB,IAAI,IAAI,CAACI,cAAc,CAACY,OAAO,CAAChB,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;MAC5C;IACF;IACA,IAAI,CAACK,UAAU,GAAG,IAAI;IACtB,IAAI,CAACC,UAAU,EAAE;IACjB,IAAI,CAACF,cAAc,CAACa,IAAI,CAACjB,IAAI,CAAC;EAChC;EAMAmB,WAAW,GAAG;IACZ,IAAI,CAACb,UAAU,EAAE;IACjB,IAAI,CAACD,UAAU,GAAG,CAAC,CAAC,IAAI,CAACC,UAAU;EACrC;AACF;AAAC;AAED,SAASC,gBAAgB,CAACP,IAAc,EAAE;EACxC,KACE,IAAI;IAAEoB,UAAU;IAAEC;EAAI,CAAC,GAAGrB,IAAI,EAC9BoB,UAAU,GACV;IAAEA,UAAU;IAAEC;EAAI,CAAC,GAAGD,UAAU,GAChC;IACA,IAAIA,UAAU,CAACE,gBAAgB,EAAE,EAAE,OAAO,KAAK;IAC/C,IACEF,UAAU,CAACG,OAAO,EAAE,IACpBH,UAAU,CAACI,eAAe,EAAE,IAC3BJ,UAAU,CAACK,cAAc,EAAE,IAAIJ,GAAG,KAAK,MAAO,EAC/C;MACA,OAAO,IAAI;IACb;EACF;EACA,OAAO,KAAK;AACd"}
|
package/lib/scope/index.js
CHANGED
@@ -170,7 +170,6 @@ function gatherNodeParts(node, parts) {
|
|
170
170
|
break;
|
171
171
|
}
|
172
172
|
}
|
173
|
-
|
174
173
|
const collectorVisitor = {
|
175
174
|
ForStatement(path) {
|
176
175
|
const declar = path.get("init");
|
@@ -184,11 +183,8 @@ const collectorVisitor = {
|
|
184
183
|
},
|
185
184
|
Declaration(path) {
|
186
185
|
if (path.isBlockScoped()) return;
|
187
|
-
|
188
186
|
if (path.isImportDeclaration()) return;
|
189
|
-
|
190
187
|
if (path.isExportDeclaration()) return;
|
191
|
-
|
192
188
|
const parent = path.scope.getFunctionParent() || path.scope.getProgramParent();
|
193
189
|
parent.registerDeclaration(path);
|
194
190
|
},
|
@@ -203,8 +199,7 @@ const collectorVisitor = {
|
|
203
199
|
const left = path.get("left");
|
204
200
|
if (left.isPattern() || left.isIdentifier()) {
|
205
201
|
state.constantViolations.push(path);
|
206
|
-
}
|
207
|
-
else if (left.isVar()) {
|
202
|
+
} else if (left.isVar()) {
|
208
203
|
const {
|
209
204
|
scope
|
210
205
|
} = path;
|
@@ -254,7 +249,6 @@ const collectorVisitor = {
|
|
254
249
|
if (scope.path === path) scope = scope.parent;
|
255
250
|
const parent = scope.getBlockParent();
|
256
251
|
parent.registerDeclaration(path);
|
257
|
-
|
258
252
|
if (path.isClassDeclaration() && path.node.id) {
|
259
253
|
const id = path.node.id;
|
260
254
|
const name = id.name;
|
@@ -269,15 +263,12 @@ const collectorVisitor = {
|
|
269
263
|
for (const param of params) {
|
270
264
|
path.scope.registerBinding("param", param);
|
271
265
|
}
|
272
|
-
|
273
|
-
if (path.isFunctionExpression() && path.has("id") &&
|
274
|
-
!path.get("id").node[NOT_LOCAL_BINDING]) {
|
266
|
+
if (path.isFunctionExpression() && path.has("id") && !path.get("id").node[NOT_LOCAL_BINDING]) {
|
275
267
|
path.scope.registerBinding("local", path.get("id"), path);
|
276
268
|
}
|
277
269
|
},
|
278
270
|
ClassExpression(path) {
|
279
|
-
if (path.has("id") &&
|
280
|
-
!path.get("id").node[NOT_LOCAL_BINDING]) {
|
271
|
+
if (path.has("id") && !path.get("id").node[NOT_LOCAL_BINDING]) {
|
281
272
|
path.scope.registerBinding("local", path);
|
282
273
|
}
|
283
274
|
}
|
@@ -310,7 +301,6 @@ class Scope {
|
|
310
301
|
this.labels = new Map();
|
311
302
|
this.inited = false;
|
312
303
|
}
|
313
|
-
|
314
304
|
get parent() {
|
315
305
|
var _parent;
|
316
306
|
let parent,
|
@@ -332,7 +322,6 @@ class Scope {
|
|
332
322
|
traverse(node, opts, state) {
|
333
323
|
(0, _index.default)(node, opts, this, state, this.path);
|
334
324
|
}
|
335
|
-
|
336
325
|
generateDeclaredUidIdentifier(name) {
|
337
326
|
const id = this.generateUidIdentifier(name);
|
338
327
|
this.push({
|
@@ -340,11 +329,9 @@ class Scope {
|
|
340
329
|
});
|
341
330
|
return cloneNode(id);
|
342
331
|
}
|
343
|
-
|
344
332
|
generateUidIdentifier(name) {
|
345
333
|
return identifier(this.generateUid(name));
|
346
334
|
}
|
347
|
-
|
348
335
|
generateUid(name = "temp") {
|
349
336
|
name = toIdentifier(name).replace(/^_+/, "").replace(/[0-9]+$/g, "");
|
350
337
|
let uid;
|
@@ -358,7 +345,6 @@ class Scope {
|
|
358
345
|
program.uids[uid] = true;
|
359
346
|
return uid;
|
360
347
|
}
|
361
|
-
|
362
348
|
_generateUid(name, i) {
|
363
349
|
let id = name;
|
364
350
|
if (i > 1) id += i;
|
@@ -371,11 +357,9 @@ class Scope {
|
|
371
357
|
id = id.replace(/^_/, "") || defaultName || "ref";
|
372
358
|
return this.generateUid(id.slice(0, 20));
|
373
359
|
}
|
374
|
-
|
375
360
|
generateUidIdentifierBasedOnNode(node, defaultName) {
|
376
361
|
return identifier(this.generateUidBasedOnNode(node, defaultName));
|
377
362
|
}
|
378
|
-
|
379
363
|
isStatic(node) {
|
380
364
|
if (isThisExpression(node) || isSuper(node) || isTopicReference(node)) {
|
381
365
|
return true;
|
@@ -390,7 +374,6 @@ class Scope {
|
|
390
374
|
}
|
391
375
|
return false;
|
392
376
|
}
|
393
|
-
|
394
377
|
maybeGenerateMemoised(node, dontPush) {
|
395
378
|
if (this.isStatic(node)) {
|
396
379
|
return null;
|
@@ -407,11 +390,8 @@ class Scope {
|
|
407
390
|
}
|
408
391
|
checkBlockScopedCollisions(local, kind, name, id) {
|
409
392
|
if (kind === "param") return;
|
410
|
-
|
411
393
|
if (local.kind === "local") return;
|
412
|
-
const duplicate =
|
413
|
-
kind === "let" || local.kind === "let" || local.kind === "const" || local.kind === "module" ||
|
414
|
-
local.kind === "param" && kind === "const";
|
394
|
+
const duplicate = kind === "let" || local.kind === "let" || local.kind === "const" || local.kind === "module" || local.kind === "param" && kind === "const";
|
415
395
|
if (duplicate) {
|
416
396
|
throw this.hub.buildError(id, `Duplicate declaration "${name}"`, TypeError);
|
417
397
|
}
|
@@ -423,7 +403,6 @@ class Scope {
|
|
423
403
|
return new _renamer.default(binding, oldName, newName).rename(block);
|
424
404
|
}
|
425
405
|
}
|
426
|
-
|
427
406
|
_renameFromMap(map, oldName, newName, value) {
|
428
407
|
if (map[oldName]) {
|
429
408
|
map[newName] = value;
|
@@ -448,7 +427,6 @@ class Scope {
|
|
448
427
|
} while (scope = scope.parent);
|
449
428
|
console.log(sep);
|
450
429
|
}
|
451
|
-
|
452
430
|
toArray(node, i, arrayLikeIsIterable) {
|
453
431
|
if (isIdentifier(node)) {
|
454
432
|
const binding = this.getBinding(node.name);
|
@@ -470,7 +448,6 @@ class Scope {
|
|
470
448
|
helperName = "toConsumableArray";
|
471
449
|
} else if (typeof i === "number") {
|
472
450
|
args.push(numericLiteral(i));
|
473
|
-
|
474
451
|
helperName = "slicedToArray";
|
475
452
|
} else {
|
476
453
|
helperName = "toArray";
|
@@ -479,7 +456,6 @@ class Scope {
|
|
479
456
|
args.unshift(this.hub.addHelper(helperName));
|
480
457
|
helperName = "maybeArrayLike";
|
481
458
|
}
|
482
|
-
|
483
459
|
return callExpression(this.hub.addHelper(helperName), args);
|
484
460
|
}
|
485
461
|
hasLabel(name) {
|
@@ -552,7 +528,6 @@ class Scope {
|
|
552
528
|
if (local.identifier === id) continue;
|
553
529
|
this.checkBlockScopedCollisions(local, kind, name, id);
|
554
530
|
}
|
555
|
-
|
556
531
|
if (local) {
|
557
532
|
this.registerConstantViolation(bindingPath);
|
558
533
|
} else {
|
@@ -652,11 +627,9 @@ class Scope {
|
|
652
627
|
return isPureish(node);
|
653
628
|
}
|
654
629
|
}
|
655
|
-
|
656
630
|
setData(key, val) {
|
657
631
|
return this.data[key] = val;
|
658
632
|
}
|
659
|
-
|
660
633
|
getData(key) {
|
661
634
|
let scope = this;
|
662
635
|
do {
|
@@ -664,7 +637,6 @@ class Scope {
|
|
664
637
|
if (data != null) return data;
|
665
638
|
} while (scope = scope.parent);
|
666
639
|
}
|
667
|
-
|
668
640
|
removeData(key) {
|
669
641
|
let scope = this;
|
670
642
|
do {
|
@@ -706,17 +678,14 @@ class Scope {
|
|
706
678
|
}
|
707
679
|
path.traverse(collectorVisitor, state);
|
708
680
|
this.crawling = false;
|
709
|
-
|
710
681
|
for (const path of state.assignments) {
|
711
682
|
const ids = path.getBindingIdentifiers();
|
712
683
|
for (const name of Object.keys(ids)) {
|
713
684
|
if (path.scope.getBinding(name)) continue;
|
714
685
|
programParent.addGlobal(ids[name]);
|
715
686
|
}
|
716
|
-
|
717
687
|
path.scope.registerConstantViolation(path);
|
718
688
|
}
|
719
|
-
|
720
689
|
for (const ref of state.references) {
|
721
690
|
const binding = ref.scope.getBinding(ref.node.name);
|
722
691
|
if (binding) {
|
@@ -725,7 +694,6 @@ class Scope {
|
|
725
694
|
programParent.addGlobal(ref.node);
|
726
695
|
}
|
727
696
|
}
|
728
|
-
|
729
697
|
for (const path of state.constantViolations) {
|
730
698
|
path.scope.registerConstantViolation(path);
|
731
699
|
}
|
@@ -759,7 +727,6 @@ class Scope {
|
|
759
727
|
const len = declarPath.node.declarations.push(declarator);
|
760
728
|
path.scope.registerBinding(kind, declarPath.get("declarations")[len - 1]);
|
761
729
|
}
|
762
|
-
|
763
730
|
getProgramParent() {
|
764
731
|
let scope = this;
|
765
732
|
do {
|
@@ -769,7 +736,6 @@ class Scope {
|
|
769
736
|
} while (scope = scope.parent);
|
770
737
|
throw new Error("Couldn't find a Program");
|
771
738
|
}
|
772
|
-
|
773
739
|
getFunctionParent() {
|
774
740
|
let scope = this;
|
775
741
|
do {
|
@@ -779,7 +745,6 @@ class Scope {
|
|
779
745
|
} while (scope = scope.parent);
|
780
746
|
return null;
|
781
747
|
}
|
782
|
-
|
783
748
|
getBlockParent() {
|
784
749
|
let scope = this;
|
785
750
|
do {
|
@@ -789,7 +754,6 @@ class Scope {
|
|
789
754
|
} while (scope = scope.parent);
|
790
755
|
throw new Error("We couldn't find a BlockStatement, For, Switch, Function, Loop or Program...");
|
791
756
|
}
|
792
|
-
|
793
757
|
getPatternParent() {
|
794
758
|
let scope = this;
|
795
759
|
do {
|
@@ -799,7 +763,6 @@ class Scope {
|
|
799
763
|
} while (scope = scope.parent.parent);
|
800
764
|
throw new Error("We couldn't find a BlockStatement, For, Switch, Function, Loop or Program...");
|
801
765
|
}
|
802
|
-
|
803
766
|
getAllBindings() {
|
804
767
|
const ids = Object.create(null);
|
805
768
|
let scope = this;
|
@@ -813,7 +776,6 @@ class Scope {
|
|
813
776
|
} while (scope);
|
814
777
|
return ids;
|
815
778
|
}
|
816
|
-
|
817
779
|
getAllBindingsOfKind(...kinds) {
|
818
780
|
const ids = Object.create(null);
|
819
781
|
for (const kind of kinds) {
|
@@ -838,9 +800,7 @@ class Scope {
|
|
838
800
|
const binding = scope.getOwnBinding(name);
|
839
801
|
if (binding) {
|
840
802
|
var _previousPath;
|
841
|
-
|
842
|
-
if ((_previousPath = previousPath) != null && _previousPath.isPattern() && binding.kind !== "param" && binding.kind !== "local") {
|
843
|
-
} else {
|
803
|
+
if ((_previousPath = previousPath) != null && _previousPath.isPattern() && binding.kind !== "param" && binding.kind !== "local") {} else {
|
844
804
|
return binding;
|
845
805
|
}
|
846
806
|
} else if (!binding && name === "arguments" && scope.path.isFunction() && !scope.path.isArrowFunctionExpression()) {
|
@@ -852,12 +812,10 @@ class Scope {
|
|
852
812
|
getOwnBinding(name) {
|
853
813
|
return this.bindings[name];
|
854
814
|
}
|
855
|
-
|
856
815
|
getBindingIdentifier(name) {
|
857
816
|
var _this$getBinding;
|
858
817
|
return (_this$getBinding = this.getBinding(name)) == null ? void 0 : _this$getBinding.identifier;
|
859
818
|
}
|
860
|
-
|
861
819
|
getOwnBindingIdentifier(name) {
|
862
820
|
const binding = this.bindings[name];
|
863
821
|
return binding == null ? void 0 : binding.identifier;
|
@@ -865,7 +823,6 @@ class Scope {
|
|
865
823
|
hasOwnBinding(name) {
|
866
824
|
return !!this.getOwnBinding(name);
|
867
825
|
}
|
868
|
-
|
869
826
|
hasBinding(name, opts) {
|
870
827
|
var _opts, _opts2, _opts3;
|
871
828
|
if (!name) return false;
|
@@ -885,7 +842,6 @@ class Scope {
|
|
885
842
|
var _this$parent;
|
886
843
|
return (_this$parent = this.parent) == null ? void 0 : _this$parent.hasBinding(name, opts);
|
887
844
|
}
|
888
|
-
|
889
845
|
moveBindingTo(name, scope) {
|
890
846
|
const info = this.getBinding(name);
|
891
847
|
if (info) {
|
@@ -900,7 +856,6 @@ class Scope {
|
|
900
856
|
removeBinding(name) {
|
901
857
|
var _this$getBinding2;
|
902
858
|
(_this$getBinding2 = this.getBinding(name)) == null ? void 0 : _this$getBinding2.scope.removeOwnBinding(name);
|
903
|
-
|
904
859
|
let scope = this;
|
905
860
|
do {
|
906
861
|
if (scope.uids[name]) {
|