fix(semantic): fix error message for duplicated label (#5071)

This commit is contained in:
Boshen 2024-08-22 12:30:04 +00:00
parent efbdced597
commit 6d87b0f1f2
4 changed files with 17 additions and 10 deletions

View file

@ -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);
}

View file

@ -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;
· ────┬──── ────┬────

View file

@ -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;

View file

@ -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:
· ───┬──