Skip to content

Commit a0ac31b

Browse files
committed
fix: Support generics in extract_function assist
This change attempts to resolve issue rust-lang#7637: Extract into Function does not create a generic function with constraints when extracting generic code. In `FunctionBody::analyze_container`, when the ancestor matches `ast::Fn`, we can perserve both the `generic_param_list` and the `where_clause`. These can then be included in the newly extracted function output via `format_function`. From what I can tell, the only other ancestor type that could potentially have a generic param list would be `ast::ClosureExpr`. In this case, we perserve the `generic_param_list`, but no where clause is ever present. In this initial implementation, only generic type parameters (and their associated where clauses) which are referenced in the extracted function body are copied to the new function signature. Const and Lifetime params are ignored for now. I don't believe this implementation will work in contexts where the generic parameters and where clauses are defined multiple layers above the function being extracted, such as with nested function declarations. Resolving this seems like another obvious improvement, but one that will potentially require more significant changes to the structure of `analyze_container` that I wasn't comfortable trying to make as a first change.
1 parent ce36446 commit a0ac31b

File tree

2 files changed

+292
-8
lines changed

2 files changed

+292
-8
lines changed

crates/hir/src/lib.rs

+9
Original file line numberDiff line numberDiff line change
@@ -3285,6 +3285,15 @@ impl Type {
32853285
let tys = hir_ty::replace_errors_with_variables(&(self.ty.clone(), to.ty.clone()));
32863286
hir_ty::could_coerce(db, self.env.clone(), &tys)
32873287
}
3288+
3289+
pub fn as_type_param(&self, db: &dyn HirDatabase) -> Option<TypeParam> {
3290+
match self.ty.kind(Interner) {
3291+
TyKind::Placeholder(p) => Some(TypeParam {
3292+
id: TypeParamId::from_unchecked(hir_ty::from_placeholder_idx(db, *p)),
3293+
}),
3294+
_ => None,
3295+
}
3296+
}
32883297
}
32893298

32903299
#[derive(Debug)]

0 commit comments

Comments
 (0)