about summary refs log tree commit diff
diff options
context:
space:
mode:
authorfeniljain <fkjainco@gmail.com>2022-09-15 19:33:19 +0530
committerfeniljain <fkjainco@gmail.com>2022-09-15 19:33:19 +0530
commit37ff07e1ffa0f3e59ac6c214d40ed4b44f31db3c (patch)
tree5b157de53a5662d9dcdc59dbcddbb1aa9f749c31
parentd0f2db3bf44cbfea1a6293de2199974421e60a27 (diff)
downloadrust-37ff07e1ffa0f3e59ac6c214d40ed4b44f31db3c.tar.gz
rust-37ff07e1ffa0f3e59ac6c214d40ed4b44f31db3c.zip
fix(generate_module): generate new impl near its ADT
-rw-r--r--crates/ide-assists/src/handlers/generate_function.rs36
1 files changed, 18 insertions, 18 deletions
diff --git a/crates/ide-assists/src/handlers/generate_function.rs b/crates/ide-assists/src/handlers/generate_function.rs
index f67cc924409..8b67982f915 100644
--- a/crates/ide-assists/src/handlers/generate_function.rs
+++ b/crates/ide-assists/src/handlers/generate_function.rs
@@ -1,4 +1,4 @@
-use hir::{HasSource, HirDisplay, Module, Semantics, TypeInfo};
+use hir::{Adt, HasSource, HirDisplay, Module, Semantics, TypeInfo};
 use ide_db::{
     base_db::FileId,
     defs::{Definition, NameRefClass},
@@ -145,7 +145,8 @@ fn gen_method(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {
         return None;
     }
     let (impl_, file) = get_adt_source(ctx, &adt, fn_name.text().as_str())?;
-    let (target, insert_offset) = get_method_target(ctx, &target_module, &impl_)?;
+    let (target, insert_offset) = get_method_target(ctx, &impl_, &adt)?;
+
     let function_builder =
         FunctionBuilder::from_method_call(ctx, &call, &fn_name, target_module, target)?;
     let text_range = call.syntax().text_range();
@@ -418,14 +419,13 @@ fn get_fn_target(
 
 fn get_method_target(
     ctx: &AssistContext<'_>,
-    target_module: &Module,
     impl_: &Option<ast::Impl>,
+    adt: &Adt,
 ) -> Option<(GeneratedFunctionTarget, TextSize)> {
     let target = match impl_ {
         Some(impl_) => next_space_for_fn_in_impl(impl_)?,
         None => {
-            next_space_for_fn_in_module(ctx.sema.db, &target_module.definition_source(ctx.sema.db))?
-                .1
+            GeneratedFunctionTarget::BehindItem(adt.source(ctx.sema.db)?.syntax().value.clone())
         }
     };
     Some((target.clone(), get_insert_offset(&target)))
@@ -444,7 +444,7 @@ fn assoc_fn_target_info(
         return None;
     }
     let (impl_, file) = get_adt_source(ctx, &adt, fn_name)?;
-    let (target, insert_offset) = get_method_target(ctx, &module, &impl_)?;
+    let (target, insert_offset) = get_method_target(ctx, &impl_, &adt)?;
     let adt_name = if impl_.is_none() { Some(adt.name(ctx.sema.db)) } else { None };
     Some(TargetInfo::new(target_module, adt_name, target, file, insert_offset))
 }
@@ -1475,12 +1475,12 @@ fn foo() {S.bar$0();}
 ",
             r"
 struct S;
-fn foo() {S.bar();}
 impl S {
     fn bar(&self) ${0:-> _} {
         todo!()
     }
 }
+fn foo() {S.bar();}
 ",
         )
     }
@@ -1547,16 +1547,16 @@ mod s {
 ",
             r"
 struct S;
-mod s {
-    fn foo() {
-        super::S.bar();
-    }
-}
 impl S {
     fn bar(&self) ${0:-> _} {
         todo!()
     }
 }
+mod s {
+    fn foo() {
+        super::S.bar();
+    }
+}
 
 ",
         )
@@ -1572,12 +1572,12 @@ fn foo() {$0S.bar();}
 ",
             r"
 struct S;
-fn foo() {S.bar();}
 impl S {
     fn bar(&self) ${0:-> _} {
         todo!()
     }
 }
+fn foo() {S.bar();}
 ",
         )
     }
@@ -1592,12 +1592,12 @@ fn foo() {S::bar$0();}
 ",
             r"
 struct S;
-fn foo() {S::bar();}
 impl S {
     fn bar() ${0:-> _} {
         todo!()
     }
 }
+fn foo() {S::bar();}
 ",
         )
     }
@@ -1659,12 +1659,12 @@ fn foo() {$0S::bar();}
 ",
             r"
 struct S;
-fn foo() {S::bar();}
 impl S {
     fn bar() ${0:-> _} {
         todo!()
     }
 }
+fn foo() {S::bar();}
 ",
         )
     }
@@ -1834,14 +1834,14 @@ fn main() {
 ",
             r"
 enum Foo {}
-fn main() {
-    Foo::new();
-}
 impl Foo {
     fn new() ${0:-> _} {
         todo!()
     }
 }
+fn main() {
+    Foo::new();
+}
 ",
         )
     }