From ca49fbe0a1f6acc1352f6628c36bb7dfe3a950e5 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Fri, 28 May 2021 14:02:53 +0200 Subject: Complete `self.` prefixed fields and methods inside methods --- crates/ide_completion/src/render/function.rs | 36 ++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 5 deletions(-) (limited to 'crates/ide_completion/src/render') diff --git a/crates/ide_completion/src/render/function.rs b/crates/ide_completion/src/render/function.rs index 63bd66926..b3ba6114d 100644 --- a/crates/ide_completion/src/render/function.rs +++ b/crates/ide_completion/src/render/function.rs @@ -20,23 +20,25 @@ pub(crate) fn render_fn<'a>( fn_: hir::Function, ) -> Option { let _p = profile::span("render_fn"); - Some(FunctionRender::new(ctx, local_name, fn_, false)?.render(import_to_add)) + Some(FunctionRender::new(ctx, None, local_name, fn_, false)?.render(import_to_add)) } pub(crate) fn render_method<'a>( ctx: RenderContext<'a>, import_to_add: Option, + receiver: Option, local_name: Option, fn_: hir::Function, ) -> Option { let _p = profile::span("render_method"); - Some(FunctionRender::new(ctx, local_name, fn_, true)?.render(import_to_add)) + Some(FunctionRender::new(ctx, receiver, local_name, fn_, true)?.render(import_to_add)) } #[derive(Debug)] struct FunctionRender<'a> { ctx: RenderContext<'a>, name: String, + receiver: Option, func: hir::Function, ast_node: Fn, is_method: bool, @@ -45,6 +47,7 @@ struct FunctionRender<'a> { impl<'a> FunctionRender<'a> { fn new( ctx: RenderContext<'a>, + receiver: Option, local_name: Option, fn_: hir::Function, is_method: bool, @@ -52,11 +55,14 @@ impl<'a> FunctionRender<'a> { let name = local_name.unwrap_or_else(|| fn_.name(ctx.db())).to_string(); let ast_node = fn_.source(ctx.db())?.value; - Some(FunctionRender { ctx, name, func: fn_, ast_node, is_method }) + Some(FunctionRender { ctx, name, receiver, func: fn_, ast_node, is_method }) } - fn render(self, import_to_add: Option) -> CompletionItem { + fn render(mut self, import_to_add: Option) -> CompletionItem { let params = self.params(); + if let Some(receiver) = &self.receiver { + self.name = format!("{}.{}", receiver, &self.name) + } let mut item = CompletionItem::new( CompletionKind::Reference, self.ctx.source_range(), @@ -148,7 +154,7 @@ impl<'a> FunctionRender<'a> { }; let mut params_pats = Vec::new(); - let params_ty = if self.ctx.completion.dot_receiver.is_some() { + let params_ty = if self.ctx.completion.dot_receiver.is_some() || self.receiver.is_some() { self.func.method_params(self.ctx.db()).unwrap_or_default() } else { if let Some(s) = ast_params.self_param() { @@ -253,6 +259,26 @@ impl S { fn bar(s: &S) { s.foo(${1:x})$0 } +"#, + ); + + check_edit( + "self.foo", + r#" +struct S {} +impl S { + fn foo(&self, x: i32) { + $0 + } +} +"#, + r#" +struct S {} +impl S { + fn foo(&self, x: i32) { + self.foo(${1:x})$0 + } +} "#, ); } -- cgit v1.2.3