Skip to content

Commit 05fba9b

Browse files
committed
fix(linter): don't panic on TSNonNullExpression in unicorn/prefer-array-find (#12400)
closes #12399
1 parent 83dd31d commit 05fba9b

File tree

2 files changed

+30
-10
lines changed

2 files changed

+30
-10
lines changed

crates/oxc_linter/src/rules/unicorn/prefer_array_find.rs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,11 @@ impl Rule for PreferArrayFind {
7272

7373
if let AstKind::CallExpression(call_expr) = node.kind() {
7474
if is_method_call(call_expr, None, Some(&["shift"]), Some(0), Some(0)) {
75-
if let Expression::CallExpression(filter_call_expr) =
76-
call_expr.callee.as_member_expression().unwrap().object().get_inner_expression()
75+
if let Some(Expression::CallExpression(filter_call_expr)) = call_expr
76+
.callee
77+
.get_inner_expression()
78+
.as_member_expression()
79+
.map(|expression| expression.object().get_inner_expression())
7780
{
7881
if is_filter_call(filter_call_expr) {
7982
ctx.diagnostic(prefer_array_find_diagnostic(
@@ -197,12 +200,11 @@ impl Rule for PreferArrayFind {
197200
})
198201
})
199202
{
200-
if let Expression::CallExpression(filter_call_expr) = at_call_expr
203+
if let Some(Expression::CallExpression(filter_call_expr)) = at_call_expr
201204
.callee
202-
.as_member_expression()
203-
.unwrap()
204-
.object()
205205
.get_inner_expression()
206+
.as_member_expression()
207+
.map(|expression| expression.object().get_inner_expression())
206208
{
207209
if is_filter_call(filter_call_expr) {
208210
ctx.diagnostic(prefer_array_find_diagnostic(
@@ -216,12 +218,11 @@ impl Rule for PreferArrayFind {
216218
// `array.filter().pop()`
217219
if let AstKind::CallExpression(pop_call_expr) = node.kind() {
218220
if is_method_call(pop_call_expr, None, Some(&["pop"]), Some(0), Some(0)) {
219-
if let Expression::CallExpression(filter_call_expr) = pop_call_expr
221+
if let Some(Expression::CallExpression(filter_call_expr)) = pop_call_expr
220222
.callee
221-
.as_member_expression()
222-
.unwrap()
223-
.object()
224223
.get_inner_expression()
224+
.as_member_expression()
225+
.map(|expression| expression.object().get_inner_expression())
225226
{
226227
if is_filter_call(filter_call_expr) {
227228
ctx.diagnostic(prefer_array_find_diagnostic(
@@ -427,6 +428,8 @@ fn test() {
427428
"array.filter().at(0)",
428429
"array.filter(foo, thisArgument, extraArgument).at(0)",
429430
"array.filter(...foo).at(0)",
431+
// oxc-project/oxc#12399
432+
"{a.pop!()}",
430433
];
431434

432435
let fail = vec![
@@ -609,6 +612,9 @@ fn test() {
609612
)
610613
// comment 6
611614
;",
615+
// oxc-project/oxc#12399
616+
"array.filter(foo).pop!()",
617+
"array.filter(foo)?.pop()",
612618
];
613619

614620
let _fix: Vec<(&'static str, &'static str, Option<serde_json::Value>)> = vec![

crates/oxc_linter/src/snapshots/unicorn_prefer_array_find.snap

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,3 +563,17 @@ source: crates/oxc_linter/src/tester.rs
563563
4// comment 2
564564
╰────
565565
help: Use 'find(predicate)' instead of 'filter(predicate)[0]' or similar patterns
566+
567+
eslint-plugin-unicorn(prefer-array-find): Prefer 'find' over filtering and accessing the first result
568+
╭─[prefer_array_find.tsx:1:7]
569+
1array.filter(foo).pop!()
570+
· ──────
571+
╰────
572+
help: Use 'find(predicate)' instead of 'filter(predicate)[0]' or similar patterns
573+
574+
eslint-plugin-unicorn(prefer-array-find): Prefer 'find' over filtering and accessing the first result
575+
╭─[prefer_array_find.tsx:1:7]
576+
1array.filter(foo)?.pop()
577+
· ──────
578+
╰────
579+
help: Use 'find(predicate)' instead of 'filter(predicate)[0]' or similar patterns

0 commit comments

Comments
 (0)