Conversation
There was a problem hiding this comment.
Pull request overview
Adds an “Unwrap block” refactor code action to the Pyrefly LSP, enabling users to remove an enclosing block statement (e.g., if, else, for/while without else, with) and reindent the block body into the parent scope.
Changes:
- Implemented
unwrap_blockquick-fix/refactor logic, including AST traversal and text edit construction. - Wired the new refactor into
Transactionand the non-wasm LSP server’s code-action collection. - Added initial LSP code-action tests for unwrap-block (basic
if,else, and loop-else rejection).
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
pyrefly/lib/test/lsp/code_actions.rs |
Adds unwrap-block helpers and a few targeted tests. |
pyrefly/lib/state/lsp/quick_fixes/unwrap_block.rs |
New unwrap-block refactor implementation (target detection + edit generation). |
pyrefly/lib/state/lsp/quick_fixes/mod.rs |
Exposes the new unwrap_block module. |
pyrefly/lib/state/lsp.rs |
Adds Transaction::unwrap_block_code_actions API entrypoint. |
pyrefly/lib/lsp/non_wasm/server.rs |
Includes unwrap-block in refactor code-action computation/telemetry. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
This comment has been minimized.
This comment has been minimized.
connernilsen
left a comment
There was a problem hiding this comment.
Hey @asukaminato0721, this is looking good, but a few things (mostly requests for more tests). Let me know if you have questions
683994e to
502de9b
Compare
This comment has been minimized.
This comment has been minimized.
| if let Some(target) = | ||
| find_unwrap_block_target_in_body(&try_stmt.orelse, source, position) | ||
| { | ||
| return Some(target); | ||
| } | ||
| if let Some(target) = | ||
| find_unwrap_block_target_in_body(&try_stmt.finalbody, source, position) | ||
| { | ||
| return Some(target); | ||
| } |
There was a problem hiding this comment.
In the For and While cases above, we return None if these are present. Is there a reason we're not doing that here?
Co-authored-by: Copilot <[email protected]>
92200b6 to
c4f23e6
Compare
|
According to mypy_primer, this change doesn't affect type check results on a corpus of open source code. ✅ |
Summary
part of #2207
impl unwrap block
astral-sh/ruff#24552
Test Plan
add test