aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/code_model.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/code_model.rs')
-rw-r--r--crates/ra_hir/src/code_model.rs28
1 files changed, 16 insertions, 12 deletions
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index c49190a0f..b8d48a500 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -13,7 +13,7 @@ use hir_def::{
13 traits::TraitData, 13 traits::TraitData,
14 type_ref::{Mutability, TypeRef}, 14 type_ref::{Mutability, TypeRef},
15 AssocItemId, CrateModuleId, FunctionContainerId, HasModule, ImplId, LocalEnumVariantId, 15 AssocItemId, CrateModuleId, FunctionContainerId, HasModule, ImplId, LocalEnumVariantId,
16 LocalStructFieldId, Lookup, ModuleId, UnionId, 16 LocalStructFieldId, Lookup, ModuleId, TypeAliasContainerId, UnionId,
17}; 17};
18use hir_expand::{ 18use hir_expand::{
19 diagnostics::DiagnosticSink, 19 diagnostics::DiagnosticSink,
@@ -954,30 +954,34 @@ pub struct TypeAlias {
954 954
955impl TypeAlias { 955impl TypeAlias {
956 pub fn module(self, db: &impl DefDatabase) -> Module { 956 pub fn module(self, db: &impl DefDatabase) -> Module {
957 Module { id: self.id.module(db) } 957 Module { id: self.id.lookup(db).module(db) }
958 } 958 }
959 959
960 pub fn krate(self, db: &impl DefDatabase) -> Option<Crate> { 960 pub fn krate(self, db: &impl DefDatabase) -> Option<Crate> {
961 Some(self.module(db).krate()) 961 Some(self.module(db).krate())
962 } 962 }
963 963
964 /// The containing impl block, if this is a method. 964 /// The containing impl block, if this is a type alias.
965 pub fn impl_block(self, db: &impl DefDatabase) -> Option<ImplBlock> { 965 pub fn impl_block(self, db: &impl DefDatabase) -> Option<ImplBlock> {
966 ImplBlock::containing(db, self.into()) 966 match self.container(db) {
967 Some(Container::ImplBlock(it)) => Some(it),
968 _ => None,
969 }
967 } 970 }
968 971
969 /// The containing trait, if this is a trait method definition. 972 /// The containing trait, if this is a trait type alias definition.
970 pub fn parent_trait(self, db: &impl DefDatabase) -> Option<Trait> { 973 pub fn parent_trait(self, db: &impl DefDatabase) -> Option<Trait> {
971 db.trait_items_index(self.module(db).id).get_parent_trait(self.id.into()).map(Trait::from) 974 match self.container(db) {
975 Some(Container::Trait(it)) => Some(it),
976 _ => None,
977 }
972 } 978 }
973 979
974 pub fn container(self, db: &impl DefDatabase) -> Option<Container> { 980 pub fn container(self, db: &impl DefDatabase) -> Option<Container> {
975 if let Some(impl_block) = self.impl_block(db) { 981 match self.id.lookup(db).container {
976 Some(impl_block.into()) 982 TypeAliasContainerId::TraitId(it) => Some(Container::Trait(it.into())),
977 } else if let Some(trait_) = self.parent_trait(db) { 983 TypeAliasContainerId::ImplId(it) => Some(Container::ImplBlock(it.into())),
978 Some(trait_.into()) 984 TypeAliasContainerId::ModuleId(_) => None,
979 } else {
980 None
981 } 985 }
982 } 986 }
983 987