mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-11-15 01:17:27 +00:00
add completions to show only traits with qualified path prefix
This commit is contained in:
parent
0209c28136
commit
9897662bf7
3 changed files with 36 additions and 3 deletions
|
@ -31,6 +31,11 @@ pub(crate) fn complete_type_path(
|
|||
ScopeDef::ImplSelfType(_) => location.complete_self_type(),
|
||||
// Don't suggest attribute macros and derives.
|
||||
ScopeDef::ModuleDef(Macro(mac)) => mac.is_fn_like(ctx.db),
|
||||
ScopeDef::ModuleDef(Trait(_) | Module(_))
|
||||
if matches!(location, TypeLocation::ImplTrait) =>
|
||||
{
|
||||
true
|
||||
}
|
||||
// Type things are fine
|
||||
ScopeDef::ModuleDef(
|
||||
BuiltinType(_) | Adt(_) | Module(_) | Trait(_) | TraitAlias(_) | TypeAlias(_),
|
||||
|
@ -187,8 +192,13 @@ pub(crate) fn complete_type_path(
|
|||
TypeLocation::ImplTrait => {
|
||||
acc.add_nameref_keywords_with_colon(ctx);
|
||||
ctx.process_all_names(&mut |name, def, doc_aliases| {
|
||||
let is_trait = matches!(def, ScopeDef::ModuleDef(hir::ModuleDef::Trait(_)));
|
||||
if is_trait {
|
||||
let is_trait_or_module = matches!(
|
||||
def,
|
||||
ScopeDef::ModuleDef(
|
||||
hir::ModuleDef::Module(_) | hir::ModuleDef::Trait(_)
|
||||
)
|
||||
);
|
||||
if is_trait_or_module {
|
||||
acc.add_path_resolution(ctx, path_ctx, name, def, doc_aliases);
|
||||
}
|
||||
});
|
||||
|
|
|
@ -202,6 +202,7 @@ impl TypeLocation {
|
|||
}
|
||||
TypeLocation::AssocConstEq => false,
|
||||
TypeLocation::AssocTypeEq => true,
|
||||
TypeLocation::ImplTrait => false,
|
||||
_ => true,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -998,8 +998,10 @@ trait Foo {}
|
|||
|
||||
struct Bar;
|
||||
|
||||
impl $0 for Bar { }"#,
|
||||
impl $0 for Bar { }
|
||||
"#,
|
||||
expect![[r#"
|
||||
md module
|
||||
tt Foo
|
||||
tt Trait
|
||||
kw crate::
|
||||
|
@ -1007,3 +1009,23 @@ impl $0 for Bar { }"#,
|
|||
"#]],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn complete_traits_with_path_on_impl_trait_block() {
|
||||
check(
|
||||
r#"
|
||||
mod outer {
|
||||
pub trait Foo {}
|
||||
pub struct Bar;
|
||||
pub mod inner {
|
||||
}
|
||||
}
|
||||
|
||||
impl outer::$0 for Bar { }
|
||||
"#,
|
||||
expect![[r#"
|
||||
md inner
|
||||
tt Foo
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue