Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-assists/src/handlers/extract_variable.rs')
-rw-r--r--crates/ide-assists/src/handlers/extract_variable.rs46
1 files changed, 36 insertions, 10 deletions
diff --git a/crates/ide-assists/src/handlers/extract_variable.rs b/crates/ide-assists/src/handlers/extract_variable.rs
index db2d316d58..da59626296 100644
--- a/crates/ide-assists/src/handlers/extract_variable.rs
+++ b/crates/ide-assists/src/handlers/extract_variable.rs
@@ -200,7 +200,7 @@ pub(crate) fn extract_variable(acc: &mut Assists, ctx: &AssistContext<'_>) -> Op
}
ExtractionKind::Constant => {
let ast_ty = make.ty(&ty_string);
- ast::Item::Const(make.item_const(None, pat_name, ast_ty, initializer))
+ ast::Item::Const(make.item_const(None, None, pat_name, ast_ty, initializer))
.into()
}
ExtractionKind::Static => {
@@ -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 => {
@@ -404,11 +404,10 @@ impl Anchor {
}
if let Some(expr) =
node.parent().and_then(ast::StmtList::cast).and_then(|it| it.tail_expr())
+ && expr.syntax() == &node
{
- if expr.syntax() == &node {
- cov_mark::hit!(test_extract_var_last_expr);
- return Some(Anchor::Before(node));
- }
+ cov_mark::hit!(test_extract_var_last_expr);
+ return Some(Anchor::Before(node));
}
if let Some(parent) = node.parent() {
@@ -427,10 +426,10 @@ impl Anchor {
}
if let Some(stmt) = ast::Stmt::cast(node.clone()) {
- if let ast::Stmt::ExprStmt(stmt) = stmt {
- if stmt.expr().as_ref() == Some(to_extract) {
- return Some(Anchor::Replace(stmt));
- }
+ if let ast::Stmt::ExprStmt(stmt) = stmt
+ && stmt.expr().as_ref() == Some(to_extract)
+ {
+ return Some(Anchor::Replace(stmt));
}
return Some(Anchor::Before(node));
}
@@ -1405,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,
@@ -1740,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,