aboutsummaryrefslogtreecommitdiff
path: root/crates/hir/src
diff options
context:
space:
mode:
authorLukas Wirth <[email protected]>2021-04-01 17:01:18 +0100
committerLukas Wirth <[email protected]>2021-04-01 20:31:25 +0100
commit444f6caababc3335b1ed51d08eeedac106fd8077 (patch)
treed99e32e304730f5472caf7606c4d8e6d3b959e89 /crates/hir/src
parent75011bbccbf2e00092222a1071ba9111f834a4ae (diff)
Resolve associated types
Diffstat (limited to 'crates/hir/src')
-rw-r--r--crates/hir/src/semantics.rs6
-rw-r--r--crates/hir/src/source_analyzer.rs19
2 files changed, 21 insertions, 4 deletions
diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs
index d3caeef4e..3bf722d2a 100644
--- a/crates/hir/src/semantics.rs
+++ b/crates/hir/src/semantics.rs
@@ -76,9 +76,11 @@ impl PathResolution {
76 pub fn assoc_type_shorthand_candidates<R>( 76 pub fn assoc_type_shorthand_candidates<R>(
77 &self, 77 &self,
78 db: &dyn HirDatabase, 78 db: &dyn HirDatabase,
79 mut cb: impl FnMut(TypeAlias) -> Option<R>, 79 mut cb: impl FnMut(&Name, TypeAlias) -> Option<R>,
80 ) -> Option<R> { 80 ) -> Option<R> {
81 associated_type_shorthand_candidates(db, self.in_type_ns()?, |_, _, id| cb(id.into())) 81 associated_type_shorthand_candidates(db, self.in_type_ns()?, |name, _, id| {
82 cb(name, id.into())
83 })
82 } 84 }
83} 85}
84 86
diff --git a/crates/hir/src/source_analyzer.rs b/crates/hir/src/source_analyzer.rs
index 37d162b32..8423dd101 100644
--- a/crates/hir/src/source_analyzer.rs
+++ b/crates/hir/src/source_analyzer.rs
@@ -466,7 +466,8 @@ fn resolve_hir_path_(
466 prefer_value_ns: bool, 466 prefer_value_ns: bool,
467) -> Option<PathResolution> { 467) -> Option<PathResolution> {
468 let types = || { 468 let types = || {
469 resolver.resolve_path_in_type_ns_fully(db.upcast(), path.mod_path()).map(|ty| match ty { 469 let (ty, remaining) = resolver.resolve_path_in_type_ns(db.upcast(), path.mod_path())?;
470 let res = match ty {
470 TypeNs::SelfType(it) => PathResolution::SelfType(it.into()), 471 TypeNs::SelfType(it) => PathResolution::SelfType(it.into()),
471 TypeNs::GenericParam(id) => PathResolution::TypeParam(TypeParam { id }), 472 TypeNs::GenericParam(id) => PathResolution::TypeParam(TypeParam { id }),
472 TypeNs::AdtSelfType(it) | TypeNs::AdtId(it) => { 473 TypeNs::AdtSelfType(it) | TypeNs::AdtId(it) => {
@@ -476,7 +477,21 @@ fn resolve_hir_path_(
476 TypeNs::TypeAliasId(it) => PathResolution::Def(TypeAlias::from(it).into()), 477 TypeNs::TypeAliasId(it) => PathResolution::Def(TypeAlias::from(it).into()),
477 TypeNs::BuiltinType(it) => PathResolution::Def(BuiltinType::from(it).into()), 478 TypeNs::BuiltinType(it) => PathResolution::Def(BuiltinType::from(it).into()),
478 TypeNs::TraitId(it) => PathResolution::Def(Trait::from(it).into()), 479 TypeNs::TraitId(it) => PathResolution::Def(Trait::from(it).into()),
479 }) 480 };
481 match remaining {
482 Some(1) => {
483 let unresolved = path.segments().get(1)?;
484 res.assoc_type_shorthand_candidates(db, |name, alias| {
485 (name == unresolved.name).then(|| alias)
486 })
487 .map(TypeAlias::from)
488 .map(Into::into)
489 .map(PathResolution::Def)
490 }
491 // ambiguous
492 Some(_) => None,
493 None => Some(res),
494 }
480 }; 495 };
481 496
482 let body_owner = resolver.body_owner(); 497 let body_owner = resolver.body_owner();