use crate::{
db::{AstDatabase, DefDatabase, HirDatabase},
type_ref::TypeRef,
- AsName, Enum, EnumVariant, FieldSource, HasSource, Name, Source, Struct, StructField,
+ AsName, Enum, EnumVariant, FieldSource, HasSource, Module, Name, Source, Struct, StructField,
};
impl Struct {
}
}
- pub(crate) fn field(self, db: &impl HirDatabase, name: &Name) -> Option<StructField> {
+ pub fn field(self, db: &impl HirDatabase, name: &Name) -> Option<StructField> {
match self {
VariantDef::Struct(it) => it.field(db, name),
VariantDef::EnumVariant(it) => it.field(db, name),
}
}
+
+ pub fn module(self, db: &impl HirDatabase) -> Module {
+ match self {
+ VariantDef::Struct(it) => it.module(db),
+ VariantDef::EnumVariant(it) => it.module(db),
+ }
+ }
+
pub(crate) fn variant_data(self, db: &impl DefDatabase) -> Arc<VariantData> {
match self {
VariantDef::Struct(it) => it.variant_data(db),
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 {
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 {
}
}
}
+
+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),
+ }
+ }
+}