From 7f58e39bb088eb16a49dad426b84864af3fd0e64 Mon Sep 17 00:00:00 2001 From: Micha Reiser Date: Mon, 12 Aug 2024 16:14:07 +0200 Subject: [PATCH] Stabilize fixes for `RET50{5-8}` (#12840) Fixes #10099 --- .../test/fixtures/flake8_return/RET505.py | 8 + crates/ruff_linter/src/fix/edits.rs | 34 +- .../src/rules/flake8_return/mod.rs | 4 - .../src/rules/flake8_return/rules/function.rs | 75 ++- ...lake8_return__tests__RET505_RET505.py.snap | 313 +++++++++++- ...lake8_return__tests__RET506_RET506.py.snap | 99 +++- ...lake8_return__tests__RET507_RET507.py.snap | 97 +++- ...lake8_return__tests__RET508_RET508.py.snap | 107 +++- ...urn__tests__preview__RET505_RET505.py.snap | 483 ------------------ ...urn__tests__preview__RET506_RET506.py.snap | 166 ------ ...urn__tests__preview__RET507_RET507.py.snap | 163 ------ ...urn__tests__preview__RET508_RET508.py.snap | 181 ------- crates/ruff_python_trivia/src/textwrap.rs | 12 +- 13 files changed, 639 insertions(+), 1103 deletions(-) delete mode 100644 crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__preview__RET505_RET505.py.snap delete mode 100644 crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__preview__RET506_RET506.py.snap delete mode 100644 crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__preview__RET507_RET507.py.snap delete mode 100644 crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__preview__RET508_RET508.py.snap diff --git a/crates/ruff_linter/resources/test/fixtures/flake8_return/RET505.py b/crates/ruff_linter/resources/test/fixtures/flake8_return/RET505.py index 6110e891c10e7..bc050cf8695fd 100644 --- a/crates/ruff_linter/resources/test/fixtures/flake8_return/RET505.py +++ b/crates/ruff_linter/resources/test/fixtures/flake8_return/RET505.py @@ -244,3 +244,11 @@ def f(): return True else: return False + + +def has_untracted_files(): + if b'Untracked files' in result.stdout: + return True + else: +\ + return False diff --git a/crates/ruff_linter/src/fix/edits.rs b/crates/ruff_linter/src/fix/edits.rs index 98a27280176ee..90742e2e0f1d6 100644 --- a/crates/ruff_linter/src/fix/edits.rs +++ b/crates/ruff_linter/src/fix/edits.rs @@ -317,26 +317,28 @@ pub(crate) fn adjust_indentation( line_indentation.contains('\t') && line_indentation.contains(' ') }); - if contains_multiline_string || mixed_indentation { - let module_text = format!("def f():{}{contents}", stylist.line_ending().as_str()); + // For simple cases, try to do a manual dedent. + if !contains_multiline_string && !mixed_indentation { + if let Some(dedent) = dedent_to(contents, indentation) { + return Ok(dedent); + } + } - let mut tree = match_statement(&module_text)?; + let module_text = format!("def f():{}{contents}", stylist.line_ending().as_str()); - let embedding = match_function_def(&mut tree)?; + let mut tree = match_statement(&module_text)?; - let indented_block = match_indented_block(&mut embedding.body)?; - indented_block.indent = Some(indentation); + let embedding = match_function_def(&mut tree)?; - let module_text = indented_block.codegen_stylist(stylist); - let module_text = module_text - .strip_prefix(stylist.line_ending().as_str()) - .unwrap() - .to_string(); - Ok(module_text) - } else { - // Otherwise, we can do a simple adjustment ourselves. - Ok(dedent_to(contents, indentation)) - } + let indented_block = match_indented_block(&mut embedding.body)?; + indented_block.indent = Some(indentation); + + let module_text = indented_block.codegen_stylist(stylist); + let module_text = module_text + .strip_prefix(stylist.line_ending().as_str()) + .unwrap() + .to_string(); + Ok(module_text) } /// Determine if a vector contains only one, specific element. diff --git a/crates/ruff_linter/src/rules/flake8_return/mod.rs b/crates/ruff_linter/src/rules/flake8_return/mod.rs index 568cd48cef71c..42eb65ff28043 100644 --- a/crates/ruff_linter/src/rules/flake8_return/mod.rs +++ b/crates/ruff_linter/src/rules/flake8_return/mod.rs @@ -36,10 +36,6 @@ mod tests { } #[test_case(Rule::ImplicitReturn, Path::new("RET503.py"))] - #[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__{}_{}", diff --git a/crates/ruff_linter/src/rules/flake8_return/rules/function.rs b/crates/ruff_linter/src/rules/flake8_return/rules/function.rs index a1d9e666eae37..35a4553f91ac2 100644 --- a/crates/ruff_linter/src/rules/flake8_return/rules/function.rs +++ b/crates/ruff_linter/src/rules/flake8_return/rules/function.rs @@ -672,16 +672,14 @@ fn superfluous_else_node( .unwrap_or_else(|| elif_else.range()), ); if checker.enabled(diagnostic.kind.rule()) { - if checker.settings.preview.is_enabled() { - diagnostic.try_set_fix(|| { - remove_else( - elif_else, - checker.locator(), - checker.indexer(), - checker.stylist(), - ) - }); - } + diagnostic.try_set_fix(|| { + remove_else( + elif_else, + checker.locator(), + checker.indexer(), + checker.stylist(), + ) + }); checker.diagnostics.push(diagnostic); } return true; @@ -692,16 +690,15 @@ fn superfluous_else_node( .unwrap_or_else(|| elif_else.range()), ); if checker.enabled(diagnostic.kind.rule()) { - if checker.settings.preview.is_enabled() { - diagnostic.try_set_fix(|| { - remove_else( - elif_else, - checker.locator(), - checker.indexer(), - checker.stylist(), - ) - }); - } + diagnostic.try_set_fix(|| { + remove_else( + elif_else, + checker.locator(), + checker.indexer(), + checker.stylist(), + ) + }); + checker.diagnostics.push(diagnostic); } return true; @@ -712,16 +709,15 @@ fn superfluous_else_node( .unwrap_or_else(|| elif_else.range()), ); if checker.enabled(diagnostic.kind.rule()) { - if checker.settings.preview.is_enabled() { - diagnostic.try_set_fix(|| { - remove_else( - elif_else, - checker.locator(), - checker.indexer(), - checker.stylist(), - ) - }); - } + diagnostic.try_set_fix(|| { + remove_else( + elif_else, + checker.locator(), + checker.indexer(), + checker.stylist(), + ) + }); + checker.diagnostics.push(diagnostic); } return true; @@ -732,16 +728,15 @@ fn superfluous_else_node( .unwrap_or_else(|| elif_else.range()), ); if checker.enabled(diagnostic.kind.rule()) { - if checker.settings.preview.is_enabled() { - diagnostic.try_set_fix(|| { - remove_else( - elif_else, - checker.locator(), - checker.indexer(), - checker.stylist(), - ) - }); - } + diagnostic.try_set_fix(|| { + remove_else( + elif_else, + checker.locator(), + checker.indexer(), + checker.stylist(), + ) + }); + checker.diagnostics.push(diagnostic); } return true; diff --git a/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__RET505_RET505.py.snap b/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__RET505_RET505.py.snap index 4cfdb0443163b..08f4b537b3107 100644 --- a/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__RET505_RET505.py.snap +++ b/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__RET505_RET505.py.snap @@ -1,7 +1,7 @@ --- source: crates/ruff_linter/src/rules/flake8_return/mod.rs --- -RET505.py:8:5: RET505 Unnecessary `elif` after `return` statement +RET505.py:8:5: RET505 [*] Unnecessary `elif` after `return` statement | 6 | a = 1 7 | return y @@ -12,7 +12,17 @@ RET505.py:8:5: RET505 Unnecessary `elif` after `return` statement | = help: Remove unnecessary `elif` -RET505.py:23:5: RET505 Unnecessary `elif` after `return` statement +ℹ 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,7 +33,17 @@ RET505.py:23:5: RET505 Unnecessary `elif` after `return` statement | = help: Remove unnecessary `elif` -RET505.py:41:5: RET505 Unnecessary `elif` after `return` statement +ℹ 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 @@ -34,7 +54,17 @@ RET505.py:41:5: RET505 Unnecessary `elif` after `return` statement | = help: Remove unnecessary `elif` -RET505.py:53:5: RET505 Unnecessary `else` after `return` statement +ℹ 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 @@ -45,7 +75,20 @@ RET505.py:53:5: RET505 Unnecessary `else` after `return` statement | = help: Remove unnecessary `else` -RET505.py:64:9: RET505 Unnecessary `else` after `return` statement +ℹ 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 @@ -56,7 +99,20 @@ RET505.py:64:9: RET505 Unnecessary `else` after `return` statement | = help: Remove unnecessary `else` -RET505.py:79:5: RET505 Unnecessary `else` after `return` statement +ℹ 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 @@ -67,7 +123,18 @@ RET505.py:79:5: RET505 Unnecessary `else` after `return` statement | = help: Remove unnecessary `else` -RET505.py:89:9: RET505 Unnecessary `else` after `return` statement +ℹ 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 @@ -78,7 +145,18 @@ RET505.py:89:9: RET505 Unnecessary `else` after `return` statement | = help: Remove unnecessary `else` -RET505.py:99:5: RET505 Unnecessary `else` after `return` statement +ℹ 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 @@ -89,7 +167,24 @@ RET505.py:99:5: RET505 Unnecessary `else` after `return` statement | = help: Remove unnecessary `else` -RET505.py:109:5: RET505 Unnecessary `else` after `return` statement +ℹ 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 | def fibo(n): + +RET505.py:109:5: RET505 [*] Unnecessary `else` after `return` statement | 107 | if n<2: 108 | return n; @@ -100,7 +195,20 @@ RET505.py:109:5: RET505 Unnecessary `else` after `return` statement | = help: Remove unnecessary `else` -RET505.py:145:5: RET505 Unnecessary `else` after `return` statement +ℹ Safe fix +106 106 | def fibo(n): +107 107 | if n<2: +108 108 | return n; +109 |- else: +110 |- last = 1; +111 |- last2 = 0; + 109 |+ last = 1; + 110 |+ last2 = 0; +112 111 | +113 112 | +114 113 | ### + +RET505.py:145:5: RET505 [*] Unnecessary `else` after `return` statement | 143 | if True: 144 | return @@ -111,7 +219,20 @@ RET505.py:145:5: RET505 Unnecessary `else` after `return` statement | = help: Remove unnecessary `else` -RET505.py:153:5: RET505 Unnecessary `else` after `return` statement +ℹ Safe fix +142 142 | def bar4(x): +143 143 | if True: +144 144 | return +145 |- else: +146 |- # comment +147 |- pass + 145 |+ # comment + 146 |+ pass +148 147 | +149 148 | +150 149 | def bar5(): + +RET505.py:153:5: RET505 [*] Unnecessary `else` after `return` statement | 151 | if True: 152 | return @@ -121,7 +242,19 @@ RET505.py:153:5: RET505 Unnecessary `else` after `return` statement | = help: Remove unnecessary `else` -RET505.py:160:5: RET505 Unnecessary `else` after `return` statement +ℹ Safe fix +150 150 | def bar5(): +151 151 | if True: +152 152 | return +153 |- else: # comment +154 |- pass + 153 |+ # comment + 154 |+ pass +155 155 | +156 156 | +157 157 | def bar6(): + +RET505.py:160:5: RET505 [*] Unnecessary `else` after `return` statement | 158 | if True: 159 | return @@ -132,7 +265,21 @@ RET505.py:160:5: RET505 Unnecessary `else` after `return` statement | = help: Remove unnecessary `else` -RET505.py:169:5: RET505 Unnecessary `else` after `return` statement +ℹ Safe fix +157 157 | def bar6(): +158 158 | if True: +159 159 | return +160 |- else\ +161 |- :\ +162 |- # comment +163 |- pass + 160 |+ # comment + 161 |+ pass +164 162 | +165 163 | +166 164 | def bar7(): + +RET505.py:169:5: RET505 [*] Unnecessary `else` after `return` statement | 167 | if True: 168 | return @@ -143,7 +290,20 @@ RET505.py:169:5: RET505 Unnecessary `else` after `return` statement | = help: Remove unnecessary `else` -RET505.py:177:5: RET505 Unnecessary `else` after `return` statement +ℹ Safe fix +166 166 | def bar7(): +167 167 | if True: +168 168 | return +169 |- else\ +170 |- : # comment +171 |- pass + 169 |+ # comment + 170 |+ pass +172 171 | +173 172 | +174 173 | def bar8(): + +RET505.py:177:5: RET505 [*] Unnecessary `else` after `return` statement | 175 | if True: 176 | return @@ -152,7 +312,17 @@ RET505.py:177:5: RET505 Unnecessary `else` after `return` statement | = help: Remove unnecessary `else` -RET505.py:183:5: RET505 Unnecessary `else` after `return` statement +ℹ Safe fix +174 174 | def bar8(): +175 175 | if True: +176 176 | return +177 |- else: pass + 177 |+ pass +178 178 | +179 179 | +180 180 | def bar9(): + +RET505.py:183:5: RET505 [*] Unnecessary `else` after `return` statement | 181 | if True: 182 | return @@ -162,7 +332,18 @@ RET505.py:183:5: RET505 Unnecessary `else` after `return` statement | = help: Remove unnecessary `else` -RET505.py:200:5: RET505 Unnecessary `else` after `return` statement +ℹ Safe fix +180 180 | def bar9(): +181 181 | if True: +182 182 | return +183 |- else:\ +184 |- pass + 183 |+ pass +185 184 | +186 185 | +187 186 | x = 0 + +RET505.py:200:5: RET505 [*] Unnecessary `else` after `return` statement | 198 | def sb(self): 199 | if self._sb is not None: return self._sb @@ -171,7 +352,17 @@ RET505.py:200:5: RET505 Unnecessary `else` after `return` statement | = help: Remove unnecessary `else` -RET505.py:207:5: RET505 Unnecessary `else` after `return` statement +ℹ Safe fix +197 197 | # Regression test for: https://github.com/astral-sh/ruff/issues/9732 +198 198 | def sb(self): +199 199 | if self._sb is not None: return self._sb +200 |- else: self._sb = '\033[01;%dm'; self._sa = '\033[0;0m'; + 200 |+ self._sb = '\033[01;%dm'; self._sa = '\033[0;0m'; +201 201 | +202 202 | +203 203 | def indent(x, y, w, z): + +RET505.py:207:5: RET505 [*] Unnecessary `else` after `return` statement | 205 | a = 1 206 | return y @@ -182,7 +373,21 @@ RET505.py:207:5: RET505 Unnecessary `else` after `return` statement | = help: Remove unnecessary `else` -RET505.py:217:5: RET505 Unnecessary `else` after `return` statement +ℹ Safe fix +204 204 | if x: # [no-else-return] +205 205 | a = 1 +206 206 | return y +207 |- else: +208 207 | +209 |- c = 3 +210 |- return z + 208 |+ c = 3 + 209 |+ return z +211 210 | +212 211 | +213 212 | def indent(x, y, w, z): + +RET505.py:217:5: RET505 [*] Unnecessary `else` after `return` statement | 215 | a = 1 216 | return y @@ -193,7 +398,22 @@ RET505.py:217:5: RET505 Unnecessary `else` after `return` statement | = help: Remove unnecessary `else` -RET505.py:227:5: RET505 Unnecessary `else` after `return` statement +ℹ Safe fix +214 214 | if x: # [no-else-return] +215 215 | a = 1 +216 216 | return y +217 |- else: +218 |- # comment +219 |- c = 3 +220 |- return z + 217 |+ # comment + 218 |+ c = 3 + 219 |+ return z +221 220 | +222 221 | +223 222 | def indent(x, y, w, z): + +RET505.py:227:5: RET505 [*] Unnecessary `else` after `return` statement | 225 | a = 1 226 | return y @@ -204,7 +424,22 @@ RET505.py:227:5: RET505 Unnecessary `else` after `return` statement | = help: Remove unnecessary `else` -RET505.py:237:5: RET505 Unnecessary `else` after `return` statement +ℹ Safe fix +224 224 | if x: # [no-else-return] +225 225 | a = 1 +226 226 | return y +227 |- else: +228 |- # comment +229 |- c = 3 +230 |- return z + 227 |+ # comment + 228 |+ c = 3 + 229 |+ return z +231 230 | +232 231 | +233 232 | def indent(x, y, w, z): + +RET505.py:237:5: RET505 [*] Unnecessary `else` after `return` statement | 235 | a = 1 236 | return y @@ -215,7 +450,21 @@ RET505.py:237:5: RET505 Unnecessary `else` after `return` statement | = help: Remove unnecessary `else` -RET505.py:245:2: RET505 Unnecessary `else` after `return` statement +ℹ Safe fix +234 234 | if x: # [no-else-return] +235 235 | a = 1 +236 236 | return y +237 |- else: +238 237 | # comment +239 |- c = 3 +240 |- return z + 238 |+ c = 3 + 239 |+ return z +241 240 | +242 241 | def f(): +243 242 | if True: + +RET505.py:245:2: RET505 [*] Unnecessary `else` after `return` statement | 243 | if True: 244 | return True @@ -224,3 +473,25 @@ RET505.py:245:2: RET505 Unnecessary `else` after `return` statement 246 | return False | = help: Remove unnecessary `else` + +ℹ Safe fix +242 242 | def f(): +243 243 | if True: +244 244 | return True +245 |- else: +246 |- return False + 245 |+ return False +247 246 | +248 247 | +249 248 | def has_untracted_files(): + +RET505.py:252:5: RET505 Unnecessary `else` after `return` statement + | +250 | if b'Untracked files' in result.stdout: +251 | return True +252 | else: + | ^^^^ RET505 +253 | \ +254 | return False + | + = help: Remove unnecessary `else` diff --git a/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__RET506_RET506.py.snap b/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__RET506_RET506.py.snap index 339d699edbaf5..b526b1a6fb395 100644 --- a/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__RET506_RET506.py.snap +++ b/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__RET506_RET506.py.snap @@ -1,7 +1,7 @@ --- source: crates/ruff_linter/src/rules/flake8_return/mod.rs --- -RET506.py:8:5: RET506 Unnecessary `elif` after `raise` statement +RET506.py:8:5: RET506 [*] Unnecessary `elif` after `raise` statement | 6 | a = 1 7 | raise Exception(y) @@ -12,7 +12,17 @@ RET506.py:8:5: RET506 Unnecessary `elif` after `raise` statement | = help: Remove unnecessary `elif` -RET506.py:23:5: RET506 Unnecessary `elif` after `raise` statement +ℹ 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,7 +33,17 @@ RET506.py:23:5: RET506 Unnecessary `elif` after `raise` statement | = help: Remove unnecessary `elif` -RET506.py:34:5: RET506 Unnecessary `else` after `raise` statement +ℹ 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,7 +54,20 @@ RET506.py:34:5: RET506 Unnecessary `else` after `raise` statement | = help: Remove unnecessary `else` -RET506.py:45:9: RET506 Unnecessary `else` after `raise` statement +ℹ 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,7 +78,20 @@ RET506.py:45:9: RET506 Unnecessary `else` after `raise` statement | = help: Remove unnecessary `else` -RET506.py:60:5: RET506 Unnecessary `else` after `raise` statement +ℹ 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) @@ -56,7 +102,18 @@ RET506.py:60:5: RET506 Unnecessary `else` after `raise` statement | = help: Remove unnecessary `else` -RET506.py:70:9: RET506 Unnecessary `else` after `raise` statement +ℹ 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) @@ -67,7 +124,18 @@ RET506.py:70:9: RET506 Unnecessary `else` after `raise` statement | = help: Remove unnecessary `else` -RET506.py:80:5: RET506 Unnecessary `else` after `raise` statement +ℹ 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) @@ -78,4 +146,19 @@ RET506.py:80:5: RET506 Unnecessary `else` after `raise` statement | = 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 | ### diff --git a/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__RET507_RET507.py.snap b/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__RET507_RET507.py.snap index bec73ac728298..6b8e47c961b3e 100644 --- a/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__RET507_RET507.py.snap +++ b/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__RET507_RET507.py.snap @@ -1,7 +1,7 @@ --- source: crates/ruff_linter/src/rules/flake8_return/mod.rs --- -RET507.py:8:9: RET507 Unnecessary `elif` after `continue` statement +RET507.py:8:9: RET507 [*] Unnecessary `elif` after `continue` statement | 6 | if i < y: # [no-else-continue] 7 | continue @@ -12,7 +12,17 @@ RET507.py:8:9: RET507 Unnecessary `elif` after `continue` statement | = help: Remove unnecessary `elif` -RET507.py:22:9: RET507 Unnecessary `elif` after `continue` statement +ℹ 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 @@ -23,7 +33,17 @@ RET507.py:22:9: RET507 Unnecessary `elif` after `continue` statement | = help: Remove unnecessary `elif` -RET507.py:36:9: RET507 Unnecessary `else` after `continue` statement +ℹ 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 @@ -33,7 +53,18 @@ RET507.py:36:9: RET507 Unnecessary `else` after `continue` statement | = help: Remove unnecessary `else` -RET507.py:47:13: RET507 Unnecessary `else` after `continue` statement +ℹ 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 @@ -44,7 +75,20 @@ RET507.py:47:13: RET507 Unnecessary `else` after `continue` statement | = help: Remove unnecessary `else` -RET507.py:63:9: RET507 Unnecessary `else` after `continue` statement +ℹ 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 @@ -55,7 +99,18 @@ RET507.py:63:9: RET507 Unnecessary `else` after `continue` statement | = help: Remove unnecessary `else` -RET507.py:74:13: RET507 Unnecessary `else` after `continue` statement +ℹ 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 @@ -66,7 +121,18 @@ RET507.py:74:13: RET507 Unnecessary `else` after `continue` statement | = help: Remove unnecessary `else` -RET507.py:85:9: RET507 Unnecessary `else` after `continue` statement +ℹ 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 @@ -77,4 +143,19 @@ RET507.py:85:9: RET507 Unnecessary `else` after `continue` statement | = 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): diff --git a/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__RET508_RET508.py.snap b/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__RET508_RET508.py.snap index 986a08bbfaf89..072b97b754024 100644 --- a/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__RET508_RET508.py.snap +++ b/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__RET508_RET508.py.snap @@ -1,7 +1,7 @@ --- source: crates/ruff_linter/src/rules/flake8_return/mod.rs --- -RET508.py:8:9: RET508 Unnecessary `elif` after `break` statement +RET508.py:8:9: RET508 [*] Unnecessary `elif` after `break` statement | 6 | if i > y: # [no-else-break] 7 | break @@ -12,7 +12,17 @@ RET508.py:8:9: RET508 Unnecessary `elif` after `break` statement | = help: Remove unnecessary `elif` -RET508.py:22:9: RET508 Unnecessary `elif` after `break` statement +ℹ 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 @@ -23,7 +33,17 @@ RET508.py:22:9: RET508 Unnecessary `elif` after `break` statement | = help: Remove unnecessary `elif` -RET508.py:33:9: RET508 Unnecessary `else` after `break` statement +ℹ 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,7 +53,18 @@ RET508.py:33:9: RET508 Unnecessary `else` after `break` statement | = help: Remove unnecessary `else` -RET508.py:44:13: RET508 Unnecessary `else` after `break` statement +ℹ 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,7 +75,20 @@ RET508.py:44:13: RET508 Unnecessary `else` after `break` statement | = help: Remove unnecessary `else` -RET508.py:60:9: RET508 Unnecessary `else` after `break` statement +ℹ 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 @@ -55,7 +99,18 @@ RET508.py:60:9: RET508 Unnecessary `else` after `break` statement | = help: Remove unnecessary `else` -RET508.py:71:13: RET508 Unnecessary `else` after `break` statement +ℹ 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 @@ -66,7 +121,18 @@ RET508.py:71:13: RET508 Unnecessary `else` after `break` statement | = help: Remove unnecessary `else` -RET508.py:82:9: RET508 Unnecessary `else` after `break` statement +ℹ 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 @@ -77,7 +143,24 @@ RET508.py:82:9: RET508 Unnecessary `else` after `break` statement | = help: Remove unnecessary `else` -RET508.py:158:13: RET508 Unnecessary `else` after `break` statement +ℹ 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 @@ -87,4 +170,10 @@ RET508.py:158:13: RET508 Unnecessary `else` after `break` statement | = 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 diff --git a/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__preview__RET505_RET505.py.snap b/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__preview__RET505_RET505.py.snap deleted file mode 100644 index 3c60fc51f85c8..0000000000000 --- a/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__preview__RET505_RET505.py.snap +++ /dev/null @@ -1,483 +0,0 @@ ---- -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 | def fibo(n): - -RET505.py:109:5: RET505 [*] Unnecessary `else` after `return` statement - | -107 | if n<2: -108 | return n; -109 | else: - | ^^^^ RET505 -110 | last = 1; -111 | last2 = 0; - | - = help: Remove unnecessary `else` - -ℹ Safe fix -106 106 | def fibo(n): -107 107 | if n<2: -108 108 | return n; -109 |- else: -110 |- last = 1; -111 |- last2 = 0; - 109 |+ last = 1; - 110 |+ last2 = 0; -112 111 | -113 112 | -114 113 | ### - -RET505.py:145:5: RET505 [*] Unnecessary `else` after `return` statement - | -143 | if True: -144 | return -145 | else: - | ^^^^ RET505 -146 | # comment -147 | pass - | - = help: Remove unnecessary `else` - -ℹ Safe fix -142 142 | def bar4(x): -143 143 | if True: -144 144 | return -145 |- else: -146 |- # comment -147 |- pass - 145 |+ # comment - 146 |+ pass -148 147 | -149 148 | -150 149 | def bar5(): - -RET505.py:153:5: RET505 [*] Unnecessary `else` after `return` statement - | -151 | if True: -152 | return -153 | else: # comment - | ^^^^ RET505 -154 | pass - | - = help: Remove unnecessary `else` - -ℹ Safe fix -150 150 | def bar5(): -151 151 | if True: -152 152 | return -153 |- else: # comment -154 |- pass - 153 |+ # comment - 154 |+ pass -155 155 | -156 156 | -157 157 | def bar6(): - -RET505.py:160:5: RET505 [*] Unnecessary `else` after `return` statement - | -158 | if True: -159 | return -160 | else\ - | ^^^^ RET505 -161 | :\ -162 | # comment - | - = help: Remove unnecessary `else` - -ℹ Safe fix -157 157 | def bar6(): -158 158 | if True: -159 159 | return -160 |- else\ -161 |- :\ -162 |- # comment -163 |- pass - 160 |+ # comment - 161 |+ pass -164 162 | -165 163 | -166 164 | def bar7(): - -RET505.py:169:5: RET505 [*] Unnecessary `else` after `return` statement - | -167 | if True: -168 | return -169 | else\ - | ^^^^ RET505 -170 | : # comment -171 | pass - | - = help: Remove unnecessary `else` - -ℹ Safe fix -166 166 | def bar7(): -167 167 | if True: -168 168 | return -169 |- else\ -170 |- : # comment -171 |- pass - 169 |+ # comment - 170 |+ pass -172 171 | -173 172 | -174 173 | def bar8(): - -RET505.py:177:5: RET505 [*] Unnecessary `else` after `return` statement - | -175 | if True: -176 | return -177 | else: pass - | ^^^^ RET505 - | - = help: Remove unnecessary `else` - -ℹ Safe fix -174 174 | def bar8(): -175 175 | if True: -176 176 | return -177 |- else: pass - 177 |+ pass -178 178 | -179 179 | -180 180 | def bar9(): - -RET505.py:183:5: RET505 [*] Unnecessary `else` after `return` statement - | -181 | if True: -182 | return -183 | else:\ - | ^^^^ RET505 -184 | pass - | - = help: Remove unnecessary `else` - -ℹ Safe fix -180 180 | def bar9(): -181 181 | if True: -182 182 | return -183 |- else:\ -184 |- pass - 183 |+ pass -185 184 | -186 185 | -187 186 | x = 0 - -RET505.py:200:5: RET505 [*] Unnecessary `else` after `return` statement - | -198 | def sb(self): -199 | if self._sb is not None: return self._sb -200 | else: self._sb = '\033[01;%dm'; self._sa = '\033[0;0m'; - | ^^^^ RET505 - | - = help: Remove unnecessary `else` - -ℹ Safe fix -197 197 | # Regression test for: https://github.com/astral-sh/ruff/issues/9732 -198 198 | def sb(self): -199 199 | if self._sb is not None: return self._sb -200 |- else: self._sb = '\033[01;%dm'; self._sa = '\033[0;0m'; - 200 |+ self._sb = '\033[01;%dm'; self._sa = '\033[0;0m'; -201 201 | -202 202 | -203 203 | def indent(x, y, w, z): - -RET505.py:207:5: RET505 [*] Unnecessary `else` after `return` statement - | -205 | a = 1 -206 | return y -207 | else: - | ^^^^ RET505 -208 | -209 | c = 3 - | - = help: Remove unnecessary `else` - -ℹ Safe fix -204 204 | if x: # [no-else-return] -205 205 | a = 1 -206 206 | return y -207 |- else: -208 207 | -209 |- c = 3 -210 |- return z - 208 |+ c = 3 - 209 |+ return z -211 210 | -212 211 | -213 212 | def indent(x, y, w, z): - -RET505.py:217:5: RET505 [*] Unnecessary `else` after `return` statement - | -215 | a = 1 -216 | return y -217 | else: - | ^^^^ RET505 -218 | # comment -219 | c = 3 - | - = help: Remove unnecessary `else` - -ℹ Safe fix -214 214 | if x: # [no-else-return] -215 215 | a = 1 -216 216 | return y -217 |- else: -218 |- # comment -219 |- c = 3 -220 |- return z - 217 |+ # comment - 218 |+ c = 3 - 219 |+ return z -221 220 | -222 221 | -223 222 | def indent(x, y, w, z): - -RET505.py:227:5: RET505 [*] Unnecessary `else` after `return` statement - | -225 | a = 1 -226 | return y -227 | else: - | ^^^^ RET505 -228 | # comment -229 | c = 3 - | - = help: Remove unnecessary `else` - -ℹ Safe fix -224 224 | if x: # [no-else-return] -225 225 | a = 1 -226 226 | return y -227 |- else: -228 |- # comment -229 |- c = 3 -230 |- return z - 227 |+ # comment - 228 |+ c = 3 - 229 |+ return z -231 230 | -232 231 | -233 232 | def indent(x, y, w, z): - -RET505.py:237:5: RET505 [*] Unnecessary `else` after `return` statement - | -235 | a = 1 -236 | return y -237 | else: - | ^^^^ RET505 -238 | # comment -239 | c = 3 - | - = help: Remove unnecessary `else` - -ℹ Safe fix -234 234 | if x: # [no-else-return] -235 235 | a = 1 -236 236 | return y -237 |- else: -238 237 | # comment -239 |- c = 3 -240 |- return z - 238 |+ c = 3 - 239 |+ return z -241 240 | -242 241 | def f(): -243 242 | if True: - -RET505.py:245:2: RET505 [*] Unnecessary `else` after `return` statement - | -243 | if True: -244 | return True -245 | else: - | ^^^^ RET505 -246 | return False - | - = help: Remove unnecessary `else` - -ℹ Safe fix -242 242 | def f(): -243 243 | if True: -244 244 | return True -245 |- else: -246 |- return False - 245 |+ return False diff --git a/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__preview__RET506_RET506.py.snap b/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__preview__RET506_RET506.py.snap deleted file mode 100644 index 549850ee8d25b..0000000000000 --- a/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__preview__RET506_RET506.py.snap +++ /dev/null @@ -1,166 +0,0 @@ ---- -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 | ### - - diff --git a/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__preview__RET507_RET507.py.snap b/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__preview__RET507_RET507.py.snap deleted file mode 100644 index 1a745fc2f576f..0000000000000 --- a/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__preview__RET507_RET507.py.snap +++ /dev/null @@ -1,163 +0,0 @@ ---- -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): - - diff --git a/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__preview__RET508_RET508.py.snap b/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__preview__RET508_RET508.py.snap deleted file mode 100644 index f35bda0f4e39e..0000000000000 --- a/crates/ruff_linter/src/rules/flake8_return/snapshots/ruff_linter__rules__flake8_return__tests__preview__RET508_RET508.py.snap +++ /dev/null @@ -1,181 +0,0 @@ ---- -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 - - diff --git a/crates/ruff_python_trivia/src/textwrap.rs b/crates/ruff_python_trivia/src/textwrap.rs index 9671fcecc244e..f36bdef30d94b 100644 --- a/crates/ruff_python_trivia/src/textwrap.rs +++ b/crates/ruff_python_trivia/src/textwrap.rs @@ -137,7 +137,7 @@ pub fn dedent(text: &str) -> Cow<'_, str> { /// /// # Panics /// If the first line is indented by less than the provided indent. -pub fn dedent_to(text: &str, indent: &str) -> String { +pub fn dedent_to(text: &str, indent: &str) -> Option { // Look at the indentation of the first non-empty line, to determine the "baseline" indentation. let existing_indent_len = text .universal_newlines() @@ -151,6 +151,10 @@ pub fn dedent_to(text: &str, indent: &str) -> String { }) .unwrap_or_default(); + if existing_indent_len < indent.len() { + return None; + } + // Determine the amount of indentation to remove. let dedent_len = existing_indent_len - indent.len(); @@ -173,7 +177,7 @@ pub fn dedent_to(text: &str, indent: &str) -> String { } } } - result + Some(result) } #[cfg(test)] @@ -414,7 +418,7 @@ mod tests { "", " baz" ].join("\n"); - assert_eq!(dedent_to(&x, " "), y); + assert_eq!(dedent_to(&x, " "), Some(y)); let x = [ " foo", @@ -426,6 +430,6 @@ mod tests { " bar", "baz" ].join("\n"); - assert_eq!(dedent_to(&x, ""), y); + assert_eq!(dedent_to(&x, ""), Some(y)); } }