diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/semicolons.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/semicolons.js new file mode 100644 index 000000000000..be359b71b1ad --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/semicolons.js @@ -0,0 +1,15 @@ +expect(do { + x = do { 1; }; +}).toBe(1); + +expect(do { + z = do { 1;;;; }; +}).toBe(1) + +expect(do { + w = (do { 1;;;; }); +}).toBe(1); + +expect(do { + k = do { ; }; +}).toBe(undefined); \ No newline at end of file diff --git a/packages/babel-types/src/converters/gatherSequenceExpressions.js b/packages/babel-types/src/converters/gatherSequenceExpressions.js index e9808e6ed3ad..ef0ccc0757c6 100644 --- a/packages/babel-types/src/converters/gatherSequenceExpressions.js +++ b/packages/babel-types/src/converters/gatherSequenceExpressions.js @@ -25,7 +25,11 @@ export default function gatherSequenceExpressions( let ensureLastUndefined = true; for (const node of nodes) { - ensureLastUndefined = false; + // if we encounter emptyStatement before a non-emptyStatement + // we want to disregard that + if (!isEmptyStatement(node)) { + ensureLastUndefined = false; + } if (isExpression(node)) { exprs.push(node); @@ -66,7 +70,10 @@ export default function gatherSequenceExpressions( exprs.push(body); } else if (isEmptyStatement(node)) { // empty statement so ensure the last item is undefined if we're last - ensureLastUndefined = true; + // checks if emptyStatement is first + if (nodes.indexOf(node) === 0) { + ensureLastUndefined = true; + } } else { // bailed, we can't turn this statement into an expression return; diff --git a/packages/babel-types/test/converters.js b/packages/babel-types/test/converters.js index 9e97c9af0a66..93075f8585c2 100644 --- a/packages/babel-types/test/converters.js +++ b/packages/babel-types/test/converters.js @@ -317,10 +317,10 @@ describe("converters", function () { const sequence = t.toSequenceExpression([undefinedNode, node], scope); expect(sequence).toBeUndefined(); }); - it("gathers empty statements", function () { + it("gathers empty statements if first element", function () { const node = parseCode(";"); const sequence = t.toSequenceExpression([undefinedNode, node], scope); - expect(generateCode(sequence.expressions[1])).toBe("undefined"); + expect(generateCode(sequence)).toBe("undefined"); }); it("skips empty statement if expression afterwards", function () { const node = parseCode("{ ; true }");