Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/render.rs')
| -rw-r--r-- | crates/ide-completion/src/render.rs | 51 |
1 files changed, 40 insertions, 11 deletions
diff --git a/crates/ide-completion/src/render.rs b/crates/ide-completion/src/render.rs index 6d91b37916..0a9ea1ac84 100644 --- a/crates/ide-completion/src/render.rs +++ b/crates/ide-completion/src/render.rs @@ -17,7 +17,7 @@ use ide_db::{ imports::import_assets::LocatedImport, RootDatabase, SnippetCap, SymbolKind, }; -use syntax::{format_smolstr, AstNode, SmolStr, SyntaxKind, TextRange}; +use syntax::{ast, AstNode, SmolStr, SyntaxKind, TextRange}; use text_edit::TextEdit; use crate::{ @@ -275,21 +275,50 @@ pub(crate) fn render_resolution_with_import_pat( pub(crate) fn render_type_tree( ctx: &CompletionContext<'_>, expr: &hir::term_search::TypeTree, - path_ctx: &PathCompletionCtx, -) -> Builder { - let mut item = CompletionItem::new( - CompletionItemKind::Snippet, - ctx.source_range(), - expr.gen_source_code(&ctx.scope), - ); +) -> Option<Builder> { + let mut i = 1; + let mut snippet_formatter = |ty: &hir::Type| { + let arg_name = ty + .as_adt() + .and_then(|adt| adt.name(ctx.db).as_text()) + .map(|s| stdx::to_lower_snake_case(s.as_str())) + .unwrap_or_else(|| String::from("_")); + let res = format!("${{{i}:{arg_name}}}"); + i += 1; + res + }; + + let mut label_formatter = |ty: &hir::Type| { + ty.as_adt() + .and_then(|adt| adt.name(ctx.db).as_text()) + .map(|s| stdx::to_lower_snake_case(s.as_str())) + .unwrap_or_else(|| String::from("_")) + }; + + let label = expr.gen_source_code(&ctx.scope, &mut label_formatter); + + let source_range = match &ctx.expected_name { + Some(name_or_ref) => name_or_ref.syntax().text_range(), + None => match ctx.original_token.parent() { + Some(node) => match node.ancestors().find_map(|n| ast::Path::cast(n)) { + Some(path) => path.syntax().text_range(), + None => node.text_range(), + }, + None => ctx.source_range(), + }, + }; + + let mut item = CompletionItem::new(CompletionItemKind::Snippet, source_range, label); + + let snippet = format!("{}$0", expr.gen_source_code(&ctx.scope, &mut snippet_formatter)); + let edit = TextEdit::replace(source_range, snippet); + item.snippet_edit(ctx.config.snippet_cap?, edit); item.set_relevance(crate::CompletionRelevance { type_match: Some(crate::item::CompletionRelevanceTypeMatch::CouldUnify), ..Default::default() }); - path_ref_match(ctx, path_ctx, &expr.ty(ctx.sema.db), &mut item); - - item + Some(item) } fn scope_def_to_name( |