[flake8-simplify] Add fix for if-with-same-arms (SIM114) (#9591)

## Summary

 add fix for `if-with-same-arms` / `SIM114`

Also preserves comments!

## Test Plan

`cargo test`
This commit is contained in:
Steve C
2024-01-21 23:37:18 -05:00
committed by GitHub
parent 836e4406a5
commit 9c8a4d927e
6 changed files with 769 additions and 122 deletions

View File

@@ -4,6 +4,11 @@ if a:
elif c:
b
if a: # we preserve comments, too!
b
elif c: # but not on the second branch
b
if x == 1:
for _ in range(20):
print("hello")
@@ -63,6 +68,10 @@ elif result.eofs == "F":
errors = 1
elif result.eofs == "E":
errors = 1
elif result.eofs == "X":
errors = 1
elif result.eofs == "C":
errors = 1
# OK
@@ -70,7 +79,7 @@ def complicated_calc(*arg, **kwargs):
return 42
def foo(p):
def func(p):
if p == 2:
return complicated_calc(microsecond=0)
elif p == 3:
@@ -103,7 +112,7 @@ elif c:
x = 1
def foo():
def func():
a = True
b = False
if a > b: # end-of-line
@@ -114,3 +123,23 @@ def foo():
return 4
elif b is None:
return 4
def func():
"""Ensure that the named expression is parenthesized when merged."""
a = True
b = False
if a > b: # end-of-line
return 3
elif a := 1:
return 3
if a: # we preserve comments, too!
b
elif c: # but not on the second branch
b
if a: b # here's a comment
elif c: b

View File

@@ -1086,7 +1086,7 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) {
);
}
if checker.enabled(Rule::IfWithSameArms) {
flake8_simplify::rules::if_with_same_arms(checker, checker.locator, if_);
flake8_simplify::rules::if_with_same_arms(checker, if_);
}
if checker.enabled(Rule::NeedlessBool) {
flake8_simplify::rules::needless_bool(checker, if_);

View File

@@ -60,6 +60,7 @@ mod tests {
#[test_case(Rule::YodaConditions, Path::new("SIM300.py"))]
#[test_case(Rule::IfElseBlockInsteadOfDictGet, Path::new("SIM401.py"))]
#[test_case(Rule::DictGetWithNoneDefault, Path::new("SIM910.py"))]
#[test_case(Rule::IfWithSameArms, Path::new("SIM114.py"))]
fn preview_rules(rule_code: Rule, path: &Path) -> Result<()> {
let snapshot = format!(
"preview__{}_{}",

View File

@@ -1,8 +1,15 @@
use ruff_diagnostics::{Diagnostic, Violation};
use std::borrow::Cow;
use anyhow::Result;
use ruff_diagnostics::{Diagnostic, Edit, Fix, FixAvailability, Violation};
use ruff_macros::{derive_message_formats, violation};
use ruff_python_ast as ast;
use ruff_python_ast::comparable::ComparableStmt;
use ruff_python_ast::parenthesize::parenthesized_range;
use ruff_python_ast::stmt_if::{if_elif_branches, IfElifBranch};
use ruff_python_ast::{self as ast, Expr};
use ruff_python_index::Indexer;
use ruff_python_trivia::{SimpleTokenKind, SimpleTokenizer};
use ruff_source_file::Locator;
use ruff_text_size::{Ranged, TextRange};
@@ -32,14 +39,20 @@ use crate::checkers::ast::Checker;
pub struct IfWithSameArms;
impl Violation for IfWithSameArms {
const FIX_AVAILABILITY: FixAvailability = FixAvailability::Sometimes;
#[derive_message_formats]
fn message(&self) -> String {
format!("Combine `if` branches using logical `or` operator")
}
fn fix_title(&self) -> Option<String> {
Some("Combine `if` branches".to_string())
}
}
/// SIM114
pub(crate) fn if_with_same_arms(checker: &mut Checker, locator: &Locator, stmt_if: &ast::StmtIf) {
pub(crate) fn if_with_same_arms(checker: &mut Checker, stmt_if: &ast::StmtIf) {
let mut branches_iter = if_elif_branches(stmt_if).peekable();
while let Some(current_branch) = branches_iter.next() {
let Some(following_branch) = branches_iter.peek() else {
@@ -63,26 +76,101 @@ pub(crate) fn if_with_same_arms(checker: &mut Checker, locator: &Locator, stmt_i
let first_comments = checker
.indexer()
.comment_ranges()
.comments_in_range(body_range(&current_branch, locator))
.comments_in_range(body_range(&current_branch, checker.locator()))
.iter()
.map(|range| locator.slice(*range));
.map(|range| checker.locator().slice(*range));
let second_comments = checker
.indexer()
.comment_ranges()
.comments_in_range(body_range(following_branch, locator))
.comments_in_range(body_range(following_branch, checker.locator()))
.iter()
.map(|range| locator.slice(*range));
.map(|range| checker.locator().slice(*range));
if !first_comments.eq(second_comments) {
continue;
}
checker.diagnostics.push(Diagnostic::new(
let mut diagnostic = Diagnostic::new(
IfWithSameArms,
TextRange::new(current_branch.start(), following_branch.end()),
));
);
if checker.settings.preview.is_enabled() {
diagnostic.try_set_fix(|| {
merge_branches(
stmt_if,
&current_branch,
following_branch,
checker.locator(),
checker.indexer(),
)
});
}
checker.diagnostics.push(diagnostic);
}
}
/// Generate a [`Fix`] to merge two [`IfElifBranch`] branches.
fn merge_branches(
stmt_if: &ast::StmtIf,
current_branch: &IfElifBranch,
following_branch: &IfElifBranch,
locator: &Locator,
indexer: &Indexer,
) -> Result<Fix> {
// Identify the colon (`:`) at the end of the current branch's test.
let Some(current_branch_colon) =
SimpleTokenizer::starts_at(current_branch.test.end(), locator.contents())
.find(|token| token.kind == SimpleTokenKind::Colon)
else {
return Err(anyhow::anyhow!("Expected colon after test"));
};
let mut following_branch_tokenizer =
SimpleTokenizer::starts_at(following_branch.test.end(), locator.contents());
// Identify the colon (`:`) at the end of the following branch's test.
let Some(following_branch_colon) =
following_branch_tokenizer.find(|token| token.kind == SimpleTokenKind::Colon)
else {
return Err(anyhow::anyhow!("Expected colon after test"));
};
let main_edit = Edit::deletion(
locator.full_line_end(current_branch_colon.end()),
locator.full_line_end(following_branch_colon.end()),
);
// If the test isn't parenthesized, consider parenthesizing it.
let following_branch_test = if let Some(range) = parenthesized_range(
following_branch.test.into(),
stmt_if.into(),
indexer.comment_ranges(),
locator.contents(),
) {
Cow::Borrowed(locator.slice(range))
} else if matches!(
following_branch.test,
Expr::BoolOp(ast::ExprBoolOp {
op: ast::BoolOp::Or,
..
}) | Expr::Lambda(_)
| Expr::NamedExpr(_)
) {
Cow::Owned(format!("({})", locator.slice(following_branch.test)))
} else {
Cow::Borrowed(locator.slice(following_branch.test))
};
Ok(Fix::safe_edits(
main_edit,
[Edit::insertion(
format!(" or {following_branch_test}"),
current_branch_colon.start(),
)],
))
}
/// Return the [`TextRange`] of an [`IfElifBranch`]'s body (from the end of the test to the end of
/// the body).
fn body_range(branch: &IfElifBranch, locator: &Locator) -> TextRange {

View File

@@ -10,158 +10,241 @@ SIM114.py:2:1: SIM114 Combine `if` branches using logical `or` operator
5 | | b
| |_____^ SIM114
6 |
7 | if x == 1:
7 | if a: # we preserve comments, too!
|
= help: Combine `if` branches
SIM114.py:7:1: SIM114 Combine `if` branches using logical `or` operator
|
5 | b
6 |
7 | / if x == 1:
8 | | for _ in range(20):
9 | | print("hello")
10 | | elif x == 2:
11 | | for _ in range(20):
12 | | print("hello")
7 | / if a: # we preserve comments, too!
8 | | b
9 | | elif c: # but not on the second branch
10 | | b
| |_____^ SIM114
11 |
12 | if x == 1:
|
= help: Combine `if` branches
SIM114.py:12:1: SIM114 Combine `if` branches using logical `or` operator
|
10 | b
11 |
12 | / if x == 1:
13 | | for _ in range(20):
14 | | print("hello")
15 | | elif x == 2:
16 | | for _ in range(20):
17 | | print("hello")
| |______________________^ SIM114
13 |
14 | if x == 1:
18 |
19 | if x == 1:
|
= help: Combine `if` branches
SIM114.py:14:1: SIM114 Combine `if` branches using logical `or` operator
SIM114.py:19:1: SIM114 Combine `if` branches using logical `or` operator
|
12 | print("hello")
13 |
14 | / if x == 1:
15 | | if True:
16 | | for _ in range(20):
17 | | print("hello")
18 | | elif x == 2:
19 | | if True:
20 | | for _ in range(20):
21 | | print("hello")
| |__________________________^ SIM114
22 |
23 | if x == 1:
|
SIM114.py:23:1: SIM114 Combine `if` branches using logical `or` operator
|
21 | print("hello")
22 |
23 | / if x == 1:
17 | print("hello")
18 |
19 | / if x == 1:
20 | | if True:
21 | | for _ in range(20):
22 | | print("hello")
23 | | elif x == 2:
24 | | if True:
25 | | for _ in range(20):
26 | | print("hello")
27 | | elif False:
28 | | for _ in range(20):
29 | | print("hello")
30 | | elif x == 2:
31 | | if True:
32 | | for _ in range(20):
33 | | print("hello")
34 | | elif False:
35 | | for _ in range(20):
36 | | print("hello")
| |__________________________^ SIM114
37 |
38 | if (
27 |
28 | if x == 1:
|
= help: Combine `if` branches
SIM114.py:24:5: SIM114 Combine `if` branches using logical `or` operator
SIM114.py:28:1: SIM114 Combine `if` branches using logical `or` operator
|
23 | if x == 1:
24 | if True:
26 | print("hello")
27 |
28 | / if x == 1:
29 | | if True:
30 | | for _ in range(20):
31 | | print("hello")
32 | | elif False:
33 | | for _ in range(20):
34 | | print("hello")
35 | | elif x == 2:
36 | | if True:
37 | | for _ in range(20):
38 | | print("hello")
39 | | elif False:
40 | | for _ in range(20):
41 | | print("hello")
| |__________________________^ SIM114
42 |
43 | if (
|
= help: Combine `if` branches
SIM114.py:29:5: SIM114 Combine `if` branches using logical `or` operator
|
28 | if x == 1:
29 | if True:
| _____^
25 | | for _ in range(20):
26 | | print("hello")
27 | | elif False:
28 | | for _ in range(20):
29 | | print("hello")
30 | | for _ in range(20):
31 | | print("hello")
32 | | elif False:
33 | | for _ in range(20):
34 | | print("hello")
| |__________________________^ SIM114
30 | elif x == 2:
31 | if True:
35 | elif x == 2:
36 | if True:
|
= help: Combine `if` branches
SIM114.py:31:5: SIM114 Combine `if` branches using logical `or` operator
SIM114.py:36:5: SIM114 Combine `if` branches using logical `or` operator
|
29 | print("hello")
30 | elif x == 2:
31 | if True:
34 | print("hello")
35 | elif x == 2:
36 | if True:
| _____^
32 | | for _ in range(20):
33 | | print("hello")
34 | | elif False:
35 | | for _ in range(20):
36 | | print("hello")
37 | | for _ in range(20):
38 | | print("hello")
39 | | elif False:
40 | | for _ in range(20):
41 | | print("hello")
| |__________________________^ SIM114
37 |
38 | if (
42 |
43 | if (
|
= help: Combine `if` branches
SIM114.py:38:1: SIM114 Combine `if` branches using logical `or` operator
SIM114.py:43:1: SIM114 Combine `if` branches using logical `or` operator
|
36 | print("hello")
37 |
38 | / if (
39 | | x == 1
40 | | and y == 2
41 | | and z == 3
42 | | and a == 4
43 | | and b == 5
44 | | and c == 6
45 | | and d == 7
46 | | and e == 8
47 | | and f == 9
48 | | and g == 10
49 | | and h == 11
50 | | and i == 12
51 | | and j == 13
52 | | and k == 14
53 | | ):
54 | | pass
55 | | elif 1 == 2:
56 | | pass
41 | print("hello")
42 |
43 | / if (
44 | | x == 1
45 | | and y == 2
46 | | and z == 3
47 | | and a == 4
48 | | and b == 5
49 | | and c == 6
50 | | and d == 7
51 | | and e == 8
52 | | and f == 9
53 | | and g == 10
54 | | and h == 11
55 | | and i == 12
56 | | and j == 13
57 | | and k == 14
58 | | ):
59 | | pass
60 | | elif 1 == 2:
61 | | pass
| |________^ SIM114
57 |
58 | if result.eofs == "O":
62 |
63 | if result.eofs == "O":
|
= help: Combine `if` branches
SIM114.py:62:1: SIM114 Combine `if` branches using logical `or` operator
SIM114.py:67:1: SIM114 Combine `if` branches using logical `or` operator
|
60 | elif result.eofs == "S":
61 | skipped = 1
62 | / elif result.eofs == "F":
63 | | errors = 1
64 | | elif result.eofs == "E":
65 | | errors = 1
65 | elif result.eofs == "S":
66 | skipped = 1
67 | / elif result.eofs == "F":
68 | | errors = 1
69 | | elif result.eofs == "E":
70 | | errors = 1
| |______________^ SIM114
71 | elif result.eofs == "X":
72 | errors = 1
|
= help: Combine `if` branches
SIM114.py:69:1: SIM114 Combine `if` branches using logical `or` operator
|
67 | elif result.eofs == "F":
68 | errors = 1
69 | / elif result.eofs == "E":
70 | | errors = 1
71 | | elif result.eofs == "X":
72 | | errors = 1
| |______________^ SIM114
73 | elif result.eofs == "C":
74 | errors = 1
|
= help: Combine `if` branches
SIM114.py:71:1: SIM114 Combine `if` branches using logical `or` operator
|
69 | elif result.eofs == "E":
70 | errors = 1
71 | / elif result.eofs == "X":
72 | | errors = 1
73 | | elif result.eofs == "C":
74 | | errors = 1
| |______________^ SIM114
|
= help: Combine `if` branches
SIM114.py:109:5: SIM114 Combine `if` branches using logical `or` operator
SIM114.py:118:5: SIM114 Combine `if` branches using logical `or` operator
|
107 | a = True
108 | b = False
109 | if a > b: # end-of-line
116 | a = True
117 | b = False
118 | if a > b: # end-of-line
| _____^
110 | | return 3
111 | | elif a == b:
112 | | return 3
119 | | return 3
120 | | elif a == b:
121 | | return 3
| |________________^ SIM114
113 | elif a < b: # end-of-line
114 | return 4
122 | elif a < b: # end-of-line
123 | return 4
|
= help: Combine `if` branches
SIM114.py:113:5: SIM114 Combine `if` branches using logical `or` operator
SIM114.py:122:5: SIM114 Combine `if` branches using logical `or` operator
|
111 | elif a == b:
112 | return 3
113 | elif a < b: # end-of-line
120 | elif a == b:
121 | return 3
122 | elif a < b: # end-of-line
| _____^
114 | | return 4
115 | | elif b is None:
116 | | return 4
123 | | return 4
124 | | elif b is None:
125 | | return 4
| |________________^ SIM114
|
= help: Combine `if` branches
SIM114.py:132:5: SIM114 Combine `if` branches using logical `or` operator
|
130 | a = True
131 | b = False
132 | if a > b: # end-of-line
| _____^
133 | | return 3
134 | | elif a := 1:
135 | | return 3
| |________________^ SIM114
|
= help: Combine `if` branches
SIM114.py:138:1: SIM114 Combine `if` branches using logical `or` operator
|
138 | / if a: # we preserve comments, too!
139 | | b
140 | | elif c: # but not on the second branch
141 | | b
| |_____^ SIM114
|
= help: Combine `if` branches
SIM114.py:144:1: SIM114 Combine `if` branches using logical `or` operator
|
144 | / if a: b # here's a comment
145 | | elif c: b
| |_________^ SIM114
|
= help: Combine `if` branches

View File

@@ -0,0 +1,446 @@
---
source: crates/ruff_linter/src/rules/flake8_simplify/mod.rs
---
SIM114.py:2:1: SIM114 [*] Combine `if` branches using logical `or` operator
|
1 | # Errors
2 | / if a:
3 | | b
4 | | elif c:
5 | | b
| |_____^ SIM114
6 |
7 | if a: # we preserve comments, too!
|
= help: Combine `if` branches
Safe fix
1 1 | # Errors
2 |-if a:
3 |- b
4 |-elif c:
2 |+if a or c:
5 3 | b
6 4 |
7 5 | if a: # we preserve comments, too!
SIM114.py:7:1: SIM114 [*] Combine `if` branches using logical `or` operator
|
5 | b
6 |
7 | / if a: # we preserve comments, too!
8 | | b
9 | | elif c: # but not on the second branch
10 | | b
| |_____^ SIM114
11 |
12 | if x == 1:
|
= help: Combine `if` branches
Safe fix
4 4 | elif c:
5 5 | b
6 6 |
7 |-if a: # we preserve comments, too!
8 |- b
9 |-elif c: # but not on the second branch
7 |+if a or c: # we preserve comments, too!
10 8 | b
11 9 |
12 10 | if x == 1:
SIM114.py:12:1: SIM114 [*] Combine `if` branches using logical `or` operator
|
10 | b
11 |
12 | / if x == 1:
13 | | for _ in range(20):
14 | | print("hello")
15 | | elif x == 2:
16 | | for _ in range(20):
17 | | print("hello")
| |______________________^ SIM114
18 |
19 | if x == 1:
|
= help: Combine `if` branches
Safe fix
9 9 | elif c: # but not on the second branch
10 10 | b
11 11 |
12 |-if x == 1:
13 |- for _ in range(20):
14 |- print("hello")
15 |-elif x == 2:
12 |+if x == 1 or x == 2:
16 13 | for _ in range(20):
17 14 | print("hello")
18 15 |
SIM114.py:19:1: SIM114 [*] Combine `if` branches using logical `or` operator
|
17 | print("hello")
18 |
19 | / if x == 1:
20 | | if True:
21 | | for _ in range(20):
22 | | print("hello")
23 | | elif x == 2:
24 | | if True:
25 | | for _ in range(20):
26 | | print("hello")
| |__________________________^ SIM114
27 |
28 | if x == 1:
|
= help: Combine `if` branches
Safe fix
16 16 | for _ in range(20):
17 17 | print("hello")
18 18 |
19 |-if x == 1:
20 |- if True:
21 |- for _ in range(20):
22 |- print("hello")
23 |-elif x == 2:
19 |+if x == 1 or x == 2:
24 20 | if True:
25 21 | for _ in range(20):
26 22 | print("hello")
SIM114.py:28:1: SIM114 [*] Combine `if` branches using logical `or` operator
|
26 | print("hello")
27 |
28 | / if x == 1:
29 | | if True:
30 | | for _ in range(20):
31 | | print("hello")
32 | | elif False:
33 | | for _ in range(20):
34 | | print("hello")
35 | | elif x == 2:
36 | | if True:
37 | | for _ in range(20):
38 | | print("hello")
39 | | elif False:
40 | | for _ in range(20):
41 | | print("hello")
| |__________________________^ SIM114
42 |
43 | if (
|
= help: Combine `if` branches
Safe fix
25 25 | for _ in range(20):
26 26 | print("hello")
27 27 |
28 |-if x == 1:
29 |- if True:
30 |- for _ in range(20):
31 |- print("hello")
32 |- elif False:
33 |- for _ in range(20):
34 |- print("hello")
35 |-elif x == 2:
28 |+if x == 1 or x == 2:
36 29 | if True:
37 30 | for _ in range(20):
38 31 | print("hello")
SIM114.py:29:5: SIM114 [*] Combine `if` branches using logical `or` operator
|
28 | if x == 1:
29 | if True:
| _____^
30 | | for _ in range(20):
31 | | print("hello")
32 | | elif False:
33 | | for _ in range(20):
34 | | print("hello")
| |__________________________^ SIM114
35 | elif x == 2:
36 | if True:
|
= help: Combine `if` branches
Safe fix
26 26 | print("hello")
27 27 |
28 28 | if x == 1:
29 |- if True:
30 |- for _ in range(20):
31 |- print("hello")
32 |- elif False:
29 |+ if True or False:
33 30 | for _ in range(20):
34 31 | print("hello")
35 32 | elif x == 2:
SIM114.py:36:5: SIM114 [*] Combine `if` branches using logical `or` operator
|
34 | print("hello")
35 | elif x == 2:
36 | if True:
| _____^
37 | | for _ in range(20):
38 | | print("hello")
39 | | elif False:
40 | | for _ in range(20):
41 | | print("hello")
| |__________________________^ SIM114
42 |
43 | if (
|
= help: Combine `if` branches
Safe fix
33 33 | for _ in range(20):
34 34 | print("hello")
35 35 | elif x == 2:
36 |- if True:
37 |- for _ in range(20):
38 |- print("hello")
39 |- elif False:
36 |+ if True or False:
40 37 | for _ in range(20):
41 38 | print("hello")
42 39 |
SIM114.py:43:1: SIM114 [*] Combine `if` branches using logical `or` operator
|
41 | print("hello")
42 |
43 | / if (
44 | | x == 1
45 | | and y == 2
46 | | and z == 3
47 | | and a == 4
48 | | and b == 5
49 | | and c == 6
50 | | and d == 7
51 | | and e == 8
52 | | and f == 9
53 | | and g == 10
54 | | and h == 11
55 | | and i == 12
56 | | and j == 13
57 | | and k == 14
58 | | ):
59 | | pass
60 | | elif 1 == 2:
61 | | pass
| |________^ SIM114
62 |
63 | if result.eofs == "O":
|
= help: Combine `if` branches
Safe fix
55 55 | and i == 12
56 56 | and j == 13
57 57 | and k == 14
58 |-):
59 |- pass
60 |-elif 1 == 2:
58 |+) or 1 == 2:
61 59 | pass
62 60 |
63 61 | if result.eofs == "O":
SIM114.py:67:1: SIM114 [*] Combine `if` branches using logical `or` operator
|
65 | elif result.eofs == "S":
66 | skipped = 1
67 | / elif result.eofs == "F":
68 | | errors = 1
69 | | elif result.eofs == "E":
70 | | errors = 1
| |______________^ SIM114
71 | elif result.eofs == "X":
72 | errors = 1
|
= help: Combine `if` branches
Safe fix
64 64 | pass
65 65 | elif result.eofs == "S":
66 66 | skipped = 1
67 |-elif result.eofs == "F":
68 |- errors = 1
69 |-elif result.eofs == "E":
67 |+elif result.eofs == "F" or result.eofs == "E":
70 68 | errors = 1
71 69 | elif result.eofs == "X":
72 70 | errors = 1
SIM114.py:69:1: SIM114 [*] Combine `if` branches using logical `or` operator
|
67 | elif result.eofs == "F":
68 | errors = 1
69 | / elif result.eofs == "E":
70 | | errors = 1
71 | | elif result.eofs == "X":
72 | | errors = 1
| |______________^ SIM114
73 | elif result.eofs == "C":
74 | errors = 1
|
= help: Combine `if` branches
Safe fix
66 66 | skipped = 1
67 67 | elif result.eofs == "F":
68 68 | errors = 1
69 |-elif result.eofs == "E":
70 |- errors = 1
71 |-elif result.eofs == "X":
69 |+elif result.eofs == "E" or result.eofs == "X":
72 70 | errors = 1
73 71 | elif result.eofs == "C":
74 72 | errors = 1
SIM114.py:71:1: SIM114 [*] Combine `if` branches using logical `or` operator
|
69 | elif result.eofs == "E":
70 | errors = 1
71 | / elif result.eofs == "X":
72 | | errors = 1
73 | | elif result.eofs == "C":
74 | | errors = 1
| |______________^ SIM114
|
= help: Combine `if` branches
Safe fix
68 68 | errors = 1
69 69 | elif result.eofs == "E":
70 70 | errors = 1
71 |-elif result.eofs == "X":
72 |- errors = 1
73 |-elif result.eofs == "C":
71 |+elif result.eofs == "X" or result.eofs == "C":
74 72 | errors = 1
75 73 |
76 74 |
SIM114.py:118:5: SIM114 [*] Combine `if` branches using logical `or` operator
|
116 | a = True
117 | b = False
118 | if a > b: # end-of-line
| _____^
119 | | return 3
120 | | elif a == b:
121 | | return 3
| |________________^ SIM114
122 | elif a < b: # end-of-line
123 | return 4
|
= help: Combine `if` branches
Safe fix
115 115 | def func():
116 116 | a = True
117 117 | b = False
118 |- if a > b: # end-of-line
119 |- return 3
120 |- elif a == b:
118 |+ if a > b or a == b: # end-of-line
121 119 | return 3
122 120 | elif a < b: # end-of-line
123 121 | return 4
SIM114.py:122:5: SIM114 [*] Combine `if` branches using logical `or` operator
|
120 | elif a == b:
121 | return 3
122 | elif a < b: # end-of-line
| _____^
123 | | return 4
124 | | elif b is None:
125 | | return 4
| |________________^ SIM114
|
= help: Combine `if` branches
Safe fix
119 119 | return 3
120 120 | elif a == b:
121 121 | return 3
122 |- elif a < b: # end-of-line
123 |- return 4
124 |- elif b is None:
122 |+ elif a < b or b is None: # end-of-line
125 123 | return 4
126 124 |
127 125 |
SIM114.py:132:5: SIM114 [*] Combine `if` branches using logical `or` operator
|
130 | a = True
131 | b = False
132 | if a > b: # end-of-line
| _____^
133 | | return 3
134 | | elif a := 1:
135 | | return 3
| |________________^ SIM114
|
= help: Combine `if` branches
Safe fix
129 129 | """Ensure that the named expression is parenthesized when merged."""
130 130 | a = True
131 131 | b = False
132 |- if a > b: # end-of-line
133 |- return 3
134 |- elif a := 1:
132 |+ if a > b or (a := 1): # end-of-line
135 133 | return 3
136 134 |
137 135 |
SIM114.py:138:1: SIM114 [*] Combine `if` branches using logical `or` operator
|
138 | / if a: # we preserve comments, too!
139 | | b
140 | | elif c: # but not on the second branch
141 | | b
| |_____^ SIM114
|
= help: Combine `if` branches
Safe fix
135 135 | return 3
136 136 |
137 137 |
138 |-if a: # we preserve comments, too!
139 |- b
140 |-elif c: # but not on the second branch
138 |+if a or c: # we preserve comments, too!
141 139 | b
142 140 |
143 141 |
SIM114.py:144:1: SIM114 [*] Combine `if` branches using logical `or` operator
|
144 | / if a: b # here's a comment
145 | | elif c: b
| |_________^ SIM114
|
= help: Combine `if` branches
Safe fix
141 141 | b
142 142 |
143 143 |
144 |-if a: b # here's a comment
145 |-elif c: b
144 |+if a or c: b # here's a comment