Skip to content

Commit ec71899

Browse files
committed
fix: Support generics in extract_function assist
This change attempts to resolve issue #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 2836dd1 commit ec71899

File tree

2 files changed

+294
-8
lines changed

2 files changed

+294
-8
lines changed

crates/hir/src/lib.rs

+9
Original file line numberDiff line numberDiff line change
@@ -3307,6 +3307,15 @@ impl Type {
33073307
let tys = hir_ty::replace_errors_with_variables(&(self.ty.clone(), to.ty.clone()));
33083308
hir_ty::could_coerce(db, self.env.clone(), &tys)
33093309
}
3310+
3311+
pub fn as_type_param(&self, db: &dyn HirDatabase) -> Option<TypeParam> {
3312+
match self.ty.kind(Interner) {
3313+
TyKind::Placeholder(p) => Some(TypeParam {
3314+
id: TypeParamId::from_unchecked(hir_ty::from_placeholder_idx(db, *p)),
3315+
}),
3316+
_ => None,
3317+
}
3318+
}
33103319
}
33113320

33123321
#[derive(Debug)]

0 commit comments

Comments
 (0)