Skip to content

Commit 0679f70

Browse files
committed
Remove fn has default generic
1 parent a44ab2a commit 0679f70

File tree

1 file changed

+47
-35
lines changed

1 file changed

+47
-35
lines changed

crates/ide-assists/src/handlers/extract_to_default_generic.rs

Lines changed: 47 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ pub(crate) fn extract_to_default_generic(acc: &mut Assists, ctx: &AssistContext<
2525
}
2626

2727
let ty: Either<ast::Type, ast::ConstArg> = ctx.find_node_at_range()?;
28-
let adt: Either<ast::Adt, Either<ast::TypeAlias, ast::Fn>> =
28+
let adt: Either<Either<ast::Adt, ast::TypeAlias>, ast::Fn> =
2929
ty.syntax().ancestors().find_map(AstNode::cast)?;
3030

3131
extract_to_default_generic_impl(acc, ctx, adt, ty)
@@ -34,48 +34,60 @@ pub(crate) fn extract_to_default_generic(acc: &mut Assists, ctx: &AssistContext<
3434
fn extract_to_default_generic_impl(
3535
acc: &mut Assists,
3636
ctx: &AssistContext<'_>,
37-
adt: impl HasName + HasGenericParams,
37+
adt: Either<impl HasName + HasGenericParams, ast::Fn>,
3838
ty: Either<ast::Type, ast::ConstArg>,
3939
) -> Option<()> {
4040
let name = adt.name()?;
41+
let has_default = adt.is_left();
4142

43+
let label = if has_default {
44+
"Extract type as default generic parameter"
45+
} else {
46+
"Extract type as generic parameter"
47+
};
4248
let target = ty.syntax().text_range();
43-
acc.add(
44-
AssistId::refactor_extract("extract_to_default_generic"),
45-
"Extract type as default generic parameter",
46-
target,
47-
|edit| {
48-
let mut editor = edit.make_editor(adt.syntax());
49-
let generic_list = get_or_create_generic_param_list(&name, &adt, &mut editor, edit);
50-
51-
let generic_name = generic_name(&generic_list, ty.is_right());
52-
53-
editor.replace(ty.syntax(), generic_name.syntax());
54-
55-
match ty {
56-
Left(ty) => {
57-
let param = make::type_default_param(generic_name, None, ty).clone_for_update();
58-
generic_list.add_generic_param(param.into());
49+
acc.add(AssistId::refactor_extract("extract_to_default_generic"), label, target, |edit| {
50+
let mut editor = edit.make_editor(adt.syntax());
51+
let generic_list = get_or_create_generic_param_list(&name, &adt, &mut editor, edit);
52+
53+
let generic_name = generic_name(&generic_list, ty.is_right());
54+
55+
editor.replace(ty.syntax(), generic_name.syntax());
56+
57+
match ty {
58+
Left(ty) => {
59+
let param = if has_default {
60+
make::type_default_param(generic_name, None, ty)
61+
} else {
62+
make::type_param(generic_name, None)
63+
}
64+
.clone_for_update();
65+
66+
generic_list.add_generic_param(param.into());
67+
}
68+
Right(n) => {
69+
let param = if has_default {
70+
make::const_default_param(generic_name, const_ty(ctx, &n), n)
71+
} else {
72+
make::const_param(generic_name, const_ty(ctx, &n))
5973
}
60-
Right(n) => {
61-
let param = make::const_default_param(generic_name, const_ty(ctx, &n), n)
62-
.clone_for_update();
63-
generic_list.add_generic_param(param.into());
64-
65-
if let Some(ast::GenericParam::ConstParam(param)) =
66-
generic_list.generic_params().last()
67-
&& let Some(ast::Type::InferType(ty)) = param.ty()
68-
&& let Some(cap) = ctx.config.snippet_cap
69-
{
70-
let annotation = edit.make_placeholder_snippet(cap);
71-
editor.add_annotation(ty.syntax(), annotation);
72-
}
74+
.clone_for_update();
75+
76+
generic_list.add_generic_param(param.into());
77+
78+
if let Some(ast::GenericParam::ConstParam(param)) =
79+
generic_list.generic_params().last()
80+
&& let Some(ast::Type::InferType(ty)) = param.ty()
81+
&& let Some(cap) = ctx.config.snippet_cap
82+
{
83+
let annotation = edit.make_placeholder_snippet(cap);
84+
editor.add_annotation(ty.syntax(), annotation);
7385
}
7486
}
87+
}
7588

76-
edit.add_file_edits(ctx.vfs_file_id(), editor);
77-
},
78-
)
89+
edit.add_file_edits(ctx.vfs_file_id(), editor);
90+
})
7991
}
8092

8193
fn array_index_type(n: &ast::ConstArg) -> Option<ast::Type> {
@@ -184,7 +196,7 @@ mod tests {
184196
check_assist(
185197
extract_to_default_generic,
186198
r#"fn foo(x: $0i32$0) {}"#,
187-
r#"fn foo<T = i32>(x: T) {}"#,
199+
r#"fn foo<T>(x: T) {}"#,
188200
);
189201
}
190202

0 commit comments

Comments
 (0)