From 37a8cec6386d57e76b3067af48c78867aa9922ed Mon Sep 17 00:00:00 2001 From: Vladyslav Katasonov Date: Sat, 13 Feb 2021 21:46:21 +0300 Subject: [PATCH] expose hir::Type::type_paramters Used to get E parameter from `Result` --- .../assists/src/handlers/extract_function.rs | 29 ++++--------------- crates/hir/src/code_model.rs | 12 ++++++++ 2 files changed, 17 insertions(+), 24 deletions(-) diff --git a/crates/assists/src/handlers/extract_function.rs b/crates/assists/src/handlers/extract_function.rs index 74fa2013cc4..9f34cc7250f 100644 --- a/crates/assists/src/handlers/extract_function.rs +++ b/crates/assists/src/handlers/extract_function.rs @@ -1131,8 +1131,11 @@ fn make_ret_ty(ctx: &AssistContext, module: hir::Module, fun: &Function) -> Opti make::ty_generic(make::name_ref("Option"), iter::once(fun_ty.make_ty(ctx, module))) } FlowHandler::Try { kind: TryKind::Result { ty: parent_ret_ty } } => { - let handler_ty = - result_err_ty(parent_ret_ty, ctx, module).unwrap_or_else(make::ty_unit); + let handler_ty = parent_ret_ty + .type_parameters() + .nth(1) + .map(|ty| make_ty(&ty, ctx, module)) + .unwrap_or_else(make::ty_unit); make::ty_generic( make::name_ref("Result"), vec![fun_ty.make_ty(ctx, module), handler_ty], @@ -1161,28 +1164,6 @@ fn make_ret_ty(ctx: &AssistContext, module: hir::Module, fun: &Function) -> Opti Some(make::ret_type(ret_ty)) } -/// Extract `E` type from `Result` -fn result_err_ty( - parent_ret_ty: &hir::Type, - ctx: &AssistContext, - module: hir::Module, -) -> Option { - // FIXME: use hir to extract argument information - // currently we use `format -> take part -> parse` - let path_ty = match make_ty(&parent_ret_ty, ctx, module) { - ast::Type::PathType(path_ty) => path_ty, - _ => return None, - }; - let arg_list = path_ty.path()?.segment()?.generic_arg_list()?; - let err_arg = arg_list.generic_args().nth(1)?; - let type_arg = match err_arg { - ast::GenericArg::TypeArg(type_arg) => type_arg, - _ => return None, - }; - - type_arg.ty() -} - fn make_body( ctx: &AssistContext, old_indent: IndentLevel, diff --git a/crates/hir/src/code_model.rs b/crates/hir/src/code_model.rs index 35b53260216..7d43d409719 100644 --- a/crates/hir/src/code_model.rs +++ b/crates/hir/src/code_model.rs @@ -1802,6 +1802,18 @@ impl Type { None } + pub fn type_parameters(&self) -> impl Iterator + '_ { + let ty = self.ty.value.strip_references(); + let substs = match ty { + Ty::Apply(apply_ty) => &apply_ty.parameters, + Ty::Opaque(opaque_ty) => &opaque_ty.parameters, + _ => return Either::Left(iter::empty()), + }; + + let iter = substs.iter().map(move |ty| self.derived(ty.clone())); + Either::Right(iter) + } + pub fn iterate_method_candidates( &self, db: &dyn HirDatabase,