Support for nested ADT

This commit is contained in:
Aleksey Kladov 2019-12-20 12:20:49 +01:00
parent 94ad07af4b
commit ac5a3f611b
5 changed files with 35 additions and 22 deletions

View File

@ -269,7 +269,7 @@ pub struct Struct {
impl Struct {
pub fn module(self, db: &impl DefDatabase) -> Module {
Module { id: self.id.lookup(db).container }
Module { id: self.id.lookup(db).container.module(db) }
}
pub fn krate(self, db: &impl DefDatabase) -> Option<Crate> {
@ -290,7 +290,7 @@ pub fn fields(self, db: &impl HirDatabase) -> Vec<StructField> {
}
pub fn ty(self, db: &impl HirDatabase) -> Type {
Type::from_def(db, self.id.lookup(db).container.krate, self.id)
Type::from_def(db, self.id.lookup(db).container.module(db).krate, self.id)
}
fn variant_data(self, db: &impl DefDatabase) -> Arc<VariantData> {
@ -309,11 +309,11 @@ pub fn name(self, db: &impl DefDatabase) -> Name {
}
pub fn module(self, db: &impl DefDatabase) -> Module {
Module { id: self.id.lookup(db).container }
Module { id: self.id.lookup(db).container.module(db) }
}
pub fn ty(self, db: &impl HirDatabase) -> Type {
Type::from_def(db, self.id.lookup(db).container.krate, self.id)
Type::from_def(db, self.id.lookup(db).container.module(db).krate, self.id)
}
pub fn fields(self, db: &impl HirDatabase) -> Vec<StructField> {
@ -337,7 +337,7 @@ pub struct Enum {
impl Enum {
pub fn module(self, db: &impl DefDatabase) -> Module {
Module { id: self.id.lookup(db).container }
Module { id: self.id.lookup(db).container.module(db) }
}
pub fn krate(self, db: &impl DefDatabase) -> Option<Crate> {
@ -357,7 +357,7 @@ pub fn variants(self, db: &impl DefDatabase) -> Vec<EnumVariant> {
}
pub fn ty(self, db: &impl HirDatabase) -> Type {
Type::from_def(db, self.id.lookup(db).container.krate, self.id)
Type::from_def(db, self.id.lookup(db).container.module(db).krate, self.id)
}
}

View File

@ -25,7 +25,7 @@
path::GenericArgs,
path::Path,
type_ref::{Mutability, TypeRef},
ContainerId, DefWithBodyId, FunctionLoc, Intern,
ContainerId, DefWithBodyId, EnumLoc, FunctionLoc, Intern, ModuleDefId, StructLoc, UnionLoc,
};
pub(super) fn lower(
@ -490,16 +490,28 @@ fn collect_block(&mut self, expr: ast::BlockExpr) -> ExprId {
}
fn collect_block_items(&mut self, block: &ast::Block) {
let container = ContainerId::DefWithBodyId(self.def).into();
let container = ContainerId::DefWithBodyId(self.def);
for item in block.items() {
match item {
let def: ModuleDefId = match item {
ast::ModuleItem::FnDef(def) => {
let ast_id = self.expander.ast_id(&def);
self.body.defs.push(FunctionLoc { container, ast_id }.intern(self.db).into())
FunctionLoc { container: container.into(), ast_id }.intern(self.db).into()
}
// FIXME: handle other items
_ => (),
}
ast::ModuleItem::StructDef(def) => {
let ast_id = self.expander.ast_id(&def);
StructLoc { container, ast_id }.intern(self.db).into()
}
ast::ModuleItem::EnumDef(def) => {
let ast_id = self.expander.ast_id(&def);
EnumLoc { container, ast_id }.intern(self.db).into()
}
ast::ModuleItem::UnionDef(def) => {
let ast_id = self.expander.ast_id(&def);
UnionLoc { container, ast_id }.intern(self.db).into()
}
_ => continue,
};
self.body.defs.push(def)
}
}

View File

@ -95,7 +95,7 @@ fn lookup(&self, db: &impl db::DefDatabase) -> FunctionLoc {
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct StructLoc {
pub container: ModuleId,
pub container: ContainerId,
pub ast_id: AstId<ast::StructDef>,
}
@ -119,7 +119,7 @@ fn lookup(&self, db: &impl db::DefDatabase) -> StructLoc {
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct UnionLoc {
pub container: ModuleId,
pub container: ContainerId,
pub ast_id: AstId<ast::UnionDef>,
}
@ -143,7 +143,7 @@ fn lookup(&self, db: &impl db::DefDatabase) -> UnionLoc {
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct EnumLoc {
pub container: ModuleId,
pub container: ContainerId,
pub ast_id: AstId<ast::EnumDef>,
}
@ -529,6 +529,7 @@ fn module(&self, db: &impl db::DefDatabase) -> ModuleId {
AdtId::UnionId(it) => it.lookup(db).container,
AdtId::EnumId(it) => it.lookup(db).container,
}
.module(db)
}
}
@ -550,7 +551,7 @@ fn module(&self, db: &impl db::DefDatabase) -> ModuleId {
GenericDefId::TraitId(it) => it.lookup(db).container,
GenericDefId::TypeAliasId(it) => it.lookup(db).module(db),
GenericDefId::ImplId(it) => it.lookup(db).container,
GenericDefId::EnumVariantId(it) => it.parent.lookup(db).container,
GenericDefId::EnumVariantId(it) => it.parent.lookup(db).container.module(db),
GenericDefId::ConstId(it) => it.lookup(db).module(db),
}
}

View File

@ -772,17 +772,17 @@ fn define_def(&mut self, def: &raw::DefData, attrs: &Attrs) {
PerNs::values(def.into())
}
raw::DefKind::Struct(ast_id) => {
let def = StructLoc { container: module, ast_id: AstId::new(self.file_id, ast_id) }
let def = StructLoc { container, ast_id: AstId::new(self.file_id, ast_id) }
.intern(self.def_collector.db);
PerNs::both(def.into(), def.into())
}
raw::DefKind::Union(ast_id) => {
let def = UnionLoc { container: module, ast_id: AstId::new(self.file_id, ast_id) }
let def = UnionLoc { container, ast_id: AstId::new(self.file_id, ast_id) }
.intern(self.def_collector.db);
PerNs::both(def.into(), def.into())
}
raw::DefKind::Enum(ast_id) => {
let def = EnumLoc { container: module, ast_id: AstId::new(self.file_id, ast_id) }
let def = EnumLoc { container, ast_id: AstId::new(self.file_id, ast_id) }
.intern(self.def_collector.db);
PerNs::types(def.into())
}

View File

@ -697,8 +697,8 @@ impl CallableDef {
pub fn krate(self, db: &impl HirDatabase) -> CrateId {
match self {
CallableDef::FunctionId(f) => f.lookup(db).module(db),
CallableDef::StructId(s) => s.lookup(db).container,
CallableDef::EnumVariantId(e) => e.parent.lookup(db).container,
CallableDef::StructId(s) => s.lookup(db).container.module(db),
CallableDef::EnumVariantId(e) => e.parent.lookup(db).container.module(db),
}
.krate
}