diff options
Diffstat (limited to 'node_modules/@babel/traverse/lib/path/replacement.js')
| -rw-r--r-- | node_modules/@babel/traverse/lib/path/replacement.js | 71 |
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)) { |
