diff --git a/crates/oxc_linter/src/rules/eslint/valid_typeof.rs b/crates/oxc_linter/src/rules/eslint/valid_typeof.rs index 2c8555619eb4a..034f040714b05 100644 --- a/crates/oxc_linter/src/rules/eslint/valid_typeof.rs +++ b/crates/oxc_linter/src/rules/eslint/valid_typeof.rs @@ -1,7 +1,7 @@ use oxc_ast::{AstKind, ast::Expression}; use oxc_diagnostics::OxcDiagnostic; use oxc_macros::declare_oxc_lint; -use oxc_span::{GetSpan, Span}; +use oxc_span::{GetSpan, Span, best_match}; use oxc_syntax::operator::UnaryOperator; use schemars::JsonSchema; use serde::Deserialize; @@ -10,7 +10,6 @@ use crate::{ AstNode, context::LintContext, rule::{DefaultRuleConfig, Rule}, - utils::best_match, }; fn not_string(help: Option<&'static str>, span: Span) -> OxcDiagnostic { diff --git a/crates/oxc_linter/src/rules/nextjs/no_typos.rs b/crates/oxc_linter/src/rules/nextjs/no_typos.rs index 107792ed48696..2f8a8c9d37d26 100644 --- a/crates/oxc_linter/src/rules/nextjs/no_typos.rs +++ b/crates/oxc_linter/src/rules/nextjs/no_typos.rs @@ -4,13 +4,12 @@ use oxc_ast::{ }; use oxc_diagnostics::OxcDiagnostic; use oxc_macros::declare_oxc_lint; -use oxc_span::Span; +use oxc_span::{Span, best_match}; use crate::{ AstNode, context::{ContextHost, LintContext}, rule::Rule, - utils::best_match, }; fn no_typos_diagnostic(typo: &str, suggestion: &str, span: Span) -> OxcDiagnostic { diff --git a/crates/oxc_linter/src/utils/mod.rs b/crates/oxc_linter/src/utils/mod.rs index 47318884e51fd..31d995ccc9d3a 100644 --- a/crates/oxc_linter/src/utils/mod.rs +++ b/crates/oxc_linter/src/utils/mod.rs @@ -13,7 +13,6 @@ use oxc_syntax::identifier::{is_identifier_part, is_identifier_start}; mod comment; mod config; -mod edit_distance; mod express; mod jest; mod jsdoc; @@ -29,8 +28,8 @@ mod vitest; mod vue; pub use self::{ - comment::*, config::*, edit_distance::*, express::*, jest::*, jsdoc::*, nextjs::*, promise::*, - react::*, react_perf::*, regex::*, typescript::*, unicorn::*, url::*, vitest::*, vue::*, + comment::*, config::*, express::*, jest::*, jsdoc::*, nextjs::*, promise::*, react::*, + react_perf::*, regex::*, typescript::*, unicorn::*, url::*, vitest::*, vue::*, }; /// List of Jest rules that have Vitest equivalents. diff --git a/crates/oxc_semantic/src/checker/javascript.rs b/crates/oxc_semantic/src/checker/javascript.rs index fe32e42807961..a360e5d27409d 100644 --- a/crates/oxc_semantic/src/checker/javascript.rs +++ b/crates/oxc_semantic/src/checker/javascript.rs @@ -4,7 +4,7 @@ use rustc_hash::FxHashMap; use oxc_allocator::GetAddress; use oxc_ast::{AstKind, ModuleDeclarationKind, ast::*}; use oxc_ecmascript::{BoundNames, IsSimpleParameterList, PropName}; -use oxc_span::{GetSpan, ModuleKind, Span}; +use oxc_span::{GetSpan, ModuleKind, Span, best_match}; use oxc_syntax::{ class::ClassId, number::NumberBase, @@ -15,6 +15,9 @@ use oxc_syntax::{ use crate::{IsGlobalReference, builder::SemanticBuilder, class::Element, diagnostics}; +/// Threshold for edit distance when suggesting similar names +const SUGGESTION_THRESHOLD: usize = 2; + /// It is a Syntax Error if any element of the ExportedBindings of ModuleItemList /// does not also occur in either the VarDeclaredNames of ModuleItemList, or the LexicallyDeclaredNames of ModuleItemList. pub fn check_unresolved_exports(program: &Program<'_>, ctx: &SemanticBuilder<'_>) { @@ -22,15 +25,28 @@ pub fn check_unresolved_exports(program: &Program<'_>, ctx: &SemanticBuilder<'_> return; } + let mut available_names: Option> = None; for stmt in &program.body { if let Statement::ExportNamedDeclaration(decl) = stmt { for specifier in &decl.specifiers { if let ModuleExportName::IdentifierReference(ident) = &specifier.local && ident.is_global_reference(&ctx.scoping) { - ctx.errors - .borrow_mut() - .push(diagnostics::undefined_export(&ident.name, ident.span)); + let names = available_names.get_or_insert_with(|| { + let root_scope_id = ctx.scoping.root_scope_id(); + ctx.scoping + .get_bindings(root_scope_id) + .keys() + .map(oxc_span::Ident::as_str) + .collect() + }); + let suggestion = + best_match(&ident.name, names.iter().copied(), SUGGESTION_THRESHOLD); + ctx.errors.borrow_mut().push(diagnostics::undefined_export( + &ident.name, + suggestion, + ident.span, + )); } } } @@ -338,11 +354,30 @@ pub fn check_private_identifier_outside_class( fn check_private_identifier(ctx: &SemanticBuilder<'_>) { if let Some(class_id) = ctx.class_table_builder.current_class_id { + let mut available_names: Option> = None; for reference in ctx.class_table_builder.classes.iter_private_identifiers(class_id) { if !ctx.class_table_builder.classes.ancestors(class_id).any(|class_id| { ctx.class_table_builder.classes.has_private_definition(class_id, reference.name) }) { - ctx.error(diagnostics::private_field_undeclared(&reference.name, reference.span)); + let names = available_names.get_or_insert_with(|| { + let mut names = Vec::new(); + for ancestor_class_id in ctx.class_table_builder.classes.ancestors(class_id) { + for element in &ctx.class_table_builder.classes.elements[ancestor_class_id] + { + if element.is_private { + names.push(element.name.as_ref()); + } + } + } + names + }); + let suggestion = + best_match(&reference.name, names.iter().copied(), SUGGESTION_THRESHOLD); + ctx.error(diagnostics::private_field_undeclared( + &reference.name, + suggestion, + reference.span, + )); } } } @@ -784,12 +819,20 @@ pub fn check_switch_statement<'a>(stmt: &SwitchStatement<'a>, ctx: &SemanticBuil pub fn check_break_statement(stmt: &BreakStatement, ctx: &SemanticBuilder<'_>) { // It is a Syntax Error if this BreakStatement is not nested, directly or indirectly (but not crossing function or static initialization block boundaries), within an IterationStatement or a SwitchStatement. + + let mut available_labels: Option> = None; for node_kind in ctx.nodes.ancestor_kinds(ctx.current_node_id) { match node_kind { AstKind::Program(_) => { return stmt.label.as_ref().map_or_else( || ctx.error(diagnostics::invalid_break(stmt.span)), - |label| ctx.error(diagnostics::invalid_label_target(label.span)), + |label| { + let labels = + available_labels.get_or_insert_with(|| collect_label_names(ctx)); + let suggestion = + best_match(&label.name, labels.iter().copied(), SUGGESTION_THRESHOLD); + ctx.error(diagnostics::invalid_label_target(suggestion, label.span)); + }, ); } AstKind::Function(_) | AstKind::StaticBlock(_) => { @@ -820,12 +863,20 @@ pub fn check_break_statement(stmt: &BreakStatement, ctx: &SemanticBuilder<'_>) { pub fn check_continue_statement(stmt: &ContinueStatement, ctx: &SemanticBuilder<'_>) { // It is a Syntax Error if this ContinueStatement is not nested, directly or indirectly (but not crossing function or static initialization block boundaries), within an IterationStatement. + + let mut available_labels: Option> = None; for node_kind in ctx.nodes.ancestor_kinds(ctx.current_node_id) { match node_kind { AstKind::Program(_) => { return stmt.label.as_ref().map_or_else( || ctx.error(diagnostics::invalid_continue(stmt.span)), - |label| ctx.error(diagnostics::invalid_label_target(label.span)), + |label| { + let labels = + available_labels.get_or_insert_with(|| collect_label_names(ctx)); + let suggestion = + best_match(&label.name, labels.iter().copied(), SUGGESTION_THRESHOLD); + ctx.error(diagnostics::invalid_label_target(suggestion, label.span)); + }, ); } AstKind::Function(_) | AstKind::StaticBlock(_) => { @@ -861,6 +912,18 @@ pub fn check_continue_statement(stmt: &ContinueStatement, ctx: &SemanticBuilder< } } +fn collect_label_names<'a>(ctx: &'_ SemanticBuilder<'a>) -> Vec<&'a str> { + let mut labels = Vec::new(); + for node_kind in ctx.nodes.ancestor_kinds(ctx.current_node_id) { + if let AstKind::LabeledStatement(labeled_statement) = node_kind { + labels.push(labeled_statement.label.name.as_str()); + } else if matches!(node_kind, AstKind::Function(_) | AstKind::StaticBlock(_)) { + break; + } + } + labels +} + pub fn check_labeled_statement(stmt: &LabeledStatement, ctx: &SemanticBuilder<'_>) { for node_kind in ctx.nodes.ancestor_kinds(ctx.current_node_id) { match node_kind { diff --git a/crates/oxc_semantic/src/diagnostics.rs b/crates/oxc_semantic/src/diagnostics.rs index 775cd90260478..7028538c3d8ed 100644 --- a/crates/oxc_semantic/src/diagnostics.rs +++ b/crates/oxc_semantic/src/diagnostics.rs @@ -27,8 +27,13 @@ pub fn static_and_instance_private_identifier(x0: &str, span1: Span, span2: Span } #[cold] -pub fn undefined_export(x0: &str, span1: Span) -> OxcDiagnostic { - OxcDiagnostic::error(format!("Export '{x0}' is not defined")).with_label(span1) +pub fn undefined_export(x0: &str, suggestion: Option<&str>, span1: Span) -> OxcDiagnostic { + let mut diagnostic = + OxcDiagnostic::error(format!("Export '{x0}' is not defined")).with_label(span1); + if let Some(suggestion) = suggestion { + diagnostic = diagnostic.with_help(format!("Did you mean '{suggestion}'?")); + } + diagnostic } #[cold] @@ -68,9 +73,15 @@ pub fn private_not_in_class(x0: &str, span1: Span) -> OxcDiagnostic { } #[cold] -pub fn private_field_undeclared(x0: &str, span1: Span) -> OxcDiagnostic { - OxcDiagnostic::error(format!("Private field '#{x0}' must be declared in an enclosing class")) - .with_label(span1) +pub fn private_field_undeclared(x0: &str, suggestion: Option<&str>, span1: Span) -> OxcDiagnostic { + let mut diagnostic = OxcDiagnostic::error(format!( + "Private field '#{x0}' must be declared in an enclosing class" + )) + .with_label(span1); + if let Some(suggestion) = suggestion { + diagnostic = diagnostic.with_help(format!("Did you mean '#{suggestion}'?")); + } + diagnostic } #[cold] @@ -168,8 +179,12 @@ pub fn invalid_label_jump_target(span: Span) -> OxcDiagnostic { } #[cold] -pub fn invalid_label_target(span: Span) -> OxcDiagnostic { - OxcDiagnostic::error("Use of undefined label").with_label(span) +pub fn invalid_label_target(suggestion: Option<&str>, span: Span) -> OxcDiagnostic { + let mut diagnostic = OxcDiagnostic::error("Use of undefined label").with_label(span); + if let Some(suggestion) = suggestion { + diagnostic = diagnostic.with_help(format!("Did you mean '{suggestion}'?")); + } + diagnostic } #[cold] diff --git a/crates/oxc_linter/src/utils/edit_distance.rs b/crates/oxc_span/src/edit_distance.rs similarity index 52% rename from crates/oxc_linter/src/utils/edit_distance.rs rename to crates/oxc_span/src/edit_distance.rs index fda8565090a74..e6c4252374609 100644 --- a/crates/oxc_linter/src/utils/edit_distance.rs +++ b/crates/oxc_span/src/edit_distance.rs @@ -1,3 +1,5 @@ +//! Levenshtein edit distance calculation for suggesting similar names. + /// Returns the Levenshtein edit distance between `a` and `b`. /// /// Uses a two-row dynamic programming algorithm to keep memory usage small. @@ -33,6 +35,10 @@ pub fn best_match<'a>( let mut best: Option<(&'a str, usize)> = None; for candidate in candidates { + // no need to calculate distance if length difference exceeds threshold + if candidate.len().abs_diff(needle.len()) > threshold { + continue; + } let distance = min_edit_distance(candidate, needle); if distance == 0 { return None; @@ -47,3 +53,38 @@ pub fn best_match<'a>( best.map(|(candidate, _)| candidate) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_min_edit_distance() { + assert_eq!(min_edit_distance("", ""), 0); + assert_eq!(min_edit_distance("a", "a"), 0); + assert_eq!(min_edit_distance("abc", "abc"), 0); + assert_eq!(min_edit_distance("", "abc"), 3); + assert_eq!(min_edit_distance("abc", ""), 3); + assert_eq!(min_edit_distance("abc", "def"), 3); + assert_eq!(min_edit_distance("sitting", "kitten"), 3); + } + + #[test] + fn test_best_match() { + let candidates = vec!["apple", "banana", "cherry"]; + + // Exact match returns None + assert_eq!(best_match("apple", candidates.clone(), 2), None); + + // Close match within threshold + assert_eq!(best_match("aple", candidates.clone(), 2), Some("apple")); + assert_eq!(best_match("banan", candidates.clone(), 2), Some("banana")); + + // No match within threshold + assert_eq!(best_match("xyz", candidates.clone(), 2), None); + + // Empty candidates + let empty: Vec<&str> = vec![]; + assert_eq!(best_match("test", empty, 2), None); + } +} diff --git a/crates/oxc_span/src/lib.rs b/crates/oxc_span/src/lib.rs index 1b575157c0929..71d58623476d0 100644 --- a/crates/oxc_span/src/lib.rs +++ b/crates/oxc_span/src/lib.rs @@ -3,10 +3,12 @@ //! mod cmp; +mod edit_distance; mod source_type; mod span; pub use cmp::ContentEq; +pub use edit_distance::{best_match, min_edit_distance}; pub use oxc_str::ident; pub use oxc_str::{ ArenaIdentHashMap, Atom, CompactStr, Ident, IdentHashMap, IdentHashSet, diff --git a/tasks/coverage/snapshots/parser_babel.snap b/tasks/coverage/snapshots/parser_babel.snap index 9ded69f7cc368..9ff956f1080f5 100644 --- a/tasks/coverage/snapshots/parser_babel.snap +++ b/tasks/coverage/snapshots/parser_babel.snap @@ -1082,6 +1082,7 @@ Expect to Parse: tasks/coverage/babel/packages/babel-parser/test/fixtures/typesc · ─────── 2 │ function decrypt() {} ╰──── + help: Did you mean 'decrypt'? × Export 'encrypt' is not defined ╭─[babel/packages/babel-parser/test/fixtures/core/scope/undecl-export-as-default/input.js:1:10] diff --git a/tasks/coverage/snapshots/parser_test262.snap b/tasks/coverage/snapshots/parser_test262.snap index 7c7008bb8bd86..35dad59632c17 100644 --- a/tasks/coverage/snapshots/parser_test262.snap +++ b/tasks/coverage/snapshots/parser_test262.snap @@ -11475,6 +11475,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 42 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-method-accessor-set.js:41:15] @@ -11491,6 +11492,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 42 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-method-async-gen.js:41:15] @@ -11507,6 +11509,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 42 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-method-async.js:41:15] @@ -11523,6 +11526,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 42 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-method-gen.js:41:15] @@ -11539,6 +11543,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 42 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-method.js:41:15] @@ -11555,6 +11560,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 42 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-no-reference.js:41:15] @@ -11571,6 +11577,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 42 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-privatename.js:41:15] @@ -11595,6 +11602,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 42 │ ); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-private-method-accessor-set.js:41:15] @@ -11611,6 +11619,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 42 │ ); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-private-method-async-gen.js:41:15] @@ -11651,6 +11660,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 42 │ ); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-private-no-reference.js:41:15] @@ -11667,6 +11677,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 42 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-privatename.js:41:15] @@ -11691,6 +11702,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 36 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-method-accessor-set.js:35:14] @@ -11707,6 +11719,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 36 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-method-async-gen.js:35:14] @@ -11723,6 +11736,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 36 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-method-async.js:35:14] @@ -11739,6 +11753,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 36 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-method-gen.js:35:14] @@ -11755,6 +11770,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 36 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-method.js:35:14] @@ -11771,6 +11787,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 36 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-no-reference.js:35:14] @@ -11787,6 +11804,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 36 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-privatename.js:35:14] @@ -11811,6 +11829,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 36 │ ; ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-private-method-accessor-set.js:35:14] @@ -11827,6 +11846,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 36 │ ; ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-private-method-async-gen.js:35:14] @@ -11867,6 +11887,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 36 │ ; ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-private-no-reference.js:35:14] @@ -11883,6 +11904,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 36 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-privatename.js:35:14] @@ -11907,6 +11929,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 42 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-method-accessor-set.js:41:16] @@ -11923,6 +11946,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 42 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-method-async-gen.js:41:16] @@ -11939,6 +11963,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 42 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-method-async.js:41:16] @@ -11955,6 +11980,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 42 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-method-gen.js:41:16] @@ -11971,6 +11997,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 42 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-method.js:41:16] @@ -11987,6 +12014,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 42 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-no-reference.js:41:16] @@ -12003,6 +12031,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 42 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-privatename.js:41:16] @@ -12027,6 +12056,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 42 │ )); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-private-method-accessor-set.js:41:16] @@ -12043,6 +12073,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 42 │ )); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-private-method-async-gen.js:41:16] @@ -12083,6 +12114,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 42 │ )); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-private-no-reference.js:41:16] @@ -12099,6 +12131,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 42 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-privatename.js:41:16] @@ -12123,6 +12156,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-method-accessor-set.js:43:13] @@ -12139,6 +12173,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-method-async-gen.js:43:13] @@ -12155,6 +12190,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-method-async.js:43:13] @@ -12171,6 +12207,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-method-gen.js:43:13] @@ -12187,6 +12224,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-method.js:43:13] @@ -12203,6 +12241,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-no-reference.js:43:13] @@ -12219,6 +12258,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-privatename.js:43:13] @@ -12243,6 +12283,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ ); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-private-method-accessor-set.js:43:13] @@ -12259,6 +12300,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ ); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-private-method-async-gen.js:43:13] @@ -12299,6 +12341,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ ); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-private-no-reference.js:43:13] @@ -12315,6 +12358,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-privatename.js:43:13] @@ -12339,6 +12383,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 38 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-method-accessor-set.js:37:12] @@ -12355,6 +12400,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 38 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-method-async-gen.js:37:12] @@ -12371,6 +12417,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 38 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-method-async.js:37:12] @@ -12387,6 +12434,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 38 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-method-gen.js:37:12] @@ -12403,6 +12451,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 38 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-method.js:37:12] @@ -12419,6 +12468,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 38 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-no-reference.js:37:12] @@ -12435,6 +12485,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 38 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-privatename.js:37:12] @@ -12459,6 +12510,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 38 │ ; ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-private-method-accessor-set.js:37:12] @@ -12475,6 +12527,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 38 │ ; ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-private-method-async-gen.js:37:12] @@ -12515,6 +12568,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 38 │ ; ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-private-no-reference.js:37:12] @@ -12531,6 +12585,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 38 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-privatename.js:37:12] @@ -12555,6 +12610,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-method-accessor-set.js:43:14] @@ -12571,6 +12627,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-method-async-gen.js:43:14] @@ -12587,6 +12644,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-method-async.js:43:14] @@ -12603,6 +12661,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-method-gen.js:43:14] @@ -12619,6 +12678,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-method.js:43:14] @@ -12635,6 +12695,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-no-reference.js:43:14] @@ -12651,6 +12712,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-privatename.js:43:14] @@ -12675,6 +12737,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ )); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-private-method-accessor-set.js:43:14] @@ -12691,6 +12754,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ )); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-private-method-async-gen.js:43:14] @@ -12731,6 +12795,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ )); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-private-no-reference.js:43:14] @@ -12747,6 +12812,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/expressions/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-privatename.js:43:14] @@ -18162,6 +18228,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 31 │ } ╰──── + help: Did you mean '#a'? × Private identifier '#name' is not allowed outside class bodies ╭─[test262/test/language/expressions/in/private-field-invalid-identifier-simple.js:26:1] @@ -30613,6 +30680,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 39 │ f() { ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-method-accessor-set.js:38:15] @@ -30629,6 +30697,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 39 │ f() { ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-method-async-gen.js:38:15] @@ -30645,6 +30714,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 39 │ f() { ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-method-async.js:38:15] @@ -30661,6 +30731,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 39 │ f() { ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-method-gen.js:38:15] @@ -30677,6 +30748,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 39 │ f() { ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-method.js:38:15] @@ -30693,6 +30765,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 39 │ f() { ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-private-no-reference.js:38:15] @@ -30709,6 +30782,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 39 │ f() { ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-call-expression-privatename.js:38:15] @@ -30733,6 +30807,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 39 │ ); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-private-method-accessor-set.js:38:15] @@ -30749,6 +30824,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 39 │ ); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-private-method-async-gen.js:38:15] @@ -30789,6 +30865,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 39 │ ); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-private-no-reference.js:38:15] @@ -30805,6 +30882,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 39 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-covered-err-delete-member-expression-privatename.js:38:15] @@ -30829,6 +30907,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 36 │ f() { ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-method-accessor-set.js:35:14] @@ -30845,6 +30924,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 36 │ f() { ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-method-async-gen.js:35:14] @@ -30861,6 +30941,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 36 │ f() { ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-method-async.js:35:14] @@ -30877,6 +30958,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 36 │ f() { ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-method-gen.js:35:14] @@ -30893,6 +30975,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 36 │ f() { ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-method.js:35:14] @@ -30909,6 +30992,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 36 │ f() { ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-private-no-reference.js:35:14] @@ -30925,6 +31009,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 36 │ f() { ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-call-expression-privatename.js:35:14] @@ -30949,6 +31034,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 36 │ ; ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-private-method-accessor-set.js:35:14] @@ -30965,6 +31051,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 36 │ ; ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-private-method-async-gen.js:35:14] @@ -31005,6 +31092,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 36 │ ; ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-private-no-reference.js:35:14] @@ -31021,6 +31109,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 36 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-err-delete-member-expression-privatename.js:35:14] @@ -31045,6 +31134,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 39 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-method-accessor-set.js:38:16] @@ -31061,6 +31151,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 39 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-method-async-gen.js:38:16] @@ -31077,6 +31168,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 39 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-method-async.js:38:16] @@ -31093,6 +31185,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 39 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-method-gen.js:38:16] @@ -31109,6 +31202,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 39 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-method.js:38:16] @@ -31125,6 +31219,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 39 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-private-no-reference.js:38:16] @@ -31141,6 +31236,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 39 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-call-expression-privatename.js:38:16] @@ -31165,6 +31261,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 39 │ )); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-private-method-accessor-set.js:38:16] @@ -31181,6 +31278,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 39 │ )); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-private-method-async-gen.js:38:16] @@ -31221,6 +31319,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 39 │ )); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-private-no-reference.js:38:16] @@ -31237,6 +31336,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 39 │ ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/field-delete-twice-covered-err-delete-member-expression-privatename.js:38:16] @@ -31261,6 +31361,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-method-accessor-set.js:43:13] @@ -31277,6 +31378,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-method-async-gen.js:43:13] @@ -31293,6 +31395,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-method-async.js:43:13] @@ -31309,6 +31412,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-method-gen.js:43:13] @@ -31325,6 +31429,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-method.js:43:13] @@ -31341,6 +31446,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-private-no-reference.js:43:13] @@ -31357,6 +31463,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-call-expression-privatename.js:43:13] @@ -31381,6 +31488,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ ); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-private-method-accessor-set.js:43:13] @@ -31397,6 +31505,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ ); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-private-method-async-gen.js:43:13] @@ -31437,6 +31546,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ ); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-private-no-reference.js:43:13] @@ -31453,6 +31563,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-covered-err-delete-member-expression-privatename.js:43:13] @@ -31477,6 +31588,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 38 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-method-accessor-set.js:37:12] @@ -31493,6 +31605,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 38 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-method-async-gen.js:37:12] @@ -31509,6 +31622,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 38 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-method-async.js:37:12] @@ -31525,6 +31639,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 38 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-method-gen.js:37:12] @@ -31541,6 +31656,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 38 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-method.js:37:12] @@ -31557,6 +31673,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 38 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-private-no-reference.js:37:12] @@ -31573,6 +31690,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 38 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-call-expression-privatename.js:37:12] @@ -31597,6 +31715,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 38 │ ; ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-private-method-accessor-set.js:37:12] @@ -31613,6 +31732,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 38 │ ; ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-private-method-async-gen.js:37:12] @@ -31653,6 +31773,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 38 │ ; ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-private-no-reference.js:37:12] @@ -31669,6 +31790,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 38 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-err-delete-member-expression-privatename.js:37:12] @@ -31693,6 +31815,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-method-accessor-set.js:43:14] @@ -31709,6 +31832,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-method-async-gen.js:43:14] @@ -31725,6 +31849,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-method-async.js:43:14] @@ -31741,6 +31866,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-method-gen.js:43:14] @@ -31757,6 +31883,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-method.js:43:14] @@ -31773,6 +31900,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-private-no-reference.js:43:14] @@ -31789,6 +31917,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-call-expression-privatename.js:43:14] @@ -31813,6 +31942,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ )); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-private-method-accessor-set.js:43:14] @@ -31829,6 +31959,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ )); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-private-method-async-gen.js:43:14] @@ -31869,6 +32000,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ )); ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-private-no-reference.js:43:14] @@ -31885,6 +32017,7 @@ Negative Passed: 4588/4588 (100.00%) · ── 44 │ } ╰──── + help: Did you mean '#x'? × The operand of a 'delete' operator cannot be a private identifier. ╭─[test262/test/language/statements/class/elements/syntax/early-errors/delete/method-delete-twice-covered-err-delete-member-expression-privatename.js:43:14] diff --git a/tasks/coverage/snapshots/parser_typescript.snap b/tasks/coverage/snapshots/parser_typescript.snap index 1770502a49d10..cc8322a1cd7e7 100644 --- a/tasks/coverage/snapshots/parser_typescript.snap +++ b/tasks/coverage/snapshots/parser_typescript.snap @@ -13683,6 +13683,7 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/parser/ecmasc · ── 12 │ } ╰──── + help: Did you mean '#x'? × Private field '#x' must be declared in an enclosing class ╭─[typescript/tests/cases/conformance/classes/classStaticBlock/classStaticBlock16.ts:21:28] @@ -13691,6 +13692,7 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/parser/ecmasc · ── 22 │ getY = (obj: D) => obj.#y; ╰──── + help: Did you mean '#y'? × Decorators are not valid here. ╭─[typescript/tests/cases/conformance/classes/classStaticBlock/classStaticBlock19.ts:2:5] @@ -14165,6 +14167,7 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/parser/ecmasc · ──── 10 │ thing.#foo(); ╰──── + help: Did you mean '#baz'? × Private field '#bar' must be declared in an enclosing class ╭─[typescript/tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts:16:15] @@ -14173,6 +14176,7 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/parser/ecmasc · ──── 17 │ thing.#foo(); ╰──── + help: Did you mean '#baz'? × Private field '#bar' must be declared in an enclosing class ╭─[typescript/tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts:23:15] @@ -14181,6 +14185,7 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/parser/ecmasc · ──── 24 │ thing.#foo(); ╰──── + help: Did you mean '#baz'? × Private field '#f' must be declared in an enclosing class ╭─[typescript/tests/cases/conformance/classes/members/privateNames/privateNameAndIndexSignature.ts:6:14] @@ -14189,6 +14194,7 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/parser/ecmasc · ── 7 │ this["#foo"] = 3; // Okay (type has index signature and "#foo" does not collide with private identifier #foo) ╰──── + help: Did you mean '#foo'? × Unexpected token ╭─[typescript/tests/cases/conformance/classes/members/privateNames/privateNameAndPropertySignature.ts:2:5] @@ -25281,6 +25287,7 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/parser/ecmasc · ── 6 │ } ╰──── + help: Did you mean '#a'? × Identifier `orbitol` has already been declared ╭─[typescript/tests/cases/conformance/salsa/plainJSRedeclare.ts:1:7]