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 ee5781e15f..5af98f7bfe 100644 --- a/crates/ruff_linter/resources/test/fixtures/flake8_return/RET505.py +++ b/crates/ruff_linter/resources/test/fixtures/flake8_return/RET505.py @@ -103,6 +103,14 @@ def bar4(x): return None +def fibo(n): + if n<2: + return n; + else: + last = 1; + last2 = 0; + + ### # Non-error ### 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 4604663b3e..96df747d43 100644 --- a/crates/ruff_linter/src/rules/flake8_return/rules/function.rs +++ b/crates/ruff_linter/src/rules/flake8_return/rules/function.rs @@ -820,14 +820,13 @@ fn remove_else( // If the statement is on the same line as the `else`, just remove the `else: `. // Ex) `else: return True` -> `return True` - let Some(first) = elif_else.body.first() else { - return Err(anyhow::anyhow!("`else` statement has no body")); - }; - if indexer.in_multi_statement_line(first, locator) { - return Ok(Fix::safe_edit(Edit::deletion( - elif_else.start(), - first.start(), - ))); + if let [first] = elif_else.body.as_slice() { + if indexer.in_multi_statement_line(first, locator) { + return Ok(Fix::safe_edit(Edit::deletion( + elif_else.start(), + first.start(), + ))); + } } // we're deleting the `else`, and it's Colon, and the rest of the line(s) they're on, 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 bead74c93b..7092059aa0 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 @@ -89,14 +89,14 @@ RET505.py:99:5: RET505 Unnecessary `else` after `return` statement | = help: Remove unnecessary `else` -RET505.py:137:5: RET505 Unnecessary `else` after `return` statement +RET505.py:109:5: RET505 Unnecessary `else` after `return` statement | -135 | if True: -136 | return -137 | else: +107 | if n<2: +108 | return n; +109 | else: | ^^^^ RET505 -138 | # comment -139 | pass +110 | last = 1; +111 | last2 = 0; | = help: Remove unnecessary `else` @@ -104,31 +104,31 @@ RET505.py:145:5: RET505 Unnecessary `else` after `return` statement | 143 | if True: 144 | return -145 | else: # comment +145 | else: | ^^^^ RET505 -146 | pass +146 | # comment +147 | pass | = help: Remove unnecessary `else` -RET505.py:152:5: RET505 Unnecessary `else` after `return` statement +RET505.py:153:5: RET505 Unnecessary `else` after `return` statement | -150 | if True: -151 | return -152 | else\ +151 | if True: +152 | return +153 | else: # comment | ^^^^ RET505 -153 | :\ -154 | # comment +154 | pass | = help: Remove unnecessary `else` -RET505.py:161:5: RET505 Unnecessary `else` after `return` statement +RET505.py:160:5: RET505 Unnecessary `else` after `return` statement | -159 | if True: -160 | return -161 | else\ +158 | if True: +159 | return +160 | else\ | ^^^^ RET505 -162 | : # comment -163 | pass +161 | :\ +162 | # comment | = help: Remove unnecessary `else` @@ -136,18 +136,29 @@ RET505.py:169:5: RET505 Unnecessary `else` after `return` statement | 167 | if True: 168 | return -169 | else: pass +169 | else\ + | ^^^^ RET505 +170 | : # comment +171 | pass + | + = help: Remove unnecessary `else` + +RET505.py:177:5: RET505 Unnecessary `else` after `return` statement + | +175 | if True: +176 | return +177 | else: pass | ^^^^ RET505 | = help: Remove unnecessary `else` -RET505.py:175:5: RET505 Unnecessary `else` after `return` statement +RET505.py:183:5: RET505 Unnecessary `else` after `return` statement | -173 | if True: -174 | return -175 | else:\ +181 | if True: +182 | return +183 | else:\ | ^^^^ RET505 -176 | pass +184 | pass | = help: Remove unnecessary `else` 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 index 6d495926e4..36de3ce974 100644 --- 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 @@ -182,141 +182,165 @@ RET505.py:99:5: RET505 [*] Unnecessary `else` after `return` statement 102 |+ return None 104 103 | 105 104 | -106 105 | ### +106 105 | def fibo(n): -RET505.py:137:5: RET505 [*] Unnecessary `else` after `return` statement +RET505.py:109:5: RET505 [*] Unnecessary `else` after `return` statement | -135 | if True: -136 | return -137 | else: +107 | if n<2: +108 | return n; +109 | else: | ^^^^ RET505 -138 | # comment -139 | pass +110 | last = 1; +111 | last2 = 0; | = 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(): +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: # comment +145 | else: | ^^^^ RET505 -146 | pass +146 | # comment +147 | pass | = help: Remove unnecessary `else` ℹ Safe fix -142 142 | def bar5(): +142 142 | def bar4(x): 143 143 | if True: 144 144 | return -145 |- else: # comment -146 |- pass +145 |- else: +146 |- # comment +147 |- pass 145 |+ # comment 146 |+ pass -147 147 | -148 148 | -149 149 | def bar6(): +148 147 | +149 148 | +150 149 | def bar5(): -RET505.py:152:5: RET505 [*] Unnecessary `else` after `return` statement +RET505.py:153:5: RET505 [*] Unnecessary `else` after `return` statement | -150 | if True: -151 | return -152 | else\ +151 | if True: +152 | return +153 | else: # comment | ^^^^ RET505 -153 | :\ -154 | # comment +154 | pass | = 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(): +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:161:5: RET505 [*] Unnecessary `else` after `return` statement +RET505.py:160:5: RET505 [*] Unnecessary `else` after `return` statement | -159 | if True: -160 | return -161 | else\ +158 | if True: +159 | return +160 | else\ | ^^^^ RET505 -162 | : # comment -163 | pass +161 | :\ +162 | # comment | = help: Remove unnecessary `else` ℹ Safe fix -158 158 | def bar7(): -159 159 | if True: -160 160 | return -161 |- else\ -162 |- : # comment +157 157 | def bar6(): +158 158 | if True: +159 159 | return +160 |- else\ +161 |- :\ +162 |- # comment 163 |- pass - 161 |+ # comment - 162 |+ pass -164 163 | -165 164 | -166 165 | def bar8(): + 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: pass +169 | else\ | ^^^^ RET505 +170 | : # comment +171 | pass | = help: Remove unnecessary `else` ℹ Safe fix -166 166 | def bar8(): +166 166 | def bar7(): 167 167 | if True: 168 168 | return -169 |- else: pass - 169 |+ pass -170 170 | -171 171 | -172 172 | def bar9(): +169 |- else\ +170 |- : # comment +171 |- pass + 169 |+ # comment + 170 |+ pass +172 171 | +173 172 | +174 173 | def bar8(): -RET505.py:175:5: RET505 [*] Unnecessary `else` after `return` statement +RET505.py:177:5: RET505 [*] Unnecessary `else` after `return` statement | -173 | if True: -174 | return -175 | else:\ +175 | if True: +176 | return +177 | else: pass | ^^^^ RET505 -176 | pass | = help: Remove unnecessary `else` ℹ Safe fix -172 172 | def bar9(): -173 173 | if True: -174 174 | return -175 |- else:\ -176 |- pass - 175 |+ pass -177 176 | -178 177 | -179 178 | x = 0 +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