diff options
| author | Lukas Wirth <lukastw97@gmail.com> | 2022-03-26 18:46:49 +0100 |
|---|---|---|
| committer | Lukas Wirth <lukastw97@gmail.com> | 2022-03-26 18:46:49 +0100 |
| commit | 9b046d105170ea1eb4ef7556fc8f5e0eb81a2b3e (patch) | |
| tree | fa10c548c54596ae34c42540c2abd99b4d4eab88 | |
| parent | e55ed520039983b322bff424e1a1dfa777d401d2 (diff) | |
| download | rust-9b046d105170ea1eb4ef7556fc8f5e0eb81a2b3e.tar.gz rust-9b046d105170ea1eb4ef7556fc8f5e0eb81a2b3e.zip | |
fix: Don't complete Drop::drop for qualified paths
| -rw-r--r-- | crates/ide_completion/src/completions/qualified_path.rs | 16 | ||||
| -rw-r--r-- | crates/ide_completion/src/tests/expression.rs | 17 |
2 files changed, 28 insertions, 5 deletions
diff --git a/crates/ide_completion/src/completions/qualified_path.rs b/crates/ide_completion/src/completions/qualified_path.rs index ad93be4210a..c1f23ceecaf 100644 --- a/crates/ide_completion/src/completions/qualified_path.rs +++ b/crates/ide_completion/src/completions/qualified_path.rs @@ -1,6 +1,7 @@ //! Completion of paths, i.e. `some::prefix::$0`. use hir::{ScopeDef, Trait}; +use ide_db::famous_defs::FamousDefs; use rustc_hash::FxHashSet; use syntax::ast; @@ -23,6 +24,13 @@ pub(crate) fn complete_qualified_path(acc: &mut Completions, ctx: &CompletionCon Some(PathCompletionCtx { qualifier: Some(ref qualifier), kind, .. }) => (qualifier, kind), _ => return, }; + let traits_in_scope = |ctx: &CompletionContext| { + let mut traits_in_scope = ctx.scope.visible_traits(); + if let Some(drop) = FamousDefs(&ctx.sema, ctx.krate).core_ops_Drop() { + traits_in_scope.remove(&drop.into()); + } + traits_in_scope + }; // special case `<_>::$0` as this doesn't resolve to anything. if qualifier.path.qualifier().is_none() { @@ -34,8 +42,7 @@ pub(crate) fn complete_qualified_path(acc: &mut Completions, ctx: &CompletionCon }) ) { cov_mark::hit!(completion_type_anchor_empty); - ctx.scope - .visible_traits() + traits_in_scope(ctx) .into_iter() .flat_map(|it| Trait::from(it).items(ctx.sema.db)) .for_each(|item| add_assoc_item(acc, ctx, item)); @@ -141,7 +148,7 @@ pub(crate) fn complete_qualified_path(acc: &mut Completions, ctx: &CompletionCon let krate = ctx.krate; if let Some(krate) = krate { - let traits_in_scope = ctx.scope.visible_traits(); + let traits_in_scope = traits_in_scope(ctx); ty.iterate_path_candidates( ctx.db, &ctx.scope, @@ -179,8 +186,7 @@ pub(crate) fn complete_qualified_path(acc: &mut Completions, ctx: &CompletionCon if let Some(hir::Adt::Enum(e)) = ty.as_adt() { add_enum_variants(acc, ctx, e); } - - let traits_in_scope = ctx.scope.visible_traits(); + let traits_in_scope = traits_in_scope(ctx); let mut seen = FxHashSet::default(); ty.iterate_path_candidates( ctx.db, diff --git a/crates/ide_completion/src/tests/expression.rs b/crates/ide_completion/src/tests/expression.rs index f38c504fab8..de283c705d0 100644 --- a/crates/ide_completion/src/tests/expression.rs +++ b/crates/ide_completion/src/tests/expression.rs @@ -554,6 +554,23 @@ fn func() { } #[test] +fn ty_qualified_no_drop() { + check_empty( + r#" +//- minicore: drop +struct Foo; +impl Drop for Foo { + fn drop(&mut self) {} +} +fn func() { + Foo::$0 +} +"#, + expect![[r#""#]], + ); +} + +#[test] fn with_parens() { check_empty( r#" |
