about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDropDemBits <r3usrlnd@gmail.com>2023-07-06 21:43:34 -0400
committerDropDemBits <r3usrlnd@gmail.com>2023-07-07 20:06:10 -0400
commit09a3bd58995079111dd59c0bd677521cceb28581 (patch)
treea60a7e20645cc3dcec96a25ef5b5e915c3735564
parent58e2053327799313de2a5ccb4c50c57612993899 (diff)
downloadrust-09a3bd58995079111dd59c0bd677521cceb28581.tar.gz
rust-09a3bd58995079111dd59c0bd677521cceb28581.zip
Match indentation of generated delegate method
-rw-r--r--crates/ide-assists/src/handlers/generate_delegate_methods.rs96
1 files changed, 92 insertions, 4 deletions
diff --git a/crates/ide-assists/src/handlers/generate_delegate_methods.rs b/crates/ide-assists/src/handlers/generate_delegate_methods.rs
index bd21b7669a6..f0b9b01672a 100644
--- a/crates/ide-assists/src/handlers/generate_delegate_methods.rs
+++ b/crates/ide-assists/src/handlers/generate_delegate_methods.rs
@@ -3,8 +3,7 @@ use std::collections::HashSet;
 use hir::{self, HasCrate, HasSource, HasVisibility};
 use syntax::{
     ast::{
-        self, edit::IndentLevel, edit_in_place::Indent, make, AstNode, HasGenericParams, HasName,
-        HasVisibility as _,
+        self, edit_in_place::Indent, make, AstNode, HasGenericParams, HasName, HasVisibility as _,
     },
     ted,
 };
@@ -141,7 +140,6 @@ pub(crate) fn generate_delegate_methods(acc: &mut Assists, ctx: &AssistContext<'
                     is_unsafe,
                 )
                 .clone_for_update();
-                f.reindent_to(IndentLevel(1));
 
                 // Create or update an impl block, attach the function to it,
                 // then insert into our code.
@@ -150,6 +148,9 @@ pub(crate) fn generate_delegate_methods(acc: &mut Assists, ctx: &AssistContext<'
                         // Remember where in our source our `impl` block lives.
                         let impl_def = edit.make_mut(impl_def);
 
+                        // Fixup function indentation.
+                        f.reindent_to(impl_def.indent_level() + 1);
+
                         // Attach the function to the impl block.
                         let assoc_items = impl_def.get_or_create_assoc_item_list();
                         assoc_items.add_item(f.clone().into());
@@ -177,15 +178,22 @@ pub(crate) fn generate_delegate_methods(acc: &mut Assists, ctx: &AssistContext<'
                         )
                         .clone_for_update();
 
+                        // Fixup function indentation.
+                        f.reindent_to(impl_def.indent_level() + 1);
+
                         let assoc_items = impl_def.get_or_create_assoc_item_list();
                         assoc_items.add_item(f.clone().into());
 
+                        // Fixup impl_def indentation
+                        let indent = strukt.indent_level();
+                        impl_def.reindent_to(indent);
+
                         // Insert the impl block.
                         let strukt = edit.make_mut(strukt.clone());
                         ted::insert_all(
                             ted::Position::after(strukt.syntax()),
                             vec![
-                                make::tokens::blank_line().into(),
+                                make::tokens::whitespace(&format!("\n\n{indent}")).into(),
                                 impl_def.syntax().clone().into(),
                             ],
                         );
@@ -243,6 +251,45 @@ impl Person {
     }
 
     #[test]
+    fn test_generate_delegate_create_impl_block_match_indent() {
+        check_assist(
+            generate_delegate_methods,
+            r#"
+mod indent {
+    struct Age(u8);
+    impl Age {
+        fn age(&self) -> u8 {
+            self.0
+        }
+    }
+
+    struct Person {
+        ag$0e: Age,
+    }
+}"#,
+            r#"
+mod indent {
+    struct Age(u8);
+    impl Age {
+        fn age(&self) -> u8 {
+            self.0
+        }
+    }
+
+    struct Person {
+        age: Age,
+    }
+
+    impl Person {
+        $0fn age(&self) -> u8 {
+            self.age.age()
+        }
+    }
+}"#,
+        );
+    }
+
+    #[test]
     fn test_generate_delegate_update_impl_block() {
         check_assist(
             generate_delegate_methods,
@@ -280,6 +327,47 @@ impl Person {
     }
 
     #[test]
+    fn test_generate_delegate_update_impl_block_match_indent() {
+        check_assist(
+            generate_delegate_methods,
+            r#"
+mod indent {
+    struct Age(u8);
+    impl Age {
+        fn age(&self) -> u8 {
+            self.0
+        }
+    }
+
+    struct Person {
+        ag$0e: Age,
+    }
+
+    impl Person {}
+}"#,
+            r#"
+mod indent {
+    struct Age(u8);
+    impl Age {
+        fn age(&self) -> u8 {
+            self.0
+        }
+    }
+
+    struct Person {
+        age: Age,
+    }
+
+    impl Person {
+        $0fn age(&self) -> u8 {
+            self.age.age()
+        }
+    }
+}"#,
+        );
+    }
+
+    #[test]
     fn test_generate_delegate_tuple_struct() {
         check_assist(
             generate_delegate_methods,