[flake8-return] - Add fixes for (RET505, RET506, RET507, RET508) (#9595)

This commit is contained in:
Steve C 2024-01-25 02:28:32 -05:00 committed by GitHub
parent dba2cb79cb
commit ffd13e65ae
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 1027 additions and 7 deletions

View file

@ -131,6 +131,37 @@ def bar3(x, y, z):
return None
def bar4(x):
if True:
return
else:
# comment
pass
def bar5():
if True:
return
else: # comment
pass
def bar6():
if True:
return
else\
:\
# comment
pass
def bar7():
if True:
return
else\
: # comment
pass
x = 0
if x == 1:

View file

@ -11,10 +11,11 @@ mod tests {
use anyhow::Result;
use test_case::test_case;
use crate::assert_messages;
use crate::registry::Rule;
use crate::settings::types::PreviewMode;
use crate::settings::LinterSettings;
use crate::test::test_path;
use crate::{assert_messages, settings};
#[test_case(Rule::UnnecessaryReturnNone, Path::new("RET501.py"))]
#[test_case(Rule::ImplicitReturnValue, Path::new("RET502.py"))]
@ -33,4 +34,25 @@ mod tests {
assert_messages!(snapshot, diagnostics);
Ok(())
}
#[test_case(Rule::SuperfluousElseReturn, Path::new("RET505.py"))]
#[test_case(Rule::SuperfluousElseRaise, Path::new("RET506.py"))]
#[test_case(Rule::SuperfluousElseContinue, Path::new("RET507.py"))]
#[test_case(Rule::SuperfluousElseBreak, Path::new("RET508.py"))]
fn preview_rules(rule_code: Rule, path: &Path) -> Result<()> {
let snapshot = format!(
"preview__{}_{}",
rule_code.noqa_code(),
path.to_string_lossy()
);
let diagnostics = test_path(
Path::new("flake8_return").join(path).as_path(),
&settings::LinterSettings {
preview: PreviewMode::Enabled,
..settings::LinterSettings::for_rule(rule_code)
},
)?;
assert_messages!(snapshot, diagnostics);
Ok(())
}
}

View file

@ -1,9 +1,10 @@
use anyhow::Result;
use std::ops::Add;
use ruff_python_ast::{self as ast, ElifElseClause, Expr, Stmt};
use ruff_text_size::{Ranged, TextRange, TextSize};
use ruff_diagnostics::{AlwaysFixableViolation, Violation};
use ruff_diagnostics::{AlwaysFixableViolation, FixAvailability, Violation};
use ruff_diagnostics::{Diagnostic, Edit, Fix};
use ruff_macros::{derive_message_formats, violation};
@ -12,12 +13,13 @@ use ruff_python_ast::stmt_if::elif_else_range;
use ruff_python_ast::visitor::Visitor;
use ruff_python_ast::whitespace::indentation;
use ruff_python_semantic::SemanticModel;
use ruff_python_trivia::is_python_whitespace;
use ruff_python_trivia::{is_python_whitespace, SimpleTokenKind, SimpleTokenizer};
use crate::checkers::ast::Checker;
use crate::fix::edits;
use crate::registry::{AsRule, Rule};
use crate::rules::flake8_return::helpers::end_of_last_statement;
use crate::rules::pyupgrade::fixes::adjust_indentation;
use super::super::branch::Branch;
use super::super::helpers::result_exists;
@ -210,11 +212,17 @@ pub struct SuperfluousElseReturn {
}
impl Violation for SuperfluousElseReturn {
const FIX_AVAILABILITY: FixAvailability = FixAvailability::Sometimes;
#[derive_message_formats]
fn message(&self) -> String {
let SuperfluousElseReturn { branch } = self;
format!("Unnecessary `{branch}` after `return` statement")
}
fn fix_title(&self) -> Option<String> {
let SuperfluousElseReturn { branch } = self;
Some(format!("Remove unnecessary `{branch}`"))
}
}
/// ## What it does
@ -248,11 +256,17 @@ pub struct SuperfluousElseRaise {
}
impl Violation for SuperfluousElseRaise {
const FIX_AVAILABILITY: FixAvailability = FixAvailability::Sometimes;
#[derive_message_formats]
fn message(&self) -> String {
let SuperfluousElseRaise { branch } = self;
format!("Unnecessary `{branch}` after `raise` statement")
}
fn fix_title(&self) -> Option<String> {
let SuperfluousElseRaise { branch } = self;
Some(format!("Remove unnecessary `{branch}`"))
}
}
/// ## What it does
@ -288,11 +302,17 @@ pub struct SuperfluousElseContinue {
}
impl Violation for SuperfluousElseContinue {
const FIX_AVAILABILITY: FixAvailability = FixAvailability::Sometimes;
#[derive_message_formats]
fn message(&self) -> String {
let SuperfluousElseContinue { branch } = self;
format!("Unnecessary `{branch}` after `continue` statement")
}
fn fix_title(&self) -> Option<String> {
let SuperfluousElseContinue { branch } = self;
Some(format!("Remove unnecessary `{branch}`"))
}
}
/// ## What it does
@ -328,11 +348,17 @@ pub struct SuperfluousElseBreak {
}
impl Violation for SuperfluousElseBreak {
const FIX_AVAILABILITY: FixAvailability = FixAvailability::Sometimes;
#[derive_message_formats]
fn message(&self) -> String {
let SuperfluousElseBreak { branch } = self;
format!("Unnecessary `{branch}` after `break` statement")
}
fn fix_title(&self) -> Option<String> {
let SuperfluousElseBreak { branch } = self;
Some(format!("Remove unnecessary `{branch}`"))
}
}
/// RET501
@ -602,42 +628,54 @@ fn superfluous_else_node(
};
for child in if_elif_body {
if child.is_return_stmt() {
let diagnostic = Diagnostic::new(
let mut diagnostic = Diagnostic::new(
SuperfluousElseReturn { branch },
elif_else_range(elif_else, checker.locator().contents())
.unwrap_or_else(|| elif_else.range()),
);
if checker.enabled(diagnostic.kind.rule()) {
if checker.settings.preview.is_enabled() {
diagnostic.try_set_fix(|| remove_else(checker, elif_else));
}
checker.diagnostics.push(diagnostic);
}
return true;
} else if child.is_break_stmt() {
let diagnostic = Diagnostic::new(
let mut diagnostic = Diagnostic::new(
SuperfluousElseBreak { branch },
elif_else_range(elif_else, checker.locator().contents())
.unwrap_or_else(|| elif_else.range()),
);
if checker.enabled(diagnostic.kind.rule()) {
if checker.settings.preview.is_enabled() {
diagnostic.try_set_fix(|| remove_else(checker, elif_else));
}
checker.diagnostics.push(diagnostic);
}
return true;
} else if child.is_raise_stmt() {
let diagnostic = Diagnostic::new(
let mut diagnostic = Diagnostic::new(
SuperfluousElseRaise { branch },
elif_else_range(elif_else, checker.locator().contents())
.unwrap_or_else(|| elif_else.range()),
);
if checker.enabled(diagnostic.kind.rule()) {
if checker.settings.preview.is_enabled() {
diagnostic.try_set_fix(|| remove_else(checker, elif_else));
}
checker.diagnostics.push(diagnostic);
}
return true;
} else if child.is_continue_stmt() {
let diagnostic = Diagnostic::new(
let mut diagnostic = Diagnostic::new(
SuperfluousElseContinue { branch },
elif_else_range(elif_else, checker.locator().contents())
.unwrap_or_else(|| elif_else.range()),
);
if checker.enabled(diagnostic.kind.rule()) {
if checker.settings.preview.is_enabled() {
diagnostic.try_set_fix(|| remove_else(checker, elif_else));
}
checker.diagnostics.push(diagnostic);
}
return true;
@ -715,3 +753,67 @@ pub(crate) fn function(checker: &mut Checker, body: &[Stmt], returns: Option<&Ex
}
}
}
fn remove_else(checker: &mut Checker, elif_else: &ElifElseClause) -> Result<Fix> {
if elif_else.test.is_some() {
// it's an elif, so we can just make it an if
// delete "el" from "elif"
Ok(Fix::safe_edit(Edit::deletion(
elif_else.start(),
elif_else.start() + TextSize::from(2),
)))
} else {
// the start of the line where the `else`` is
let else_line_start = checker.locator().line_start(elif_else.start());
// making a tokenizer to find the Colon for the `else`, not always on the same line!
let mut else_line_tokenizer =
SimpleTokenizer::starts_at(elif_else.start(), checker.locator().contents());
// find the Colon for the `else`
let Some(else_colon) =
else_line_tokenizer.find(|token| token.kind == SimpleTokenKind::Colon)
else {
return Err(anyhow::anyhow!("Cannot find `:` in `else` statement"));
};
// get the indentation of the `else`, since that is the indent level we want to end with
let Some(desired_indentation) = indentation(checker.locator(), elif_else) else {
return Err(anyhow::anyhow!("Compound statement cannot be inlined"));
};
// we're deleting the `else`, and it's Colon, and the rest of the line(s) they're on,
// so here we get the last position of the line the Colon is on
let else_colon_end = checker.locator().full_line_end(else_colon.end());
// if there is a comment on the same line as the Colon, let's keep it
// and give it the proper indentation once we unindent it
let else_comment_after_colon = else_line_tokenizer
.find(|token| token.kind.is_comment())
.and_then(|token| {
if token.kind == SimpleTokenKind::Comment && token.start() < else_colon_end {
return Some(format!(
"{desired_indentation}{}{}",
checker.locator().slice(token),
checker.stylist().line_ending().as_str(),
));
}
None
})
.unwrap_or(String::new());
let indented = adjust_indentation(
TextRange::new(else_colon_end, elif_else.end()),
desired_indentation,
checker.locator(),
checker.stylist(),
)?;
Ok(Fix::safe_edit(Edit::replacement(
format!("{else_comment_after_colon}{indented}"),
else_line_start,
elif_else.end(),
)))
}
}

View file

@ -10,6 +10,7 @@ RET505.py:8:5: RET505 Unnecessary `elif` after `return` statement
9 | b = 2
10 | return w
|
= help: Remove unnecessary `elif`
RET505.py:23:5: RET505 Unnecessary `elif` after `return` statement
|
@ -20,6 +21,7 @@ RET505.py:23:5: RET505 Unnecessary `elif` after `return` statement
24 | c = 2
25 | else:
|
= help: Remove unnecessary `elif`
RET505.py:41:5: RET505 Unnecessary `elif` after `return` statement
|
@ -30,6 +32,7 @@ RET505.py:41:5: RET505 Unnecessary `elif` after `return` statement
42 | b = 2
43 | return w
|
= help: Remove unnecessary `elif`
RET505.py:53:5: RET505 Unnecessary `else` after `return` statement
|
@ -40,6 +43,7 @@ RET505.py:53:5: RET505 Unnecessary `else` after `return` statement
54 | b = 2
55 | return z
|
= help: Remove unnecessary `else`
RET505.py:64:9: RET505 Unnecessary `else` after `return` statement
|
@ -50,6 +54,7 @@ RET505.py:64:9: RET505 Unnecessary `else` after `return` statement
65 | c = 3
66 | return x
|
= help: Remove unnecessary `else`
RET505.py:79:5: RET505 Unnecessary `else` after `return` statement
|
@ -60,6 +65,7 @@ RET505.py:79:5: RET505 Unnecessary `else` after `return` statement
80 | c = 3
81 | return
|
= help: Remove unnecessary `else`
RET505.py:89:9: RET505 Unnecessary `else` after `return` statement
|
@ -70,6 +76,7 @@ RET505.py:89:9: RET505 Unnecessary `else` after `return` statement
90 | b = 2
91 | else:
|
= help: Remove unnecessary `else`
RET505.py:99:5: RET505 Unnecessary `else` after `return` statement
|
@ -80,5 +87,49 @@ RET505.py:99:5: RET505 Unnecessary `else` after `return` statement
100 | try:
101 | return False
|
= help: Remove unnecessary `else`
RET505.py:137:5: RET505 Unnecessary `else` after `return` statement
|
135 | if True:
136 | return
137 | else:
| ^^^^ RET505
138 | # comment
139 | pass
|
= help: Remove unnecessary `else`
RET505.py:145:5: RET505 Unnecessary `else` after `return` statement
|
143 | if True:
144 | return
145 | else: # comment
| ^^^^ RET505
146 | pass
|
= help: Remove unnecessary `else`
RET505.py:152:5: RET505 Unnecessary `else` after `return` statement
|
150 | if True:
151 | return
152 | else\
| ^^^^ RET505
153 | :\
154 | # comment
|
= help: Remove unnecessary `else`
RET505.py:161:5: RET505 Unnecessary `else` after `return` statement
|
159 | if True:
160 | return
161 | else\
| ^^^^ RET505
162 | : # comment
163 | pass
|
= help: Remove unnecessary `else`

View file

@ -10,6 +10,7 @@ RET506.py:8:5: RET506 Unnecessary `elif` after `raise` statement
9 | b = 2
10 | raise Exception(w)
|
= help: Remove unnecessary `elif`
RET506.py:23:5: RET506 Unnecessary `elif` after `raise` statement
|
@ -20,6 +21,7 @@ RET506.py:23:5: RET506 Unnecessary `elif` after `raise` statement
24 | raise Exception(y)
25 | else:
|
= help: Remove unnecessary `elif`
RET506.py:34:5: RET506 Unnecessary `else` after `raise` statement
|
@ -30,6 +32,7 @@ RET506.py:34:5: RET506 Unnecessary `else` after `raise` statement
35 | b = 2
36 | raise Exception(z)
|
= help: Remove unnecessary `else`
RET506.py:45:9: RET506 Unnecessary `else` after `raise` statement
|
@ -40,6 +43,7 @@ RET506.py:45:9: RET506 Unnecessary `else` after `raise` statement
46 | c = 3
47 | raise Exception(x)
|
= help: Remove unnecessary `else`
RET506.py:60:5: RET506 Unnecessary `else` after `raise` statement
|
@ -50,6 +54,7 @@ RET506.py:60:5: RET506 Unnecessary `else` after `raise` statement
61 | c = 3
62 | raise Exception(y)
|
= help: Remove unnecessary `else`
RET506.py:70:9: RET506 Unnecessary `else` after `raise` statement
|
@ -60,6 +65,7 @@ RET506.py:70:9: RET506 Unnecessary `else` after `raise` statement
71 | b = 2
72 | else:
|
= help: Remove unnecessary `else`
RET506.py:80:5: RET506 Unnecessary `else` after `raise` statement
|
@ -70,5 +76,6 @@ RET506.py:80:5: RET506 Unnecessary `else` after `raise` statement
81 | try:
82 | raise Exception(False)
|
= help: Remove unnecessary `else`

View file

@ -10,6 +10,7 @@ RET507.py:8:9: RET507 Unnecessary `elif` after `continue` statement
9 | continue
10 | else:
|
= help: Remove unnecessary `elif`
RET507.py:22:9: RET507 Unnecessary `elif` after `continue` statement
|
@ -20,6 +21,7 @@ RET507.py:22:9: RET507 Unnecessary `elif` after `continue` statement
23 | c = 2
24 | else:
|
= help: Remove unnecessary `elif`
RET507.py:36:9: RET507 Unnecessary `else` after `continue` statement
|
@ -29,6 +31,7 @@ RET507.py:36:9: RET507 Unnecessary `else` after `continue` statement
| ^^^^ RET507
37 | a = z
|
= help: Remove unnecessary `else`
RET507.py:47:13: RET507 Unnecessary `else` after `continue` statement
|
@ -39,6 +42,7 @@ RET507.py:47:13: RET507 Unnecessary `else` after `continue` statement
48 | c = 3
49 | continue
|
= help: Remove unnecessary `else`
RET507.py:63:9: RET507 Unnecessary `else` after `continue` statement
|
@ -49,6 +53,7 @@ RET507.py:63:9: RET507 Unnecessary `else` after `continue` statement
64 | c = 3
65 | continue
|
= help: Remove unnecessary `else`
RET507.py:74:13: RET507 Unnecessary `else` after `continue` statement
|
@ -59,6 +64,7 @@ RET507.py:74:13: RET507 Unnecessary `else` after `continue` statement
75 | b = 2
76 | else:
|
= help: Remove unnecessary `else`
RET507.py:85:9: RET507 Unnecessary `else` after `continue` statement
|
@ -69,5 +75,6 @@ RET507.py:85:9: RET507 Unnecessary `else` after `continue` statement
86 | try:
87 | return
|
= help: Remove unnecessary `else`

View file

@ -10,6 +10,7 @@ RET508.py:8:9: RET508 Unnecessary `elif` after `break` statement
9 | break
10 | else:
|
= help: Remove unnecessary `elif`
RET508.py:22:9: RET508 Unnecessary `elif` after `break` statement
|
@ -20,6 +21,7 @@ RET508.py:22:9: RET508 Unnecessary `elif` after `break` statement
23 | c = 2
24 | else:
|
= help: Remove unnecessary `elif`
RET508.py:33:9: RET508 Unnecessary `else` after `break` statement
|
@ -29,6 +31,7 @@ RET508.py:33:9: RET508 Unnecessary `else` after `break` statement
| ^^^^ RET508
34 | a = z
|
= help: Remove unnecessary `else`
RET508.py:44:13: RET508 Unnecessary `else` after `break` statement
|
@ -39,6 +42,7 @@ RET508.py:44:13: RET508 Unnecessary `else` after `break` statement
45 | c = 3
46 | break
|
= help: Remove unnecessary `else`
RET508.py:60:9: RET508 Unnecessary `else` after `break` statement
|
@ -49,6 +53,7 @@ RET508.py:60:9: RET508 Unnecessary `else` after `break` statement
61 | c = 3
62 | break
|
= help: Remove unnecessary `else`
RET508.py:71:13: RET508 Unnecessary `else` after `break` statement
|
@ -59,6 +64,7 @@ RET508.py:71:13: RET508 Unnecessary `else` after `break` statement
72 | b = 2
73 | else:
|
= help: Remove unnecessary `else`
RET508.py:82:9: RET508 Unnecessary `else` after `break` statement
|
@ -69,6 +75,7 @@ RET508.py:82:9: RET508 Unnecessary `else` after `break` statement
83 | try:
84 | return
|
= help: Remove unnecessary `else`
RET508.py:158:13: RET508 Unnecessary `else` after `break` statement
|
@ -78,5 +85,6 @@ RET508.py:158:13: RET508 Unnecessary `else` after `break` statement
| ^^^^ RET508
159 | a = z
|
= help: Remove unnecessary `else`

View file

@ -0,0 +1,282 @@
---
source: crates/ruff_linter/src/rules/flake8_return/mod.rs
---
RET505.py:8:5: RET505 [*] Unnecessary `elif` after `return` statement
|
6 | a = 1
7 | return y
8 | elif z:
| ^^^^ RET505
9 | b = 2
10 | return w
|
= help: Remove unnecessary `elif`
Safe fix
5 5 | if x: # [no-else-return]
6 6 | a = 1
7 7 | return y
8 |- elif z:
8 |+ if z:
9 9 | b = 2
10 10 | return w
11 11 | else:
RET505.py:23:5: RET505 [*] Unnecessary `elif` after `return` statement
|
21 | b = 2
22 | return
23 | elif z:
| ^^^^ RET505
24 | c = 2
25 | else:
|
= help: Remove unnecessary `elif`
Safe fix
20 20 | else:
21 21 | b = 2
22 22 | return
23 |- elif z:
23 |+ if z:
24 24 | c = 2
25 25 | else:
26 26 | c = 3
RET505.py:41:5: RET505 [*] Unnecessary `elif` after `return` statement
|
39 | a = 1
40 | return y
41 | elif z:
| ^^^^ RET505
42 | b = 2
43 | return w
|
= help: Remove unnecessary `elif`
Safe fix
38 38 | if x: # [no-else-return]
39 39 | a = 1
40 40 | return y
41 |- elif z:
41 |+ if z:
42 42 | b = 2
43 43 | return w
44 44 | else:
RET505.py:53:5: RET505 [*] Unnecessary `else` after `return` statement
|
51 | a = 1
52 | return y
53 | else:
| ^^^^ RET505
54 | b = 2
55 | return z
|
= help: Remove unnecessary `else`
Safe fix
50 50 | if x: # [no-else-return]
51 51 | a = 1
52 52 | return y
53 |- else:
54 |- b = 2
55 |- return z
53 |+ b = 2
54 |+ return z
56 55 |
57 56 |
58 57 | def foo3(x, y, z):
RET505.py:64:9: RET505 [*] Unnecessary `else` after `return` statement
|
62 | b = 2
63 | return y
64 | else:
| ^^^^ RET505
65 | c = 3
66 | return x
|
= help: Remove unnecessary `else`
Safe fix
61 61 | if y: # [no-else-return]
62 62 | b = 2
63 63 | return y
64 |- else:
65 |- c = 3
66 |- return x
64 |+ c = 3
65 |+ return x
67 66 | else:
68 67 | d = 4
69 68 | return z
RET505.py:79:5: RET505 [*] Unnecessary `else` after `return` statement
|
77 | b = 2
78 | return
79 | else:
| ^^^^ RET505
80 | c = 3
81 | return
|
= help: Remove unnecessary `else`
Safe fix
76 76 | else:
77 77 | b = 2
78 78 | return
79 |- else:
80 |- c = 3
79 |+ c = 3
81 80 | return
82 81 |
83 82 |
RET505.py:89:9: RET505 [*] Unnecessary `else` after `return` statement
|
87 | a = 4
88 | return
89 | else:
| ^^^^ RET505
90 | b = 2
91 | else:
|
= help: Remove unnecessary `else`
Safe fix
86 86 | if y: # [no-else-return]
87 87 | a = 4
88 88 | return
89 |- else:
90 |- b = 2
89 |+ b = 2
91 90 | else:
92 91 | c = 3
93 92 | return
RET505.py:99:5: RET505 [*] Unnecessary `else` after `return` statement
|
97 | if x: # [no-else-return]
98 | return True
99 | else:
| ^^^^ RET505
100 | try:
101 | return False
|
= help: Remove unnecessary `else`
Safe fix
96 96 | def bar4(x):
97 97 | if x: # [no-else-return]
98 98 | return True
99 |- else:
100 |- try:
101 |- return False
102 |- except ValueError:
103 |- return None
99 |+ try:
100 |+ return False
101 |+ except ValueError:
102 |+ return None
104 103 |
105 104 |
106 105 | ###
RET505.py:137:5: RET505 [*] Unnecessary `else` after `return` statement
|
135 | if True:
136 | return
137 | else:
| ^^^^ RET505
138 | # comment
139 | pass
|
= help: Remove unnecessary `else`
Safe fix
134 134 | def bar4(x):
135 135 | if True:
136 136 | return
137 |- else:
138 |- # comment
139 |- pass
137 |+ # comment
138 |+ pass
140 139 |
141 140 |
142 141 | def bar5():
RET505.py:145:5: RET505 [*] Unnecessary `else` after `return` statement
|
143 | if True:
144 | return
145 | else: # comment
| ^^^^ RET505
146 | pass
|
= help: Remove unnecessary `else`
Safe fix
142 142 | def bar5():
143 143 | if True:
144 144 | return
145 |- else: # comment
146 |- pass
145 |+ # comment
146 |+ pass
147 147 |
148 148 |
149 149 | def bar6():
RET505.py:152:5: RET505 [*] Unnecessary `else` after `return` statement
|
150 | if True:
151 | return
152 | else\
| ^^^^ RET505
153 | :\
154 | # comment
|
= help: Remove unnecessary `else`
Safe fix
149 149 | def bar6():
150 150 | if True:
151 151 | return
152 |- else\
153 |- :\
154 |- # comment
155 |- pass
152 |+ # comment
153 |+ pass
156 154 |
157 155 |
158 156 | def bar7():
RET505.py:161:5: RET505 [*] Unnecessary `else` after `return` statement
|
159 | if True:
160 | return
161 | else\
| ^^^^ RET505
162 | : # comment
163 | pass
|
= help: Remove unnecessary `else`
Safe fix
158 158 | def bar7():
159 159 | if True:
160 160 | return
161 |- else\
162 |- : # comment
163 |- pass
161 |+ # comment
162 |+ pass
164 163 |
165 164 | x = 0
166 165 |

View file

@ -0,0 +1,166 @@
---
source: crates/ruff_linter/src/rules/flake8_return/mod.rs
---
RET506.py:8:5: RET506 [*] Unnecessary `elif` after `raise` statement
|
6 | a = 1
7 | raise Exception(y)
8 | elif z:
| ^^^^ RET506
9 | b = 2
10 | raise Exception(w)
|
= help: Remove unnecessary `elif`
Safe fix
5 5 | if x: # [no-else-raise]
6 6 | a = 1
7 7 | raise Exception(y)
8 |- elif z:
8 |+ if z:
9 9 | b = 2
10 10 | raise Exception(w)
11 11 | else:
RET506.py:23:5: RET506 [*] Unnecessary `elif` after `raise` statement
|
21 | b = 2
22 | raise Exception(x)
23 | elif z:
| ^^^^ RET506
24 | raise Exception(y)
25 | else:
|
= help: Remove unnecessary `elif`
Safe fix
20 20 | else:
21 21 | b = 2
22 22 | raise Exception(x)
23 |- elif z:
23 |+ if z:
24 24 | raise Exception(y)
25 25 | else:
26 26 | c = 3
RET506.py:34:5: RET506 [*] Unnecessary `else` after `raise` statement
|
32 | a = 1
33 | raise Exception(y)
34 | else:
| ^^^^ RET506
35 | b = 2
36 | raise Exception(z)
|
= help: Remove unnecessary `else`
Safe fix
31 31 | if x: # [no-else-raise]
32 32 | a = 1
33 33 | raise Exception(y)
34 |- else:
35 |- b = 2
36 |- raise Exception(z)
34 |+ b = 2
35 |+ raise Exception(z)
37 36 |
38 37 |
39 38 | def foo3(x, y, z):
RET506.py:45:9: RET506 [*] Unnecessary `else` after `raise` statement
|
43 | b = 2
44 | raise Exception(y)
45 | else:
| ^^^^ RET506
46 | c = 3
47 | raise Exception(x)
|
= help: Remove unnecessary `else`
Safe fix
42 42 | if y: # [no-else-raise]
43 43 | b = 2
44 44 | raise Exception(y)
45 |- else:
46 |- c = 3
47 |- raise Exception(x)
45 |+ c = 3
46 |+ raise Exception(x)
48 47 | else:
49 48 | d = 4
50 49 | raise Exception(z)
RET506.py:60:5: RET506 [*] Unnecessary `else` after `raise` statement
|
58 | b = 2
59 | raise Exception(x)
60 | else:
| ^^^^ RET506
61 | c = 3
62 | raise Exception(y)
|
= help: Remove unnecessary `else`
Safe fix
57 57 | else:
58 58 | b = 2
59 59 | raise Exception(x)
60 |- else:
61 |- c = 3
60 |+ c = 3
62 61 | raise Exception(y)
63 62 |
64 63 |
RET506.py:70:9: RET506 [*] Unnecessary `else` after `raise` statement
|
68 | a = 4
69 | raise Exception(x)
70 | else:
| ^^^^ RET506
71 | b = 2
72 | else:
|
= help: Remove unnecessary `else`
Safe fix
67 67 | if y: # [no-else-raise]
68 68 | a = 4
69 69 | raise Exception(x)
70 |- else:
71 |- b = 2
70 |+ b = 2
72 71 | else:
73 72 | c = 3
74 73 | raise Exception(y)
RET506.py:80:5: RET506 [*] Unnecessary `else` after `raise` statement
|
78 | if x: # [no-else-raise]
79 | raise Exception(True)
80 | else:
| ^^^^ RET506
81 | try:
82 | raise Exception(False)
|
= help: Remove unnecessary `else`
Safe fix
77 77 | def bar4(x):
78 78 | if x: # [no-else-raise]
79 79 | raise Exception(True)
80 |- else:
81 |- try:
82 |- raise Exception(False)
83 |- except ValueError:
84 |- raise Exception(None)
80 |+ try:
81 |+ raise Exception(False)
82 |+ except ValueError:
83 |+ raise Exception(None)
85 84 |
86 85 |
87 86 | ###

View file

@ -0,0 +1,163 @@
---
source: crates/ruff_linter/src/rules/flake8_return/mod.rs
---
RET507.py:8:9: RET507 [*] Unnecessary `elif` after `continue` statement
|
6 | if i < y: # [no-else-continue]
7 | continue
8 | elif i < w:
| ^^^^ RET507
9 | continue
10 | else:
|
= help: Remove unnecessary `elif`
Safe fix
5 5 | for i in x:
6 6 | if i < y: # [no-else-continue]
7 7 | continue
8 |- elif i < w:
8 |+ if i < w:
9 9 | continue
10 10 | else:
11 11 | a = z
RET507.py:22:9: RET507 [*] Unnecessary `elif` after `continue` statement
|
20 | b = 2
21 | continue
22 | elif z:
| ^^^^ RET507
23 | c = 2
24 | else:
|
= help: Remove unnecessary `elif`
Safe fix
19 19 | else:
20 20 | b = 2
21 21 | continue
22 |- elif z:
22 |+ if z:
23 23 | c = 2
24 24 | else:
25 25 | c = 3
RET507.py:36:9: RET507 [*] Unnecessary `else` after `continue` statement
|
34 | if i < y: # [no-else-continue]
35 | continue
36 | else:
| ^^^^ RET507
37 | a = z
|
= help: Remove unnecessary `else`
Safe fix
33 33 | for i in x:
34 34 | if i < y: # [no-else-continue]
35 35 | continue
36 |- else:
37 |- a = z
36 |+ a = z
38 37 |
39 38 |
40 39 | def foo3(x, y, z):
RET507.py:47:13: RET507 [*] Unnecessary `else` after `continue` statement
|
45 | b = 2
46 | continue
47 | else:
| ^^^^ RET507
48 | c = 3
49 | continue
|
= help: Remove unnecessary `else`
Safe fix
44 44 | if z: # [no-else-continue]
45 45 | b = 2
46 46 | continue
47 |- else:
48 |- c = 3
49 |- continue
47 |+ c = 3
48 |+ continue
50 49 | else:
51 50 | d = 4
52 51 | continue
RET507.py:63:9: RET507 [*] Unnecessary `else` after `continue` statement
|
61 | b = 2
62 | continue
63 | else:
| ^^^^ RET507
64 | c = 3
65 | continue
|
= help: Remove unnecessary `else`
Safe fix
60 60 | else:
61 61 | b = 2
62 62 | continue
63 |- else:
64 |- c = 3
63 |+ c = 3
65 64 | continue
66 65 |
67 66 |
RET507.py:74:13: RET507 [*] Unnecessary `else` after `continue` statement
|
72 | a = 4
73 | continue
74 | else:
| ^^^^ RET507
75 | b = 2
76 | else:
|
= help: Remove unnecessary `else`
Safe fix
71 71 | if y: # [no-else-continue]
72 72 | a = 4
73 73 | continue
74 |- else:
75 |- b = 2
74 |+ b = 2
76 75 | else:
77 76 | c = 3
78 77 | continue
RET507.py:85:9: RET507 [*] Unnecessary `else` after `continue` statement
|
83 | if x: # [no-else-continue]
84 | continue
85 | else:
| ^^^^ RET507
86 | try:
87 | return
|
= help: Remove unnecessary `else`
Safe fix
82 82 | for i in range(10):
83 83 | if x: # [no-else-continue]
84 84 | continue
85 |- else:
86 |- try:
87 |- return
88 |- except ValueError:
89 |- continue
85 |+ try:
86 |+ return
87 |+ except ValueError:
88 |+ continue
90 89 |
91 90 |
92 91 | def bar1(x, y, z):

View file

@ -0,0 +1,181 @@
---
source: crates/ruff_linter/src/rules/flake8_return/mod.rs
---
RET508.py:8:9: RET508 [*] Unnecessary `elif` after `break` statement
|
6 | if i > y: # [no-else-break]
7 | break
8 | elif i > w:
| ^^^^ RET508
9 | break
10 | else:
|
= help: Remove unnecessary `elif`
Safe fix
5 5 | for i in x:
6 6 | if i > y: # [no-else-break]
7 7 | break
8 |- elif i > w:
8 |+ if i > w:
9 9 | break
10 10 | else:
11 11 | a = z
RET508.py:22:9: RET508 [*] Unnecessary `elif` after `break` statement
|
20 | b = 2
21 | break
22 | elif z:
| ^^^^ RET508
23 | c = 2
24 | else:
|
= help: Remove unnecessary `elif`
Safe fix
19 19 | else:
20 20 | b = 2
21 21 | break
22 |- elif z:
22 |+ if z:
23 23 | c = 2
24 24 | else:
25 25 | c = 3
RET508.py:33:9: RET508 [*] Unnecessary `else` after `break` statement
|
31 | if i > y: # [no-else-break]
32 | break
33 | else:
| ^^^^ RET508
34 | a = z
|
= help: Remove unnecessary `else`
Safe fix
30 30 | for i in x:
31 31 | if i > y: # [no-else-break]
32 32 | break
33 |- else:
34 |- a = z
33 |+ a = z
35 34 |
36 35 |
37 36 | def foo3(x, y, z):
RET508.py:44:13: RET508 [*] Unnecessary `else` after `break` statement
|
42 | b = 2
43 | break
44 | else:
| ^^^^ RET508
45 | c = 3
46 | break
|
= help: Remove unnecessary `else`
Safe fix
41 41 | if z: # [no-else-break]
42 42 | b = 2
43 43 | break
44 |- else:
45 |- c = 3
46 |- break
44 |+ c = 3
45 |+ break
47 46 | else:
48 47 | d = 4
49 48 | break
RET508.py:60:9: RET508 [*] Unnecessary `else` after `break` statement
|
58 | b = 2
59 | break
60 | else:
| ^^^^ RET508
61 | c = 3
62 | break
|
= help: Remove unnecessary `else`
Safe fix
57 57 | else:
58 58 | b = 2
59 59 | break
60 |- else:
61 |- c = 3
60 |+ c = 3
62 61 | break
63 62 |
64 63 |
RET508.py:71:13: RET508 [*] Unnecessary `else` after `break` statement
|
69 | a = 4
70 | break
71 | else:
| ^^^^ RET508
72 | b = 2
73 | else:
|
= help: Remove unnecessary `else`
Safe fix
68 68 | if y: # [no-else-break]
69 69 | a = 4
70 70 | break
71 |- else:
72 |- b = 2
71 |+ b = 2
73 72 | else:
74 73 | c = 3
75 74 | break
RET508.py:82:9: RET508 [*] Unnecessary `else` after `break` statement
|
80 | if x: # [no-else-break]
81 | break
82 | else:
| ^^^^ RET508
83 | try:
84 | return
|
= help: Remove unnecessary `else`
Safe fix
79 79 | for i in range(10):
80 80 | if x: # [no-else-break]
81 81 | break
82 |- else:
83 |- try:
84 |- return
85 |- except ValueError:
86 |- break
82 |+ try:
83 |+ return
84 |+ except ValueError:
85 |+ break
87 86 |
88 87 |
89 88 | ###
RET508.py:158:13: RET508 [*] Unnecessary `else` after `break` statement
|
156 | if i > w:
157 | break
158 | else:
| ^^^^ RET508
159 | a = z
|
= help: Remove unnecessary `else`
Safe fix
155 155 | else:
156 156 | if i > w:
157 157 | break
158 |- else:
159 |- a = z
158 |+ a = z