forked from astral-sh/ruff
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Revert "Remove
unreachable-code
feature (astral-sh#9463)"
This reverts commit f9dd7bb.
- Loading branch information
1 parent
b356c43
commit b82b4e7
Showing
15 changed files
with
4,275 additions
and
0 deletions.
There are no files selected for viewing
185 changes: 185 additions & 0 deletions
185
crates/ruff_linter/resources/test/fixtures/ruff/RUF014.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,185 @@ | ||
def after_return(): | ||
return "reachable" | ||
return "unreachable" | ||
|
||
async def also_works_on_async_functions(): | ||
return "reachable" | ||
return "unreachable" | ||
|
||
def if_always_true(): | ||
if True: | ||
return "reachable" | ||
return "unreachable" | ||
|
||
def if_always_false(): | ||
if False: | ||
return "unreachable" | ||
return "reachable" | ||
|
||
def if_elif_always_false(): | ||
if False: | ||
return "unreachable" | ||
elif False: | ||
return "also unreachable" | ||
return "reachable" | ||
|
||
def if_elif_always_true(): | ||
if False: | ||
return "unreachable" | ||
elif True: | ||
return "reachable" | ||
return "also unreachable" | ||
|
||
def ends_with_if(): | ||
if False: | ||
return "unreachable" | ||
else: | ||
return "reachable" | ||
|
||
def infinite_loop(): | ||
while True: | ||
continue | ||
return "unreachable" | ||
|
||
''' TODO: we could determine these, but we don't yet. | ||
def for_range_return(): | ||
for i in range(10): | ||
if i == 5: | ||
return "reachable" | ||
return "unreachable" | ||
def for_range_else(): | ||
for i in range(111): | ||
if i == 5: | ||
return "reachable" | ||
else: | ||
return "unreachable" | ||
return "also unreachable" | ||
def for_range_break(): | ||
for i in range(13): | ||
return "reachable" | ||
return "unreachable" | ||
def for_range_if_break(): | ||
for i in range(1110): | ||
if True: | ||
return "reachable" | ||
return "unreachable" | ||
''' | ||
|
||
def match_wildcard(status): | ||
match status: | ||
case _: | ||
return "reachable" | ||
return "unreachable" | ||
|
||
def match_case_and_wildcard(status): | ||
match status: | ||
case 1: | ||
return "reachable" | ||
case _: | ||
return "reachable" | ||
return "unreachable" | ||
|
||
def raise_exception(): | ||
raise Exception | ||
return "unreachable" | ||
|
||
def while_false(): | ||
while False: | ||
return "unreachable" | ||
return "reachable" | ||
|
||
def while_false_else(): | ||
while False: | ||
return "unreachable" | ||
else: | ||
return "reachable" | ||
|
||
def while_false_else_return(): | ||
while False: | ||
return "unreachable" | ||
else: | ||
return "reachable" | ||
return "also unreachable" | ||
|
||
def while_true(): | ||
while True: | ||
return "reachable" | ||
return "unreachable" | ||
|
||
def while_true_else(): | ||
while True: | ||
return "reachable" | ||
else: | ||
return "unreachable" | ||
|
||
def while_true_else_return(): | ||
while True: | ||
return "reachable" | ||
else: | ||
return "unreachable" | ||
return "also unreachable" | ||
|
||
def while_false_var_i(): | ||
i = 0 | ||
while False: | ||
i += 1 | ||
return i | ||
|
||
def while_true_var_i(): | ||
i = 0 | ||
while True: | ||
i += 1 | ||
return i | ||
|
||
def while_infinite(): | ||
while True: | ||
pass | ||
return "unreachable" | ||
|
||
def while_if_true(): | ||
while True: | ||
if True: | ||
return "reachable" | ||
return "unreachable" | ||
|
||
# Test case found in the Bokeh repository that trigger a false positive. | ||
def bokeh1(self, obj: BytesRep) -> bytes: | ||
data = obj["data"] | ||
|
||
if isinstance(data, str): | ||
return base64.b64decode(data) | ||
elif isinstance(data, Buffer): | ||
buffer = data | ||
else: | ||
id = data["id"] | ||
|
||
if id in self._buffers: | ||
buffer = self._buffers[id] | ||
else: | ||
self.error(f"can't resolve buffer '{id}'") | ||
|
||
return buffer.data | ||
|
||
''' | ||
TODO: because `try` statements aren't handled this triggers a false positive as | ||
the last statement is reached, but the rules thinks it isn't (it doesn't | ||
see/process the break statement). | ||
# Test case found in the Bokeh repository that trigger a false positive. | ||
def bokeh2(self, host: str = DEFAULT_HOST, port: int = DEFAULT_PORT) -> None: | ||
self.stop_serving = False | ||
while True: | ||
try: | ||
self.server = HTTPServer((host, port), HtmlOnlyHandler) | ||
self.host = host | ||
self.port = port | ||
break | ||
except OSError: | ||
log.debug(f"port {port} is in use, trying to next one") | ||
port += 1 | ||
self.thread = threading.Thread(target=self._run_web_server) | ||
''' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
97 changes: 97 additions & 0 deletions
97
...ff/rules/snapshots/ruff_linter__rules__ruff__rules__unreachable__tests__assert.py.md.snap
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
--- | ||
source: crates/ruff_linter/src/rules/ruff/rules/unreachable.rs | ||
description: "This is a Mermaid graph. You can use https://mermaid.live to visualize it as a diagram." | ||
--- | ||
## Function 0 | ||
### Source | ||
```python | ||
def func(): | ||
assert True | ||
``` | ||
|
||
### Control Flow Graph | ||
```mermaid | ||
flowchart TD | ||
start(("Start")) | ||
return(("End")) | ||
block0[["`*(empty)*`"]] | ||
block1[["Exception raised"]] | ||
block2["assert True\n"] | ||
start --> block2 | ||
block2 -- "True" --> block0 | ||
block2 -- "else" --> block1 | ||
block1 --> return | ||
block0 --> return | ||
``` | ||
|
||
## Function 1 | ||
### Source | ||
```python | ||
def func(): | ||
assert False | ||
``` | ||
|
||
### Control Flow Graph | ||
```mermaid | ||
flowchart TD | ||
start(("Start")) | ||
return(("End")) | ||
block0[["`*(empty)*`"]] | ||
block1[["Exception raised"]] | ||
block2["assert False\n"] | ||
start --> block2 | ||
block2 -- "False" --> block0 | ||
block2 -- "else" --> block1 | ||
block1 --> return | ||
block0 --> return | ||
``` | ||
|
||
## Function 2 | ||
### Source | ||
```python | ||
def func(): | ||
assert True, "oops" | ||
``` | ||
|
||
### Control Flow Graph | ||
```mermaid | ||
flowchart TD | ||
start(("Start")) | ||
return(("End")) | ||
block0[["`*(empty)*`"]] | ||
block1[["Exception raised"]] | ||
block2["assert True, #quot;oops#quot;\n"] | ||
start --> block2 | ||
block2 -- "True" --> block0 | ||
block2 -- "else" --> block1 | ||
block1 --> return | ||
block0 --> return | ||
``` | ||
|
||
## Function 3 | ||
### Source | ||
```python | ||
def func(): | ||
assert False, "oops" | ||
``` | ||
|
||
### Control Flow Graph | ||
```mermaid | ||
flowchart TD | ||
start(("Start")) | ||
return(("End")) | ||
block0[["`*(empty)*`"]] | ||
block1[["Exception raised"]] | ||
block2["assert False, #quot;oops#quot;\n"] | ||
start --> block2 | ||
block2 -- "False" --> block0 | ||
block2 -- "else" --> block1 | ||
block1 --> return | ||
block0 --> return | ||
``` | ||
|
||
|
Oops, something went wrong.