summaryrefslogtreecommitdiff
path: root/node_modules/@babel/traverse/lib/path/replacement.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/@babel/traverse/lib/path/replacement.js')
-rw-r--r--node_modules/@babel/traverse/lib/path/replacement.js71
1 files changed, 65 insertions, 6 deletions
diff --git a/node_modules/@babel/traverse/lib/path/replacement.js b/node_modules/@babel/traverse/lib/path/replacement.js
index dd3df51a..cca66d0f 100644
--- a/node_modules/@babel/traverse/lib/path/replacement.js
+++ b/node_modules/@babel/traverse/lib/path/replacement.js
@@ -22,19 +22,27 @@ const {
assignmentExpression,
awaitExpression,
blockStatement,
+ buildUndefinedNode,
callExpression,
cloneNode,
+ conditionalExpression,
expressionStatement,
+ getBindingIdentifiers,
identifier,
inheritLeadingComments,
inheritTrailingComments,
inheritsComments,
+ isBlockStatement,
+ isEmptyStatement,
isExpression,
+ isExpressionStatement,
+ isIfStatement,
isProgram,
isStatement,
+ isVariableDeclaration,
removeComments,
returnStatement,
- toSequenceExpression,
+ sequenceExpression,
validate,
yieldExpression
} = _t;
@@ -44,7 +52,7 @@ function replaceWithMultiple(nodes) {
nodes = this._verifyNodeList(nodes);
inheritLeadingComments(nodes[0], this.node);
inheritTrailingComments(nodes[nodes.length - 1], this.node);
- (_getCachedPaths = (0, _cache.getCachedPaths)(this.hub, this.parent)) == null ? void 0 : _getCachedPaths.delete(this.node);
+ (_getCachedPaths = (0, _cache.getCachedPaths)(this.hub, this.parent)) == null || _getCachedPaths.delete(this.node);
this.node = this.container[this.key] = null;
const paths = this.insertAfter(nodes);
if (this.node) {
@@ -132,14 +140,18 @@ function _replaceWith(node) {
validate(this.parent, this.key, node);
}
this.debug(`Replace with ${node == null ? void 0 : node.type}`);
- (_getCachedPaths2 = (0, _cache.getCachedPaths)(this.hub, this.parent)) == null ? void 0 : _getCachedPaths2.set(node, this).delete(this.node);
+ (_getCachedPaths2 = (0, _cache.getCachedPaths)(this.hub, this.parent)) == null || _getCachedPaths2.set(node, this).delete(this.node);
this.node = this.container[this.key] = node;
}
function replaceExpressionWithStatements(nodes) {
this.resync();
- const nodesAsSequenceExpression = toSequenceExpression(nodes, this.scope);
- if (nodesAsSequenceExpression) {
- return this.replaceWith(nodesAsSequenceExpression)[0].get("expressions");
+ const declars = [];
+ const nodesAsSingleExpression = gatherSequenceExpressions(nodes, declars);
+ if (nodesAsSingleExpression) {
+ for (const id of declars) this.scope.push({
+ id
+ });
+ return this.replaceWith(nodesAsSingleExpression)[0].get("expressions");
}
const functionParent = this.getFunctionParent();
const isParentAsync = functionParent == null ? void 0 : functionParent.is("async");
@@ -186,6 +198,53 @@ function replaceExpressionWithStatements(nodes) {
}
return newCallee.get("body.body");
}
+function gatherSequenceExpressions(nodes, declars) {
+ const exprs = [];
+ let ensureLastUndefined = true;
+ for (const node of nodes) {
+ if (!isEmptyStatement(node)) {
+ ensureLastUndefined = false;
+ }
+ if (isExpression(node)) {
+ exprs.push(node);
+ } else if (isExpressionStatement(node)) {
+ exprs.push(node.expression);
+ } else if (isVariableDeclaration(node)) {
+ if (node.kind !== "var") return;
+ for (const declar of node.declarations) {
+ const bindings = getBindingIdentifiers(declar);
+ for (const key of Object.keys(bindings)) {
+ declars.push(cloneNode(bindings[key]));
+ }
+ if (declar.init) {
+ exprs.push(assignmentExpression("=", declar.id, declar.init));
+ }
+ }
+ ensureLastUndefined = true;
+ } else if (isIfStatement(node)) {
+ const consequent = node.consequent ? gatherSequenceExpressions([node.consequent], declars) : buildUndefinedNode();
+ const alternate = node.alternate ? gatherSequenceExpressions([node.alternate], declars) : buildUndefinedNode();
+ if (!consequent || !alternate) return;
+ exprs.push(conditionalExpression(node.test, consequent, alternate));
+ } else if (isBlockStatement(node)) {
+ const body = gatherSequenceExpressions(node.body, declars);
+ if (!body) return;
+ exprs.push(body);
+ } else if (isEmptyStatement(node)) {
+ if (nodes.indexOf(node) === 0) {
+ ensureLastUndefined = true;
+ }
+ } else {
+ return;
+ }
+ }
+ if (ensureLastUndefined) exprs.push(buildUndefinedNode());
+ if (exprs.length === 1) {
+ return exprs[0];
+ } else {
+ return sequenceExpression(exprs);
+ }
+}
function replaceInline(nodes) {
this.resync();
if (Array.isArray(nodes)) {