fix(linter): panic in no-else-return (#6648)

closes #6636
This commit is contained in:
dalaoshu 2024-10-18 08:30:55 +08:00 committed by GitHub
parent f4cdc56577
commit a66839752a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 19 additions and 2 deletions

View file

@ -263,8 +263,14 @@ fn left_offset_for_whitespace(ctx: &LintContext, position: u32) -> u32 {
return position;
}
let chars = ctx.source_text()[..(position as usize)].chars().rev();
let offset = chars.take_while(|c| c.is_whitespace()).count();
let mut offset = 0;
for c in ctx.source_text()[..(position as usize)].chars().rev() {
if !c.is_whitespace() {
break;
}
offset += c.len_utf8();
}
debug_assert!(offset < u32::MAX as usize);
offset as u32
}
@ -423,6 +429,7 @@ fn test() {
];
let fail = vec![
("if(0)return;else r", None),
("function foo1() { if (true) { return x; } else { return y; } }", None),
("function foo2() { if (true) { var x = bar; return x; } else { var y = baz; return y; } }", None),
("function foo3() { if (true) return x; else return y; }", None),
@ -514,6 +521,7 @@ fn test() {
];
let fix = vec![
("if(0)return;else r", "if(0)return; r", None),
("function foo1() { if (true) { return x; } else { return y; } }", "function foo1() { if (true) { return x; } return y; }", None),
("function foo1() { if(true){ return x; }else{ return y; } }", "function foo1() { if(true){ return x; } return y; }", None),
("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),

View file

@ -1,6 +1,15 @@
---
source: crates/oxc_linter/src/tester.rs
---
⚠ eslint(no-else-return): Unnecessary 'else' after 'return'.
╭─[no_else_return.tsx:1:6]
1 │ if(0)return;else r
· ───┬─────┬──
· │ ╰── Making this `else` block unnecessary.
· ╰── This consequent block always returns,
╰────
help: Remove the `else` block, moving its contents outside of the `if` statement.
⚠ eslint(no-else-return): Unnecessary 'else' after 'return'.
╭─[no_else_return.tsx:1:31]
1 │ function foo1() { if (true) { return x; } else { return y; } }