perf(linter): avoid unnecessary work in jsx_a11y/anchor_is_valid rule (#5341)

Follow-on after #5223.

#5223 introduced the line `let span = jsx_el.opening_element.name.span();`. But the span is only needed when creating a diagnostic when the rule fails (cold path). Avoid the work of getting the span for the common case where the rule passes.
This commit is contained in:
overlookmotel 2024-08-30 12:52:39 +00:00
parent 57050ab16a
commit 05636b7725

View file

@ -135,7 +135,8 @@ impl Rule for AnchorIsValid {
if name != "a" { if name != "a" {
return; return;
}; };
let span = jsx_el.opening_element.name.span(); // Don't eagerly get `span` here, to avoid that work unless rule fails
let get_span = || jsx_el.opening_element.name.span();
if let Option::Some(href_attr) = if let Option::Some(href_attr) =
has_jsx_prop_ignore_case(&jsx_el.opening_element, "href") has_jsx_prop_ignore_case(&jsx_el.opening_element, "href")
{ {
@ -145,17 +146,17 @@ impl Rule for AnchorIsValid {
// Check if the 'a' element has a correct href attribute // Check if the 'a' element has a correct href attribute
let Some(value) = attr.value.as_ref() else { let Some(value) = attr.value.as_ref() else {
ctx.diagnostic(incorrect_href(span)); ctx.diagnostic(incorrect_href(get_span()));
return; return;
}; };
let is_empty = self.check_value_is_empty(value); let is_empty = self.check_value_is_empty(value);
if is_empty { if is_empty {
if has_jsx_prop_ignore_case(&jsx_el.opening_element, "onclick").is_some() { if has_jsx_prop_ignore_case(&jsx_el.opening_element, "onclick").is_some() {
ctx.diagnostic(cant_be_anchor(span)); ctx.diagnostic(cant_be_anchor(get_span()));
return; return;
} }
ctx.diagnostic(incorrect_href(span)); ctx.diagnostic(incorrect_href(get_span()));
return; return;
} }
return; return;
@ -168,7 +169,7 @@ impl Rule for AnchorIsValid {
if has_spread_attr { if has_spread_attr {
return; return;
} }
ctx.diagnostic(missing_href_attribute(span)); ctx.diagnostic(missing_href_attribute(get_span()));
} }
} }
} }