From 7ce77582436a594c12a48172c7b8ecf35fd66a30 Mon Sep 17 00:00:00 2001 From: Barron Wei Date: Wed, 17 Jun 2020 15:15:54 -0400 Subject: [PATCH 01/12] test(do-expr): condition before break --- .../condition-before-break/input.js | 10 ++++++++++ .../condition-before-break/output.js | 9 +++++++++ 2 files changed, 19 insertions(+) create mode 100644 packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/input.js create mode 100644 packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/output.js diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/input.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/input.js new file mode 100644 index 000000000000..deb5891d784b --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/input.js @@ -0,0 +1,10 @@ +const x = (n) => do { + switch (n) { + case 0: + if (true) { + 'out'; + break; + } + + } +} diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/output.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/output.js new file mode 100644 index 000000000000..f0acfbbfad1b --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/output.js @@ -0,0 +1,9 @@ +const x = n => function () { + switch (n) { + case 0: + if (true) { + return 'out'; + } + + } +}(); From ed71ebf50bf59ec66407add5a3f590024ddd238d Mon Sep 17 00:00:00 2001 From: Barron Wei Date: Wed, 17 Jun 2020 15:16:27 -0400 Subject: [PATCH 02/12] test(do-expr): labeled break --- .../test/fixtures/do-expressions/labeled-break/input.js | 6 ++++++ .../test/fixtures/do-expressions/labeled-break/options.json | 3 +++ .../test/fixtures/do-expressions/labeled-break/output.js | 5 +++++ 3 files changed, 14 insertions(+) create mode 100644 packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/input.js create mode 100644 packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/options.json create mode 100644 packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/output.js diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/input.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/input.js new file mode 100644 index 000000000000..49a2a42d2f1c --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/input.js @@ -0,0 +1,6 @@ +const x = do { + y: { + 'out'; + break y; + } +} diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/options.json b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/options.json new file mode 100644 index 000000000000..116249a4f7a7 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["transform-block-scoping", "proposal-do-expressions"] +} diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/output.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/output.js new file mode 100644 index 000000000000..e2abb621585a --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/output.js @@ -0,0 +1,5 @@ +var x = function () { + y: { + return 'out'; + } +}(); From 8439fc86dee5fd5da0394cf56c1a4ba259db0ec7 Mon Sep 17 00:00:00 2001 From: Barron Wei Date: Wed, 17 Jun 2020 15:17:49 -0400 Subject: [PATCH 03/12] fix(do-expr): add check for break in BlockStatement --- packages/babel-traverse/src/path/family.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/babel-traverse/src/path/family.js b/packages/babel-traverse/src/path/family.js index b2d9cefc4e1b..cb29f359b4b8 100644 --- a/packages/babel-traverse/src/path/family.js +++ b/packages/babel-traverse/src/path/family.js @@ -81,7 +81,14 @@ export function getCompletionRecords(): NodePath[] { paths = addCompletionRecords(this.get("alternate"), paths); } else if (this.isDoExpression() || this.isFor() || this.isWhile()) { paths = addCompletionRecords(this.get("body"), paths); - } else if (this.isProgram() || this.isBlockStatement()) { + } else if (this.isProgram()) { + paths = addCompletionRecords(this.get("body").pop(), paths); + } else if (this.isBlockStatement()) { + const body = this.get("body"); + const last = body[body.length - 1]; + if (last.isBreakStatement()) { + last.remove(); + } paths = addCompletionRecords(this.get("body").pop(), paths); } else if (this.isFunction()) { return this.get("body").getCompletionRecords(); From 363e2a5f57d0837d35b5c8e8e7a4241c55c80cfa Mon Sep 17 00:00:00 2001 From: Barron Wei Date: Wed, 17 Jun 2020 15:18:31 -0400 Subject: [PATCH 04/12] fix(do-expr): add LabeledStatement case for getCompletionRecords --- packages/babel-traverse/src/path/family.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-traverse/src/path/family.js b/packages/babel-traverse/src/path/family.js index cb29f359b4b8..e0b30e2e30ba 100644 --- a/packages/babel-traverse/src/path/family.js +++ b/packages/babel-traverse/src/path/family.js @@ -95,7 +95,7 @@ export function getCompletionRecords(): NodePath[] { } else if (this.isTryStatement()) { paths = addCompletionRecords(this.get("block"), paths); paths = addCompletionRecords(this.get("handler"), paths); - } else if (this.isCatchClause()) { + } else if (this.isCatchClause() || this.isLabeledStatement()) { paths = addCompletionRecords(this.get("body"), paths); } else if (this.isSwitchStatement()) { paths = completionRecordForSwitch(this.get("cases"), paths); From 063baf0b8804821708011b09bb5d4e7daaf39877 Mon Sep 17 00:00:00 2001 From: Barron Wei Date: Thu, 18 Jun 2020 15:26:42 -0400 Subject: [PATCH 05/12] test(do-expr): rename condition before break to condition before expression --- .../input.js | 0 .../output.js | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/{condition-before-break => condition-before-expression}/input.js (100%) rename packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/{condition-before-break => condition-before-expression}/output.js (100%) diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/input.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-expression/input.js similarity index 100% rename from packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/input.js rename to packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-expression/input.js diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/output.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-expression/output.js similarity index 100% rename from packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/output.js rename to packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-expression/output.js From 38088a1eccd95dcd2c08173e6aea13f54c0d1418 Mon Sep 17 00:00:00 2001 From: Barron Wei Date: Thu, 18 Jun 2020 15:42:44 -0400 Subject: [PATCH 06/12] revert(do-expr): undo remove break for do switch --- packages/babel-traverse/src/path/family.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/babel-traverse/src/path/family.js b/packages/babel-traverse/src/path/family.js index e0b30e2e30ba..719f74514109 100644 --- a/packages/babel-traverse/src/path/family.js +++ b/packages/babel-traverse/src/path/family.js @@ -84,11 +84,6 @@ export function getCompletionRecords(): NodePath[] { } else if (this.isProgram()) { paths = addCompletionRecords(this.get("body").pop(), paths); } else if (this.isBlockStatement()) { - const body = this.get("body"); - const last = body[body.length - 1]; - if (last.isBreakStatement()) { - last.remove(); - } paths = addCompletionRecords(this.get("body").pop(), paths); } else if (this.isFunction()) { return this.get("body").getCompletionRecords(); From 1cbb509e8d9bf5f98e444284028b55d7b80e1702 Mon Sep 17 00:00:00 2001 From: Barron Wei Date: Thu, 18 Jun 2020 15:43:39 -0400 Subject: [PATCH 07/12] revert(do-expr): undo remove labeled break --- packages/babel-traverse/src/path/family.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-traverse/src/path/family.js b/packages/babel-traverse/src/path/family.js index 719f74514109..032dcc33e74e 100644 --- a/packages/babel-traverse/src/path/family.js +++ b/packages/babel-traverse/src/path/family.js @@ -90,7 +90,7 @@ export function getCompletionRecords(): NodePath[] { } else if (this.isTryStatement()) { paths = addCompletionRecords(this.get("block"), paths); paths = addCompletionRecords(this.get("handler"), paths); - } else if (this.isCatchClause() || this.isLabeledStatement()) { + } else if (this.isCatchClause()) { paths = addCompletionRecords(this.get("body"), paths); } else if (this.isSwitchStatement()) { paths = completionRecordForSwitch(this.get("cases"), paths); From 8cadeb1fd255f1feaff05076c9f0c1c8e18065fc Mon Sep 17 00:00:00 2001 From: Barron Wei Date: Thu, 18 Jun 2020 15:52:54 -0400 Subject: [PATCH 08/12] test(do-expr): add condition before break --- .../condition-before-break/exec.js | 11 +++++++++++ .../condition-before-break/input.js | 9 +++++++++ .../condition-before-break/output.js | 9 +++++++++ 3 files changed, 29 insertions(+) create mode 100644 packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/exec.js create mode 100644 packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/input.js create mode 100644 packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/output.js diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/exec.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/exec.js new file mode 100644 index 000000000000..0a771a985064 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/exec.js @@ -0,0 +1,11 @@ +const x = (n) => do { + switch (n) { + case 0: + if (true) { + break; + } + + } +} + +expect(x(0)).toBe(undefined); diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/input.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/input.js new file mode 100644 index 000000000000..41f65cf645e1 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/input.js @@ -0,0 +1,9 @@ +const x = (n) => do { + switch (n) { + case 0: + if (true) { + break; + } + + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/output.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/output.js new file mode 100644 index 000000000000..a30d7d6b62f5 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/output.js @@ -0,0 +1,9 @@ +const x = n => function () { + switch (n) { + case 0: + if (true) { + break; + } + + } +}(); From 3723a28aef49b58914c191b02b5f4a942fb0c28b Mon Sep 17 00:00:00 2001 From: Barron Wei Date: Thu, 18 Jun 2020 16:18:24 -0400 Subject: [PATCH 09/12] test(do-expr): update condition before break --- .../do-expression-switch-case/condition-before-break/exec.js | 1 - .../condition-before-break/input.js | 1 - .../condition-before-break/output.js | 5 +---- 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/exec.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/exec.js index 0a771a985064..27bba05a969d 100644 --- a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/exec.js +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/exec.js @@ -4,7 +4,6 @@ const x = (n) => do { if (true) { break; } - } } diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/input.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/input.js index 41f65cf645e1..febf6add8206 100644 --- a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/input.js +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/input.js @@ -4,6 +4,5 @@ const x = (n) => do { if (true) { break; } - } } \ No newline at end of file diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/output.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/output.js index a30d7d6b62f5..6f8a8e2dcec0 100644 --- a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/output.js +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/output.js @@ -1,9 +1,6 @@ const x = n => function () { switch (n) { case 0: - if (true) { - break; - } - + if (true) return void 0; } }(); From 9510c9964967de336f10e0fb2d76e4def0f26183 Mon Sep 17 00:00:00 2001 From: Barron Wei Date: Thu, 18 Jun 2020 17:06:07 -0400 Subject: [PATCH 10/12] test(do-expr): remove labeled break --- .../test/fixtures/do-expressions/labeled-break/input.js | 6 ------ .../test/fixtures/do-expressions/labeled-break/options.json | 3 --- .../test/fixtures/do-expressions/labeled-break/output.js | 5 ----- 3 files changed, 14 deletions(-) delete mode 100644 packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/input.js delete mode 100644 packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/options.json delete mode 100644 packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/output.js diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/input.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/input.js deleted file mode 100644 index 49a2a42d2f1c..000000000000 --- a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/input.js +++ /dev/null @@ -1,6 +0,0 @@ -const x = do { - y: { - 'out'; - break y; - } -} diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/options.json b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/options.json deleted file mode 100644 index 116249a4f7a7..000000000000 --- a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "plugins": ["transform-block-scoping", "proposal-do-expressions"] -} diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/output.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/output.js deleted file mode 100644 index e2abb621585a..000000000000 --- a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expressions/labeled-break/output.js +++ /dev/null @@ -1,5 +0,0 @@ -var x = function () { - y: { - return 'out'; - } -}(); From a3c491aaad3f3c3807794f6130944aef332932a2 Mon Sep 17 00:00:00 2001 From: Barron Wei Date: Thu, 18 Jun 2020 17:07:11 -0400 Subject: [PATCH 11/12] fix(do-expr): add tree search in findBreak --- packages/babel-traverse/src/path/family.js | 55 +++++++++++++++------- 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/packages/babel-traverse/src/path/family.js b/packages/babel-traverse/src/path/family.js index 032dcc33e74e..e7d702880e04 100644 --- a/packages/babel-traverse/src/path/family.js +++ b/packages/babel-traverse/src/path/family.js @@ -18,6 +18,42 @@ function addCompletionRecords(path, paths) { return paths; } +function findBreak(statements): ?NodePath { + let breakStatement; + if (!Array.isArray(statements)) { + statements = [statements]; + } + + for (const statement of statements) { + if ( + statement.isDoExpression() || + statement.isProgram() || + statement.isBlockStatement() || + statement.isCatchClause() || + statement.isLabeledStatement() + ) { + breakStatement = findBreak(statement.get("body")); + } else if (statement.isIfStatement()) { + breakStatement = + findBreak(statement.get("consequent")) ?? + findBreak(statement.get("alternate")); + } else if (statement.isTryStatement()) { + breakStatement = + findBreak(statement.get("block")) ?? + findBreak(statement.get("handler")); + } else if (statement.isFunction()) { + return findBreak(statement.get("body")); + } else if (statement.isBreakStatement()) { + breakStatement = statement; + } + + if (breakStatement) { + return breakStatement; + } + } + return null; +} + function completionRecordForSwitch(cases, paths) { let isLastCaseWithConsequent = true; @@ -25,20 +61,7 @@ function completionRecordForSwitch(cases, paths) { 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; - } - } + let breakStatement = findBreak(consequent); if (breakStatement) { while ( @@ -81,9 +104,7 @@ export function getCompletionRecords(): NodePath[] { paths = addCompletionRecords(this.get("alternate"), paths); } else if (this.isDoExpression() || this.isFor() || this.isWhile()) { paths = addCompletionRecords(this.get("body"), paths); - } else if (this.isProgram()) { - paths = addCompletionRecords(this.get("body").pop(), paths); - } else if (this.isBlockStatement()) { + } else if (this.isProgram() || this.isBlockStatement()) { paths = addCompletionRecords(this.get("body").pop(), paths); } else if (this.isFunction()) { return this.get("body").getCompletionRecords(); From cd1fdbbb0c12e5fac2ce9ac8e220bd437681e5d7 Mon Sep 17 00:00:00 2001 From: Barron Wei Date: Fri, 19 Jun 2020 12:42:56 -0400 Subject: [PATCH 12/12] fix(do-expr): ignore isFunction case in findBreak --- packages/babel-traverse/src/path/family.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/babel-traverse/src/path/family.js b/packages/babel-traverse/src/path/family.js index e7d702880e04..6b5743384a68 100644 --- a/packages/babel-traverse/src/path/family.js +++ b/packages/babel-traverse/src/path/family.js @@ -41,8 +41,6 @@ function findBreak(statements): ?NodePath { breakStatement = findBreak(statement.get("block")) ?? findBreak(statement.get("handler")); - } else if (statement.isFunction()) { - return findBreak(statement.get("body")); } else if (statement.isBreakStatement()) { breakStatement = statement; }