about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDorian Scheidt <dorian.scheidt@gmail.com>2022-08-18 18:14:51 -0500
committerDorian Scheidt <dorian.scheidt@gmail.com>2022-08-18 18:14:51 -0500
commit30eabeb95d047b91268a70c5170b6374c6bab622 (patch)
tree051af425e84819ae4d58c48fbbc47bc9218e331d
parent61308607893b1a3c2a9de19d2f80c811d7ad643b (diff)
downloadrust-30eabeb95d047b91268a70c5170b6374c6bab622.tar.gz
rust-30eabeb95d047b91268a70c5170b6374c6bab622.zip
extract fn_target_info
-rw-r--r--crates/ide-assists/src/handlers/generate_function.rs42
1 files changed, 26 insertions, 16 deletions
diff --git a/crates/ide-assists/src/handlers/generate_function.rs b/crates/ide-assists/src/handlers/generate_function.rs
index 20855adf3c5..ba8bfe0c19b 100644
--- a/crates/ide-assists/src/handlers/generate_function.rs
+++ b/crates/ide-assists/src/handlers/generate_function.rs
@@ -61,9 +61,31 @@ fn gen_fn(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {
     }
 
     let fn_name = &*name_ref.text();
+    let (target_module, adt_name, target, file, insert_offset) =
+        fn_target_info(path, ctx, &call, fn_name)?;
+    let function_builder = FunctionBuilder::from_call(ctx, &call, fn_name, target_module, target)?;
+    let text_range = call.syntax().text_range();
+    let label = format!("Generate {} function", function_builder.fn_name);
+    add_func_to_accumulator(
+        acc,
+        ctx,
+        text_range,
+        function_builder,
+        insert_offset,
+        file,
+        adt_name,
+        label,
+    )
+}
+
+fn fn_target_info(
+    path: ast::Path,
+    ctx: &AssistContext<'_>,
+    call: &CallExpr,
+    fn_name: &str,
+) -> Option<(Option<Module>, Option<hir::Name>, GeneratedFunctionTarget, FileId, TextSize)> {
     let mut target_module = None;
     let mut adt_name = None;
-
     let (target, file, insert_offset) = match path.qualifier() {
         Some(qualifier) => match ctx.sema.resolve_path(&qualifier) {
             Some(hir::PathResolution::Def(hir::ModuleDef::Module(module))) => {
@@ -78,11 +100,11 @@ fn gen_fn(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {
                     }
                 }
 
-                assoc_fn_target(ctx, &call, adt, &mut target_module, fn_name, &mut adt_name)?
+                assoc_fn_target(ctx, call, adt, &mut target_module, fn_name, &mut adt_name)?
             }
             Some(hir::PathResolution::SelfType(impl_)) => {
                 let adt = impl_.self_ty(ctx.db()).as_adt()?;
-                assoc_fn_target(ctx, &call, adt, &mut target_module, fn_name, &mut adt_name)?
+                assoc_fn_target(ctx, call, adt, &mut target_module, fn_name, &mut adt_name)?
             }
             _ => {
                 return None;
@@ -93,19 +115,7 @@ fn gen_fn(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {
             get_fn_target(ctx, &target_module, call.clone())?
         }
     };
-    let function_builder = FunctionBuilder::from_call(ctx, &call, fn_name, target_module, target)?;
-    let text_range = call.syntax().text_range();
-    let label = format!("Generate {} function", function_builder.fn_name);
-    add_func_to_accumulator(
-        acc,
-        ctx,
-        text_range,
-        function_builder,
-        insert_offset,
-        file,
-        adt_name,
-        label,
-    )
+    Some((target_module, adt_name, target, file, insert_offset))
 }
 
 fn gen_method(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {