diff --git a/crates/ruff_linter/src/rules/refurb/rules/readlines_in_for.rs b/crates/ruff_linter/src/rules/refurb/rules/readlines_in_for.rs index 42981237cff1cb..9911e9a921078a 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/readlines_in_for.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/readlines_in_for.rs @@ -36,36 +36,38 @@ pub(crate) struct ReadlinesInFor; impl AlwaysFixableViolation for ReadlinesInFor { #[derive_message_formats] fn message(&self) -> String { - format!("Use of readlines() in for loop") + format!("Use of `readlines()` in loop") } fn fix_title(&self) -> String { - "Remove readlines()".into() + "Remove `readlines()`".into() } } -fn readlines_in_iter(checker: &mut Checker, iter_expr: &Expr) -> Option<()> { - let expr_call = iter_expr.as_call_expr()?; - let attr_expr = expr_call.func.as_attribute_expr()?; - (attr_expr.attr.as_str() == "readlines" && expr_call.arguments.is_empty()).then(|| { - checker - .diagnostics - .push( - Diagnostic::new(ReadlinesInFor, expr_call.range()).with_fix(Fix::unsafe_edit( - Edit::range_deletion( - expr_call.range().add_start(attr_expr.value.range().len()), - ), - )), - ); - }) -} - -// FURB129 +/// FURB129 pub(crate) fn readlines_in_for(checker: &mut Checker, for_stmt: &StmtFor) { readlines_in_iter(checker, for_stmt.iter.as_ref()); } -// FURB129 +/// FURB129 pub(crate) fn readlines_in_comprehension(checker: &mut Checker, comprehension: &Comprehension) { readlines_in_iter(checker, &comprehension.iter); } + +fn readlines_in_iter(checker: &mut Checker, iter_expr: &Expr) { + let Expr::Call(expr_call) = iter_expr else { + return; + }; + + let Expr::Attribute(expr_attr) = expr_call.func.as_ref() else { + return; + }; + + if expr_attr.attr.as_str() == "readlines" && expr_call.arguments.is_empty() { + let mut diagnostic = Diagnostic::new(ReadlinesInFor, expr_call.range()); + diagnostic.set_fix(Fix::unsafe_edit(Edit::range_deletion( + expr_call.range().add_start(expr_attr.value.range().len()), + ))); + checker.diagnostics.push(diagnostic); + } +} diff --git a/crates/ruff_linter/src/rules/refurb/snapshots/ruff_linter__rules__refurb__tests__FURB129_FURB129.py.snap b/crates/ruff_linter/src/rules/refurb/snapshots/ruff_linter__rules__refurb__tests__FURB129_FURB129.py.snap index b0879739607b92..22f0a60abcf73c 100644 --- a/crates/ruff_linter/src/rules/refurb/snapshots/ruff_linter__rules__refurb__tests__FURB129_FURB129.py.snap +++ b/crates/ruff_linter/src/rules/refurb/snapshots/ruff_linter__rules__refurb__tests__FURB129_FURB129.py.snap @@ -1,7 +1,7 @@ --- source: crates/ruff_linter/src/rules/refurb/mod.rs --- -FURB129.py:7:18: FURB129 [*] Use of readlines() in for loop +FURB129.py:7:18: FURB129 [*] Use of `readlines()` in loop | 5 | # Errors 6 | with open("FURB129.py") as f: @@ -10,7 +10,7 @@ FURB129.py:7:18: FURB129 [*] Use of readlines() in for loop 8 | pass 9 | a = [line.lower() for line in f.readlines()] | - = help: Remove readlines() + = help: Remove `readlines()` ℹ Unsafe fix 4 4 | @@ -22,7 +22,7 @@ FURB129.py:7:18: FURB129 [*] Use of readlines() in for loop 9 9 | a = [line.lower() for line in f.readlines()] 10 10 | b = {line.upper() for line in f.readlines()} -FURB129.py:9:35: FURB129 [*] Use of readlines() in for loop +FURB129.py:9:35: FURB129 [*] Use of `readlines()` in loop | 7 | for _line in f.readlines(): 8 | pass @@ -31,7 +31,7 @@ FURB129.py:9:35: FURB129 [*] Use of readlines() in for loop 10 | b = {line.upper() for line in f.readlines()} 11 | c = {line.lower(): line.upper() for line in f.readlines()} | - = help: Remove readlines() + = help: Remove `readlines()` ℹ Unsafe fix 6 6 | with open("FURB129.py") as f: @@ -43,7 +43,7 @@ FURB129.py:9:35: FURB129 [*] Use of readlines() in for loop 11 11 | c = {line.lower(): line.upper() for line in f.readlines()} 12 12 | -FURB129.py:10:35: FURB129 [*] Use of readlines() in for loop +FURB129.py:10:35: FURB129 [*] Use of `readlines()` in loop | 8 | pass 9 | a = [line.lower() for line in f.readlines()] @@ -51,7 +51,7 @@ FURB129.py:10:35: FURB129 [*] Use of readlines() in for loop | ^^^^^^^^^^^^^ FURB129 11 | c = {line.lower(): line.upper() for line in f.readlines()} | - = help: Remove readlines() + = help: Remove `readlines()` ℹ Unsafe fix 7 7 | for _line in f.readlines(): @@ -63,7 +63,7 @@ FURB129.py:10:35: FURB129 [*] Use of readlines() in for loop 12 12 | 13 13 | with Path("FURB129.py").open() as f: -FURB129.py:11:49: FURB129 [*] Use of readlines() in for loop +FURB129.py:11:49: FURB129 [*] Use of `readlines()` in loop | 9 | a = [line.lower() for line in f.readlines()] 10 | b = {line.upper() for line in f.readlines()} @@ -72,7 +72,7 @@ FURB129.py:11:49: FURB129 [*] Use of readlines() in for loop 12 | 13 | with Path("FURB129.py").open() as f: | - = help: Remove readlines() + = help: Remove `readlines()` ℹ Unsafe fix 8 8 | pass @@ -84,14 +84,14 @@ FURB129.py:11:49: FURB129 [*] Use of readlines() in for loop 13 13 | with Path("FURB129.py").open() as f: 14 14 | for _line in f.readlines(): -FURB129.py:14:18: FURB129 [*] Use of readlines() in for loop +FURB129.py:14:18: FURB129 [*] Use of `readlines()` in loop | 13 | with Path("FURB129.py").open() as f: 14 | for _line in f.readlines(): | ^^^^^^^^^^^^^ FURB129 15 | pass | - = help: Remove readlines() + = help: Remove `readlines()` ℹ Unsafe fix 11 11 | c = {line.lower(): line.upper() for line in f.readlines()} @@ -103,7 +103,7 @@ FURB129.py:14:18: FURB129 [*] Use of readlines() in for loop 16 16 | 17 17 | for _line in open("FURB129.py").readlines(): -FURB129.py:17:14: FURB129 [*] Use of readlines() in for loop +FURB129.py:17:14: FURB129 [*] Use of `readlines()` in loop | 15 | pass 16 | @@ -111,7 +111,7 @@ FURB129.py:17:14: FURB129 [*] Use of readlines() in for loop | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FURB129 18 | pass | - = help: Remove readlines() + = help: Remove `readlines()` ℹ Unsafe fix 14 14 | for _line in f.readlines(): @@ -123,7 +123,7 @@ FURB129.py:17:14: FURB129 [*] Use of readlines() in for loop 19 19 | 20 20 | for _line in Path("FURB129.py").open().readlines(): -FURB129.py:20:14: FURB129 [*] Use of readlines() in for loop +FURB129.py:20:14: FURB129 [*] Use of `readlines()` in loop | 18 | pass 19 | @@ -131,7 +131,7 @@ FURB129.py:20:14: FURB129 [*] Use of readlines() in for loop | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FURB129 21 | pass | - = help: Remove readlines() + = help: Remove `readlines()` ℹ Unsafe fix 17 17 | for _line in open("FURB129.py").readlines(): @@ -143,7 +143,7 @@ FURB129.py:20:14: FURB129 [*] Use of readlines() in for loop 22 22 | 23 23 | -FURB129.py:26:18: FURB129 [*] Use of readlines() in for loop +FURB129.py:26:18: FURB129 [*] Use of `readlines()` in loop | 24 | def good1(): 25 | f = Path("FURB129.py").open() @@ -152,7 +152,7 @@ FURB129.py:26:18: FURB129 [*] Use of readlines() in for loop 27 | pass 28 | f.close() | - = help: Remove readlines() + = help: Remove `readlines()` ℹ Unsafe fix 23 23 | @@ -164,14 +164,14 @@ FURB129.py:26:18: FURB129 [*] Use of readlines() in for loop 28 28 | f.close() 29 29 | -FURB129.py:32:18: FURB129 [*] Use of readlines() in for loop +FURB129.py:32:18: FURB129 [*] Use of `readlines()` in loop | 31 | def good2(f: io.BytesIO): 32 | for _line in f.readlines(): | ^^^^^^^^^^^^^ FURB129 33 | pass | - = help: Remove readlines() + = help: Remove `readlines()` ℹ Unsafe fix 29 29 | @@ -183,7 +183,7 @@ FURB129.py:32:18: FURB129 [*] Use of readlines() in for loop 34 34 | 35 35 | -FURB129.py:38:18: FURB129 [*] Use of readlines() in for loop +FURB129.py:38:18: FURB129 [*] Use of `readlines()` in loop | 36 | # False positives 37 | def bad(f): @@ -191,7 +191,7 @@ FURB129.py:38:18: FURB129 [*] Use of readlines() in for loop | ^^^^^^^^^^^^^ FURB129 39 | pass | - = help: Remove readlines() + = help: Remove `readlines()` ℹ Unsafe fix 35 35 | @@ -203,14 +203,14 @@ FURB129.py:38:18: FURB129 [*] Use of readlines() in for loop 40 40 | 41 41 | -FURB129.py:43:18: FURB129 [*] Use of readlines() in for loop +FURB129.py:43:18: FURB129 [*] Use of `readlines()` in loop | 42 | def worse(f: codecs.StreamReader): 43 | for _line in f.readlines(): | ^^^^^^^^^^^^^ FURB129 44 | pass | - = help: Remove readlines() + = help: Remove `readlines()` ℹ Unsafe fix 40 40 | @@ -222,13 +222,13 @@ FURB129.py:43:18: FURB129 [*] Use of readlines() in for loop 45 45 | 46 46 | -FURB129.py:55:14: FURB129 [*] Use of readlines() in for loop +FURB129.py:55:14: FURB129 [*] Use of `readlines()` in loop | 55 | for _line in foo().readlines(): | ^^^^^^^^^^^^^^^^^ FURB129 56 | pass | - = help: Remove readlines() + = help: Remove `readlines()` ℹ Unsafe fix 52 52 | return A()