From 37a8cec6386d57e76b3067af48c78867aa9922ed Mon Sep 17 00:00:00 2001 From: Vladyslav Katasonov Date: Sat, 13 Feb 2021 21:46:21 +0300 Subject: expose hir::Type::type_paramters Used to get E parameter from `Result` --- crates/assists/src/handlers/extract_function.rs | 29 +++++-------------------- 1 file changed, 5 insertions(+), 24 deletions(-) (limited to 'crates/assists') diff --git a/crates/assists/src/handlers/extract_function.rs b/crates/assists/src/handlers/extract_function.rs index 74fa2013c..9f34cc725 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, -- cgit v1.2.3