From bb92b2982b4e19bfefbd2c3aa0ba8d0e9b11d8a3 Mon Sep 17 00:00:00 2001 From: Boshen Date: Thu, 22 Aug 2024 20:22:25 +0800 Subject: [PATCH] fix(semantic): fix error message for duplicated label --- crates/oxc_semantic/src/checker/javascript.rs | 9 ++++++++- tasks/coverage/parser_babel.snap | 6 +++--- tasks/coverage/parser_test262.snap | 4 ++-- tasks/coverage/parser_typescript.snap | 8 ++++---- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/crates/oxc_semantic/src/checker/javascript.rs b/crates/oxc_semantic/src/checker/javascript.rs index 396c7cde49d33..da81f41923c9c 100644 --- a/crates/oxc_semantic/src/checker/javascript.rs +++ b/crates/oxc_semantic/src/checker/javascript.rs @@ -638,13 +638,20 @@ pub fn check_continue_statement<'a>( } } +fn label_redeclaration(x0: &str, span1: Span, span2: Span) -> OxcDiagnostic { + OxcDiagnostic::error(format!("Label `{x0}` has already been declared")).with_labels([ + span1.label(format!("`{x0}` has already been declared here")), + span2.label("It can not be redeclared here"), + ]) +} + #[allow(clippy::option_if_let_else)] pub fn check_labeled_statement(ctx: &SemanticBuilder) { ctx.label_builder.labels.iter().for_each(|labels| { let mut defined = FxHashMap::default(); for labeled in labels { if let Some(span) = defined.get(labeled.name) { - ctx.error(redeclaration(labeled.name, *span, labeled.span)); + ctx.error(label_redeclaration(labeled.name, *span, labeled.span)); } else { defined.insert(labeled.name, labeled.span); } diff --git a/tasks/coverage/parser_babel.snap b/tasks/coverage/parser_babel.snap index 0649ac17c8b53..65626f6298116 100644 --- a/tasks/coverage/parser_babel.snap +++ b/tasks/coverage/parser_babel.snap @@ -1887,7 +1887,7 @@ Expect to Parse: tasks/coverage/babel/packages/babel-parser/test/fixtures/typesc ╰──── help: A `continue` statement can only be used within an enclosing `for`, `while` or `do while` - × Identifier `x` has already been declared + × Label `x` has already been declared ╭─[babel/packages/babel-parser/test/fixtures/core/uncategorised/465/input.js:1:1] 1 │ x: while (true) { x: while (true) { } } · ┬ ┬ @@ -9131,7 +9131,7 @@ Expect to Parse: tasks/coverage/babel/packages/babel-parser/test/fixtures/typesc ╰──── help: A `continue` statement can only be used within an enclosing `for`, `while` or `do while` - × Identifier `x` has already been declared + × Label `x` has already been declared ╭─[babel/packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0182/input.js:1:1] 1 │ x: while (true) { x: while (true) { } } · ┬ ┬ @@ -9540,7 +9540,7 @@ Expect to Parse: tasks/coverage/babel/packages/babel-parser/test/fixtures/typesc · ─────── ╰──── - × Identifier `__proto__` has already been declared + × Label `__proto__` has already been declared ╭─[babel/packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0248/input.js:1:1] 1 │ __proto__: __proto__: 42; · ────┬──── ────┬──── diff --git a/tasks/coverage/parser_test262.snap b/tasks/coverage/parser_test262.snap index fcff25b2e0752..27d28db939ed2 100644 --- a/tasks/coverage/parser_test262.snap +++ b/tasks/coverage/parser_test262.snap @@ -21564,7 +21564,7 @@ Negative Passed: 4220/4220 (100.00%) · ╰── It cannot be redeclared here ╰──── - × Identifier `label` has already been declared + × Label `label` has already been declared ╭─[test262/test/language/module-code/early-dup-lables.js:16:1] 15 │ 16 │ label: { @@ -30302,7 +30302,7 @@ Negative Passed: 4220/4220 (100.00%) 31 │ } ╰──── - × Identifier `x` has already been declared + × Label `x` has already been declared ╭─[test262/test/language/statements/class/static-init-invalid-label-dup.js:21:5] 20 │ static { 21 │ x: x: 0; diff --git a/tasks/coverage/parser_typescript.snap b/tasks/coverage/parser_typescript.snap index 1c8f7c120db9d..e98818396594d 100644 --- a/tasks/coverage/parser_typescript.snap +++ b/tasks/coverage/parser_typescript.snap @@ -7269,7 +7269,7 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/salsa/typeFro 20 │ return 0; ╰──── - × Identifier `target` has already been declared + × Label `target` has already been declared ╭─[typescript/tests/cases/compiler/duplicateLabel1.ts:1:1] 1 │ target: · ───┬── @@ -7280,7 +7280,7 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/salsa/typeFro 3 │ while (true) { ╰──── - × Identifier `target` has already been declared + × Label `target` has already been declared ╭─[typescript/tests/cases/compiler/duplicateLabel2.ts:1:1] 1 │ target: · ───┬── @@ -20674,7 +20674,7 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/salsa/typeFro 3 │ } ╰──── - × Identifier `target` has already been declared + × Label `target` has already been declared ╭─[typescript/tests/cases/conformance/parser/ecmascript5/Statements/LabeledStatements/parser_duplicateLabel1.ts:1:1] 1 │ target: · ───┬── @@ -20685,7 +20685,7 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/salsa/typeFro 3 │ while (true) { ╰──── - × Identifier `target` has already been declared + × Label `target` has already been declared ╭─[typescript/tests/cases/conformance/parser/ecmascript5/Statements/LabeledStatements/parser_duplicateLabel2.ts:1:1] 1 │ target: · ───┬──