From 51c50dd5acd34fac006406a6fc24f51a624e208e Mon Sep 17 00:00:00 2001 From: Jeroen Vannevel Date: Tue, 1 Feb 2022 00:36:50 +0000 Subject: [PATCH] don't tear body --- .../src/handlers/extract_function.rs | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/crates/ide_assists/src/handlers/extract_function.rs b/crates/ide_assists/src/handlers/extract_function.rs index 640c3554096..afe0b221e50 100644 --- a/crates/ide_assists/src/handlers/extract_function.rs +++ b/crates/ide_assists/src/handlers/extract_function.rs @@ -482,8 +482,11 @@ impl FunctionBody { let full_body = parent.syntax().children_with_tokens(); let mut text_range = full_body - .map(|stmt| stmt.text_range()) - .filter(|&stmt| selected.intersect(stmt).filter(|it| !it.is_empty()).is_some()) + .filter(|it| { + matches!(it.kind().is_punct() || it.kind() == SyntaxKind::WHITESPACE, false) + }) + .map(|element| element.text_range()) + .filter(|&range| selected.intersect(range).filter(|it| !it.is_empty()).is_some()) .reduce(|acc, stmt| acc.cover(stmt)); if let Some(tail_range) = parent @@ -4126,6 +4129,27 @@ fn $0fun_name() { ); } + #[test] + fn extract_does_not_tear_body_apart() { + check_assist( + extract_function, + r#" +fn foo() { + $0foo(); +}$0 +"#, + r#" +fn foo() { + fun_name(); +} + +fn $0fun_name() { + foo(); +} +"#, + ); + } + #[test] fn extract_does_not_wrap_res_in_res() { check_assist(