Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/completions.rs')
| -rw-r--r-- | crates/ide-completion/src/completions.rs | 73 |
1 files changed, 58 insertions, 15 deletions
diff --git a/crates/ide-completion/src/completions.rs b/crates/ide-completion/src/completions.rs index c1081dbde3..a0725198f7 100644 --- a/crates/ide-completion/src/completions.rs +++ b/crates/ide-completion/src/completions.rs @@ -23,13 +23,13 @@ pub(crate) mod vis; use std::iter; use hir::{known, ScopeDef}; -use ide_db::SymbolKind; +use ide_db::{imports::import_assets::LocatedImport, SymbolKind}; use syntax::ast; use crate::{ context::{ - ItemListKind, NameContext, NameKind, NameRefContext, NameRefKind, PathKind, PatternContext, - TypeLocation, Visible, + DotAccess, ItemListKind, NameContext, NameKind, NameRefContext, NameRefKind, + PathCompletionCtx, PathKind, PatternContext, TypeLocation, Visible, }, item::Builder, render::{ @@ -38,7 +38,7 @@ use crate::{ literal::{render_struct_literal, render_variant_lit}, macro_::render_macro, pattern::{render_struct_pat, render_variant_pat}, - render_field, render_resolution, render_resolution_simple, render_tuple_field, + render_field, render_path_resolution, render_resolution_simple, render_tuple_field, type_alias::{render_type_alias, render_type_alias_with_eq}, union_literal::render_union_literal, RenderContext, @@ -137,15 +137,16 @@ impl Completions { pub(crate) fn add_crate_roots(&mut self, ctx: &CompletionContext) { ctx.process_all_names(&mut |name, res| match res { ScopeDef::ModuleDef(hir::ModuleDef::Module(m)) if m.is_crate_root(ctx.db) => { - self.add_resolution(ctx, name, res); + self.add_module(ctx, m, name); } _ => (), }); } - pub(crate) fn add_resolution( + pub(crate) fn add_path_resolution( &mut self, ctx: &CompletionContext, + path_ctx: &PathCompletionCtx, local_name: hir::Name, resolution: hir::ScopeDef, ) { @@ -153,7 +154,10 @@ impl Completions { cov_mark::hit!(qualified_path_doc_hidden); return; } - self.add(render_resolution(RenderContext::new(ctx), local_name, resolution).build()); + self.add( + render_path_resolution(RenderContext::new(ctx), path_ctx, local_name, resolution) + .build(), + ); } pub(crate) fn add_resolution_simple( @@ -174,12 +178,13 @@ impl Completions { module: hir::Module, local_name: hir::Name, ) { - self.add_resolution(ctx, local_name, hir::ScopeDef::ModuleDef(module.into())); + self.add_resolution_simple(ctx, local_name, hir::ScopeDef::ModuleDef(module.into())); } pub(crate) fn add_macro( &mut self, ctx: &CompletionContext, + path_ctx: &PathCompletionCtx, mac: hir::Macro, local_name: hir::Name, ) { @@ -191,6 +196,7 @@ impl Completions { self.add( render_macro( RenderContext::new(ctx).private_editable(is_private_editable), + path_ctx, local_name, mac, ) @@ -201,6 +207,7 @@ impl Completions { pub(crate) fn add_function( &mut self, ctx: &CompletionContext, + path_ctx: &PathCompletionCtx, func: hir::Function, local_name: Option<hir::Name>, ) { @@ -212,6 +219,7 @@ impl Completions { self.add( render_fn( RenderContext::new(ctx).private_editable(is_private_editable), + path_ctx, local_name, func, ) @@ -222,6 +230,7 @@ impl Completions { pub(crate) fn add_method( &mut self, ctx: &CompletionContext, + dot_access: &DotAccess, func: hir::Function, receiver: Option<hir::Name>, local_name: Option<hir::Name>, @@ -234,6 +243,7 @@ impl Completions { self.add( render_method( RenderContext::new(ctx).private_editable(is_private_editable), + dot_access, receiver, local_name, func, @@ -242,6 +252,32 @@ impl Completions { ); } + pub(crate) fn add_method_with_import( + &mut self, + ctx: &CompletionContext, + dot_access: &DotAccess, + func: hir::Function, + import: LocatedImport, + ) { + let is_private_editable = match ctx.is_visible(&func) { + Visible::Yes => false, + Visible::Editable => true, + Visible::No => return, + }; + self.add( + render_method( + RenderContext::new(ctx) + .private_editable(is_private_editable) + .import_to_add(Some(import)), + dot_access, + None, + None, + func, + ) + .build(), + ); + } + pub(crate) fn add_const(&mut self, ctx: &CompletionContext, konst: hir::Const) { let is_private_editable = match ctx.is_visible(&konst) { Visible::Yes => false, @@ -277,11 +313,12 @@ impl Completions { pub(crate) fn add_qualified_enum_variant( &mut self, ctx: &CompletionContext, + path_ctx: &PathCompletionCtx, variant: hir::Variant, path: hir::ModPath, ) { if let Some(builder) = - render_variant_lit(RenderContext::new(ctx), None, variant, Some(path)) + render_variant_lit(RenderContext::new(ctx), path_ctx, None, variant, Some(path)) { self.add(builder.build()); } @@ -290,11 +327,12 @@ impl Completions { pub(crate) fn add_enum_variant( &mut self, ctx: &CompletionContext, + path_ctx: &PathCompletionCtx, variant: hir::Variant, local_name: Option<hir::Name>, ) { if let Some(builder) = - render_variant_lit(RenderContext::new(ctx), local_name, variant, None) + render_variant_lit(RenderContext::new(ctx), path_ctx, local_name, variant, None) { self.add(builder.build()); } @@ -324,12 +362,13 @@ impl Completions { pub(crate) fn add_struct_literal( &mut self, ctx: &CompletionContext, + path_ctx: &PathCompletionCtx, strukt: hir::Struct, path: Option<hir::ModPath>, local_name: Option<hir::Name>, ) { if let Some(builder) = - render_struct_literal(RenderContext::new(ctx), strukt, path, local_name) + render_struct_literal(RenderContext::new(ctx), path_ctx, strukt, path, local_name) { self.add(builder.build()); } @@ -369,11 +408,13 @@ impl Completions { pub(crate) fn add_variant_pat( &mut self, ctx: &CompletionContext, + pattern_ctx: &PatternContext, variant: hir::Variant, local_name: Option<hir::Name>, ) { self.add_opt(render_variant_pat( RenderContext::new(ctx), + pattern_ctx, variant, local_name.clone(), None, @@ -383,20 +424,22 @@ impl Completions { pub(crate) fn add_qualified_variant_pat( &mut self, ctx: &CompletionContext, + pattern_ctx: &PatternContext, variant: hir::Variant, path: hir::ModPath, ) { let path = Some(&path); - self.add_opt(render_variant_pat(RenderContext::new(ctx), variant, None, path)); + self.add_opt(render_variant_pat(RenderContext::new(ctx), pattern_ctx, variant, None, path)); } pub(crate) fn add_struct_pat( &mut self, ctx: &CompletionContext, + pattern_ctx: &PatternContext, strukt: hir::Struct, local_name: Option<hir::Name>, ) { - self.add_opt(render_struct_pat(RenderContext::new(ctx), strukt, local_name)); + self.add_opt(render_struct_pat(RenderContext::new(ctx), pattern_ctx, strukt, local_name)); } } @@ -541,8 +584,8 @@ pub(super) fn complete_name_ref( NameRefKind::Keyword(item) => { keyword::complete_for_and_where(acc, ctx, item); } - NameRefKind::RecordExpr(record_expr) => { - record::complete_record_expr_fields(acc, ctx, record_expr); + NameRefKind::RecordExpr { dot_prefix, expr } => { + record::complete_record_expr_fields(acc, ctx, expr, dot_prefix); } NameRefKind::Pattern(pattern_ctx) => complete_patterns(acc, ctx, pattern_ctx), } |