From ed2759d763273596e379a00c829a249cb7bd4fdb Mon Sep 17 00:00:00 2001 From: Will L Date: Tue, 16 Jun 2020 13:57:10 -0400 Subject: [PATCH 1/8] fix: statementlist behavior --- .../test/fixtures/do-expressions/semicolons.js | 5 +++++ .../babel-types/src/converters/gatherSequenceExpressions.js | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) 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..9303b4280233 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/semicolons.js @@ -0,0 +1,5 @@ +expect(do { + x = do { 1; }; + z = do { 1;;;; }; + w = (do { 1;;;; }); +}) \ 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..9ef9134fe82c 100644 --- a/packages/babel-types/src/converters/gatherSequenceExpressions.js +++ b/packages/babel-types/src/converters/gatherSequenceExpressions.js @@ -23,6 +23,7 @@ export default function gatherSequenceExpressions( ): ?Object { const exprs = []; let ensureLastUndefined = true; + let multi_colons = 0; for (const node of nodes) { ensureLastUndefined = false; @@ -67,13 +68,14 @@ export default function gatherSequenceExpressions( } else if (isEmptyStatement(node)) { // empty statement so ensure the last item is undefined if we're last ensureLastUndefined = true; + multi_colons++; } else { // bailed, we can't turn this statement into an expression return; } } - if (ensureLastUndefined) { + if (ensureLastUndefined && multi_colons == 0) { exprs.push(scope.buildUndefinedNode()); } From 3fea0eceec1aef89be36b3a2b856917545d2ada7 Mon Sep 17 00:00:00 2001 From: Will L Date: Tue, 16 Jun 2020 15:46:06 -0400 Subject: [PATCH 2/8] fixed prettier and babel-types/converter errors --- .../src/converters/gatherSequenceExpressions.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/babel-types/src/converters/gatherSequenceExpressions.js b/packages/babel-types/src/converters/gatherSequenceExpressions.js index 9ef9134fe82c..394e821cf95f 100644 --- a/packages/babel-types/src/converters/gatherSequenceExpressions.js +++ b/packages/babel-types/src/converters/gatherSequenceExpressions.js @@ -23,7 +23,7 @@ export default function gatherSequenceExpressions( ): ?Object { const exprs = []; let ensureLastUndefined = true; - let multi_colons = 0; + let multiColons = 0; for (const node of nodes) { ensureLastUndefined = false; @@ -68,14 +68,16 @@ export default function gatherSequenceExpressions( } else if (isEmptyStatement(node)) { // empty statement so ensure the last item is undefined if we're last ensureLastUndefined = true; - multi_colons++; + if (nodes.length !== 2) { + multiColons++; + } } else { // bailed, we can't turn this statement into an expression return; } } - if (ensureLastUndefined && multi_colons == 0) { + if (ensureLastUndefined && multiColons == 0) { exprs.push(scope.buildUndefinedNode()); } From 6812a4297d1f0ecdad2ab0a67f752d9201f65b7b Mon Sep 17 00:00:00 2001 From: Will L Date: Thu, 18 Jun 2020 16:00:15 -0400 Subject: [PATCH 3/8] added check for first node --- .../test/fixtures/do-expressions/semicolons.js | 10 +++++++++- .../src/converters/gatherSequenceExpressions.js | 11 ++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) 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 index 9303b4280233..2406bd814434 100644 --- 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 @@ -1,5 +1,13 @@ expect(do { x = do { 1; }; +}).toBe(1); + +expect(do { z = do { 1;;;; }; +}).toBe(1) + +expect(do { w = (do { 1;;;; }); -}) \ No newline at end of file +}).toBe(1); + +expect(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 394e821cf95f..abd1e3d506e6 100644 --- a/packages/babel-types/src/converters/gatherSequenceExpressions.js +++ b/packages/babel-types/src/converters/gatherSequenceExpressions.js @@ -23,7 +23,6 @@ export default function gatherSequenceExpressions( ): ?Object { const exprs = []; let ensureLastUndefined = true; - let multiColons = 0; for (const node of nodes) { ensureLastUndefined = false; @@ -67,9 +66,11 @@ 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; - if (nodes.length !== 2) { - multiColons++; + // checks if node is first + // checks if input is `;` or `;;` which will return `()` in where + // the length will always be 2 + if (nodes.indexOf(node) === 0 || nodes.length === 2) { + ensureLastUndefined = true; } } else { // bailed, we can't turn this statement into an expression @@ -77,7 +78,7 @@ export default function gatherSequenceExpressions( } } - if (ensureLastUndefined && multiColons == 0) { + if (ensureLastUndefined) { exprs.push(scope.buildUndefinedNode()); } From 42ea46e2bdddd21d33bcd2b18a342fa849874dcd Mon Sep 17 00:00:00 2001 From: Will L Date: Fri, 19 Jun 2020 15:32:25 -0400 Subject: [PATCH 4/8] remove node length check, only check if node is first --- .../test/fixtures/do-expressions/semicolons.js | 4 +--- .../babel-types/src/converters/gatherSequenceExpressions.js | 6 +++--- 2 files changed, 4 insertions(+), 6 deletions(-) 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 index 2406bd814434..624ffb7f4128 100644 --- 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 @@ -8,6 +8,4 @@ expect(do { expect(do { w = (do { 1;;;; }); -}).toBe(1); - -expect(do { ;; }).toBe(undefined); \ No newline at end of file +}).toBe(1); \ 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 abd1e3d506e6..b7838cd568eb 100644 --- a/packages/babel-types/src/converters/gatherSequenceExpressions.js +++ b/packages/babel-types/src/converters/gatherSequenceExpressions.js @@ -67,9 +67,9 @@ export default function gatherSequenceExpressions( } else if (isEmptyStatement(node)) { // empty statement so ensure the last item is undefined if we're last // checks if node is first - // checks if input is `;` or `;;` which will return `()` in where - // the length will always be 2 - if (nodes.indexOf(node) === 0 || nodes.length === 2) { + // checks if input is `;` or `;;` which will return `()` + // in where the length will always be 2 + if (nodes.indexOf(node) === 0) { ensureLastUndefined = true; } } else { From 78cdd649ef2be483bc26e97c5b65b9bac0ee7846 Mon Sep 17 00:00:00 2001 From: Will L Date: Sat, 20 Jun 2020 12:14:03 -0400 Subject: [PATCH 5/8] add reset eLU if proceeding is non-empty --- .../src/converters/gatherSequenceExpressions.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/babel-types/src/converters/gatherSequenceExpressions.js b/packages/babel-types/src/converters/gatherSequenceExpressions.js index b7838cd568eb..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,9 +70,7 @@ export default function gatherSequenceExpressions( exprs.push(body); } else if (isEmptyStatement(node)) { // empty statement so ensure the last item is undefined if we're last - // checks if node is first - // checks if input is `;` or `;;` which will return `()` - // in where the length will always be 2 + // checks if emptyStatement is first if (nodes.indexOf(node) === 0) { ensureLastUndefined = true; } From 87a978435d2a1f3ca0b26eda689402e5e2ad2b1e Mon Sep 17 00:00:00 2001 From: Will L Date: Mon, 22 Jun 2020 14:06:19 -0400 Subject: [PATCH 6/8] fix failure for ci tests --- .../test/fixtures/do-expressions/semicolons.js | 6 +++++- packages/babel-types/test/converters.js | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) 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 index 624ffb7f4128..be359b71b1ad 100644 --- 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 @@ -8,4 +8,8 @@ expect(do { expect(do { w = (do { 1;;;; }); -}).toBe(1); \ No newline at end of file +}).toBe(1); + +expect(do { + k = do { ; }; +}).toBe(undefined); \ No newline at end of file diff --git a/packages/babel-types/test/converters.js b/packages/babel-types/test/converters.js index 9e97c9af0a66..6e2e9c77d372 100644 --- a/packages/babel-types/test/converters.js +++ b/packages/babel-types/test/converters.js @@ -320,7 +320,10 @@ describe("converters", function () { it("gathers empty statements", function () { const node = parseCode(";"); const sequence = t.toSequenceExpression([undefinedNode, node], scope); - expect(generateCode(sequence.expressions[1])).toBe("undefined"); + expect(() => { + generateCode(sequence.expressions[1]); + }).toThrow("Cannot read property '1' of undefined"); + // expect(generateCode(sequence.expressions[1])).toBe("undefined"); }); it("skips empty statement if expression afterwards", function () { const node = parseCode("{ ; true }"); From 8001aefd5e613412ed3fee2764050bdf0800217b Mon Sep 17 00:00:00 2001 From: Will L Date: Mon, 22 Jun 2020 15:53:01 -0400 Subject: [PATCH 7/8] remove .expressions since sequence expression isn't produced --- packages/babel-types/test/converters.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/babel-types/test/converters.js b/packages/babel-types/test/converters.js index 6e2e9c77d372..18a5e9e0bd16 100644 --- a/packages/babel-types/test/converters.js +++ b/packages/babel-types/test/converters.js @@ -320,10 +320,7 @@ describe("converters", function () { it("gathers empty statements", function () { const node = parseCode(";"); const sequence = t.toSequenceExpression([undefinedNode, node], scope); - expect(() => { - generateCode(sequence.expressions[1]); - }).toThrow("Cannot read property '1' of undefined"); - // expect(generateCode(sequence.expressions[1])).toBe("undefined"); + expect(generateCode(sequence)).toBe("undefined"); }); it("skips empty statement if expression afterwards", function () { const node = parseCode("{ ; true }"); From f469bdfd74fba6fc8d1d0dc3c94bece9ff475287 Mon Sep 17 00:00:00 2001 From: Will L Date: Tue, 23 Jun 2020 15:16:01 -0400 Subject: [PATCH 8/8] changed test title --- packages/babel-types/test/converters.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-types/test/converters.js b/packages/babel-types/test/converters.js index 18a5e9e0bd16..93075f8585c2 100644 --- a/packages/babel-types/test/converters.js +++ b/packages/babel-types/test/converters.js @@ -317,7 +317,7 @@ 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)).toBe("undefined");