add module methods

This commit is contained in:
Ekaterina Babshukova 2019-10-09 14:59:47 +03:00
parent afc871199d
commit aa2f58550a
2 changed files with 42 additions and 2 deletions

View file

@ -569,6 +569,14 @@ impl DefWithBody {
DefWithBody::Static(s) => s.krate(db),
}
}
pub fn module(self, db: &impl HirDatabase) -> Module {
match self {
DefWithBody::Const(c) => c.module(db),
DefWithBody::Function(f) => f.module(db),
DefWithBody::Static(s) => s.module(db),
}
}
}
pub trait HasBody: Copy {
@ -789,6 +797,20 @@ impl Const {
ImplBlock::containing(module_impls, self.into())
}
pub fn parent_trait(self, db: &impl DefDatabase) -> Option<Trait> {
db.trait_items_index(self.module(db)).get_parent_trait(self.into())
}
pub fn container(self, db: &impl DefDatabase) -> Option<Container> {
if let Some(impl_block) = self.impl_block(db) {
Some(impl_block.into())
} else if let Some(trait_) = self.parent_trait(db) {
Some(trait_.into())
} else {
None
}
}
// FIXME: move to a more general type for 'body-having' items
/// Builds a resolver for code inside this item.
pub(crate) fn resolver(self, db: &impl HirDatabase) -> Resolver {
@ -1075,3 +1097,13 @@ impl From<AssocItem> for crate::generics::GenericDef {
}
}
}
impl AssocItem {
pub fn module(self, db: &impl DefDatabase) -> Module {
match self {
AssocItem::Function(f) => f.module(db),
AssocItem::Const(c) => c.module(db),
AssocItem::TypeAlias(t) => t.module(db),
}
}
}