diff options
| author | Shoyu Vanilla (Flint) <modulo641@gmail.com> | 2025-09-20 11:59:20 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-20 11:59:20 +0000 |
| commit | f6170ec3f56cafa7c27e921c410155edbcb992d8 (patch) | |
| tree | 47166778048d4f35ed143ca3eb6027898ad2b9d4 | |
| parent | 36b75b503ece2de745c62e2f6495ce2583076fc0 (diff) | |
| parent | 5a043cef02229eb6eb777277745cd7e12b350311 (diff) | |
| download | rust-f6170ec3f56cafa7c27e921c410155edbcb992d8.tar.gz rust-f6170ec3f56cafa7c27e921c410155edbcb992d8.zip | |
Merge pull request #20700 from A4-Tacks/extract-var-let-expr
Fix extract_variable on LetExpr
| -rw-r--r-- | src/tools/rust-analyzer/crates/ide-assists/src/handlers/extract_variable.rs | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/src/tools/rust-analyzer/crates/ide-assists/src/handlers/extract_variable.rs b/src/tools/rust-analyzer/crates/ide-assists/src/handlers/extract_variable.rs index bd88e8b09ce..da596262962 100644 --- a/src/tools/rust-analyzer/crates/ide-assists/src/handlers/extract_variable.rs +++ b/src/tools/rust-analyzer/crates/ide-assists/src/handlers/extract_variable.rs @@ -285,7 +285,7 @@ fn peel_parens(mut expr: ast::Expr) -> ast::Expr { /// In general that's true for any expression, but in some cases that would produce invalid code. fn valid_target_expr(node: SyntaxNode) -> Option<ast::Expr> { match node.kind() { - SyntaxKind::PATH_EXPR | SyntaxKind::LOOP_EXPR => None, + SyntaxKind::PATH_EXPR | SyntaxKind::LOOP_EXPR | SyntaxKind::LET_EXPR => None, SyntaxKind::BREAK_EXPR => ast::BreakExpr::cast(node).and_then(|e| e.expr()), SyntaxKind::RETURN_EXPR => ast::ReturnExpr::cast(node).and_then(|e| e.expr()), SyntaxKind::BLOCK_EXPR => { @@ -1404,6 +1404,25 @@ fn main() { } #[test] + fn extract_var_let_expr() { + check_assist_by_label( + extract_variable, + r#" +fn main() { + if $0let$0 Some(x) = Some(2+2) {} +} +"#, + r#" +fn main() { + let $0var_name = Some(2+2); + if let Some(x) = var_name {} +} +"#, + "Extract into variable", + ); + } + + #[test] fn extract_var_for_cast() { check_assist_by_label( extract_variable, @@ -1739,6 +1758,14 @@ fn main() { } #[test] + fn extract_var_for_let_expr_not_applicable() { + check_assist_not_applicable( + extract_variable, + "fn main() { if $0let Some(x) = Some(2+2) {} }", + ); + } + + #[test] fn extract_var_unit_expr_not_applicable() { check_assist_not_applicable( extract_variable, |
