mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-28 05:53:45 +00:00
Transform paths before make::fn_
This commit is contained in:
parent
872951d2d9
commit
ba952e65ff
1 changed files with 29 additions and 18 deletions
|
@ -107,31 +107,48 @@ pub(crate) fn generate_delegate_methods(acc: &mut Assists, ctx: &AssistContext<'
|
|||
|edit| {
|
||||
// Create the function
|
||||
let method_source = match ctx.sema.source(method) {
|
||||
Some(source) => source.value,
|
||||
Some(source) => {
|
||||
let v = source.value.clone_for_update();
|
||||
let source_scope = ctx.sema.scope(v.syntax());
|
||||
let target_scope = ctx.sema.scope(strukt.syntax());
|
||||
if let (Some(s), Some(t)) = (source_scope, target_scope) {
|
||||
PathTransform::generic_transformation(&t, &s).apply(v.syntax());
|
||||
}
|
||||
v
|
||||
}
|
||||
None => return,
|
||||
};
|
||||
|
||||
let vis = method_source.visibility();
|
||||
let fn_name = make::name(&name);
|
||||
let params =
|
||||
method_source.param_list().unwrap_or_else(|| make::param_list(None, []));
|
||||
let type_params = method_source.generic_param_list();
|
||||
let arg_list = match method_source.param_list() {
|
||||
Some(list) => convert_param_list_to_arg_list(list),
|
||||
None => make::arg_list([]),
|
||||
};
|
||||
let tail_expr = make::expr_method_call(field, make::name_ref(&name), arg_list);
|
||||
let ret_type = method_source.ret_type();
|
||||
let is_async = method_source.async_token().is_some();
|
||||
let is_const = method_source.const_token().is_some();
|
||||
let is_unsafe = method_source.unsafe_token().is_some();
|
||||
|
||||
let fn_name = make::name(&name);
|
||||
|
||||
let type_params = method_source.generic_param_list();
|
||||
let where_clause = method_source.where_clause();
|
||||
let params =
|
||||
method_source.param_list().unwrap_or_else(|| make::param_list(None, []));
|
||||
|
||||
// compute the `body`
|
||||
let arg_list = method_source
|
||||
.param_list()
|
||||
.map(|list| convert_param_list_to_arg_list(list))
|
||||
.unwrap_or_else(|| make::arg_list([]));
|
||||
|
||||
let tail_expr = make::expr_method_call(field, make::name_ref(&name), arg_list);
|
||||
let tail_expr_finished =
|
||||
if is_async { make::expr_await(tail_expr) } else { tail_expr };
|
||||
let body = make::block_expr([], Some(tail_expr_finished));
|
||||
|
||||
let ret_type = method_source.ret_type();
|
||||
|
||||
let f = make::fn_(
|
||||
vis,
|
||||
fn_name,
|
||||
type_params,
|
||||
method_source.where_clause(),
|
||||
where_clause,
|
||||
params,
|
||||
body,
|
||||
ret_type,
|
||||
|
@ -184,12 +201,6 @@ pub(crate) fn generate_delegate_methods(acc: &mut Assists, ctx: &AssistContext<'
|
|||
let assoc_items = impl_def.get_or_create_assoc_item_list();
|
||||
assoc_items.add_item(f.clone().into());
|
||||
|
||||
if let Some((target, source)) =
|
||||
ctx.sema.scope(strukt.syntax()).zip(ctx.sema.scope(method_source.syntax()))
|
||||
{
|
||||
PathTransform::generic_transformation(&target, &source).apply(f.syntax());
|
||||
}
|
||||
|
||||
if let Some(cap) = ctx.config.snippet_cap {
|
||||
edit.add_tabstop_before(cap, f)
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue