diff --git a/crates/oxc_linter/Cargo.toml b/crates/oxc_linter/Cargo.toml index 6d16c4a5d..c83980fbe 100644 --- a/crates/oxc_linter/Cargo.toml +++ b/crates/oxc_linter/Cargo.toml @@ -42,7 +42,7 @@ itertools = { workspace = true } dashmap = { workspace = true } convert_case = { workspace = true } language-tags = { workspace = true } -mime_guess = { workspace = true } +mime_guess = { workspace = true } rust-lapper = "1.1.0" once_cell = "1.19.0" diff --git a/crates/oxc_linter/src/rules/jsx_a11y/lang.rs b/crates/oxc_linter/src/rules/jsx_a11y/lang.rs index f2b4e107d..ae6b0576c 100644 --- a/crates/oxc_linter/src/rules/jsx_a11y/lang.rs +++ b/crates/oxc_linter/src/rules/jsx_a11y/lang.rs @@ -151,8 +151,7 @@ fn test() { ("", None, None), ("", None, None), ("", None, Some(settings())), - // TODO: wait polymorphicPropName complete in next PR - // ("", None, None), + ("", None, Some(settings())), ]; Tester::new_with_settings(Lang::NAME, pass, fail).test_and_snapshot(); diff --git a/crates/oxc_linter/src/snapshots/lang.snap b/crates/oxc_linter/src/snapshots/lang.snap index a93a1036f..6887f0622 100644 --- a/crates/oxc_linter/src/snapshots/lang.snap +++ b/crates/oxc_linter/src/snapshots/lang.snap @@ -31,4 +31,11 @@ expression: lang ╰──── help: Set a valid value for lang attribute. + ⚠ eslint-plugin-jsx-a11y(lang): Lang attribute must have a valid value. + ╭─[lang.tsx:1:1] + 1 │ + · ────────── + ╰──── + help: Set a valid value for lang attribute. + diff --git a/crates/oxc_linter/src/utils/react.rs b/crates/oxc_linter/src/utils/react.rs index 9a75fa804..3432e9387 100644 --- a/crates/oxc_linter/src/utils/react.rs +++ b/crates/oxc_linter/src/utils/react.rs @@ -163,20 +163,28 @@ pub fn get_parent_es6_component<'a, 'b>(ctx: &'b LintContext<'a>) -> Option<&'b None }) } + pub fn get_element_type(context: &LintContext, element: &JSXOpeningElement) -> Option { let JSXElementName::Identifier(ident) = &element.name else { return None; }; - let mut element_type = String::from(ident.name.as_str()); - let LintSettings { jsx_a11y } = context.settings(); - let JsxA11y { polymorphic_prop_name: _, components } = jsx_a11y; - if let Some(val) = components.get(&element_type) { - element_type = String::from(val); + let JsxA11y { polymorphic_prop_name, components } = jsx_a11y; + + if let Some(polymorphic_prop_name_value) = polymorphic_prop_name { + if let Some(as_tag) = has_jsx_prop_lowercase(element, &polymorphic_prop_name_value) { + if let Some(JSXAttributeValue::StringLiteral(str)) = get_prop_value(as_tag) { + return Some(String::from(str.value.as_str())); + } + } } - Some(element_type) + let element_type = ident.name.as_str(); + if let Some(val) = components.get(element_type) { + return Some(String::from(val)); + } + Some(String::from(element_type)) } pub fn parse_jsx_value(value: &JSXAttributeValue) -> Result {