X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=crates%2Fide_completion%2Fsrc%2Fcompletions%2Frecord.rs;h=78d06231060d766dd78629e562792fcc6b23b51b;hb=24255e5b3dbabe7eaec1a42668d50d96d6b1aa0f;hp=54fc748d1c4822f8cf6b3a57051e4cc100036c71;hpb=4aa2a44a55ecd0fe31a22bb02bebbf93dd319ec9;p=rust.git diff --git a/crates/ide_completion/src/completions/record.rs b/crates/ide_completion/src/completions/record.rs index 54fc748d1c4..78d06231060 100644 --- a/crates/ide_completion/src/completions/record.rs +++ b/crates/ide_completion/src/completions/record.rs @@ -1,10 +1,10 @@ //! Complete fields in record literals and patterns. -use ide_db::{helpers::FamousDefs, SymbolKind}; +use ide_db::SymbolKind; use syntax::{ast::Expr, T}; use crate::{ - item::CompletionKind, patterns::ImmediateLocation, CompletionContext, CompletionItem, - CompletionItemKind, Completions, + patterns::ImmediateLocation, CompletionContext, CompletionItem, CompletionItemKind, + CompletionRelevance, Completions, }; pub(crate) fn complete_record(acc: &mut Completions, ctx: &CompletionContext) -> Option<()> { @@ -14,28 +14,28 @@ pub(crate) fn complete_record(acc: &mut Completions, ctx: &CompletionContext) -> | ImmediateLocation::RecordExprUpdate(record_expr), ) => { let ty = ctx.sema.type_of_expr(&Expr::RecordExpr(record_expr.clone())); - let default_trait = FamousDefs(&ctx.sema, ctx.krate).core_default_Default(); + let default_trait = ctx.famous_defs().core_default_Default(); let impl_default_trait = default_trait.zip(ty).map_or(false, |(default_trait, ty)| { ty.original.impls_trait(ctx.db, default_trait, &[]) }); let missing_fields = ctx.sema.record_literal_missing_fields(record_expr); - if impl_default_trait && !missing_fields.is_empty() { + if impl_default_trait && !missing_fields.is_empty() && ctx.path_qual().is_none() { let completion_text = "..Default::default()"; - let mut item = CompletionItem::new( - CompletionKind::Snippet, - ctx.source_range(), - completion_text, - ); + let mut item = + CompletionItem::new(SymbolKind::Field, ctx.source_range(), completion_text); let completion_text = completion_text.strip_prefix(ctx.token.text()).unwrap_or(completion_text); - item.insert_text(completion_text).kind(SymbolKind::Field); + item.insert_text(completion_text).set_relevance(CompletionRelevance { + exact_postfix_snippet_match: true, + ..Default::default() + }); item.add_to(acc); } if ctx.previous_token_is(T![.]) { let mut item = - CompletionItem::new(CompletionKind::Snippet, ctx.source_range(), ".."); - item.insert_text(".").kind(CompletionItemKind::Snippet); + CompletionItem::new(CompletionItemKind::Snippet, ctx.source_range(), ".."); + item.insert_text("."); item.add_to(acc); return None; } @@ -63,7 +63,12 @@ pub(crate) fn complete_record_literal( } if let hir::Adt::Struct(strukt) = ctx.expected_type.as_ref()?.as_adt()? { - acc.add_struct_literal(ctx, strukt, None); + if ctx.path_qual().is_none() { + let module = if let Some(module) = ctx.module { module } else { strukt.module(ctx.db) }; + let path = module.find_use_path(ctx.db, hir::ModuleDef::from(strukt)); + + acc.add_struct_literal(ctx, strukt, path, None); + } } Some(()) @@ -98,6 +103,35 @@ fn baz() { ) } + #[test] + fn literal_struct_completion_from_sub_modules() { + check_edit( + "Struct {…}", + r#" +mod submod { + pub struct Struct { + pub a: u64, + } +} + +fn f() -> submod::Struct { + Stru$0 +} + "#, + r#" +mod submod { + pub struct Struct { + pub a: u64, + } +} + +fn f() -> submod::Struct { + submod::Struct { a: ${1:()} }$0 +} + "#, + ) + } + #[test] fn literal_struct_complexion_module() { check_edit(