diff --git a/crates/oxc_linter/src/rules/jsx_a11y/tabindex_no_positive.rs b/crates/oxc_linter/src/rules/jsx_a11y/tabindex_no_positive.rs index e86af4bdd53ac..dffb08112688b 100644 --- a/crates/oxc_linter/src/rules/jsx_a11y/tabindex_no_positive.rs +++ b/crates/oxc_linter/src/rules/jsx_a11y/tabindex_no_positive.rs @@ -1,7 +1,7 @@ use oxc_ast::{AstKind, ast::JSXAttributeItem}; use oxc_diagnostics::OxcDiagnostic; use oxc_macros::declare_oxc_lint; -use oxc_span::Span; +use oxc_span::{GetSpan, Span}; use crate::{ AstNode, @@ -46,7 +46,7 @@ declare_oxc_lint!( TabindexNoPositive, jsx_a11y, correctness, - pending + dangerous_suggestion ); impl Rule for TabindexNoPositive { @@ -65,7 +65,10 @@ fn check_and_diagnose(attr: &JSXAttributeItem, ctx: &LintContext<'_>) { JSXAttributeItem::Attribute(attr) => attr.value.as_ref().map_or((), |value| { if let Ok(parsed_value) = parse_jsx_value(value) { if parsed_value > 0.0 { - ctx.diagnostic(tabindex_no_positive_diagnostic(attr.span)); + ctx.diagnostic_with_dangerous_suggestion( + tabindex_no_positive_diagnostic(attr.span), + |fixer| fixer.replace(value.span(), r#""0""#), + ); } } }), @@ -78,34 +81,43 @@ fn test() { use crate::tester::Tester; let pass = vec![ - (r"
;", None), - (r"", None), - (r#""#, None), - (r"", None), - (r"", None), - (r"", None), - (r"", None), - (r"", None), - (r"", None), - (r"", None), - (r"", None), - (r#""#, None), - (r#""#, None), - (r#""#, None), - (r#""#, None), - (r#""#, None), - (r"", None), - (r"", None), + r";", + r"", + r#""#, + r"", + r"", + r"", + r"", + r"", + r"", + r"", + r"", + r#""#, + r#""#, + r#""#, + r#""#, + r#""#, + r"", + r"", ]; let fail = vec![ - (r#""#, None), - (r"", None), - (r#""#, None), - (r"", None), - (r"", None), + r#""#, + r"", + r#""#, + r"", + r"", + ]; + + let fix = vec![ + (r#""#, r#""#), + (r"", r#""#), + (r#""#, r#""#), + (r"", r#""#), + (r"", r#""#), ]; Tester::new(TabindexNoPositive::NAME, TabindexNoPositive::PLUGIN, pass, fail) + .expect_fix(fix) .test_and_snapshot(); }