diff --git a/crates/oxc_linter/src/rules/eslint/array_callback_return/mod.rs b/crates/oxc_linter/src/rules/eslint/array_callback_return/mod.rs index cdcb702956883..442cb45f3ac18 100644 --- a/crates/oxc_linter/src/rules/eslint/array_callback_return/mod.rs +++ b/crates/oxc_linter/src/rules/eslint/array_callback_return/mod.rs @@ -311,6 +311,7 @@ fn test() { None, ), ("foo.every(function() { try { bar(); } finally { return true; } })", None), + ("foo.every(function() { switch (a) { default: case0: return true; } })", None), ( "Array.from(x, function() { return; })", Some(serde_json::json!([{"allowImplicit": true}])), diff --git a/crates/oxc_linter/src/rules/eslint/array_callback_return/return_checker.rs b/crates/oxc_linter/src/rules/eslint/array_callback_return/return_checker.rs index c98c4f00b1ac9..89732826570da 100644 --- a/crates/oxc_linter/src/rules/eslint/array_callback_return/return_checker.rs +++ b/crates/oxc_linter/src/rules/eslint/array_callback_return/return_checker.rs @@ -156,17 +156,25 @@ pub fn check_statement(statement: &Statement) -> StatementReturnStatus { // 2. There is a default case that returns Statement::SwitchStatement(stmt) => { let mut case_statuses = vec![]; + // The default case maybe is not the last case and fallthrough + let mut default_case_fallthrough_continue = false; let mut default_case_status = StatementReturnStatus::NotReturn; let mut current_case_status = StatementReturnStatus::NotReturn; for case in &stmt.cases { let branch_terminated = check_switch_case(case, &mut current_case_status); - if case.is_default_case() { - default_case_status = current_case_status; - // Cases below the default case are not considered. - break; + if branch_terminated { + default_case_status = current_case_status; + // Cases below the default case are not considered. + break; + } + default_case_fallthrough_continue = true; } else if branch_terminated { + if default_case_fallthrough_continue { + default_case_status = current_case_status; + break; + } case_statuses.push(current_case_status); current_case_status = StatementReturnStatus::NotReturn; } // Falls through to next case, accumulating lattice