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())
+ })
}
}
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) => {
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();
};
// 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::<()>
});