From ddf2a8a948ed91bda14fef398c850c71c403ab59 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 9 Jan 2019 18:09:49 +0300 Subject: add completion detail --- crates/ra_ide_api/src/completion/completion_item.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'crates/ra_ide_api/src') diff --git a/crates/ra_ide_api/src/completion/completion_item.rs b/crates/ra_ide_api/src/completion/completion_item.rs index a25b87bee..d707a84ef 100644 --- a/crates/ra_ide_api/src/completion/completion_item.rs +++ b/crates/ra_ide_api/src/completion/completion_item.rs @@ -11,6 +11,7 @@ pub struct CompletionItem { /// completion. completion_kind: CompletionKind, label: String, + detail: Option, lookup: Option, snippet: Option, kind: Option, @@ -51,6 +52,7 @@ impl CompletionItem { Builder { completion_kind, label, + detail: None, lookup: None, snippet: None, kind: None, @@ -60,6 +62,10 @@ impl CompletionItem { pub fn label(&self) -> &str { &self.label } + /// Short one-line additional information, like a type + pub fn detail(&self) -> Option<&str> { + self.detail.as_ref().map(|it| it.as_str()) + } /// What string is used for filtering. pub fn lookup(&self) -> &str { self.lookup @@ -87,6 +93,7 @@ impl CompletionItem { pub(crate) struct Builder { completion_kind: CompletionKind, label: String, + detail: Option, lookup: Option, snippet: Option, kind: Option, @@ -100,6 +107,7 @@ impl Builder { pub(crate) fn build(self) -> CompletionItem { CompletionItem { label: self.label, + detail: self.detail, lookup: self.lookup, snippet: self.snippet, kind: self.kind, @@ -118,6 +126,10 @@ impl Builder { self.kind = Some(kind); self } + pub(crate) fn detail(mut self, detail: impl Into) -> Builder { + self.detail = Some(detail.into()); + self + } pub(super) fn from_resolution( mut self, ctx: &CompletionContext, -- cgit v1.2.3 From 56b2138d82620db946fe08ddc164c5e7e22be625 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 9 Jan 2019 18:46:02 +0300 Subject: show field types in completion --- crates/ra_ide_api/src/completion/complete_dot.rs | 14 +++++++------- crates/ra_ide_api/src/completion/completion_item.rs | 11 +++++++++-- 2 files changed, 16 insertions(+), 9 deletions(-) (limited to 'crates/ra_ide_api/src') diff --git a/crates/ra_ide_api/src/completion/complete_dot.rs b/crates/ra_ide_api/src/completion/complete_dot.rs index 5d4e60dc5..65bba6dc7 100644 --- a/crates/ra_ide_api/src/completion/complete_dot.rs +++ b/crates/ra_ide_api/src/completion/complete_dot.rs @@ -28,13 +28,13 @@ fn complete_fields(acc: &mut Completions, ctx: &CompletionContext, receiver: Ty) Ty::Adt { def_id, .. } => { match def_id.resolve(ctx.db)? { Def::Struct(s) => { - let variant_data = s.variant_data(ctx.db)?; - for field in variant_data.fields() { + for field in s.fields(ctx.db)? { CompletionItem::new( CompletionKind::Reference, field.name().to_string(), ) .kind(CompletionItemKind::Field) + .set_detail(field.ty(ctx.db)?.map(|ty| ty.to_string())) .add_to(acc); } } @@ -72,7 +72,7 @@ mod tests { a.<|> } ", - r#"the_field"#, + r#"the_field "u32""#, ); } @@ -80,14 +80,14 @@ mod tests { fn test_struct_field_completion_self() { check_ref_completion( r" - struct A { the_field: u32 } + struct A { the_field: (u32,) } impl A { fn foo(self) { self.<|> } } ", - r#"the_field"#, + r#"the_field "(u32,)""#, ); } @@ -95,14 +95,14 @@ mod tests { fn test_struct_field_completion_autoderef() { check_ref_completion( r" - struct A { the_field: u32 } + struct A { the_field: (u32, i32) } impl A { fn foo(&self) { self.<|> } } ", - r#"the_field"#, + r#"the_field "(u32, i32)""#, ); } diff --git a/crates/ra_ide_api/src/completion/completion_item.rs b/crates/ra_ide_api/src/completion/completion_item.rs index d707a84ef..334449fae 100644 --- a/crates/ra_ide_api/src/completion/completion_item.rs +++ b/crates/ra_ide_api/src/completion/completion_item.rs @@ -126,8 +126,12 @@ impl Builder { self.kind = Some(kind); self } - pub(crate) fn detail(mut self, detail: impl Into) -> Builder { - self.detail = Some(detail.into()); + #[allow(unused)] + pub(crate) fn detail(self, detail: impl Into) -> Builder { + self.set_detail(Some(detail)) + } + pub(crate) fn set_detail(mut self, detail: Option>) -> Builder { + self.detail = detail.map(Into::into); self } pub(super) fn from_resolution( @@ -239,6 +243,9 @@ impl Completions { } else { res.push_str(&c.label); } + if let Some(detail) = &c.detail { + res.push_str(&format!(" {:?}", detail)); + } if let Some(snippet) = &c.snippet { res.push_str(&format!(" {:?}", snippet)); } -- cgit v1.2.3