From 798a6dfe467a30cd47673fb188609334bfebd15b Mon Sep 17 00:00:00 2001 From: Boshen Date: Wed, 6 Mar 2024 15:28:59 +0800 Subject: [PATCH] refactor(span): disallow struct expression constructor for `Span` (#2625) --- crates/oxc_linter/src/fixer.rs | 4 +-- crates/oxc_linter/src/rules/eslint/eqeqeq.rs | 2 +- .../src/rules/eslint/no_regex_spaces.rs | 4 +-- crates/oxc_linter/src/rules/eslint/no_void.rs | 8 ++--- .../src/rules/jest/no_alias_methods.rs | 5 +-- .../src/rules/jest/no_focused_tests.rs | 4 +-- .../src/rules/jest/no_restricted_matchers.rs | 5 +-- .../rules/jest/no_test_return_statement.rs | 8 ++--- .../src/rules/jest/prefer_to_have_length.rs | 2 +- .../oxc_linter/src/rules/jest/prefer_todo.rs | 4 +-- .../src/rules/react/no_unescaped_entities.rs | 8 ++--- .../src/rules/typescript/array_type.rs | 2 +- .../src/rules/typescript/ban_ts_comment.rs | 6 ++-- .../rules/typescript/ban_tslint_comment.rs | 2 +- .../src/rules/typescript/prefer_as_const.rs | 2 +- .../rules/typescript/prefer_function_type.rs | 31 +++++++++---------- .../typescript/triple_slash_reference.rs | 4 +-- .../src/rules/unicorn/empty_brace_spaces.rs | 7 +++-- .../src/rules/unicorn/no_console_spaces.rs | 2 +- .../src/rules/unicorn/no_lonely_if.rs | 4 +-- .../oxc_linter/src/rules/unicorn/no_null.rs | 5 +-- .../src/rules/unicorn/no_useless_spread.rs | 6 ++-- .../src/rules/unicorn/number_literal_case.rs | 20 ++++++------ .../unicorn/require_array_join_separator.rs | 16 +++++----- ...require_number_to_fixed_digits_argument.rs | 2 +- .../src/rules/unicorn/switch_case_braces.rs | 6 ++-- crates/oxc_span/src/span.rs | 1 + 27 files changed, 80 insertions(+), 90 deletions(-) diff --git a/crates/oxc_linter/src/fixer.rs b/crates/oxc_linter/src/fixer.rs index 6a2bda2b9..03ff13b92 100644 --- a/crates/oxc_linter/src/fixer.rs +++ b/crates/oxc_linter/src/fixer.rs @@ -386,8 +386,8 @@ mod test { fn sort_no_fix_messages_correctly() { let result = get_fix_result(vec![ create_message(ReplaceId, Some(REPLACE_ID)), - Message::new(NoFix2(Span { start: 1, end: 7 }).into(), None), - Message::new(NoFix1(Span { start: 1, end: 3 }).into(), None), + Message::new(NoFix2(Span::new(1, 7)).into(), None), + Message::new(NoFix1(Span::new(1, 3)).into(), None), ]); assert_eq!(result.fixed_code, TEST_CODE.replace("answer", "foo")); assert_eq!(result.messages.len(), 2); diff --git a/crates/oxc_linter/src/rules/eslint/eqeqeq.rs b/crates/oxc_linter/src/rules/eslint/eqeqeq.rs index 107462223..533de51c9 100644 --- a/crates/oxc_linter/src/rules/eslint/eqeqeq.rs +++ b/crates/oxc_linter/src/rules/eslint/eqeqeq.rs @@ -108,7 +108,7 @@ impl Rule for Eqeqeq { || { let start = binary_expr.left.span().end; let end = binary_expr.right.span().start; - Fix::new(preferred_operator_with_padding, Span { start, end }) + Fix::new(preferred_operator_with_padding, Span::new(start, end)) }, ); } else { diff --git a/crates/oxc_linter/src/rules/eslint/no_regex_spaces.rs b/crates/oxc_linter/src/rules/eslint/no_regex_spaces.rs index a888eff4f..d47d03934 100644 --- a/crates/oxc_linter/src/rules/eslint/no_regex_spaces.rs +++ b/crates/oxc_linter/src/rules/eslint/no_regex_spaces.rs @@ -80,7 +80,7 @@ impl NoRegexSpaces { let start = literal.span.start + u32::try_from(idx_start).unwrap() + 1; let end = literal.span.start + u32::try_from(idx_end).unwrap() + 2; - return Some(Span { start, end }); + return Some(Span::new(start, end)); } None @@ -104,7 +104,7 @@ impl NoRegexSpaces { let start = pattern.span.start + u32::try_from(idx_start).unwrap() + 1; let end = pattern.span.start + u32::try_from(idx_end).unwrap() + 2; - return Some(Span { start, end }); + return Some(Span::new(start, end)); } } diff --git a/crates/oxc_linter/src/rules/eslint/no_void.rs b/crates/oxc_linter/src/rules/eslint/no_void.rs index 77702aa2f..e91aba853 100644 --- a/crates/oxc_linter/src/rules/eslint/no_void.rs +++ b/crates/oxc_linter/src/rules/eslint/no_void.rs @@ -63,10 +63,10 @@ impl Rule for NoVoid { }; if unary_expr.operator == UnaryOperator::Void { - ctx.diagnostic(NoVoidDiagnostic(Span { - start: unary_expr.span.start, - end: unary_expr.span.start + 4, - })); + ctx.diagnostic(NoVoidDiagnostic(Span::new( + unary_expr.span.start, + unary_expr.span.start + 4, + ))); } } } diff --git a/crates/oxc_linter/src/rules/jest/no_alias_methods.rs b/crates/oxc_linter/src/rules/jest/no_alias_methods.rs index d8859108f..6e6eb1037 100644 --- a/crates/oxc_linter/src/rules/jest/no_alias_methods.rs +++ b/crates/oxc_linter/src/rules/jest/no_alias_methods.rs @@ -72,7 +72,8 @@ fn run<'a>(possible_jest_node: &PossibleJestNode<'a, '_>, ctx: &LintContext<'a>) if let Some(method_name) = BadAliasMethodName::from_str(alias.as_ref()) { let (name, canonical_name) = method_name.name_with_canonical(); - let Span { mut start, mut end } = matcher.span; + let mut start = matcher.span.start; + let mut end = matcher.span.end; // expect(a).not['toThrowError']() // matcher is the node of `toThrowError`, we only what to replace the content in the quotes. if matcher.element.is_string_literal() { @@ -82,7 +83,7 @@ fn run<'a>(possible_jest_node: &PossibleJestNode<'a, '_>, ctx: &LintContext<'a>) ctx.diagnostic_with_fix( NoAliasMethodsDiagnostic(name, canonical_name, matcher.span), - || Fix::new(canonical_name, Span { start, end }), + || Fix::new(canonical_name, Span::new(start, end)), ); } } diff --git a/crates/oxc_linter/src/rules/jest/no_focused_tests.rs b/crates/oxc_linter/src/rules/jest/no_focused_tests.rs index 603624f0f..faff9c9fb 100644 --- a/crates/oxc_linter/src/rules/jest/no_focused_tests.rs +++ b/crates/oxc_linter/src/rules/jest/no_focused_tests.rs @@ -78,7 +78,7 @@ fn run<'a>(possible_jest_node: &PossibleJestNode<'a, '_>, ctx: &LintContext<'a>) if name.starts_with('f') { ctx.diagnostic_with_fix(NoFocusedTestsDiagnostic(call_expr.span), || { let start = call_expr.span.start; - Fix::delete(Span { start, end: start + 1 }) + Fix::delete(Span::new(start, start + 1)) }); return; @@ -94,7 +94,7 @@ fn run<'a>(possible_jest_node: &PossibleJestNode<'a, '_>, ctx: &LintContext<'a>) } else { span.end + 1 }; - Fix::delete(Span { start, end }) + Fix::delete(Span::new(start, end)) }); } } diff --git a/crates/oxc_linter/src/rules/jest/no_restricted_matchers.rs b/crates/oxc_linter/src/rules/jest/no_restricted_matchers.rs index 5387aab02..4efaedc1e 100644 --- a/crates/oxc_linter/src/rules/jest/no_restricted_matchers.rs +++ b/crates/oxc_linter/src/rules/jest/no_restricted_matchers.rs @@ -123,10 +123,7 @@ impl NoRestrictedMatchers { .collect::>() .join("."); - let span = Span { - start: members.first().unwrap().span.start, - end: members.last().unwrap().span.end, - }; + let span = Span::new(members.first().unwrap().span.start, members.last().unwrap().span.end); for (restriction, message) in &self.restricted_matchers { if Self::check_restriction(chain_call.as_str(), restriction.as_str()) { diff --git a/crates/oxc_linter/src/rules/jest/no_test_return_statement.rs b/crates/oxc_linter/src/rules/jest/no_test_return_statement.rs index 8c8d62031..e940c2e3e 100644 --- a/crates/oxc_linter/src/rules/jest/no_test_return_statement.rs +++ b/crates/oxc_linter/src/rules/jest/no_test_return_statement.rs @@ -120,10 +120,10 @@ fn check_test_return_statement<'a>(func_body: &OBox<'_, FunctionBody<'a>>, ctx: return; } - ctx.diagnostic(NoTestReturnStatementDiagnostic(Span { - start: return_stmt.span().start, - end: call_expr.span.start - 1, - })); + ctx.diagnostic(NoTestReturnStatementDiagnostic(Span::new( + return_stmt.span().start, + call_expr.span.start - 1, + ))); } #[test] diff --git a/crates/oxc_linter/src/rules/jest/prefer_to_have_length.rs b/crates/oxc_linter/src/rules/jest/prefer_to_have_length.rs index a514b04e3..5aa5feff1 100644 --- a/crates/oxc_linter/src/rules/jest/prefer_to_have_length.rs +++ b/crates/oxc_linter/src/rules/jest/prefer_to_have_length.rs @@ -155,7 +155,7 @@ impl PreferToHaveLength { } else { matcher.span.end }; - Fix::new(code, Span { start: call_expr.span.start, end: end - 1 }) + Fix::new(code, Span::new(call_expr.span.start, end - 1)) }); } diff --git a/crates/oxc_linter/src/rules/jest/prefer_todo.rs b/crates/oxc_linter/src/rules/jest/prefer_todo.rs index 31ff75652..2391b9fa8 100644 --- a/crates/oxc_linter/src/rules/jest/prefer_todo.rs +++ b/crates/oxc_linter/src/rules/jest/prefer_todo.rs @@ -133,9 +133,7 @@ fn is_empty_function(expr: &CallExpression) -> bool { fn get_fix_content<'a>(expr: &'a CallExpression<'a>) -> (&'a str, Span) { match &expr.callee { - Expression::Identifier(ident) => { - (".todo", Span { start: ident.span.end, end: ident.span.end }) - } + Expression::Identifier(ident) => (".todo", Span::new(ident.span.end, ident.span.end)), Expression::MemberExpression(mem_expr) => { if let Some((span, _)) = mem_expr.static_property_info() { return ("todo", span); diff --git a/crates/oxc_linter/src/rules/react/no_unescaped_entities.rs b/crates/oxc_linter/src/rules/react/no_unescaped_entities.rs index e05e1b467..115af37c5 100644 --- a/crates/oxc_linter/src/rules/react/no_unescaped_entities.rs +++ b/crates/oxc_linter/src/rules/react/no_unescaped_entities.rs @@ -54,10 +54,10 @@ impl Rule for NoUnescapedEntities { if let Some(escapes) = DEFAULTS.get(&char) { #[allow(clippy::cast_possible_truncation)] ctx.diagnostic(NoUnescapedEntitiesDiagnostic( - Span { - start: jsx_text.span.start + i as u32, - end: jsx_text.span.start + i as u32 + 1, - }, + Span::new( + jsx_text.span.start + i as u32, + jsx_text.span.start + i as u32 + 1, + ), char, escapes.join(" or "), )); diff --git a/crates/oxc_linter/src/rules/typescript/array_type.rs b/crates/oxc_linter/src/rules/typescript/array_type.rs index a962aca37..32a3263d7 100644 --- a/crates/oxc_linter/src/rules/typescript/array_type.rs +++ b/crates/oxc_linter/src/rules/typescript/array_type.rs @@ -227,7 +227,7 @@ fn check_and_report_error_generic( Fix::new( array_type_identifier.to_string() + "<" + type_text + ">", - Span { start: type_reference_span.start, end: type_reference_span.end }, + Span::new(type_reference_span.start, type_reference_span.end), ) }); } diff --git a/crates/oxc_linter/src/rules/typescript/ban_ts_comment.rs b/crates/oxc_linter/src/rules/typescript/ban_ts_comment.rs index 101e9c29e..90db19777 100644 --- a/crates/oxc_linter/src/rules/typescript/ban_ts_comment.rs +++ b/crates/oxc_linter/src/rules/typescript/ban_ts_comment.rs @@ -151,7 +151,7 @@ impl Rule for BanTsComment { if *on { ctx.diagnostic(BanTsCommentDiagnostic::Comment( directive.to_string(), - Span { start: *start, end: comment.end() }, + Span::new(*start, comment.end()), )); } } @@ -160,7 +160,7 @@ impl Rule for BanTsComment { ctx.diagnostic(BanTsCommentDiagnostic::CommentRequiresDescription( directive.to_string(), self.minimum_description_length, - Span { start: *start, end: comment.end() }, + Span::new(*start, comment.end()), )); } @@ -170,7 +170,7 @@ impl Rule for BanTsComment { BanTsCommentDiagnostic::CommentDescriptionNotMatchPattern( directive.to_string(), re.to_string(), - Span { start: *start, end: comment.end() }, + Span::new(*start, comment.end()), ), ); } diff --git a/crates/oxc_linter/src/rules/typescript/ban_tslint_comment.rs b/crates/oxc_linter/src/rules/typescript/ban_tslint_comment.rs index 34957f052..11acff651 100644 --- a/crates/oxc_linter/src/rules/typescript/ban_tslint_comment.rs +++ b/crates/oxc_linter/src/rules/typescript/ban_tslint_comment.rs @@ -77,7 +77,7 @@ fn get_full_comment(source_text_len: usize, start: u32, end: u32, is_multi_line: comment_end += 1; } - Span { start: comment_start, end: comment_end } + Span::new(comment_start, comment_end) } #[test] diff --git a/crates/oxc_linter/src/rules/typescript/prefer_as_const.rs b/crates/oxc_linter/src/rules/typescript/prefer_as_const.rs index 4e3fab7e3..3062eab3c 100644 --- a/crates/oxc_linter/src/rules/typescript/prefer_as_const.rs +++ b/crates/oxc_linter/src/rules/typescript/prefer_as_const.rs @@ -122,7 +122,7 @@ fn check_and_report( ctx.diagnostic_with_fix(PreferAsConstDiagnostic(span), || { let start = span.start; let end = span.end; - Fix::new("const", Span { start, end }) + Fix::new("const", Span::new(start, end)) }); } else { ctx.diagnostic(PreferAsConstDiagnostic(span)); diff --git a/crates/oxc_linter/src/rules/typescript/prefer_function_type.rs b/crates/oxc_linter/src/rules/typescript/prefer_function_type.rs index 6a8bd3cc3..c89ca4be7 100644 --- a/crates/oxc_linter/src/rules/typescript/prefer_function_type.rs +++ b/crates/oxc_linter/src/rules/typescript/prefer_function_type.rs @@ -138,7 +138,7 @@ fn check_member(member: &TSSignature, node: &AstNode<'_>, ctx: &LintContext<'_>) || { Fix::new( format!("type {type_name} = {suggestion};"), - Span { start: node_start, end: node_end }, + Span::new(node_start, node_end), ) }, ); @@ -209,7 +209,7 @@ fn check_member(member: &TSSignature, node: &AstNode<'_>, ctx: &LintContext<'_>) &interface_decl.id.name, &suggestion ), - Span { start: node_start, end: node_end }, + Span::new(node_start, node_end), ); } @@ -218,7 +218,7 @@ fn check_member(member: &TSSignature, node: &AstNode<'_>, ctx: &LintContext<'_>) "type {} = {};", &interface_decl.id.name, &suggestion ), - Span { start: node_start, end: node_end }, + Span::new(node_start, node_end), ) }, ); @@ -238,10 +238,7 @@ fn check_member(member: &TSSignature, node: &AstNode<'_>, ctx: &LintContext<'_>) || { Fix::new( format!("({suggestion})"), - Span { - start: literal.span.start, - end: literal.span.end, - }, + Span::new(literal.span.start, literal.span.end), ) }, ); @@ -254,7 +251,7 @@ fn check_member(member: &TSSignature, node: &AstNode<'_>, ctx: &LintContext<'_>) || { Fix::new( suggestion.to_string(), - Span { start: literal.span.start, end: literal.span.end }, + Span::new(literal.span.start, literal.span.end), ) }, ), @@ -280,10 +277,10 @@ fn check_member(member: &TSSignature, node: &AstNode<'_>, ctx: &LintContext<'_>) || { Fix::new( format!("({suggestion})"), - Span { - start: literal.span.start, - end: literal.span.end, - }, + Span::new( + literal.span.start, + literal.span.end, + ), ) }, ); @@ -305,10 +302,10 @@ fn check_member(member: &TSSignature, node: &AstNode<'_>, ctx: &LintContext<'_>) || { Fix::new( format!("({suggestion})"), - Span { - start: literal.span.start, - end: literal.span.end, - }, + Span::new( + literal.span.start, + literal.span.end, + ), ) }, ); @@ -322,7 +319,7 @@ fn check_member(member: &TSSignature, node: &AstNode<'_>, ctx: &LintContext<'_>) || { Fix::new( suggestion.to_string(), - Span { start: literal.span.start, end: literal.span.end }, + Span::new(literal.span.start, literal.span.end), ) }, ), diff --git a/crates/oxc_linter/src/rules/typescript/triple_slash_reference.rs b/crates/oxc_linter/src/rules/typescript/triple_slash_reference.rs index a58bd7efd..761f38e49 100644 --- a/crates/oxc_linter/src/rules/typescript/triple_slash_reference.rs +++ b/crates/oxc_linter/src/rules/typescript/triple_slash_reference.rs @@ -121,12 +121,12 @@ impl Rule for TripleSlashReference { { ctx.diagnostic(TripleSlashReferenceDiagnostic( group2.to_string(), - Span { start: *start - 2, end: comment.end() }, + Span::new(*start - 2, comment.end()), )); } if group1 == "types" && self.types == TypesOption::PreferImport { - refs_for_import.insert(group2, Span { start: *start - 2, end: comment.end() }); + refs_for_import.insert(group2, Span::new(*start - 2, comment.end())); } } } diff --git a/crates/oxc_linter/src/rules/unicorn/empty_brace_spaces.rs b/crates/oxc_linter/src/rules/unicorn/empty_brace_spaces.rs index bbac6b715..40c646790 100644 --- a/crates/oxc_linter/src/rules/unicorn/empty_brace_spaces.rs +++ b/crates/oxc_linter/src/rules/unicorn/empty_brace_spaces.rs @@ -37,7 +37,8 @@ impl Rule for EmptyBraceSpaces { fn run<'a>(&self, node: &AstNode<'a>, ctx: &LintContext<'a>) { match node.kind() { AstKind::StaticBlock(static_block) => { - let Span { start, end } = static_block.span; + let start = static_block.span.start; + let end = static_block.span.end; let static_leading_count = get_static_leading_count(static_block.span, ctx); @@ -75,8 +76,8 @@ impl Rule for EmptyBraceSpaces { } fn remove_empty_braces_spaces(ctx: &LintContext, is_empty_body: bool, span: Span) { - // dbg!(class); - let Span { start, end } = span; + let start = span.start; + let end = span.end; if is_empty_body && end - start > 2 && !ctx.semantic().trivias().has_comments_between(span) { // length of "{}" diff --git a/crates/oxc_linter/src/rules/unicorn/no_console_spaces.rs b/crates/oxc_linter/src/rules/unicorn/no_console_spaces.rs index 56a7ed3dd..086eb5d18 100644 --- a/crates/oxc_linter/src/rules/unicorn/no_console_spaces.rs +++ b/crates/oxc_linter/src/rules/unicorn/no_console_spaces.rs @@ -138,7 +138,7 @@ fn report_diagnostic( }; ctx.diagnostic_with_fix(NoConsoleSpacesDiagnostic(direction, ident.to_string(), span), || { - Fix::new(fix, Span { start, end }) + Fix::new(fix, Span::new(start, end)) }); } diff --git a/crates/oxc_linter/src/rules/unicorn/no_lonely_if.rs b/crates/oxc_linter/src/rules/unicorn/no_lonely_if.rs index aaca20caf..4dcf7f6bc 100644 --- a/crates/oxc_linter/src/rules/unicorn/no_lonely_if.rs +++ b/crates/oxc_linter/src/rules/unicorn/no_lonely_if.rs @@ -85,8 +85,8 @@ impl Rule for NoLonelyIf { }; ctx.diagnostic(NoLonelyIfDiagnostic( - Span { start: if_stmt.span.start, end: if_stmt.span.start + 2 }, - Span { start: parent_if_stmt_span.start, end: parent_if_stmt_span.start + 2 }, + Span::new(if_stmt.span.start, if_stmt.span.start + 2), + Span::new(parent_if_stmt_span.start, parent_if_stmt_span.start + 2), )); } } diff --git a/crates/oxc_linter/src/rules/unicorn/no_null.rs b/crates/oxc_linter/src/rules/unicorn/no_null.rs index 4cd5f5ee3..a7a4c92a6 100644 --- a/crates/oxc_linter/src/rules/unicorn/no_null.rs +++ b/crates/oxc_linter/src/rules/unicorn/no_null.rs @@ -105,10 +105,7 @@ fn diagnose_variable_declarator( && matches!(parent_kind, Some(AstKind::VariableDeclaration(var_declaration)) if !var_declaration.kind.is_const() ) { ctx.diagnostic_with_fix(RemoveNullDiagnostic(null_literal.span), || { - Fix::delete(Span { - start: variable_declarator.id.span().end, - end: null_literal.span.end, - }) + Fix::delete(Span::new(variable_declarator.id.span().end, null_literal.span.end)) }); return; diff --git a/crates/oxc_linter/src/rules/unicorn/no_useless_spread.rs b/crates/oxc_linter/src/rules/unicorn/no_useless_spread.rs index c471b844d..054c1dd71 100644 --- a/crates/oxc_linter/src/rules/unicorn/no_useless_spread.rs +++ b/crates/oxc_linter/src/rules/unicorn/no_useless_spread.rs @@ -143,7 +143,7 @@ fn check_useless_spread_in_list<'a>(node: &AstNode<'a>, ctx: &LintContext<'a>) { return; }; - let span = Span { start: spread_elem.span.start, end: spread_elem.span.start + 3 }; + let span = Span::new(spread_elem.span.start, spread_elem.span.start + 3); match node.kind() { AstKind::ObjectExpression(_) => { @@ -186,7 +186,7 @@ fn check_useless_iterable_to_array<'a>( return; }; - let span = Span { start: spread_elem.span.start, end: spread_elem.span.start + 3 }; + let span = Span::new(spread_elem.span.start, spread_elem.span.start + 3); let parent = if let AstKind::Argument(_) = parent.kind() { let Some(parent) = outermost_paren_parent(parent, ctx) else { @@ -298,7 +298,7 @@ fn check_useless_array_clone<'a>(array_expr: &ArrayExpression<'a>, ctx: &LintCon return; }; - let span = Span { start: spread_elem.span.start, end: spread_elem.span.start + 3 }; + let span = Span::new(spread_elem.span.start, spread_elem.span.start + 3); if let Expression::CallExpression(call_expr) = &spread_elem.argument { if !(is_method_call( diff --git a/crates/oxc_linter/src/rules/unicorn/number_literal_case.rs b/crates/oxc_linter/src/rules/unicorn/number_literal_case.rs index 51332f771..ce47fa85d 100644 --- a/crates/oxc_linter/src/rules/unicorn/number_literal_case.rs +++ b/crates/oxc_linter/src/rules/unicorn/number_literal_case.rs @@ -92,7 +92,7 @@ fn check_number_literal( if number_literal.starts_with("0B") || number_literal.starts_with("0O") { return Some(( NumberLiteralCaseDiagnostic::UppercasePrefix( - Span { start: raw_span.start + 1, end: raw_span.start + 2 }, + Span::new(raw_span.start + 1, raw_span.start + 2), if number_literal.starts_with("0B") { "0b" } else { "0o" }, ), number_literal.to_lowercase(), @@ -112,7 +112,7 @@ fn check_number_literal( if has_uppercase_prefix { return Some(( NumberLiteralCaseDiagnostic::UppercasePrefix( - Span { start: raw_span.start + 1, end: raw_span.start + 2 }, + Span::new(raw_span.start + 1, raw_span.start + 2), "0x", ), "0x".to_owned() + &number_literal[2..], @@ -120,10 +120,10 @@ fn check_number_literal( } if has_lowercase_digits { return Some(( - NumberLiteralCaseDiagnostic::LowercaseHexadecimalDigits(Span { - start: raw_span.start + 2, - end: raw_span.end, - }), + NumberLiteralCaseDiagnostic::LowercaseHexadecimalDigits(Span::new( + raw_span.start + 2, + raw_span.end, + )), "0x".to_owned() + &digits_to_uppercase(&number_literal[2..]), )); } @@ -132,10 +132,10 @@ fn check_number_literal( if let Some(index) = number_literal.find('E') { let char_position = raw_span.start + index as u32; return Some(( - NumberLiteralCaseDiagnostic::UppercaseExponentialNotation(Span { - start: char_position, - end: char_position + 1, - }), + NumberLiteralCaseDiagnostic::UppercaseExponentialNotation(Span::new( + char_position, + char_position + 1, + )), number_literal.to_lowercase(), )); } diff --git a/crates/oxc_linter/src/rules/unicorn/require_array_join_separator.rs b/crates/oxc_linter/src/rules/unicorn/require_array_join_separator.rs index 10eb8a627..aa22b58af 100644 --- a/crates/oxc_linter/src/rules/unicorn/require_array_join_separator.rs +++ b/crates/oxc_linter/src/rules/unicorn/require_array_join_separator.rs @@ -63,10 +63,10 @@ impl Rule for RequireArrayJoinSeparator { && !call_expr.optional && !matches!(member_expr, MemberExpression::ComputedMemberExpression(_)) { - ctx.diagnostic(RequireArrayJoinSeparatorDiagnostic(Span { - start: member_expr.span().end, - end: call_expr.span.end, - })); + ctx.diagnostic(RequireArrayJoinSeparatorDiagnostic(Span::new( + member_expr.span().end, + call_expr.span.end, + ))); } // `[].join.call(foo)` and `Array.prototype.join.call(foo)` @@ -77,10 +77,10 @@ impl Rule for RequireArrayJoinSeparator { && !call_expr.arguments.iter().any(oxc_ast::ast::Argument::is_spread) && is_array_prototype_property(member_expr_obj, "join") { - ctx.diagnostic(RequireArrayJoinSeparatorDiagnostic(Span { - start: member_expr.span().end, - end: call_expr.span.end, - })); + ctx.diagnostic(RequireArrayJoinSeparatorDiagnostic(Span::new( + member_expr.span().end, + call_expr.span.end, + ))); } } } diff --git a/crates/oxc_linter/src/rules/unicorn/require_number_to_fixed_digits_argument.rs b/crates/oxc_linter/src/rules/unicorn/require_number_to_fixed_digits_argument.rs index 65ca9cdaa..77dfdcfc8 100644 --- a/crates/oxc_linter/src/rules/unicorn/require_number_to_fixed_digits_argument.rs +++ b/crates/oxc_linter/src/rules/unicorn/require_number_to_fixed_digits_argument.rs @@ -58,7 +58,7 @@ impl Rule for RequireNumberToFixedDigitsArgument { if let Some(property_name) = member.static_property_name() { if property_name == "toFixed" { - let parenthesis_span = Span { start: member.span().end, end: expr.span.end }; + let parenthesis_span = Span::new(member.span().end, expr.span.end); ctx.diagnostic_with_fix( RequireNumberToFixedDigitsArgumentDiagnostic(parenthesis_span), diff --git a/crates/oxc_linter/src/rules/unicorn/switch_case_braces.rs b/crates/oxc_linter/src/rules/unicorn/switch_case_braces.rs index d83c70275..14c059cb9 100644 --- a/crates/oxc_linter/src/rules/unicorn/switch_case_braces.rs +++ b/crates/oxc_linter/src/rules/unicorn/switch_case_braces.rs @@ -69,10 +69,8 @@ impl Rule for SwitchCaseBraces { return; }; - let case_body_span = Span { - start: first_statement.span().start, - end: last_statement.span().end, - }; + let case_body_span = + Span::new(first_statement.span().start, last_statement.span().end); ctx.diagnostic_with_fix(SwitchCaseBracesDiagnostic(case_body_span), || { use oxc_codegen::{Context, Gen}; diff --git a/crates/oxc_span/src/span.rs b/crates/oxc_span/src/span.rs index 3cbe4b469..d63fa01d9 100644 --- a/crates/oxc_span/src/span.rs +++ b/crates/oxc_span/src/span.rs @@ -15,6 +15,7 @@ pub const SPAN: Span = Span::new(0, 0); #[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] #[cfg_attr(feature = "serde", derive(Serialize))] #[cfg_attr(all(feature = "serde", feature = "wasm"), derive(tsify::Tsify))] +#[non_exhaustive] // disallow struct expression constructor `Span {}` pub struct Span { pub start: u32, pub end: u32,