From 362dca8b5c7ebb9c6bd9b88158e9271349f04a14 Mon Sep 17 00:00:00 2001 From: Daniel Martens Date: Thu, 8 Feb 2024 17:15:18 +0100 Subject: [PATCH 1/4] feat: disallow switch statements with multiple default cases --- .../_error_/multiple-default-cases/fixture.ts | 3 +++ packages/typescript-estree/src/convert.ts | 11 +++++++++++ 2 files changed, 14 insertions(+) create mode 100644 packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/fixture.ts diff --git a/packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/fixture.ts b/packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/fixture.ts new file mode 100644 index 00000000000..cf62a87a889 --- /dev/null +++ b/packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/fixture.ts @@ -0,0 +1,3 @@ +switch (true) { + default: default: +} \ No newline at end of file diff --git a/packages/typescript-estree/src/convert.ts b/packages/typescript-estree/src/convert.ts index 13882d67c9c..7f248e49737 100644 --- a/packages/typescript-estree/src/convert.ts +++ b/packages/typescript-estree/src/convert.ts @@ -844,6 +844,17 @@ export class Converter { }); case SyntaxKind.SwitchStatement: + if ( + node.caseBlock.clauses.filter( + switchCase => switchCase.kind === SyntaxKind.DefaultClause, + ).length > 1 + ) { + this.#throwError( + node, + "A 'default' clause cannot appear more than once in a 'switch' statement.", + ); + } + return this.createNode(node, { type: AST_NODE_TYPES.SwitchStatement, discriminant: this.convertChild(node.expression), From 185b04e8251eb92458239983e769c78fffdb79e1 Mon Sep 17 00:00:00 2001 From: Daniel Martens Date: Thu, 8 Feb 2024 17:54:04 +0100 Subject: [PATCH 2/4] fix: add missing snapshots for new error fixture --- .../snapshots/1-TSESTree-Error.shot | 11 +++++++++++ .../snapshots/2-Babel-Error.shot | 3 +++ .../snapshots/3-Alignment-Error.shot | 3 +++ 3 files changed, 17 insertions(+) create mode 100644 packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/snapshots/1-TSESTree-Error.shot create mode 100644 packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/snapshots/2-Babel-Error.shot create mode 100644 packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/snapshots/3-Alignment-Error.shot diff --git a/packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/snapshots/1-TSESTree-Error.shot b/packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/snapshots/1-TSESTree-Error.shot new file mode 100644 index 00000000000..b5a7fa669e6 --- /dev/null +++ b/packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/snapshots/1-TSESTree-Error.shot @@ -0,0 +1,11 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`AST Fixtures statement SwitchStatement _error_ multiple-default-cases TSESTree - Error 1`] = ` +"TSError +> 1 | switch (true) { + | ^^^^^^^^^^^^^^^ +> 2 | default: default: + | ^^^^^^^^^^^^^^^^^^ +> 3 | } + | ^^ A 'default' clause cannot appear more than once in a 'switch' statement." +`; diff --git a/packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/snapshots/2-Babel-Error.shot b/packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/snapshots/2-Babel-Error.shot new file mode 100644 index 00000000000..36271efa74a --- /dev/null +++ b/packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/snapshots/2-Babel-Error.shot @@ -0,0 +1,3 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`AST Fixtures statement SwitchStatement _error_ multiple-default-cases Babel - Error 1`] = `[SyntaxError: Multiple default clauses. (2:10)]`; diff --git a/packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/snapshots/3-Alignment-Error.shot b/packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/snapshots/3-Alignment-Error.shot new file mode 100644 index 00000000000..37a7c334d63 --- /dev/null +++ b/packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/snapshots/3-Alignment-Error.shot @@ -0,0 +1,3 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`AST Fixtures statement SwitchStatement _error_ multiple-default-cases Error Alignment 1`] = `"Both errored"`; From 10a7b460bd3b136dfdf7392f1446452deec2f58e Mon Sep 17 00:00:00 2001 From: Brad Zacher Date: Fri, 15 Mar 2024 18:25:33 -0700 Subject: [PATCH 3/4] Update fixture.ts to add a ending newline --- .../fixtures/_error_/multiple-default-cases/fixture.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/fixture.ts b/packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/fixture.ts index cf62a87a889..698850476ff 100644 --- a/packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/fixture.ts +++ b/packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/fixture.ts @@ -1,3 +1,3 @@ switch (true) { default: default: -} \ No newline at end of file +} From 7dabbce0f698ae63c373c49c5667441b654959ee Mon Sep 17 00:00:00 2001 From: Brad Zacher Date: Fri, 15 Mar 2024 18:36:18 -0700 Subject: [PATCH 4/4] Update 1-TSESTree-Error.shot --- .../multiple-default-cases/snapshots/1-TSESTree-Error.shot | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/snapshots/1-TSESTree-Error.shot b/packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/snapshots/1-TSESTree-Error.shot index b5a7fa669e6..ee04bea45a4 100644 --- a/packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/snapshots/1-TSESTree-Error.shot +++ b/packages/ast-spec/src/statement/SwitchStatement/fixtures/_error_/multiple-default-cases/snapshots/1-TSESTree-Error.shot @@ -7,5 +7,6 @@ exports[`AST Fixtures statement SwitchStatement _error_ multiple-default-cases T > 2 | default: default: | ^^^^^^^^^^^^^^^^^^ > 3 | } - | ^^ A 'default' clause cannot appear more than once in a 'switch' statement." + | ^^ A 'default' clause cannot appear more than once in a 'switch' statement. + 4 |" `;