Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide_assists/src/handlers/extract_function.rs')
| -rw-r--r-- | crates/ide_assists/src/handlers/extract_function.rs | 40 |
1 files changed, 23 insertions, 17 deletions
diff --git a/crates/ide_assists/src/handlers/extract_function.rs b/crates/ide_assists/src/handlers/extract_function.rs index 328d172cb8..733bb34788 100644 --- a/crates/ide_assists/src/handlers/extract_function.rs +++ b/crates/ide_assists/src/handlers/extract_function.rs @@ -148,24 +148,30 @@ fn extraction_target(node: &SyntaxNode, selection_range: TextRange) -> Option<Fu return match stmt { ast::Stmt::Item(_) => None, ast::Stmt::ExprStmt(_) | ast::Stmt::LetStmt(_) => Some(FunctionBody::from_range( - node.parent().and_then(ast::BlockExpr::cast)?, + node.parent().and_then(ast::StmtList::cast)?, node.text_range(), )), }; } + // Covering element returned the parent block of one or multiple statements that have been selected + if let Some(stmt_list) = ast::StmtList::cast(node.clone()) { + if let Some(block_expr) = stmt_list.syntax().parent().and_then(ast::BlockExpr::cast) { + if block_expr.syntax().text_range() == selection_range { + return FunctionBody::from_expr(block_expr.into()); + } + } + + // Extract the full statements. + return Some(FunctionBody::from_range(stmt_list, selection_range)); + } + let expr = ast::Expr::cast(node.clone())?; // A node got selected fully if node.text_range() == selection_range { return FunctionBody::from_expr(expr.clone()); } - // Covering element returned the parent block of one or multiple statements that have been selected - if let ast::Expr::BlockExpr(block) = expr { - // Extract the full statements. - return Some(FunctionBody::from_range(block, selection_range)); - } - node.ancestors().find_map(ast::Expr::cast).and_then(FunctionBody::from_expr) } @@ -284,7 +290,7 @@ impl RetType { #[derive(Debug)] enum FunctionBody { Expr(ast::Expr), - Span { parent: ast::BlockExpr, text_range: TextRange }, + Span { parent: ast::StmtList, text_range: TextRange }, } #[derive(Debug)] @@ -441,7 +447,7 @@ impl FunctionBody { } } - fn from_range(parent: ast::BlockExpr, selected: TextRange) -> FunctionBody { + fn from_range(parent: ast::StmtList, selected: TextRange) -> FunctionBody { let mut text_range = parent .statements() .map(|stmt| stmt.syntax().text_range()) @@ -643,14 +649,14 @@ impl FunctionBody { break match_ast! { match anc { ast::ClosureExpr(closure) => (false, closure.body(), infer_expr_opt(closure.body())), - ast::EffectExpr(effect) => { - let (constness, block) = match effect.effect() { - ast::Effect::Const(_) => (true, effect.block_expr()), - ast::Effect::Try(_) => (false, effect.block_expr()), - ast::Effect::Label(label) if label.lifetime().is_some() => (false, effect.block_expr()), + ast::BlockExpr(block_expr) => { + let (constness, block) = match block_expr.modifier() { + Some(ast::BlockModifier::Const(_)) => (true, block_expr), + Some(ast::BlockModifier::Try(_)) => (false, block_expr), + Some(ast::BlockModifier::Label(label)) if label.lifetime().is_some() => (false, block_expr), _ => continue, }; - let expr = block.map(ast::Expr::BlockExpr); + let expr = Some(ast::Expr::BlockExpr(block)); (constness, expr.clone(), infer_expr_opt(expr)) }, ast::Fn(fn_) => { @@ -745,7 +751,7 @@ impl FunctionBody { ast::Expr::LoopExpr(_) | ast::Expr::ForExpr(_) | ast::Expr::WhileExpr(_) => loop_depth -= 1, - ast::Expr::EffectExpr(effect) if effect.unsafe_token().is_some() => { + ast::Expr::BlockExpr(block_expr) if block_expr.unsafe_token().is_some() => { unsafe_depth -= 1 } _ => (), @@ -757,7 +763,7 @@ impl FunctionBody { ast::Expr::LoopExpr(_) | ast::Expr::ForExpr(_) | ast::Expr::WhileExpr(_) => { loop_depth += 1; } - ast::Expr::EffectExpr(effect) if effect.unsafe_token().is_some() => { + ast::Expr::BlockExpr(block_expr) if block_expr.unsafe_token().is_some() => { unsafe_depth += 1 } ast::Expr::ReturnExpr(it) => { |