Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit d79807c

Browse files
committedJul 8, 2022
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 c419aa9 commit d79807c

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
@@ -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)
Please sign in to comment.