From ee134f022cc4d4cb402a4899846a37d08e9af910 Mon Sep 17 00:00:00 2001 From: Cameron Date: Fri, 20 Oct 2023 14:50:58 +0100 Subject: [PATCH] fix(linter): incorrect reporting for jsx_key (#1020) tested on a different repo and noticed an issue (despite passing all of the eslint test cases) If we are in the following scenario: ```tsx const columns: ColumnDef[] = [ { accessorKey: 'firstName', header: ({ column }) => , cell: ({ row }) =>
{row.getValue('firstName')}
, enableSorting: true, enableHiding: false, }, ] ``` Previously an error would be reported however it did not make sense to as the object has to be mapped again before it is displayed in react (hence lets check there instead) --- crates/oxc_linter/src/rules/react/jsx_key.rs | 37 ++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/crates/oxc_linter/src/rules/react/jsx_key.rs b/crates/oxc_linter/src/rules/react/jsx_key.rs index 3ea13e887..3547e1a73 100644 --- a/crates/oxc_linter/src/rules/react/jsx_key.rs +++ b/crates/oxc_linter/src/rules/react/jsx_key.rs @@ -79,6 +79,15 @@ fn is_in_array_or_iter<'a, 'b>( }; match parent.kind() { + AstKind::ArrowExpression(_) | AstKind::Function(_) => { + let Some(parent) = ctx.nodes().parent_node(parent.id()) else { + return None; + }; + + if let AstKind::ObjectProperty(_) = parent.kind() { + return None; + } + } AstKind::ArrayExpression(_) => return Some(InsideArrayOrIterator::Array), AstKind::CallExpression(v) => { let callee = &v.callee.without_parenthesized(); @@ -94,8 +103,9 @@ fn is_in_array_or_iter<'a, 'b>( return None; } AstKind::JSXElement(_) | AstKind::JSXOpeningElement(_) => return None, - _ => node = parent, + _ => {} } + node = parent; } } @@ -290,10 +300,33 @@ fn test() { } export const clusterFrameMap = observable.map(); - "#, None, ), + ( + r#" + const columns: ColumnDef[] = [{ + accessorKey: 'lastName', + header: ({ column }) => , + cell: ({ row }) =>
{row.getValue('lastName')}
, + enableSorting: true, + enableHiding: false, + }] + "#, + None, + ), + ( + r#" + const columns: ColumnDef[] = [{ + accessorKey: 'lastName', + header: function ({ column }) { return }, + cell: ({ row }) =>
{row.getValue('lastName')}
, + enableSorting: true, + enableHiding: false, + }] + "#, + None, + ), ]; let fail = vec![