Resolve associated types
This commit is contained in:
parent
75011bbccb
commit
444f6caaba
@ -76,9 +76,11 @@ impl PathResolution {
|
||||
pub fn assoc_type_shorthand_candidates<R>(
|
||||
&self,
|
||||
db: &dyn HirDatabase,
|
||||
mut cb: impl FnMut(TypeAlias) -> Option<R>,
|
||||
mut cb: impl FnMut(&Name, TypeAlias) -> Option<R>,
|
||||
) -> Option<R> {
|
||||
associated_type_shorthand_candidates(db, self.in_type_ns()?, |_, _, id| cb(id.into()))
|
||||
associated_type_shorthand_candidates(db, self.in_type_ns()?, |name, _, id| {
|
||||
cb(name, id.into())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -466,7 +466,8 @@ fn resolve_hir_path_(
|
||||
prefer_value_ns: bool,
|
||||
) -> Option<PathResolution> {
|
||||
let types = || {
|
||||
resolver.resolve_path_in_type_ns_fully(db.upcast(), path.mod_path()).map(|ty| match ty {
|
||||
let (ty, remaining) = resolver.resolve_path_in_type_ns(db.upcast(), path.mod_path())?;
|
||||
let res = match ty {
|
||||
TypeNs::SelfType(it) => PathResolution::SelfType(it.into()),
|
||||
TypeNs::GenericParam(id) => PathResolution::TypeParam(TypeParam { id }),
|
||||
TypeNs::AdtSelfType(it) | TypeNs::AdtId(it) => {
|
||||
@ -476,7 +477,21 @@ fn resolve_hir_path_(
|
||||
TypeNs::TypeAliasId(it) => PathResolution::Def(TypeAlias::from(it).into()),
|
||||
TypeNs::BuiltinType(it) => PathResolution::Def(BuiltinType::from(it).into()),
|
||||
TypeNs::TraitId(it) => PathResolution::Def(Trait::from(it).into()),
|
||||
})
|
||||
};
|
||||
match remaining {
|
||||
Some(1) => {
|
||||
let unresolved = path.segments().get(1)?;
|
||||
res.assoc_type_shorthand_candidates(db, |name, alias| {
|
||||
(name == unresolved.name).then(|| alias)
|
||||
})
|
||||
.map(TypeAlias::from)
|
||||
.map(Into::into)
|
||||
.map(PathResolution::Def)
|
||||
}
|
||||
// ambiguous
|
||||
Some(_) => None,
|
||||
None => Some(res),
|
||||
}
|
||||
};
|
||||
|
||||
let body_owner = resolver.body_owner();
|
||||
|
@ -3834,4 +3834,46 @@ fn foo() {}
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn hover_generic_assoc() {
|
||||
check(
|
||||
r#"
|
||||
fn foo<T: A>() where T::Assoc$0: {}
|
||||
|
||||
trait A {
|
||||
type Assoc;
|
||||
}"#,
|
||||
expect![[r#"
|
||||
*Assoc*
|
||||
|
||||
```rust
|
||||
test
|
||||
```
|
||||
|
||||
```rust
|
||||
type Assoc
|
||||
```
|
||||
"#]],
|
||||
);
|
||||
check(
|
||||
r#"
|
||||
trait A where
|
||||
Self::Assoc$0: ,
|
||||
{
|
||||
type Assoc;
|
||||
}"#,
|
||||
expect![[r#"
|
||||
*Assoc*
|
||||
|
||||
```rust
|
||||
test
|
||||
```
|
||||
|
||||
```rust
|
||||
type Assoc
|
||||
```
|
||||
"#]],
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -24,7 +24,7 @@ pub(crate) fn complete_qualified_path(acc: &mut Completions, ctx: &CompletionCon
|
||||
};
|
||||
|
||||
// Add associated types on type parameters and `Self`.
|
||||
resolution.assoc_type_shorthand_candidates(ctx.db, |alias| {
|
||||
resolution.assoc_type_shorthand_candidates(ctx.db, |_, alias| {
|
||||
acc.add_type_alias(ctx, alias);
|
||||
None::<()>
|
||||
});
|
||||
|
Loading…
x
Reference in New Issue
Block a user