diff options
| -rw-r--r-- | crates/hir/src/lib.rs | 2 | ||||
| -rw-r--r-- | crates/ide_completion/src/completions.rs | 2 | ||||
| -rw-r--r-- | crates/ide_completion/src/completions/lifetime.rs | 4 | ||||
| -rw-r--r-- | crates/ide_completion/src/completions/pattern.rs | 2 | ||||
| -rw-r--r-- | crates/ide_completion/src/completions/qualified_path.rs | 12 | ||||
| -rw-r--r-- | crates/ide_completion/src/completions/unqualified_path.rs | 10 | ||||
| -rw-r--r-- | crates/ide_completion/src/context.rs | 6 | ||||
| -rw-r--r-- | crates/ide_completion/src/render.rs | 111 |
8 files changed, 71 insertions, 78 deletions
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index b57f49690ac..526e90bd0b4 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -3024,7 +3024,7 @@ impl Callable { } /// For IDE only -#[derive(Debug, PartialEq, Eq, Hash)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] pub enum ScopeDef { ModuleDef(ModuleDef), MacroDef(MacroDef), diff --git a/crates/ide_completion/src/completions.rs b/crates/ide_completion/src/completions.rs index 8474ebec0d9..53f5ad49921 100644 --- a/crates/ide_completion/src/completions.rs +++ b/crates/ide_completion/src/completions.rs @@ -84,7 +84,7 @@ impl Completions { &mut self, ctx: &CompletionContext, local_name: hir::Name, - resolution: &hir::ScopeDef, + resolution: hir::ScopeDef, ) { if ctx.is_scope_def_hidden(resolution) { cov_mark::hit!(qualified_path_doc_hidden); diff --git a/crates/ide_completion/src/completions/lifetime.rs b/crates/ide_completion/src/completions/lifetime.rs index f5308254346..4082414f029 100644 --- a/crates/ide_completion/src/completions/lifetime.rs +++ b/crates/ide_completion/src/completions/lifetime.rs @@ -35,7 +35,7 @@ pub(crate) fn complete_lifetime(acc: &mut Completions, ctx: &CompletionContext) ctx.scope.process_all_names(&mut |name, res| { if let ScopeDef::GenericParam(hir::GenericParam::LifetimeParam(_)) = res { if param_lifetime != Some(&*name.to_smol_str()) { - acc.add_resolution(ctx, name, &res); + acc.add_resolution(ctx, name, res); } } }); @@ -51,7 +51,7 @@ pub(crate) fn complete_label(acc: &mut Completions, ctx: &CompletionContext) { } ctx.scope.process_all_names(&mut |name, res| { if let ScopeDef::Label(_) = res { - acc.add_resolution(ctx, name, &res); + acc.add_resolution(ctx, name, res); } }); } diff --git a/crates/ide_completion/src/completions/pattern.rs b/crates/ide_completion/src/completions/pattern.rs index b3b27f251f6..a140ca4239b 100644 --- a/crates/ide_completion/src/completions/pattern.rs +++ b/crates/ide_completion/src/completions/pattern.rs @@ -59,7 +59,7 @@ pub(crate) fn complete_pattern(acc: &mut Completions, ctx: &CompletionContext) { _ => false, }; if add_resolution { - acc.add_resolution(ctx, name, &res); + acc.add_resolution(ctx, name, res); } }); } diff --git a/crates/ide_completion/src/completions/qualified_path.rs b/crates/ide_completion/src/completions/qualified_path.rs index a0d6d5cdc6b..1af7ac95206 100644 --- a/crates/ide_completion/src/completions/qualified_path.rs +++ b/crates/ide_completion/src/completions/qualified_path.rs @@ -44,7 +44,7 @@ pub(crate) fn complete_qualified_path(acc: &mut Completions, ctx: &CompletionCon } } if let ScopeDef::ModuleDef(hir::ModuleDef::Module(_)) = def { - acc.add_resolution(ctx, name, &def); + acc.add_resolution(ctx, name, def); } } } @@ -64,7 +64,7 @@ pub(crate) fn complete_qualified_path(acc: &mut Completions, ctx: &CompletionCon .next() { if let Some(name) = next.name(ctx.db) { - acc.add_resolution(ctx, name, &ScopeDef::ModuleDef(next.into())); + acc.add_resolution(ctx, name, ScopeDef::ModuleDef(next.into())); } } } @@ -80,7 +80,7 @@ pub(crate) fn complete_qualified_path(acc: &mut Completions, ctx: &CompletionCon _ => false, }; if add_resolution { - acc.add_resolution(ctx, name, &def); + acc.add_resolution(ctx, name, def); } } } @@ -147,14 +147,12 @@ pub(crate) fn complete_qualified_path(acc: &mut Completions, ctx: &CompletionCon }; if add_resolution { - acc.add_resolution(ctx, name, &def); + acc.add_resolution(ctx, name, def); } } } hir::PathResolution::Def( - def - @ - (hir::ModuleDef::Adt(_) + def @ (hir::ModuleDef::Adt(_) | hir::ModuleDef::TypeAlias(_) | hir::ModuleDef::BuiltinType(_)), ) => { diff --git a/crates/ide_completion/src/completions/unqualified_path.rs b/crates/ide_completion/src/completions/unqualified_path.rs index ac1ba2da7c4..e7980c12d77 100644 --- a/crates/ide_completion/src/completions/unqualified_path.rs +++ b/crates/ide_completion/src/completions/unqualified_path.rs @@ -24,7 +24,7 @@ pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionC cov_mark::hit!(unqualified_path_only_modules_in_import); ctx.process_all_names(&mut |name, res| { if let ScopeDef::ModuleDef(hir::ModuleDef::Module(_)) = res { - acc.add_resolution(ctx, name, &res); + acc.add_resolution(ctx, name, res); } }); @@ -43,7 +43,7 @@ pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionC _ => false, }; if add_resolution { - acc.add_resolution(ctx, name, &res); + acc.add_resolution(ctx, name, res); } }); return; @@ -61,7 +61,7 @@ pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionC } } if let hir::ScopeDef::ModuleDef(hir::ModuleDef::Module(_)) = res { - acc.add_resolution(ctx, name, &res); + acc.add_resolution(ctx, name, res); } }); return; @@ -76,7 +76,7 @@ pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionC _ => false, }; if add_resolution { - acc.add_resolution(ctx, name, &res); + acc.add_resolution(ctx, name, res); } }); return; @@ -134,7 +134,7 @@ pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionC _ => true, }; if add_resolution { - acc.add_resolution(ctx, name, &res); + acc.add_resolution(ctx, name, res); } }); } diff --git a/crates/ide_completion/src/context.rs b/crates/ide_completion/src/context.rs index c6af285e86c..d0ed9889898 100644 --- a/crates/ide_completion/src/context.rs +++ b/crates/ide_completion/src/context.rs @@ -278,7 +278,7 @@ impl<'a> CompletionContext<'a> { self.is_visible_impl(&item.visibility(self.db), &item.attrs(self.db), item.krate(self.db)) } - pub(crate) fn is_scope_def_hidden(&self, scope_def: &ScopeDef) -> bool { + pub(crate) fn is_scope_def_hidden(&self, scope_def: ScopeDef) -> bool { if let (Some(attrs), Some(krate)) = (scope_def.attrs(self.db), scope_def.krate(self.db)) { return self.is_doc_hidden(&attrs, krate); } @@ -303,7 +303,7 @@ impl<'a> CompletionContext<'a> { /// A version of [`SemanticsScope::process_all_names`] that filters out `#[doc(hidden)]` items. pub(crate) fn process_all_names(&self, f: &mut dyn FnMut(Name, ScopeDef)) { self.scope.process_all_names(&mut |name, def| { - if self.is_scope_def_hidden(&def) { + if self.is_scope_def_hidden(def) { return; } @@ -367,7 +367,7 @@ impl<'a> CompletionContext<'a> { parse.reparse(&edit).tree() }; let fake_ident_token = - file_with_fake_ident.syntax().token_at_offset(offset).right_biased().unwrap(); + file_with_fake_ident.syntax().token_at_offset(offset).right_biased()?; let original_token = original_file.syntax().token_at_offset(offset).left_biased()?; let token = sema.descend_into_macros_single(original_token.clone()); diff --git a/crates/ide_completion/src/render.rs b/crates/ide_completion/src/render.rs index 4b4fbb3ed9e..f26fc3ec1fb 100644 --- a/crates/ide_completion/src/render.rs +++ b/crates/ide_completion/src/render.rs @@ -11,7 +11,7 @@ pub(crate) mod struct_literal; mod builder_ext; -use hir::{AsAssocItem, HasAttrs, HirDisplay}; +use hir::{AsAssocItem, HasAttrs, HirDisplay, ScopeDef}; use ide_db::{ helpers::{item_name, SnippetCap}, RootDatabase, SymbolKind, @@ -128,7 +128,7 @@ pub(crate) fn render_tuple_field( pub(crate) fn render_resolution( ctx: RenderContext<'_>, local_name: hir::Name, - resolution: &hir::ScopeDef, + resolution: ScopeDef, ) -> Option<CompletionItem> { render_resolution_(ctx, local_name, None, resolution) } @@ -137,80 +137,75 @@ pub(crate) fn render_resolution_with_import( ctx: RenderContext<'_>, import_edit: ImportEdit, ) -> Option<CompletionItem> { - let resolution = hir::ScopeDef::from(import_edit.import.original_item); + let resolution = ScopeDef::from(import_edit.import.original_item); let local_name = match resolution { - hir::ScopeDef::ModuleDef(hir::ModuleDef::Function(f)) => f.name(ctx.completion.db), - hir::ScopeDef::ModuleDef(hir::ModuleDef::Const(c)) => c.name(ctx.completion.db)?, - hir::ScopeDef::ModuleDef(hir::ModuleDef::TypeAlias(t)) => t.name(ctx.completion.db), + ScopeDef::ModuleDef(hir::ModuleDef::Function(f)) => f.name(ctx.completion.db), + ScopeDef::ModuleDef(hir::ModuleDef::Const(c)) => c.name(ctx.completion.db)?, + ScopeDef::ModuleDef(hir::ModuleDef::TypeAlias(t)) => t.name(ctx.completion.db), _ => item_name(ctx.db(), import_edit.import.original_item)?, }; - render_resolution_(ctx, local_name, Some(import_edit), &resolution) + render_resolution_(ctx, local_name, Some(import_edit), resolution) } fn render_resolution_( ctx: RenderContext<'_>, local_name: hir::Name, import_to_add: Option<ImportEdit>, - resolution: &hir::ScopeDef, + resolution: ScopeDef, ) -> Option<CompletionItem> { let _p = profile::span("render_resolution"); use hir::ModuleDef::*; let kind = match resolution { - hir::ScopeDef::ModuleDef(Function(func)) => { - return render_fn(ctx, import_to_add, Some(local_name), *func); + ScopeDef::ModuleDef(Function(func)) => { + return render_fn(ctx, import_to_add, Some(local_name), func) } - hir::ScopeDef::ModuleDef(Variant(_)) if ctx.completion.pattern_ctx.is_some() => { - CompletionItemKind::SymbolKind(SymbolKind::Variant) + ScopeDef::ModuleDef(Variant(var)) if ctx.completion.pattern_ctx.is_none() => { + return Some(render_variant(ctx, import_to_add, Some(local_name), var, None)) } - hir::ScopeDef::ModuleDef(Variant(var)) => { - let item = render_variant(ctx, import_to_add, Some(local_name), *var, None); - return Some(item); - } - hir::ScopeDef::MacroDef(mac) => { - let item = render_macro(ctx, import_to_add, local_name, *mac); + ScopeDef::MacroDef(mac) => { + let item = render_macro(ctx, import_to_add, local_name, mac); return item; } + ScopeDef::Unknown => { + let mut item = CompletionItem::new( + CompletionItemKind::UnresolvedReference, + ctx.source_range(), + local_name.to_smol_str(), + ); + if let Some(import_to_add) = import_to_add { + item.add_import(import_to_add); + } + return Some(item.build()); + } - hir::ScopeDef::ModuleDef(Module(..)) => CompletionItemKind::SymbolKind(SymbolKind::Module), - hir::ScopeDef::ModuleDef(Adt(adt)) => CompletionItemKind::SymbolKind(match adt { + ScopeDef::ModuleDef(Variant(_)) => CompletionItemKind::SymbolKind(SymbolKind::Variant), + ScopeDef::ModuleDef(Module(..)) => CompletionItemKind::SymbolKind(SymbolKind::Module), + ScopeDef::ModuleDef(Adt(adt)) => CompletionItemKind::SymbolKind(match adt { hir::Adt::Struct(_) => SymbolKind::Struct, hir::Adt::Union(_) => SymbolKind::Union, hir::Adt::Enum(_) => SymbolKind::Enum, }), - hir::ScopeDef::ModuleDef(Const(..)) => CompletionItemKind::SymbolKind(SymbolKind::Const), - hir::ScopeDef::ModuleDef(Static(..)) => CompletionItemKind::SymbolKind(SymbolKind::Static), - hir::ScopeDef::ModuleDef(Trait(..)) => CompletionItemKind::SymbolKind(SymbolKind::Trait), - hir::ScopeDef::ModuleDef(TypeAlias(..)) => { - CompletionItemKind::SymbolKind(SymbolKind::TypeAlias) - } - hir::ScopeDef::ModuleDef(BuiltinType(..)) => CompletionItemKind::BuiltinType, - hir::ScopeDef::GenericParam(param) => CompletionItemKind::SymbolKind(match param { + ScopeDef::ModuleDef(Const(..)) => CompletionItemKind::SymbolKind(SymbolKind::Const), + ScopeDef::ModuleDef(Static(..)) => CompletionItemKind::SymbolKind(SymbolKind::Static), + ScopeDef::ModuleDef(Trait(..)) => CompletionItemKind::SymbolKind(SymbolKind::Trait), + ScopeDef::ModuleDef(TypeAlias(..)) => CompletionItemKind::SymbolKind(SymbolKind::TypeAlias), + ScopeDef::ModuleDef(BuiltinType(..)) => CompletionItemKind::BuiltinType, + ScopeDef::GenericParam(param) => CompletionItemKind::SymbolKind(match param { hir::GenericParam::TypeParam(_) => SymbolKind::TypeParam, hir::GenericParam::LifetimeParam(_) => SymbolKind::LifetimeParam, hir::GenericParam::ConstParam(_) => SymbolKind::ConstParam, }), - hir::ScopeDef::Local(..) => CompletionItemKind::SymbolKind(SymbolKind::Local), - hir::ScopeDef::Label(..) => CompletionItemKind::SymbolKind(SymbolKind::Label), - hir::ScopeDef::AdtSelfType(..) | hir::ScopeDef::ImplSelfType(..) => { + ScopeDef::Local(..) => CompletionItemKind::SymbolKind(SymbolKind::Local), + ScopeDef::Label(..) => CompletionItemKind::SymbolKind(SymbolKind::Label), + ScopeDef::AdtSelfType(..) | ScopeDef::ImplSelfType(..) => { CompletionItemKind::SymbolKind(SymbolKind::SelfParam) } - hir::ScopeDef::Unknown => { - let mut item = CompletionItem::new( - CompletionItemKind::UnresolvedReference, - ctx.source_range(), - local_name.to_smol_str(), - ); - if let Some(import_to_add) = import_to_add { - item.add_import(import_to_add); - } - return Some(item.build()); - } }; let local_name = local_name.to_smol_str(); let mut item = CompletionItem::new(kind, ctx.source_range(), local_name.clone()); - if let hir::ScopeDef::Local(local) = resolution { + if let ScopeDef::Local(local) = resolution { let ty = local.ty(ctx.db()); if !ty.is_unknown() { item.detail(ty.display(ctx.db()).to_string()); @@ -236,8 +231,8 @@ fn render_resolution_( { if let Some(cap) = ctx.snippet_cap() { let has_non_default_type_params = match resolution { - hir::ScopeDef::ModuleDef(Adt(it)) => it.has_non_default_type_params(ctx.db()), - hir::ScopeDef::ModuleDef(TypeAlias(it)) => it.has_non_default_type_params(ctx.db()), + ScopeDef::ModuleDef(Adt(it)) => it.has_non_default_type_params(ctx.db()), + ScopeDef::ModuleDef(TypeAlias(it)) => it.has_non_default_type_params(ctx.db()), _ => false, }; if has_non_default_type_params { @@ -257,26 +252,26 @@ fn render_resolution_( Some(item.build()) } -fn scope_def_docs(db: &RootDatabase, resolution: &hir::ScopeDef) -> Option<hir::Documentation> { +fn scope_def_docs(db: &RootDatabase, resolution: ScopeDef) -> Option<hir::Documentation> { use hir::ModuleDef::*; match resolution { - hir::ScopeDef::ModuleDef(Module(it)) => it.docs(db), - hir::ScopeDef::ModuleDef(Adt(it)) => it.docs(db), - hir::ScopeDef::ModuleDef(Variant(it)) => it.docs(db), - hir::ScopeDef::ModuleDef(Const(it)) => it.docs(db), - hir::ScopeDef::ModuleDef(Static(it)) => it.docs(db), - hir::ScopeDef::ModuleDef(Trait(it)) => it.docs(db), - hir::ScopeDef::ModuleDef(TypeAlias(it)) => it.docs(db), + ScopeDef::ModuleDef(Module(it)) => it.docs(db), + ScopeDef::ModuleDef(Adt(it)) => it.docs(db), + ScopeDef::ModuleDef(Variant(it)) => it.docs(db), + ScopeDef::ModuleDef(Const(it)) => it.docs(db), + ScopeDef::ModuleDef(Static(it)) => it.docs(db), + ScopeDef::ModuleDef(Trait(it)) => it.docs(db), + ScopeDef::ModuleDef(TypeAlias(it)) => it.docs(db), _ => None, } } -fn scope_def_is_deprecated(ctx: &RenderContext<'_>, resolution: &hir::ScopeDef) -> bool { +fn scope_def_is_deprecated(ctx: &RenderContext<'_>, resolution: ScopeDef) -> bool { match resolution { - hir::ScopeDef::ModuleDef(it) => ctx.is_deprecated_assoc_item(*it), - hir::ScopeDef::MacroDef(it) => ctx.is_deprecated(*it), - hir::ScopeDef::GenericParam(it) => ctx.is_deprecated(*it), - hir::ScopeDef::AdtSelfType(it) => ctx.is_deprecated(*it), + ScopeDef::ModuleDef(it) => ctx.is_deprecated_assoc_item(it), + ScopeDef::MacroDef(it) => ctx.is_deprecated(it), + ScopeDef::GenericParam(it) => ctx.is_deprecated(it), + ScopeDef::AdtSelfType(it) => ctx.is_deprecated(it), _ => false, } } |
