diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/.fallthrough-multiblock/exec.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/.fallthrough-multiblock/exec.js new file mode 100644 index 000000000000..3811a50b2494 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/.fallthrough-multiblock/exec.js @@ -0,0 +1,36 @@ +// `blockExpressions` before `break` is hard to deal with +// https://github.com/babel/babel/pull/10070#discussion_r296048106 +const x = (n) => do { + switch (n) { + case 0: + { "a"; } + { "b"; }; + case 1: + { "c"; } + break; + { "d"; }; + case 2: + "a"; + "b"; + case 3: + {} + { break; } + case 4: + { "d"; } + { "e"; } + case 5: + "f"; + case 6: + {} + case 7: + } +} + +expect(x(0)).toBe('c') +expect(x(1)).toBe('c') +expect(x(2)).toBeUndefined() +expect(x(3)).toBeUndefined() +expect(x(4)).toBe('f') +expect(x(5)).toBe('f') +expect(x(6)).toBeUndefined() +expect(x(7)).toBeUndefined() diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/.fallthrough-multiblock/input.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/.fallthrough-multiblock/input.js new file mode 100644 index 000000000000..adda24b703d1 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/.fallthrough-multiblock/input.js @@ -0,0 +1,25 @@ +const x = (n) => do { + switch (n) { + case 0: + { "a"; } + { "b"; }; + case 1: + { "c"; } + break; + { "d"; }; + case 2: + "a"; + "b"; + case 3: + {} + { break; } + case 4: + { "a"; } + { "b"; } + case 5: + "c"; + case 6: + {} + case 7: + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/declaration-before-break/input.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/declaration-before-break/input.js new file mode 100644 index 000000000000..3e64d8911875 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/declaration-before-break/input.js @@ -0,0 +1,9 @@ +const x = (n) => do { + switch (n) { + case 0: + case 6: + const b = 1; + break; + default: 'bar'; + } +} diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/declaration-before-break/output.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/declaration-before-break/output.js new file mode 100644 index 000000000000..a438311f5e24 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/declaration-before-break/output.js @@ -0,0 +1,11 @@ +const x = n => function () { + switch (n) { + case 0: + case 6: + const b = 1; + return void 0; + + default: + return 'bar'; + } +}(); diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/empty-case-block/input.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/empty-case-block/input.js new file mode 100644 index 000000000000..920878526152 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/empty-case-block/input.js @@ -0,0 +1,7 @@ +const x = () => do { + switch (new Date().getDay()) { + case 0: + break; + default: "weekday 🚴" + } +} diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/empty-case-block/output.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/empty-case-block/output.js new file mode 100644 index 000000000000..15fb9f3537ff --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/empty-case-block/output.js @@ -0,0 +1,9 @@ +const x = () => function () { + switch (new Date().getDay()) { + case 0: + return void 0; + + default: + return "weekday 🚴"; + } +}(); diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-block-last/exec.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-block-last/exec.js new file mode 100644 index 000000000000..395fdf6f0538 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-block-last/exec.js @@ -0,0 +1,26 @@ +const x = (n) => do { + switch (n) { + case 0: { + 'a'; + } + case 1: { + 'b'; + break; + } + default: { + 'd'; + } + case 2: { + 'c'; + } + case 3: + case 4: + } +} + +expect(x(0)).toBe('b'); +expect(x(1)).toBe('b'); +expect(x(2)).toBe('c'); +expect(x(3)).toBeUndefined(); +expect(x(4)).toBeUndefined(); +expect(x(5)).toBe('c'); \ No newline at end of file diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-block-last/input.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-block-last/input.js new file mode 100644 index 000000000000..e9c30a6b4550 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-block-last/input.js @@ -0,0 +1,19 @@ +const x = (n) => do { + switch (n) { + case 0: { + 'a'; + } + case 1: { + 'b'; + break; + } + default: { + 'd'; + } + case 2: { + 'c'; + } + case 3: + case 4: + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-block-last/output.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-block-last/output.js new file mode 100644 index 000000000000..91f6ebcdc15c --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-block-last/output.js @@ -0,0 +1,26 @@ +const x = n => function () { + switch (n) { + case 0: + { + 'a'; + } + + case 1: + { + return 'b'; + } + + default: + { + 'd'; + } + + case 2: + { + return 'c'; + } + + case 3: + case 4: + } +}(); diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-block/exec.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-block/exec.js new file mode 100644 index 000000000000..f9593ecc8cdb --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-block/exec.js @@ -0,0 +1,30 @@ +const x = (n) => do { + switch (n) { + case 0: { + 'a'; + } + case 1: { + 'b'; + break; + } + case 2: { + 'c'; + break; + } + case 3: { + break; + } + case 4: { + 'd'; + 'e'; + } + default: 'f'; + } +} + +expect(x(0)).toBe('b'); +expect(x(1)).toBe('b'); +expect(x(2)).toBe('c'); +expect(x(3)).toBeUndefined(); +expect(x(4)).toBe('f'); +expect(x(5)).toBe('f'); \ No newline at end of file diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-block/input.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-block/input.js new file mode 100644 index 000000000000..768140a79198 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-block/input.js @@ -0,0 +1,23 @@ +const x = (n) => do { + switch (n) { + case 0: { + 'a'; + } + case 1: { + 'b'; + break; + } + case 2: { + 'c'; + break; + } + case 3: { + break; + } + case 4: { + 'd'; + 'e'; + } + default: 'f'; + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-block/output.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-block/output.js new file mode 100644 index 000000000000..4bf150750242 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-block/output.js @@ -0,0 +1,30 @@ +const x = n => function () { + switch (n) { + case 0: + { + 'a'; + } + + case 1: + { + return 'b'; + } + + case 2: + { + return 'c'; + } + + case 3: + return void 0; + + case 4: + { + 'd'; + 'e'; + } + + default: + return 'f'; + } +}(); diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-last/exec.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-last/exec.js new file mode 100644 index 000000000000..f1a689aa3e1a --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-last/exec.js @@ -0,0 +1,21 @@ +const x = (n) => do { + switch (n) { + case 0: + 'a'; + case 1: + 'b'; + break; + default: 'd'; + case 2: + 'c'; + case 3: + case 4: + } +} + +expect(x(0)).toBe('b'); +expect(x(1)).toBe('b'); +expect(x(2)).toBe('c'); +expect(x(3)).toBeUndefined(); +expect(x(4)).toBeUndefined(); +expect(x(5)).toBe('c'); \ No newline at end of file diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-last/input.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-last/input.js new file mode 100644 index 000000000000..0c432fe07022 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-last/input.js @@ -0,0 +1,14 @@ +const x = (n) => do { + switch (n) { + case 0: + 'a'; + case 1: + 'b'; + break; + default: 'd'; + case 2: + 'c'; + case 3: + case 4: + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-last/output.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-last/output.js new file mode 100644 index 000000000000..85bec17a0cda --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough-last/output.js @@ -0,0 +1,18 @@ +const x = n => function () { + switch (n) { + case 0: + 'a'; + + case 1: + return 'b'; + + default: + 'd'; + + case 2: + return 'c'; + + case 3: + case 4: + } +}(); diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough/exec.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough/exec.js new file mode 100644 index 000000000000..6531d426eca8 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough/exec.js @@ -0,0 +1,25 @@ +const x = (n) => do { + switch (n) { + case 0: + 'a'; + case 1: + 'b'; + break; + case 2: + 'c'; + break; + case 3: + break; + case 4: + 'd'; + 'e'; + default: 'f'; + } +} + +expect(x(0)).toBe('b'); +expect(x(1)).toBe('b'); +expect(x(2)).toBe('c'); +expect(x(3)).toBeUndefined(); +expect(x(4)).toBe('f'); +expect(x(5)).toBe('f'); diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough/input.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough/input.js new file mode 100644 index 000000000000..ea14170edc44 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough/input.js @@ -0,0 +1,18 @@ +const x = (n) => do { + switch (n) { + case 0: + 'a'; + case 1: + 'b'; + break; + case 2: + 'c'; + break; + case 3: + break; + case 4: + 'd'; + 'e'; + default: 'f'; + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough/output.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough/output.js new file mode 100644 index 000000000000..a006d36deea8 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/fallthrough/output.js @@ -0,0 +1,22 @@ +const x = n => function () { + switch (n) { + case 0: + 'a'; + + case 1: + return 'b'; + + case 2: + return 'c'; + + case 3: + return void 0; + + case 4: + 'd'; + 'e'; + + default: + return 'f'; + } +}(); diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multi-consequent-multiblock/exec.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multi-consequent-multiblock/exec.js new file mode 100644 index 000000000000..da1fb5e8764b --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multi-consequent-multiblock/exec.js @@ -0,0 +1,36 @@ +const x = (n) => do { + switch (n) { + case 0: + { "a"; } + { break; } + { "b"; }; + case 1: + { "a"; } + break; + { "b"; }; + case 2: + "a"; + { break; } + "b"; + case 3: + "a"; + { "b"; break; } + { "c"; } + case 4: + { "a"; } + { "b"; } + { "c"; break; "d" } + { "e"; break; "f" } + case 5: + { "a"; } + { break; "b"; } + { break; "c"; } + } +} + +expect(x(0)).toBe('a') +expect(x(1)).toBe('a') +expect(x(2)).toBe('a') +expect(x(3)).toBe('b') +expect(x(4)).toBe('c') +expect(x(5)).toBe('a') diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multi-consequent-multiblock/input.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multi-consequent-multiblock/input.js new file mode 100644 index 000000000000..f038e3b27b39 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multi-consequent-multiblock/input.js @@ -0,0 +1,29 @@ +const x = (n) => do { + switch (n) { + case 0: + { "a"; } + { break; } + { "b"; }; + case 1: + { "a"; } + break; + { "b"; }; + case 2: + "a"; + { break; } + "b"; + case 3: + "a"; + { "b"; break; } + { "c"; } + case 4: + { "a"; } + { "b"; } + { "c"; break; "d" } + { "e"; break; "f" } + case 5: + { "a"; } + { break; "b"; } + { break; "c"; } + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multi-consequent-multiblock/output.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multi-consequent-multiblock/output.js new file mode 100644 index 000000000000..a51ac54ca308 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multi-consequent-multiblock/output.js @@ -0,0 +1,60 @@ +const x = n => function () { + switch (n) { + case 0: + { + return "a"; + } + { + "b"; + } + ; + + case 1: + { + return "a"; + } + { + "b"; + } + ; + + case 2: + return "a"; + "b"; + + case 3: + "a"; + { + return "b"; + } + { + "c"; + } + + case 4: + { + "a"; + } + { + "b"; + } + { + return "c"; + "d"; + } + { + "e"; + break; + "f"; + } + + case 5: + { + return "a"; + } + { + break; + "c"; + } + } +}(); diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-break/exec.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-break/exec.js new file mode 100644 index 000000000000..5ae85c2392e4 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-break/exec.js @@ -0,0 +1,19 @@ +const x = (n) => do { + switch (n) { + case 0: + 'a'; + break; + 'b'; + 'c'; + break; + 'd'; + case 6: + 'e'; + default: + 'f' + } +} + +expect(x(0)).toBe('a'); +expect(x(1)).toBe('f'); +expect(x(6)).toBe('f'); \ No newline at end of file diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-break/input.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-break/input.js new file mode 100644 index 000000000000..fd57351fe300 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-break/input.js @@ -0,0 +1,15 @@ +const x = (n) => do { + switch (n) { + case 0: + 'a'; + break; + 'b'; + 'c'; + break; + 'd'; + case 6: + 'e'; + default: + 'f' + } +} diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-break/output.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-break/output.js new file mode 100644 index 000000000000..36f4c4abcb8b --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-break/output.js @@ -0,0 +1,16 @@ +const x = n => function () { + switch (n) { + case 0: + return 'a'; + 'b'; + 'c'; + break; + 'd'; + + case 6: + 'e'; + + default: + return 'f'; + } +}(); diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-consequent-block/exec.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-consequent-block/exec.js new file mode 100644 index 000000000000..0a2bce023197 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-consequent-block/exec.js @@ -0,0 +1,32 @@ +const x = (n) => do { + switch (n) { + case 0: { + 'a'; + break; + } + case 1: { + 'b'; + break; + 'c'; + break; + 'd'; + } + case 2: { + 'e'; + const a = 'e'; + break; + } + case 3: { + const a = 'f'; + break; + 'f'; + } + default: 'g'; + } +} + +expect(x(0)).toBe('a'); +expect(x(1)).toBe('b'); +expect(x(2)).toBeUndefined(); +expect(x(3)).toBeUndefined(); +expect(x(4)).toBe('g'); \ No newline at end of file diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-consequent-block/input.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-consequent-block/input.js new file mode 100644 index 000000000000..d859f871f276 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-consequent-block/input.js @@ -0,0 +1,27 @@ +const x = (n) => do { + switch (n) { + case 0: { + get(); + 'a'; + break; + } + case 1: { + 'b'; + break; + 'c'; + break; + 'd'; + } + case 2: { + 'e'; + const a = 'e'; + break; + } + case 3: { + const a = 'f'; + break; + 'f'; + } + default: 'g'; + } +} diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-consequent-block/output.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-consequent-block/output.js new file mode 100644 index 000000000000..b5d77d0ff7cd --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-consequent-block/output.js @@ -0,0 +1,34 @@ +const x = n => function () { + switch (n) { + case 0: + { + get(); + return 'a'; + } + + case 1: + { + return 'b'; + 'c'; + break; + 'd'; + } + + case 2: + { + 'e'; + const a = 'e'; + return void 0; + } + + case 3: + { + const a = 'f'; + return void 0; + 'f'; + } + + default: + return 'g'; + } +}(); diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-consequent/input.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-consequent/input.js new file mode 100644 index 000000000000..5ef4ca35d4cc --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-consequent/input.js @@ -0,0 +1,9 @@ +const x = () => do { + switch (new Date().getDay()) { + case 0: + get(); + 1+1; + break; + default: "weekday 🚴" + } +} diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-consequent/output.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-consequent/output.js new file mode 100644 index 000000000000..ad928a82a82d --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/multiple-consequent/output.js @@ -0,0 +1,10 @@ +const x = () => function () { + switch (new Date().getDay()) { + case 0: + get(); + return 1 + 1; + + default: + return "weekday 🚴"; + } +}(); diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/options.json b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/options.json new file mode 100644 index 000000000000..96d2eb705b15 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["proposal-do-expressions"] +} diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/single-consequent-block/exec.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/single-consequent-block/exec.js new file mode 100644 index 000000000000..bfb6d498243b --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/single-consequent-block/exec.js @@ -0,0 +1,13 @@ +const x = (n) => do { + switch (n) { + case 0: case 6: { + "weekend 🚵"; + break; + } + default: "weekday 🚴" + } +} + +expect(x(0)).toBe('weekend 🚵') +expect(x(1)).toBe('weekday 🚴') +expect(x(6)).toBe('weekend 🚵') \ No newline at end of file diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/single-consequent-block/input.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/single-consequent-block/input.js new file mode 100644 index 000000000000..8f41efb7ea45 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/single-consequent-block/input.js @@ -0,0 +1,9 @@ +const x = (n) => do { + switch (n) { + case 0: case 6: { + "weekend 🚵"; + break; + } + default: "weekday 🚴" + } +} diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/single-consequent-block/output.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/single-consequent-block/output.js new file mode 100644 index 000000000000..12d69e7a3448 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/single-consequent-block/output.js @@ -0,0 +1,12 @@ +const x = n => function () { + switch (n) { + case 0: + case 6: + { + return "weekend 🚵"; + } + + default: + return "weekday 🚴"; + } +}(); diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/single-consequent/exec.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/single-consequent/exec.js new file mode 100644 index 000000000000..c48058f0b36d --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/single-consequent/exec.js @@ -0,0 +1,10 @@ +const x = (n) => do { + switch (n) { + case 0: case 6: "weekend 🚵"; break + default: "weekday 🚴" + } +} + +expect(x(0)).toBe('weekend 🚵') +expect(x(1)).toBe('weekday 🚴') +expect(x(6)).toBe('weekend 🚵') \ No newline at end of file diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/single-consequent/input.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/single-consequent/input.js new file mode 100644 index 000000000000..e3012915a365 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/single-consequent/input.js @@ -0,0 +1,6 @@ +const x = (n) => do { + switch (n) { + case 0: case 6: "weekend 🚵"; break + default: "weekday 🚴" + } +} diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/single-consequent/output.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/single-consequent/output.js new file mode 100644 index 000000000000..2c7f6486cefc --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/single-consequent/output.js @@ -0,0 +1,10 @@ +const x = n => function () { + switch (n) { + case 0: + case 6: + return "weekend 🚵"; + + default: + return "weekday 🚴"; + } +}(); diff --git a/packages/babel-traverse/src/path/family.js b/packages/babel-traverse/src/path/family.js index 1ed824d3789d..b2d9cefc4e1b 100644 --- a/packages/babel-traverse/src/path/family.js +++ b/packages/babel-traverse/src/path/family.js @@ -18,6 +18,61 @@ function addCompletionRecords(path, paths) { return paths; } +function completionRecordForSwitch(cases, paths) { + let isLastCaseWithConsequent = true; + + for (let i = cases.length - 1; i >= 0; i--) { + const switchCase = cases[i]; + const consequent = switchCase.get("consequent"); + + let breakStatement; + findBreak: for (const statement of consequent) { + if (statement.isBlockStatement()) { + for (const statementInBlock of statement.get("body")) { + if (statementInBlock.isBreakStatement()) { + breakStatement = statementInBlock; + break findBreak; + } + } + } else if (statement.isBreakStatement()) { + breakStatement = statement; + break; + } + } + + if (breakStatement) { + while ( + breakStatement.key === 0 && + breakStatement.parentPath.isBlockStatement() + ) { + breakStatement = breakStatement.parentPath; + } + + const prevSibling = breakStatement.getPrevSibling(); + if ( + breakStatement.key > 0 && + (prevSibling.isExpressionStatement() || prevSibling.isBlockStatement()) + ) { + paths = addCompletionRecords(prevSibling, paths); + breakStatement.remove(); + } else { + breakStatement.replaceWith(breakStatement.scope.buildUndefinedNode()); + paths = addCompletionRecords(breakStatement, paths); + } + } else if (isLastCaseWithConsequent) { + const statementFinder = statement => + !statement.isBlockStatement() || + statement.get("body").some(statementFinder); + const hasConsequent = consequent.some(statementFinder); + if (hasConsequent) { + paths = addCompletionRecords(consequent[consequent.length - 1], paths); + isLastCaseWithConsequent = false; + } + } + } + return paths; +} + export function getCompletionRecords(): NodePath[] { let paths = []; @@ -35,6 +90,8 @@ export function getCompletionRecords(): NodePath[] { paths = addCompletionRecords(this.get("handler"), paths); } else if (this.isCatchClause()) { paths = addCompletionRecords(this.get("body"), paths); + } else if (this.isSwitchStatement()) { + paths = completionRecordForSwitch(this.get("cases"), paths); } else { paths.push(this); }