Skip to content

Commit

Permalink
start working on struct generics
Browse files Browse the repository at this point in the history
  • Loading branch information
edg-l committed Jan 31, 2025
1 parent 8332389 commit 108a902
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 9 deletions.
2 changes: 1 addition & 1 deletion src/ast/expressions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ pub enum ValueExpr {

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct StructInitExpr {
pub name: Ident,
pub name: TypeName,
pub fields: HashMap<Ident, StructInitField>,
pub span: Span,
}
Expand Down
20 changes: 15 additions & 5 deletions src/grammar.lalrpop
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,16 @@ TypeName: ast::common::TypeName = {
}
}

// A Type name in "use" form, needs "::" at end to avoid ambiguity
TypeNameUse: ast::common::TypeName = {
<lo:@L> <path:(<Ident> "::")*> <name:Ident> <generics:("::" "<" <Comma<TypeName>> ">")?> <hi:@R> => ast::common::TypeName {
name,
path,
generics: generics.unwrap_or_default(),
span: ast::common::Span::new(lo, hi),
}
}

TypeDescriptor: ast::types::TypeDescriptor = {
<lo:@L> <name:TypeName> <hi:@R> => ast::types::TypeDescriptor::Type {
name,
Expand Down Expand Up @@ -431,18 +441,18 @@ EnumVariant: ast::enums::EnumVariant = {
}

StructInitField: (ast::common::Ident, ast::expressions::StructInitField) = {
<lo:@L> <name:Ident> ":" <value:StructInitExpr> <hi:@R> => (name, ast::expressions::StructInitField {
value: ast::expressions::Expression::StructInit(value),
span: Span::new(lo, hi),
}),
<lo:@L> <name:Ident> ":" <value:Expression> <hi:@R> => (name, ast::expressions::StructInitField {
value,
span: Span::new(lo, hi),
}),
<lo:@L> <name:Ident> ":" <value:StructInitExpr> <hi:@R> => (name, ast::expressions::StructInitField {
value: ast::expressions::Expression::StructInit(value),
span: Span::new(lo, hi),
})
}

StructInitExpr: ast::expressions::StructInitExpr = {
<lo:@L> <name:Ident> "{" <fields:Comma<StructInitField>> "}" <hi:@R> => ast::expressions::StructInitExpr {
<lo:@L> <name:TypeNameUse> "{" <fields:Comma<StructInitField>> "}" <hi:@R> => ast::expressions::StructInitExpr {
name,
fields: fields.into_iter().collect(),
span: Span::new(lo, hi),
Expand Down
6 changes: 3 additions & 3 deletions src/ir/lowering.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1145,7 +1145,7 @@ fn find_expression_type(builder: &mut FnBodyBuilder, info: &Expression) -> Optio
.get_module_body()
.symbols
.structs
.get(&info.name.name)
.get(&info.name.name.name)
.expect("struct not found");

// todo: struct generics
Expand Down Expand Up @@ -1288,8 +1288,8 @@ fn lower_expression(
.get_module_body()
.symbols
.structs
.get(&info.name.name)
.or_else(|| builder.get_module_body().imports.get(&info.name.name))
.get(&info.name.name.name)
.or_else(|| builder.get_module_body().imports.get(&info.name.name.name))
.expect("struct not found");
let struct_body = builder.ctx.body.structs.get(&id).unwrap().clone();
let ty = Ty {
Expand Down

0 comments on commit 108a902

Please sign in to comment.