diff --git a/packages/babel-plugin-transform-do-expressions/test/fixtures/do-expressions/while-if/actual.js b/packages/babel-plugin-transform-do-expressions/test/fixtures/do-expressions/while-if/actual.js new file mode 100644 index 0000000000..d3706c14b3 --- /dev/null +++ b/packages/babel-plugin-transform-do-expressions/test/fixtures/do-expressions/while-if/actual.js @@ -0,0 +1,10 @@ +let p +let a = do { + while (p = p.parentPath) { + if (a) { + 'a' + } else { + 'b' + } + } +}; diff --git a/packages/babel-plugin-transform-do-expressions/test/fixtures/do-expressions/while-if/expected.js b/packages/babel-plugin-transform-do-expressions/test/fixtures/do-expressions/while-if/expected.js new file mode 100644 index 0000000000..5c0298f045 --- /dev/null +++ b/packages/babel-plugin-transform-do-expressions/test/fixtures/do-expressions/while-if/expected.js @@ -0,0 +1,13 @@ +let p; +let a = function () { + var _ret; + + while (p = p.parentPath) { + if (a) { + _ret = 'a'; + } else { + _ret = 'b'; + } + } + return _ret; +}(); diff --git a/packages/babel-traverse/src/path/replacement.js b/packages/babel-traverse/src/path/replacement.js index 1a8cdbef54..47e706d0d2 100644 --- a/packages/babel-traverse/src/path/replacement.js +++ b/packages/babel-traverse/src/path/replacement.js @@ -219,10 +219,16 @@ export function replaceExpressionWithStatements(nodes: Array) { const loop = path.findParent((path) => path.isLoop()); if (loop) { - const callee = this.get("callee"); + let uid = loop.getData("expressionReplacementReturnUid"); - const uid = callee.scope.generateDeclaredUidIdentifier("ret"); - callee.get("body").pushContainer("body", t.returnStatement(uid)); + if (!uid) { + const callee = this.get("callee"); + uid = callee.scope.generateDeclaredUidIdentifier("ret"); + callee.get("body").pushContainer("body", t.returnStatement(uid)); + loop.setData("expressionReplacementReturnUid", uid); + } else { + uid = t.identifier(uid.name); + } path.get("expression").replaceWith( t.assignmentExpression("=", uid, path.node.expression)