about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJeroen Vannevel <jer_vannevel@outlook.com>2022-02-01 00:36:50 +0000
committerJeroen Vannevel <jer_vannevel@outlook.com>2022-02-01 00:36:50 +0000
commit51c50dd5acd34fac006406a6fc24f51a624e208e (patch)
treed27cfe4badb3f07750b96092f0ac8751b378d369
parente72ed9230a06d5bf89fe5ca465b9d1377a53fc3e (diff)
downloadrust-51c50dd5acd34fac006406a6fc24f51a624e208e.tar.gz
rust-51c50dd5acd34fac006406a6fc24f51a624e208e.zip
don't tear body
-rw-r--r--crates/ide_assists/src/handlers/extract_function.rs28
1 files 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
@@ -4127,6 +4130,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(
             extract_function,