Control flow: return and raise#17121
Conversation
|
| code | total | + violation | - violation | + fix | - fix |
|---|---|---|---|---|---|
| PLW0101 | 18 | 18 | 0 | 0 | 0 |
MichaReiser
left a comment
There was a problem hiding this comment.
Doing this incrementally makes it convenient to review. Thank you.
| | | ||
| 16 | def after_return(): | ||
| 17 | return 1 | ||
| 18 | / print("unreachable") |
There was a problem hiding this comment.
We need multiline span diagnostics so that we can highlight the "why". (CC: @ntBre might be a good first rule to port)
With our current noqa system. Would a user have to put the noqa on the last line? Would that be confusing if they have
return 1
if a:
pass
else:
other # noqa: unreachableThere was a problem hiding this comment.
I think it's the opposite: noqa comments go at the start of the range. So I think it would be
return 1
if a: # noqa: unreachable
pass
else:
other | start = end + 1; | ||
|
|
||
| if stmts.get(start).is_some() { | ||
| let next_block = self.new_block(); | ||
| self.move_to(next_block); |
There was a problem hiding this comment.
This seems a bit repetitive. We may want to abstract this somehow (e.g. store stmts in the current block and have a self.branch(offset) or similar). But I'm fine deferring this a little longer
* origin/main: [red-knot] Fix more [redundant-cast] false positives (#17170) [red-knot] Three-argument type-calls take 'str' as the first argument (#17168) Control flow: `return` and `raise` (#17121) Bump 0.11.3 (#17173) [red-knot] Improve `Debug` implementation for `semantic_index::SymbolTable` (#17172) [red-knot] Fix `str(…)` calls (#17163) [red-knot] visibility_constraint analysis for match cases (#17077) [red-knot] Fix playground crashes when diagnostics are stale (#17165)
* origin/main: (82 commits) [red-knot] Fix more [redundant-cast] false positives (#17170) [red-knot] Three-argument type-calls take 'str' as the first argument (#17168) Control flow: `return` and `raise` (#17121) Bump 0.11.3 (#17173) [red-knot] Improve `Debug` implementation for `semantic_index::SymbolTable` (#17172) [red-knot] Fix `str(…)` calls (#17163) [red-knot] visibility_constraint analysis for match cases (#17077) [red-knot] Fix playground crashes when diagnostics are stale (#17165) [red-knot] Callable types are disjoint from literals (#17160) [red-knot] Fix inference for `pow` between two literal integers (#17161) [red-knot] Add GitHub PR annotations when mdtests fail in CI (#17150) [red-knot] Fix equivalence of differently ordered unions that contain `Callable` types (#17145) [red-knot] Add initial set of tests for unreachable code (#17159) [`airflow`] Move `AIR302` to `AIR301` and `AIR303` to `AIR302` (#17151) ruff_db: simplify lifetimes on `DiagnosticDisplay` [red-knot] Detect division-by-zero in unions and intersections (#17157) [`airflow`] Add autofix infrastructure to `AIR302` name checks (#16965) [`flake8-bandit`] Mark `str` and `list[str]` literals as trusted input (`S603`) (#17136) [`airflow`] Add autofix for `AIR302` attribute checks (#16977) [`airflow`] Extend `AIR302` with additional symbols (#17085) ...
We add support for `return` and `raise` statements in the control flow graph: we simply add an edge to the terminal block, push the statements to the current block, and proceed. This implementation will have to be modified somewhat once we add support for `try` statements - then we will need to check whether to _defer_ the jump. But for now this will do! Also in this PR: We fix the `unreachable` diagnostic range so that it lumps together consecutive unreachable blocks.
We add support for
returnandraisestatements in the control flow graph: we simply add an edge to the terminal block, push the statements to the current block, and proceed.This implementation will have to be modified somewhat once we add support for
trystatements - then we will need to check whether to defer the jump. But for now this will do!Also in this PR: We fix the
unreachablediagnostic range so that it lumps together consecutive unreachable blocks.