From cfaa70dcf48a0ea9a6c7adb4ae1f7925934b3933 Mon Sep 17 00:00:00 2001 From: William Law Date: Thu, 25 Jun 2020 13:38:01 -0400 Subject: [PATCH] skip following empty statements in toSequenceExpression (#11724) * fix: statementlist behavior * fixed prettier and babel-types/converter errors * added check for first node * remove node length check, only check if node is first * add reset eLU if proceeding is non-empty * fix failure for ci tests * remove .expressions since sequence expression isn't produced * changed test title --- .../test/fixtures/do-expressions/semicolons.js | 15 +++++++++++++++ .../src/converters/gatherSequenceExpressions.js | 11 +++++++++-- packages/babel-types/test/converters.js | 4 ++-- 3 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/semicolons.js 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 }");