Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide_completion/src/render/enum_variant.rs')
| -rw-r--r-- | crates/ide_completion/src/render/enum_variant.rs | 91 |
1 files changed, 34 insertions, 57 deletions
diff --git a/crates/ide_completion/src/render/enum_variant.rs b/crates/ide_completion/src/render/enum_variant.rs index 914ace910d..5b485005d3 100644 --- a/crates/ide_completion/src/render/enum_variant.rs +++ b/crates/ide_completion/src/render/enum_variant.rs @@ -1,13 +1,15 @@ //! Renderer for `enum` variants. -use hir::{db::HirDatabase, HasAttrs, HirDisplay, StructKind}; +use hir::{HasAttrs, StructKind}; use ide_db::SymbolKind; -use itertools::Itertools; use syntax::SmolStr; use crate::{ item::{CompletionItem, ImportEdit}, - render::{builder_ext::Params, compute_ref_match, compute_type_match, RenderContext}, + render::{ + compound::{format_literal_label, render_record, render_tuple, RenderedCompound}, + compute_ref_match, compute_type_match, RenderContext, + }, CompletionRelevance, }; @@ -46,20 +48,42 @@ fn render( let qualified_name = qualified_name.to_string(); let short_qualified_name: SmolStr = short_qualified_name.to_string().into(); - let mut item = CompletionItem::new(SymbolKind::Variant, ctx.source_range(), qualified_name); + let mut rendered = match variant_kind { + StructKind::Tuple => { + render_tuple(db, ctx.snippet_cap(), &variant.fields(db), Some(&qualified_name)) + } + StructKind::Record => { + render_record(db, ctx.snippet_cap(), &variant.fields(db), Some(&qualified_name)) + } + StructKind::Unit => { + RenderedCompound { literal: qualified_name.clone(), detail: qualified_name.clone() } + } + }; + + if ctx.snippet_cap().is_some() { + rendered.literal.push_str("$0"); + } + + let mut item = CompletionItem::new( + SymbolKind::Variant, + ctx.source_range(), + format_literal_label(&qualified_name, variant_kind), + ); + item.set_documentation(variant.docs(db)) .set_deprecated(ctx.is_deprecated(variant)) - .detail(detail(db, variant, variant_kind)); + .detail(rendered.detail); + + match ctx.snippet_cap() { + Some(snippet_cap) => item.insert_snippet(snippet_cap, rendered.literal), + None => item.insert_text(rendered.literal), + }; if let Some(import_to_add) = import_to_add { item.add_import(import_to_add); } - if variant_kind == hir::StructKind::Tuple { - cov_mark::hit!(inserts_parens_for_tuple_enums); - let params = Params::Anonymous(variant.fields(db).len()); - item.add_call_parens(completion, short_qualified_name, params); - } else if qualified { + if qualified { item.lookup_by(short_qualified_name); } @@ -75,50 +99,3 @@ fn render( item.build() } - -fn detail(db: &dyn HirDatabase, variant: hir::Variant, variant_kind: StructKind) -> String { - let detail_types = variant.fields(db).into_iter().map(|field| (field.name(db), field.ty(db))); - - match variant_kind { - hir::StructKind::Tuple | hir::StructKind::Unit => { - format!("({})", detail_types.format_with(", ", |(_, t), f| f(&t.display(db)))) - } - hir::StructKind::Record => { - format!( - "{{{}}}", - detail_types.format_with(", ", |(n, t), f| { - f(&n)?; - f(&": ")?; - f(&t.display(db)) - }), - ) - } - } -} - -#[cfg(test)] -mod tests { - use crate::tests::check_edit; - - #[test] - fn inserts_parens_for_tuple_enums() { - cov_mark::check!(inserts_parens_for_tuple_enums); - check_edit( - "Some", - r#" -enum Option<T> { Some(T), None } -use Option::*; -fn main() -> Option<i32> { - Som$0 -} -"#, - r#" -enum Option<T> { Some(T), None } -use Option::*; -fn main() -> Option<i32> { - Some($0) -} -"#, - ); - } -} |