Skip to content

Commit

Permalink
fix(linter): improve the key span for jsx-key
Browse files Browse the repository at this point in the history
  • Loading branch information
Boshen committed Dec 8, 2023
1 parent 8347e22 commit b973261
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 8 deletions.
11 changes: 5 additions & 6 deletions crates/oxc_linter/src/rules/react/jsx_key.rs
Original file line number Diff line number Diff line change
Expand Up @@ -135,27 +135,27 @@ fn check_jsx_element<'a>(node: &AstNode<'a>, jsx_elem: &JSXElement<'a>, ctx: &Li
}

fn check_jsx_element_is_key_before_spread<'a>(jsx_elem: &JSXElement<'a>, ctx: &LintContext<'a>) {
let mut key_idx: Option<usize> = None;
let mut key_idx_span: Option<(usize, Span)> = None;
let mut spread_idx: Option<usize> = None;

for (i, attr) in jsx_elem.opening_element.attributes.iter().enumerate() {
match attr {
JSXAttributeItem::Attribute(attr) => {
let JSXAttributeName::Identifier(ident) = &attr.name else { continue };
if ident.name == "key" {
key_idx = Some(i);
key_idx_span = Some((i, attr.name.span()));
}
}
JSXAttributeItem::SpreadAttribute(_) => spread_idx = Some(i),
}
if key_idx.is_some() && spread_idx.is_some() {
if key_idx_span.map(|x| x.0).is_some() && spread_idx.is_some() {
break;
}
}

if let (Some(key_idx), Some(spread_idx)) = (key_idx, spread_idx) {
if let (Some((key_idx, key_span)), Some(spread_idx)) = (key_idx_span, spread_idx) {
if key_idx > spread_idx {
ctx.diagnostic(JsxKeyDiagnostic::KeyPropMustBePlacedBeforeSpread(jsx_elem.span));
ctx.diagnostic(JsxKeyDiagnostic::KeyPropMustBePlacedBeforeSpread(key_span));
}
}
}
Expand Down Expand Up @@ -462,7 +462,6 @@ fn test() {
{list.map(item => (<div>
<Text foo bar baz qux onClick={() => onClickHandler()} onPointerDown={() => onPointerDownHandler()} onMouseDown={() => onMouseDownHandler()} />
</div>)
)}
</div>
);
Expand Down
4 changes: 2 additions & 2 deletions crates/oxc_linter/src/snapshots/jsx_key.snap
Original file line number Diff line number Diff line change
Expand Up @@ -155,14 +155,14 @@ expression: jsx_key
eslint-plugin-react(jsx-key): "key" prop must be placed before any `{...spread}`
╭─[jsx_key.tsx:1:1]
1 │ [<App {...obj} key="keyAfterSpread" />];
· ─────────────────────────────────────
· ───
╰────
help: To avoid conflicting with React's new JSX transform: https://reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html

eslint-plugin-react(jsx-key): "key" prop must be placed before any `{...spread}`
╭─[jsx_key.tsx:1:1]
1 │ [<div {...obj} key="keyAfterSpread" />];
· ─────────────────────────────────────
· ───
╰────
help: To avoid conflicting with React's new JSX transform: https://reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html

Expand Down

0 comments on commit b973261

Please sign in to comment.