Skip to content

Commit a089e19

Browse files
authoredOct 1, 2024··
feat(linter): eslint/no-else-return (#4305)
1 parent 0400ff9 commit a089e19

File tree

3 files changed

+977
-0
lines changed

3 files changed

+977
-0
lines changed
 

‎crates/oxc_linter/src/rules.rs

+2
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ mod eslint {
6363
pub mod no_dupe_else_if;
6464
pub mod no_dupe_keys;
6565
pub mod no_duplicate_case;
66+
pub mod no_else_return;
6667
pub mod no_empty;
6768
pub mod no_empty_character_class;
6869
pub mod no_empty_function;
@@ -536,6 +537,7 @@ oxc_macros::declare_all_lint_rules! {
536537
eslint::no_empty_function,
537538
eslint::no_empty_pattern,
538539
eslint::no_empty_static_block,
540+
eslint::no_else_return,
539541
eslint::no_eq_null,
540542
eslint::no_eval,
541543
eslint::no_ex_assign,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,389 @@
1+
use crate::{context::LintContext, rule::Rule, AstNode};
2+
use cow_utils::CowUtils;
3+
use oxc_ast::{ast::Statement, AstKind};
4+
use oxc_diagnostics::OxcDiagnostic;
5+
use oxc_macros::declare_oxc_lint;
6+
use oxc_semantic::{ScopeId, ScopeTree};
7+
use oxc_span::{GetSpan, Span};
8+
9+
#[derive(Debug, Default, Clone)]
10+
pub struct NoElseReturn {
11+
allow_else_if: bool,
12+
}
13+
14+
declare_oxc_lint!(
15+
/// ### What it does
16+
/// Disallow `else` blocks after `return` statements in `if` statements
17+
///
18+
/// ### Why is this bad?
19+
/// If an if block contains a return statement, the else block becomes unnecessary. Its contents can be placed outside of the block.
20+
///
21+
/// ### Example
22+
/// ```javascript
23+
/// function foo() {
24+
/// if (x) {
25+
/// return y;
26+
/// } else {
27+
/// return z;
28+
/// }
29+
/// }
30+
/// ```
31+
NoElseReturn,
32+
suspicious,
33+
fix
34+
);
35+
36+
fn no_else_return_diagnostic(else_stmt: &Statement) -> OxcDiagnostic {
37+
OxcDiagnostic::warn("Disallow `else` blocks after `return` statements in `if` statements")
38+
.with_help("Unnecessary 'else' after 'return'.")
39+
.with_label(else_stmt.span())
40+
}
41+
42+
fn is_safe_from_name_collisions(
43+
ctx: &LintContext,
44+
stmt: &Statement,
45+
parent_scope_id: ScopeId,
46+
) -> bool {
47+
let scopes: &ScopeTree = ctx.scopes();
48+
49+
match stmt {
50+
Statement::BlockStatement(block) => {
51+
let block_scope_id = block.scope_id.get().unwrap();
52+
let bindings = scopes.get_bindings(block_scope_id);
53+
let parent_bindings = scopes.get_bindings(parent_scope_id);
54+
55+
if bindings.iter().any(|(name, symbol_id)| {
56+
let Some((parent_name, parent_symbol_id)) = parent_bindings.get_key_value(name)
57+
else {
58+
return false;
59+
};
60+
parent_name == name && symbol_id != parent_symbol_id
61+
}) {
62+
return false;
63+
}
64+
65+
true
66+
}
67+
Statement::FunctionDeclaration(_) => false,
68+
_ => true,
69+
}
70+
}
71+
72+
fn replace_block(s: &str) -> String {
73+
if s.starts_with('{') && s.ends_with('}') && s.len() > 1 {
74+
s[1..s.len() - 1].to_string()
75+
} else {
76+
s.to_string()
77+
}
78+
}
79+
80+
fn no_else_return_diagnostic_fix(
81+
ctx: &LintContext,
82+
else_stmt_prev: &Statement,
83+
else_stmt: &Statement,
84+
if_block_node: &AstNode,
85+
) {
86+
let parent_scope_id = if_block_node.scope_id();
87+
88+
if !is_safe_from_name_collisions(ctx, else_stmt, parent_scope_id) {
89+
return ctx.diagnostic(no_else_return_diagnostic(else_stmt));
90+
};
91+
92+
let prev_span = else_stmt_prev.span();
93+
let span = else_stmt.span();
94+
95+
let else_code = ctx.source_range(span);
96+
let else_code_prev_token = ctx
97+
.source_range(Span::new(prev_span.end, span.end))
98+
.cow_replacen("else ", "", 1)
99+
.cow_replace(else_code, "")
100+
.to_string();
101+
let fix_else_code = else_code_prev_token + &replace_block(else_code);
102+
103+
ctx.diagnostic_with_fix(no_else_return_diagnostic(else_stmt), |fixer| {
104+
fixer.replace(Span::new(prev_span.end, span.end), fix_else_code)
105+
});
106+
}
107+
108+
fn naive_has_return(node: &Statement) -> bool {
109+
match node {
110+
Statement::BlockStatement(block) => {
111+
let Some(last_child) = block.body.last() else {
112+
return false;
113+
};
114+
matches!(last_child, Statement::ReturnStatement(_))
115+
}
116+
Statement::ReturnStatement(_) => true,
117+
_ => false,
118+
}
119+
}
120+
121+
fn check_for_return_or_if(node: &Statement) -> bool {
122+
match node {
123+
Statement::ReturnStatement(_) => true,
124+
Statement::IfStatement(if_stmt) => {
125+
let Some(alternate) = &if_stmt.alternate else {
126+
return false;
127+
};
128+
naive_has_return(alternate) && naive_has_return(&if_stmt.consequent)
129+
}
130+
_ => false,
131+
}
132+
}
133+
134+
fn always_returns(stmt: &Statement) -> bool {
135+
match stmt {
136+
Statement::BlockStatement(block) => block.body.iter().any(check_for_return_or_if),
137+
node => check_for_return_or_if(node),
138+
}
139+
}
140+
141+
fn check_if_with_else(ctx: &LintContext, node: &AstNode) {
142+
let AstKind::IfStatement(if_stmt) = node.kind() else {
143+
return;
144+
};
145+
let Some(alternate) = &if_stmt.alternate else {
146+
return;
147+
};
148+
149+
if always_returns(&if_stmt.consequent) {
150+
no_else_return_diagnostic_fix(ctx, &if_stmt.consequent, alternate, node);
151+
}
152+
}
153+
154+
fn check_if_without_else(ctx: &LintContext, node: &AstNode) {
155+
let AstKind::IfStatement(if_stmt) = node.kind() else {
156+
return;
157+
};
158+
let mut current_node = if_stmt;
159+
let mut last_alternate;
160+
let mut last_alternate_prev;
161+
162+
loop {
163+
let Some(alternate) = &current_node.alternate else {
164+
return;
165+
};
166+
if !always_returns(&current_node.consequent) {
167+
return;
168+
}
169+
last_alternate_prev = &current_node.consequent;
170+
last_alternate = alternate;
171+
match alternate {
172+
Statement::IfStatement(if_stmt) => {
173+
current_node = if_stmt;
174+
}
175+
_ => break,
176+
}
177+
}
178+
179+
no_else_return_diagnostic_fix(ctx, last_alternate_prev, last_alternate, node);
180+
}
181+
182+
impl Rule for NoElseReturn {
183+
fn from_configuration(value: serde_json::Value) -> Self {
184+
let Some(value) = value.get(0) else { return Self { allow_else_if: true } };
185+
Self {
186+
allow_else_if: value
187+
.get("allowElseIf")
188+
.and_then(serde_json::Value::as_bool)
189+
.unwrap_or(true),
190+
}
191+
}
192+
193+
fn run<'a>(&self, node: &AstNode<'a>, ctx: &LintContext<'a>) {
194+
let AstKind::IfStatement(_) = node.kind() else {
195+
return;
196+
};
197+
198+
let Some(parent_node) = ctx.nodes().parent_node(node.id()) else {
199+
return;
200+
};
201+
202+
if !matches!(
203+
parent_node.kind(),
204+
AstKind::Program(_)
205+
| AstKind::BlockStatement(_)
206+
| AstKind::StaticBlock(_)
207+
| AstKind::SwitchCase(_)
208+
| AstKind::FunctionBody(_)
209+
) {
210+
return;
211+
}
212+
if self.allow_else_if {
213+
check_if_without_else(ctx, node);
214+
} else {
215+
check_if_with_else(ctx, node);
216+
}
217+
}
218+
}
219+
220+
#[test]
221+
fn test() {
222+
use crate::tester::Tester;
223+
224+
let pass = vec![
225+
("function foo() { if (true) { if (false) { return x; } } else { return y; } }", None),
226+
("function foo() { if (true) { return x; } return y; }", None),
227+
("function foo() { if (true) { for (;;) { return x; } } else { return y; } }", None),
228+
("function foo() { var x = true; if (x) { return x; } else if (x === false) { return false; } }", None),
229+
("function foo() { if (true) notAReturn(); else return y; }", None),
230+
("function foo() {if (x) { notAReturn(); } else if (y) { return true; } else { notAReturn(); } }", None),
231+
("function foo() {if (x) { return true; } else if (y) { notAReturn() } else { notAReturn(); } }", None),
232+
("if (0) { if (0) {} else {} } else {}", None),
233+
("
234+
function foo() {
235+
if (foo)
236+
if (bar) return;
237+
else baz;
238+
else qux;
239+
}
240+
", None),
241+
("
242+
function foo() {
243+
while (foo)
244+
if (bar) return;
245+
else baz;
246+
}
247+
", None),
248+
("function foo19() { if (true) { return x; } else if (false) { return y; } }", Some(serde_json::json!([{ "allowElseIf": true }]))),
249+
("function foo20() {if (x) { return true; } else if (y) { notAReturn() } else { notAReturn(); } }", Some(serde_json::json!([{ "allowElseIf": true }]))),
250+
("function foo21() { var x = true; if (x) { return x; } else if (x === false) { return false; } }", Some(serde_json::json!([{ "allowElseIf": true }])))
251+
];
252+
253+
let fail = vec![
254+
("function foo1() { if (true) { return x; } else { return y; } }", None),
255+
("function foo2() { if (true) { var x = bar; return x; } else { var y = baz; return y; } }", None),
256+
("function foo3() { if (true) return x; else return y; }", None),
257+
("function foo4() { if (true) { if (false) return x; else return y; } else { return z; } }", None),
258+
("function foo5() { if (true) { if (false) { if (true) return x; else { w = y; } } else { w = x; } } else { return z; } }", None),
259+
("function foo6() { if (true) { if (false) { if (true) return x; else return y; } } else { return z; } }", None),
260+
("function foo7() { if (true) { if (false) { if (true) return x; else return y; } return w; } else { return z; } }", None),
261+
("function foo8() { if (true) { if (false) { if (true) return x; else return y; } else { w = x; } } else { return z; } }", None),
262+
("function foo9() {if (x) { return true; } else if (y) { return true; } else { notAReturn(); } }", None),
263+
("function foo9a() {if (x) { return true; } else if (y) { return true; } else { notAReturn(); } }", Some(serde_json::json!([{ "allowElseIf": false }]))),
264+
("function foo9b() {if (x) { return true; } if (y) { return true; } else { notAReturn(); } }", Some(serde_json::json!([{ "allowElseIf": false }]))),
265+
("function foo10() { if (foo) return bar; else (foo).bar(); }", None),
266+
("function foo11() { if (foo) return bar
267+
else { [1, 2, 3].map(foo) } }", None),
268+
("function foo12() { if (foo) return bar
269+
else { baz() }
270+
[1, 2, 3].map(foo) }", None),
271+
("function foo13() { if (foo) return bar;
272+
else { [1, 2, 3].map(foo) } }", None),
273+
("function foo14() { if (foo) return bar
274+
else { baz(); }
275+
[1, 2, 3].map(foo) }", None),
276+
("function foo15() { if (foo) return bar; else { baz() } qaz() }", None),
277+
("function foo16() { if (foo) return bar
278+
else { baz() } qaz() }", None),
279+
("function foo17() { if (foo) return bar
280+
else { baz() }
281+
qaz() }", None),
282+
("function foo18() { if (foo) return function() {}
283+
else [1, 2, 3].map(bar) }", None),
284+
("function foo19() { if (true) { return x; } else if (false) { return y; } }", Some(serde_json::json!([{ "allowElseIf": false }]))),
285+
("function foo20() {if (x) { return true; } else if (y) { notAReturn() } else { notAReturn(); } }", Some(serde_json::json!([{ "allowElseIf": false }]))),
286+
("function foo21() { var x = true; if (x) { return x; } else if (x === false) { return false; } }", Some(serde_json::json!([{ "allowElseIf": false }]))),
287+
("function foo() { var a; if (bar) { return true; } else { var a; } }", None),
288+
("function foo() { if (bar) { var a; if (baz) { return true; } else { var a; } } }", None),
289+
("function foo() { var a; if (bar) { return true; } else { var a; } }", None), // { "ecmaVersion": 6 },
290+
("function foo() { if (bar) { var a; if (baz) { return true; } else { var a; } } }", None), // { "ecmaVersion": 6 },
291+
("function foo() { let a; if (bar) { return true; } else { let a; } }", None), // { "ecmaVersion": 6 },
292+
("class foo { bar() { let a; if (baz) { return true; } else { let a; } } }", None), // { "ecmaVersion": 6 },
293+
("function foo() { if (bar) { let a; if (baz) { return true; } else { let a; } } }", None), // { "ecmaVersion": 6 },
294+
("function foo() {let a; if (bar) { if (baz) { return true; } else { let a; } } }", None), // { "ecmaVersion": 6 },
295+
("function foo() { const a = 1; if (bar) { return true; } else { let a; } }", None), // { "ecmaVersion": 6 },
296+
("function foo() { if (bar) { const a = 1; if (baz) { return true; } else { let a; } } }", None), // { "ecmaVersion": 6 },
297+
("function foo() { let a; if (bar) { return true; } else { const a = 1 } }", None), // { "ecmaVersion": 6 },
298+
("function foo() { if (bar) { let a; if (baz) { return true; } else { const a = 1; } } }", None), // { "ecmaVersion": 6 },
299+
("function foo() { class a {}; if (bar) { return true; } else { const a = 1; } }", None), // { "ecmaVersion": 6 },
300+
("function foo() { if (bar) { class a {}; if (baz) { return true; } else { const a = 1; } } }", None), // { "ecmaVersion": 6 },
301+
("function foo() { const a = 1; if (bar) { return true; } else { class a {} } }", None), // { "ecmaVersion": 6 },
302+
("function foo() { if (bar) { const a = 1; if (baz) { return true; } else { class a {} } } }", None), // { "ecmaVersion": 6 },
303+
("function foo() { var a; if (bar) { return true; } else { let a; } }", None), // { "ecmaVersion": 6 },
304+
("function foo() { if (bar) { var a; return true; } else { let a; } }", None), // { "ecmaVersion": 6 },
305+
("function foo() { if (bar) { return true; } else { let a; } while (baz) { var a; } }", None), // { "ecmaVersion": 6 },
306+
("function foo(a) { if (bar) { return true; } else { let a; } }", None), // { "ecmaVersion": 6 },
307+
("function foo(a = 1) { if (bar) { return true; } else { let a; } }", None), // { "ecmaVersion": 6 },
308+
("function foo(a, b = a) { if (bar) { return true; } else { let a; } if (bar) { return true; } else { let b; }}", None), // { "ecmaVersion": 6 },
309+
("function foo(...args) { if (bar) { return true; } else { let args; } }", None), // { "ecmaVersion": 6 },
310+
("function foo() { try {} catch (a) { if (bar) { return true; } else { let a; } } }", None), // { "ecmaVersion": 6 },
311+
("function foo() { try {} catch (a) { if (bar) { if (baz) { return true; } else { let a; } } } }", None), // { "ecmaVersion": 6 },
312+
("function foo() { try {} catch ({bar, a = 1}) { if (baz) { return true; } else { let a; } } }", None), // { "ecmaVersion": 6 },
313+
("function foo() { if (bar) { return true; } else { let arguments; } }", None), // { "ecmaVersion": 6 },
314+
("function foo() { if (bar) { return true; } else { let arguments; } return arguments[0]; }", None), // { "ecmaVersion": 6 },
315+
("function foo() { if (bar) { return true; } else { let arguments; } if (baz) { return arguments[0]; } }", None), // { "ecmaVersion": 6 },
316+
("function foo() { if (bar) { if (baz) { return true; } else { let arguments; } } }", None), // { "ecmaVersion": 6 },
317+
("function foo() { if (bar) { return true; } else { let a; } a; }", None), // { "ecmaVersion": 6 },
318+
("function foo() { if (bar) { return true; } else { let a; } if (baz) { a; } }", None), // { "ecmaVersion": 6 },
319+
("function foo() { if (bar) { if (baz) { return true; } else { let a; } } a; }", None), // { "ecmaVersion": 6 },
320+
("function foo() { if (bar) { if (baz) { return true; } else { let a; } a; } }", None), // { "ecmaVersion": 6 },
321+
("function foo() { if (bar) { if (baz) { return true; } else { let a; } if (quux) { a; } } }", None), // { "ecmaVersion": 6 },
322+
("function a() { if (foo) { return true; } else { let a; } a(); }", None), // { "ecmaVersion": 6 },
323+
("function a() { if (a) { return true; } else { let a; } }", None), // { "ecmaVersion": 6 },
324+
("function a() { if (foo) { return a; } else { let a; } }", None), // { "ecmaVersion": 6 },
325+
("function foo() { if (bar) { return true; } else { let a; } function baz() { a; } }", None), // { "ecmaVersion": 6 },
326+
("function foo() { if (bar) { if (baz) { return true; } else { let a; } (() => a) } }", None), // { "ecmaVersion": 6 },
327+
("function foo() { if (bar) { return true; } else { let a; } var a; }", None), // { "ecmaVersion": 6 },
328+
("function foo() { if (bar) { if (baz) { return true; } else { let a; } var a; } }", None), // { "ecmaVersion": 6 },
329+
("function foo() { if (bar) { if (baz) { return true; } else { let a; } var { a } = {}; } }", None), // { "ecmaVersion": 6 },
330+
("function foo() { if (bar) { if (baz) { return true; } else { let a; } if (quux) { var a; } } }", None), // { "ecmaVersion": 6 },
331+
("function foo() { if (bar) { if (baz) { return true; } else { let a; } } if (quux) { var a; } }", None), // { "ecmaVersion": 6 },
332+
("function foo() { if (quux) { var a; } if (bar) { if (baz) { return true; } else { let a; } } }", None), // { "ecmaVersion": 6 },
333+
("function foo() { if (bar) { return true; } else { let a; } function a(){} }", None), // { "ecmaVersion": 6 },
334+
("function foo() { if (baz) { if (bar) { return true; } else { let a; } function a(){} } }", None), // { "ecmaVersion": 6 },
335+
("function foo() { if (bar) { if (baz) { return true; } else { let a; } } if (quux) { function a(){} } }", None), // { "ecmaVersion": 6 },
336+
("function foo() { if (bar) { if (baz) { return true; } else { let a; } } function a(){} }", None), // { "ecmaVersion": 6 },
337+
("function foo() { let a; if (bar) { return true; } else { function a(){} } }", None), // { "ecmaVersion": 6 },
338+
("function foo() { var a; if (bar) { return true; } else { function a(){} } }", None), // { "ecmaVersion": 6 },
339+
("function foo() { if (bar) { return true; } else function baz() {} };", None),
340+
("if (foo) { return true; } else { let a; }", None), // { "ecmaVersion": 6, "sourceType": "commonjs" },
341+
("let a; if (foo) { return true; } else { let a; }", None), // { "ecmaVersion": 6, "sourceType": "commonjs" }
342+
];
343+
344+
let fix = vec![
345+
("function foo1() { if (true) { return x; } else { return y; } }", "function foo1() { if (true) { return x; } return y; }", None),
346+
("function foo2() { if (true) { var x = bar; return x; } else { var y = baz; return y; } }", "function foo2() { if (true) { var x = bar; return x; } var y = baz; return y; }", None),
347+
("function foo3() { if (true) return x; else return y; }", "function foo3() { if (true) return x; return y; }", None),
348+
("function foo4() { if (true) { if (false) return x; else return y; } else { return z; } }", "function foo4() { if (true) { if (false) return x; return y; } return z; }", None),
349+
("function foo5() { if (true) { if (false) { if (true) return x; else { w = y; } } else { w = x; } } else { return z; } }", "function foo5() { if (true) { if (false) { if (true) return x; w = y; } else { w = x; } } else { return z; } }", None),
350+
("function foo6() { if (true) { if (false) { if (true) return x; else return y; } } else { return z; } }", "function foo6() { if (true) { if (false) { if (true) return x; return y; } } else { return z; } }", None),
351+
("function foo7() { if (true) { if (false) { if (true) return x; else return y; } return w; } else { return z; } }", "function foo7() { if (true) { if (false) { if (true) return x; return y; } return w; } return z; }", None),
352+
("function foo8() { if (true) { if (false) { if (true) return x; else return y; } else { w = x; } } else { return z; } }", "function foo8() { if (true) { if (false) { if (true) return x; return y; } w = x; } else { return z; } }", None),
353+
("function foo9() {if (x) { return true; } else if (y) { return true; } else { notAReturn(); } }", "function foo9() {if (x) { return true; } else if (y) { return true; } notAReturn(); }", None),
354+
("function foo9a() {if (x) { return true; } else if (y) { return true; } else { notAReturn(); } }", "function foo9a() {if (x) { return true; } if (y) { return true; } else { notAReturn(); } }", Some(serde_json::json!([{ "allowElseIf": false }]))),
355+
("function foo9b() {if (x) { return true; } if (y) { return true; } else { notAReturn(); } }", "function foo9b() {if (x) { return true; } if (y) { return true; } notAReturn(); }", Some(serde_json::json!([{ "allowElseIf": false }]))),
356+
("function foo10() { if (foo) return bar; else (foo).bar(); }", "function foo10() { if (foo) return bar; (foo).bar(); }", None),
357+
("function foo13() { if (foo) return bar;
358+
else { [1, 2, 3].map(foo) } }", "function foo13() { if (foo) return bar;
359+
[1, 2, 3].map(foo) }", None),
360+
("function foo14() { if (foo) return bar
361+
else { baz(); }
362+
[1, 2, 3].map(foo) }", "function foo14() { if (foo) return bar
363+
baz();
364+
[1, 2, 3].map(foo) }", None),
365+
("function foo17() { if (foo) return bar
366+
else { baz() }
367+
qaz() }", "function foo17() { if (foo) return bar
368+
baz()
369+
qaz() }", None),
370+
("function foo19() { if (true) { return x; } else if (false) { return y; } }", "function foo19() { if (true) { return x; } if (false) { return y; } }", Some(serde_json::json!([{ "allowElseIf": false }]))),
371+
("function foo20() {if (x) { return true; } else if (y) { notAReturn() } else { notAReturn(); } }", "function foo20() {if (x) { return true; } if (y) { notAReturn() } else { notAReturn(); } }", Some(serde_json::json!([{ "allowElseIf": false }]))),
372+
("function foo21() { var x = true; if (x) { return x; } else if (x === false) { return false; } }", "function foo21() { var x = true; if (x) { return x; } if (x === false) { return false; } }", Some(serde_json::json!([{ "allowElseIf": false }]))),
373+
("function foo() { var a; if (bar) { return true; } else { var a; } }", "function foo() { var a; if (bar) { return true; } var a; }", None),
374+
("function foo() { if (bar) { var a; if (baz) { return true; } else { var a; } } }", "function foo() { if (bar) { var a; if (baz) { return true; } var a; } }", None),
375+
("function foo() { var a; if (bar) { return true; } else { var a; } }", "function foo() { var a; if (bar) { return true; } var a; }", None),
376+
("function foo() { if (bar) { var a; if (baz) { return true; } else { var a; } } }", "function foo() { if (bar) { var a; if (baz) { return true; } var a; } }", None),
377+
("function foo() {let a; if (bar) { if (baz) { return true; } else { let a; } } }", "function foo() {let a; if (bar) { if (baz) { return true; } let a; } }", None),
378+
("function foo() { try {} catch (a) { if (bar) { if (baz) { return true; } else { let a; } } } }", "function foo() { try {} catch (a) { if (bar) { if (baz) { return true; } let a; } } }", None),
379+
("function foo() { if (bar) { return true; } else { let arguments; } }", "function foo() { if (bar) { return true; } let arguments; }", None),
380+
("function foo() { if (bar) { if (baz) { return true; } else { let arguments; } } }", "function foo() { if (bar) { if (baz) { return true; } let arguments; } }", None),
381+
("function foo() { if (bar) { if (baz) { return true; } else { let a; } } a; }", "function foo() { if (bar) { if (baz) { return true; } let a; } a; }", None),
382+
("function foo() { if (bar) { if (baz) { return true; } else { let a; } } if (quux) { var a; } }", "function foo() { if (bar) { if (baz) { return true; } let a; } if (quux) { var a; } }", None),
383+
("function foo() { if (quux) { var a; } if (bar) { if (baz) { return true; } else { let a; } } }", "function foo() { if (quux) { var a; } if (bar) { if (baz) { return true; } let a; } }", None),
384+
("function foo() { if (bar) { if (baz) { return true; } else { let a; } } if (quux) { function a(){} } }", "function foo() { if (bar) { if (baz) { return true; } let a; } if (quux) { function a(){} } }", None),
385+
("function foo() { if (bar) { if (baz) { return true; } else { let a; } } function a(){} }", "function foo() { if (bar) { if (baz) { return true; } let a; } function a(){} }", None),
386+
("if (foo) { return true; } else { let a; }", "if (foo) { return true; } let a; ", None)
387+
];
388+
Tester::new(NoElseReturn::NAME, pass, fail).expect_fix(fix).test_and_snapshot();
389+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,586 @@
1+
---
2+
source: crates/oxc_linter/src/tester.rs
3+
---
4+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
5+
╭─[no_else_return.tsx:1:48]
6+
1function foo1() { if (true) { return x; } else { return y; } }
7+
· ─────────────
8+
╰────
9+
help: Unnecessary 'else' after 'return'.
10+
11+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
12+
╭─[no_else_return.tsx:1:61]
13+
1function foo2() { if (true) { var x = bar; return x; } else { var y = baz; return y; } }
14+
· ──────────────────────────
15+
╰────
16+
help: Unnecessary 'else' after 'return'.
17+
18+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
19+
╭─[no_else_return.tsx:1:44]
20+
1function foo3() { if (true) return x; else return y; }
21+
· ─────────
22+
╰────
23+
help: Unnecessary 'else' after 'return'.
24+
25+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
26+
╭─[no_else_return.tsx:1:74]
27+
1function foo4() { if (true) { if (false) return x; else return y; } else { return z; } }
28+
· ─────────────
29+
╰────
30+
help: Unnecessary 'else' after 'return'.
31+
32+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
33+
╭─[no_else_return.tsx:1:57]
34+
1function foo4() { if (true) { if (false) return x; else return y; } else { return z; } }
35+
· ─────────
36+
╰────
37+
help: Unnecessary 'else' after 'return'.
38+
39+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
40+
╭─[no_else_return.tsx:1:69]
41+
1function foo5() { if (true) { if (false) { if (true) return x; else { w = y; } } else { w = x; } } else { return z; } }
42+
· ──────────
43+
╰────
44+
help: Unnecessary 'else' after 'return'.
45+
46+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
47+
╭─[no_else_return.tsx:1:69]
48+
1function foo6() { if (true) { if (false) { if (true) return x; else return y; } } else { return z; } }
49+
· ─────────
50+
╰────
51+
help: Unnecessary 'else' after 'return'.
52+
53+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
54+
╭─[no_else_return.tsx:1:98]
55+
1function foo7() { if (true) { if (false) { if (true) return x; else return y; } return w; } else { return z; } }
56+
· ─────────────
57+
╰────
58+
help: Unnecessary 'else' after 'return'.
59+
60+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
61+
╭─[no_else_return.tsx:1:69]
62+
1function foo7() { if (true) { if (false) { if (true) return x; else return y; } return w; } else { return z; } }
63+
· ─────────
64+
╰────
65+
help: Unnecessary 'else' after 'return'.
66+
67+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
68+
╭─[no_else_return.tsx:1:86]
69+
1function foo8() { if (true) { if (false) { if (true) return x; else return y; } else { w = x; } } else { return z; } }
70+
· ──────────
71+
╰────
72+
help: Unnecessary 'else' after 'return'.
73+
74+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
75+
╭─[no_else_return.tsx:1:69]
76+
1function foo8() { if (true) { if (false) { if (true) return x; else return y; } else { w = x; } } else { return z; } }
77+
· ─────────
78+
╰────
79+
help: Unnecessary 'else' after 'return'.
80+
81+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
82+
╭─[no_else_return.tsx:1:76]
83+
1function foo9() {if (x) { return true; } else if (y) { return true; } else { notAReturn(); } }
84+
· ─────────────────
85+
╰────
86+
help: Unnecessary 'else' after 'return'.
87+
88+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
89+
╭─[no_else_return.tsx:1:48]
90+
1function foo9a() {if (x) { return true; } else if (y) { return true; } else { notAReturn(); } }
91+
· ──────────────────────────────────────────────
92+
╰────
93+
help: Unnecessary 'else' after 'return'.
94+
95+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
96+
╭─[no_else_return.tsx:1:72]
97+
1function foo9b() {if (x) { return true; } if (y) { return true; } else { notAReturn(); } }
98+
· ─────────────────
99+
╰────
100+
help: Unnecessary 'else' after 'return'.
101+
102+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
103+
╭─[no_else_return.tsx:1:46]
104+
1function foo10() { if (foo) return bar; else (foo).bar(); }
105+
· ────────────
106+
╰────
107+
help: Unnecessary 'else' after 'return'.
108+
109+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
110+
╭─[no_else_return.tsx:2:9]
111+
1function foo11() { if (foo) return bar
112+
2else { [1, 2, 3].map(foo) } }
113+
· ──────────────────────
114+
╰────
115+
help: Unnecessary 'else' after 'return'.
116+
117+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
118+
╭─[no_else_return.tsx:2:9]
119+
1function foo12() { if (foo) return bar
120+
2else { baz() }
121+
· ─────────
122+
3 │ [1, 2, 3].map(foo) }
123+
╰────
124+
help: Unnecessary 'else' after 'return'.
125+
126+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
127+
╭─[no_else_return.tsx:2:9]
128+
1function foo13() { if (foo) return bar;
129+
2else { [1, 2, 3].map(foo) } }
130+
· ──────────────────────
131+
╰────
132+
help: Unnecessary 'else' after 'return'.
133+
134+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
135+
╭─[no_else_return.tsx:2:9]
136+
1function foo14() { if (foo) return bar
137+
2else { baz(); }
138+
· ──────────
139+
3 │ [1, 2, 3].map(foo) }
140+
╰────
141+
help: Unnecessary 'else' after 'return'.
142+
143+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
144+
╭─[no_else_return.tsx:1:46]
145+
1function foo15() { if (foo) return bar; else { baz() } qaz() }
146+
· ─────────
147+
╰────
148+
help: Unnecessary 'else' after 'return'.
149+
150+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
151+
╭─[no_else_return.tsx:2:9]
152+
1function foo16() { if (foo) return bar
153+
2else { baz() } qaz() }
154+
· ─────────
155+
╰────
156+
help: Unnecessary 'else' after 'return'.
157+
158+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
159+
╭─[no_else_return.tsx:2:9]
160+
1function foo17() { if (foo) return bar
161+
2else { baz() }
162+
· ─────────
163+
3qaz() }
164+
╰────
165+
help: Unnecessary 'else' after 'return'.
166+
167+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
168+
╭─[no_else_return.tsx:2:9]
169+
1function foo18() { if (foo) return function() {}
170+
2else [1, 2, 3].map(bar) }
171+
· ──────────────────
172+
╰────
173+
help: Unnecessary 'else' after 'return'.
174+
175+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
176+
╭─[no_else_return.tsx:1:49]
177+
1function foo19() { if (true) { return x; } else if (false) { return y; } }
178+
· ────────────────────────
179+
╰────
180+
help: Unnecessary 'else' after 'return'.
181+
182+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
183+
╭─[no_else_return.tsx:1:48]
184+
1function foo20() {if (x) { return true; } else if (y) { notAReturn() } else { notAReturn(); } }
185+
· ──────────────────────────────────────────────
186+
╰────
187+
help: Unnecessary 'else' after 'return'.
188+
189+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
190+
╭─[no_else_return.tsx:1:60]
191+
1function foo21() { var x = true; if (x) { return x; } else if (x === false) { return false; } }
192+
· ──────────────────────────────────
193+
╰────
194+
help: Unnecessary 'else' after 'return'.
195+
196+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
197+
╭─[no_else_return.tsx:1:56]
198+
1function foo() { var a; if (bar) { return true; } else { var a; } }
199+
· ──────────
200+
╰────
201+
help: Unnecessary 'else' after 'return'.
202+
203+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
204+
╭─[no_else_return.tsx:1:67]
205+
1function foo() { if (bar) { var a; if (baz) { return true; } else { var a; } } }
206+
· ──────────
207+
╰────
208+
help: Unnecessary 'else' after 'return'.
209+
210+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
211+
╭─[no_else_return.tsx:1:56]
212+
1function foo() { var a; if (bar) { return true; } else { var a; } }
213+
· ──────────
214+
╰────
215+
help: Unnecessary 'else' after 'return'.
216+
217+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
218+
╭─[no_else_return.tsx:1:67]
219+
1function foo() { if (bar) { var a; if (baz) { return true; } else { var a; } } }
220+
· ──────────
221+
╰────
222+
help: Unnecessary 'else' after 'return'.
223+
224+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
225+
╭─[no_else_return.tsx:1:56]
226+
1function foo() { let a; if (bar) { return true; } else { let a; } }
227+
· ──────────
228+
╰────
229+
help: Unnecessary 'else' after 'return'.
230+
231+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
232+
╭─[no_else_return.tsx:1:59]
233+
1class foo { bar() { let a; if (baz) { return true; } else { let a; } } }
234+
· ──────────
235+
╰────
236+
help: Unnecessary 'else' after 'return'.
237+
238+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
239+
╭─[no_else_return.tsx:1:67]
240+
1function foo() { if (bar) { let a; if (baz) { return true; } else { let a; } } }
241+
· ──────────
242+
╰────
243+
help: Unnecessary 'else' after 'return'.
244+
245+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
246+
╭─[no_else_return.tsx:1:66]
247+
1function foo() {let a; if (bar) { if (baz) { return true; } else { let a; } } }
248+
· ──────────
249+
╰────
250+
help: Unnecessary 'else' after 'return'.
251+
252+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
253+
╭─[no_else_return.tsx:1:62]
254+
1function foo() { const a = 1; if (bar) { return true; } else { let a; } }
255+
· ──────────
256+
╰────
257+
help: Unnecessary 'else' after 'return'.
258+
259+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
260+
╭─[no_else_return.tsx:1:73]
261+
1function foo() { if (bar) { const a = 1; if (baz) { return true; } else { let a; } } }
262+
· ──────────
263+
╰────
264+
help: Unnecessary 'else' after 'return'.
265+
266+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
267+
╭─[no_else_return.tsx:1:56]
268+
1function foo() { let a; if (bar) { return true; } else { const a = 1 } }
269+
· ───────────────
270+
╰────
271+
help: Unnecessary 'else' after 'return'.
272+
273+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
274+
╭─[no_else_return.tsx:1:67]
275+
1function foo() { if (bar) { let a; if (baz) { return true; } else { const a = 1; } } }
276+
· ────────────────
277+
╰────
278+
help: Unnecessary 'else' after 'return'.
279+
280+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
281+
╭─[no_else_return.tsx:1:61]
282+
1function foo() { class a {}; if (bar) { return true; } else { const a = 1; } }
283+
· ────────────────
284+
╰────
285+
help: Unnecessary 'else' after 'return'.
286+
287+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
288+
╭─[no_else_return.tsx:1:72]
289+
1function foo() { if (bar) { class a {}; if (baz) { return true; } else { const a = 1; } } }
290+
· ────────────────
291+
╰────
292+
help: Unnecessary 'else' after 'return'.
293+
294+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
295+
╭─[no_else_return.tsx:1:62]
296+
1function foo() { const a = 1; if (bar) { return true; } else { class a {} } }
297+
· ──────────────
298+
╰────
299+
help: Unnecessary 'else' after 'return'.
300+
301+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
302+
╭─[no_else_return.tsx:1:73]
303+
1function foo() { if (bar) { const a = 1; if (baz) { return true; } else { class a {} } } }
304+
· ──────────────
305+
╰────
306+
help: Unnecessary 'else' after 'return'.
307+
308+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
309+
╭─[no_else_return.tsx:1:56]
310+
1function foo() { var a; if (bar) { return true; } else { let a; } }
311+
· ──────────
312+
╰────
313+
help: Unnecessary 'else' after 'return'.
314+
315+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
316+
╭─[no_else_return.tsx:1:56]
317+
1function foo() { if (bar) { var a; return true; } else { let a; } }
318+
· ──────────
319+
╰────
320+
help: Unnecessary 'else' after 'return'.
321+
322+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
323+
╭─[no_else_return.tsx:1:49]
324+
1function foo() { if (bar) { return true; } else { let a; } while (baz) { var a; } }
325+
· ──────────
326+
╰────
327+
help: Unnecessary 'else' after 'return'.
328+
329+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
330+
╭─[no_else_return.tsx:1:50]
331+
1function foo(a) { if (bar) { return true; } else { let a; } }
332+
· ──────────
333+
╰────
334+
help: Unnecessary 'else' after 'return'.
335+
336+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
337+
╭─[no_else_return.tsx:1:54]
338+
1function foo(a = 1) { if (bar) { return true; } else { let a; } }
339+
· ──────────
340+
╰────
341+
help: Unnecessary 'else' after 'return'.
342+
343+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
344+
╭─[no_else_return.tsx:1:57]
345+
1function foo(a, b = a) { if (bar) { return true; } else { let a; } if (bar) { return true; } else { let b; }}
346+
· ──────────
347+
╰────
348+
help: Unnecessary 'else' after 'return'.
349+
350+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
351+
╭─[no_else_return.tsx:1:100]
352+
1function foo(a, b = a) { if (bar) { return true; } else { let a; } if (bar) { return true; } else { let b; }}
353+
· ──────────
354+
╰────
355+
help: Unnecessary 'else' after 'return'.
356+
357+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
358+
╭─[no_else_return.tsx:1:56]
359+
1function foo(...args) { if (bar) { return true; } else { let args; } }
360+
· ─────────────
361+
╰────
362+
help: Unnecessary 'else' after 'return'.
363+
364+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
365+
╭─[no_else_return.tsx:1:68]
366+
1function foo() { try {} catch (a) { if (bar) { return true; } else { let a; } } }
367+
· ──────────
368+
╰────
369+
help: Unnecessary 'else' after 'return'.
370+
371+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
372+
╭─[no_else_return.tsx:1:79]
373+
1function foo() { try {} catch (a) { if (bar) { if (baz) { return true; } else { let a; } } } }
374+
· ──────────
375+
╰────
376+
help: Unnecessary 'else' after 'return'.
377+
378+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
379+
╭─[no_else_return.tsx:1:79]
380+
1function foo() { try {} catch ({bar, a = 1}) { if (baz) { return true; } else { let a; } } }
381+
· ──────────
382+
╰────
383+
help: Unnecessary 'else' after 'return'.
384+
385+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
386+
╭─[no_else_return.tsx:1:49]
387+
1function foo() { if (bar) { return true; } else { let arguments; } }
388+
· ──────────────────
389+
╰────
390+
help: Unnecessary 'else' after 'return'.
391+
392+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
393+
╭─[no_else_return.tsx:1:49]
394+
1function foo() { if (bar) { return true; } else { let arguments; } return arguments[0]; }
395+
· ──────────────────
396+
╰────
397+
help: Unnecessary 'else' after 'return'.
398+
399+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
400+
╭─[no_else_return.tsx:1:49]
401+
1function foo() { if (bar) { return true; } else { let arguments; } if (baz) { return arguments[0]; } }
402+
· ──────────────────
403+
╰────
404+
help: Unnecessary 'else' after 'return'.
405+
406+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
407+
╭─[no_else_return.tsx:1:60]
408+
1function foo() { if (bar) { if (baz) { return true; } else { let arguments; } } }
409+
· ──────────────────
410+
╰────
411+
help: Unnecessary 'else' after 'return'.
412+
413+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
414+
╭─[no_else_return.tsx:1:49]
415+
1function foo() { if (bar) { return true; } else { let a; } a; }
416+
· ──────────
417+
╰────
418+
help: Unnecessary 'else' after 'return'.
419+
420+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
421+
╭─[no_else_return.tsx:1:49]
422+
1function foo() { if (bar) { return true; } else { let a; } if (baz) { a; } }
423+
· ──────────
424+
╰────
425+
help: Unnecessary 'else' after 'return'.
426+
427+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
428+
╭─[no_else_return.tsx:1:60]
429+
1function foo() { if (bar) { if (baz) { return true; } else { let a; } } a; }
430+
· ──────────
431+
╰────
432+
help: Unnecessary 'else' after 'return'.
433+
434+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
435+
╭─[no_else_return.tsx:1:60]
436+
1function foo() { if (bar) { if (baz) { return true; } else { let a; } a; } }
437+
· ──────────
438+
╰────
439+
help: Unnecessary 'else' after 'return'.
440+
441+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
442+
╭─[no_else_return.tsx:1:60]
443+
1function foo() { if (bar) { if (baz) { return true; } else { let a; } if (quux) { a; } } }
444+
· ──────────
445+
╰────
446+
help: Unnecessary 'else' after 'return'.
447+
448+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
449+
╭─[no_else_return.tsx:1:47]
450+
1function a() { if (foo) { return true; } else { let a; } a(); }
451+
· ──────────
452+
╰────
453+
help: Unnecessary 'else' after 'return'.
454+
455+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
456+
╭─[no_else_return.tsx:1:45]
457+
1function a() { if (a) { return true; } else { let a; } }
458+
· ──────────
459+
╰────
460+
help: Unnecessary 'else' after 'return'.
461+
462+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
463+
╭─[no_else_return.tsx:1:44]
464+
1function a() { if (foo) { return a; } else { let a; } }
465+
· ──────────
466+
╰────
467+
help: Unnecessary 'else' after 'return'.
468+
469+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
470+
╭─[no_else_return.tsx:1:49]
471+
1function foo() { if (bar) { return true; } else { let a; } function baz() { a; } }
472+
· ──────────
473+
╰────
474+
help: Unnecessary 'else' after 'return'.
475+
476+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
477+
╭─[no_else_return.tsx:1:60]
478+
1function foo() { if (bar) { if (baz) { return true; } else { let a; } (() => a) } }
479+
· ──────────
480+
╰────
481+
help: Unnecessary 'else' after 'return'.
482+
483+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
484+
╭─[no_else_return.tsx:1:49]
485+
1function foo() { if (bar) { return true; } else { let a; } var a; }
486+
· ──────────
487+
╰────
488+
help: Unnecessary 'else' after 'return'.
489+
490+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
491+
╭─[no_else_return.tsx:1:60]
492+
1function foo() { if (bar) { if (baz) { return true; } else { let a; } var a; } }
493+
· ──────────
494+
╰────
495+
help: Unnecessary 'else' after 'return'.
496+
497+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
498+
╭─[no_else_return.tsx:1:60]
499+
1function foo() { if (bar) { if (baz) { return true; } else { let a; } var { a } = {}; } }
500+
· ──────────
501+
╰────
502+
help: Unnecessary 'else' after 'return'.
503+
504+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
505+
╭─[no_else_return.tsx:1:60]
506+
1function foo() { if (bar) { if (baz) { return true; } else { let a; } if (quux) { var a; } } }
507+
· ──────────
508+
╰────
509+
help: Unnecessary 'else' after 'return'.
510+
511+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
512+
╭─[no_else_return.tsx:1:60]
513+
1function foo() { if (bar) { if (baz) { return true; } else { let a; } } if (quux) { var a; } }
514+
· ──────────
515+
╰────
516+
help: Unnecessary 'else' after 'return'.
517+
518+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
519+
╭─[no_else_return.tsx:1:81]
520+
1function foo() { if (quux) { var a; } if (bar) { if (baz) { return true; } else { let a; } } }
521+
· ──────────
522+
╰────
523+
help: Unnecessary 'else' after 'return'.
524+
525+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
526+
╭─[no_else_return.tsx:1:49]
527+
1function foo() { if (bar) { return true; } else { let a; } function a(){} }
528+
· ──────────
529+
╰────
530+
help: Unnecessary 'else' after 'return'.
531+
532+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
533+
╭─[no_else_return.tsx:1:60]
534+
1function foo() { if (baz) { if (bar) { return true; } else { let a; } function a(){} } }
535+
· ──────────
536+
╰────
537+
help: Unnecessary 'else' after 'return'.
538+
539+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
540+
╭─[no_else_return.tsx:1:60]
541+
1function foo() { if (bar) { if (baz) { return true; } else { let a; } } if (quux) { function a(){} } }
542+
· ──────────
543+
╰────
544+
help: Unnecessary 'else' after 'return'.
545+
546+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
547+
╭─[no_else_return.tsx:1:60]
548+
1function foo() { if (bar) { if (baz) { return true; } else { let a; } } function a(){} }
549+
· ──────────
550+
╰────
551+
help: Unnecessary 'else' after 'return'.
552+
553+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
554+
╭─[no_else_return.tsx:1:56]
555+
1function foo() { let a; if (bar) { return true; } else { function a(){} } }
556+
· ──────────────────
557+
╰────
558+
help: Unnecessary 'else' after 'return'.
559+
560+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
561+
╭─[no_else_return.tsx:1:56]
562+
1function foo() { var a; if (bar) { return true; } else { function a(){} } }
563+
· ──────────────────
564+
╰────
565+
help: Unnecessary 'else' after 'return'.
566+
567+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
568+
╭─[no_else_return.tsx:1:49]
569+
1function foo() { if (bar) { return true; } else function baz() {} };
570+
· ─────────────────
571+
╰────
572+
help: Unnecessary 'else' after 'return'.
573+
574+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
575+
╭─[no_else_return.tsx:1:32]
576+
1if (foo) { return true; } else { let a; }
577+
· ──────────
578+
╰────
579+
help: Unnecessary 'else' after 'return'.
580+
581+
eslint(no-else-return): Disallow `else` blocks after `return` statements in `if` statements
582+
╭─[no_else_return.tsx:1:39]
583+
1let a; if (foo) { return true; } else { let a; }
584+
· ──────────
585+
╰────
586+
help: Unnecessary 'else' after 'return'.

0 commit comments

Comments
 (0)
Please sign in to comment.