diff --git a/crates/codegen/src/top_level.rs b/crates/codegen/src/top_level.rs index 58433e7..004a42b 100644 --- a/crates/codegen/src/top_level.rs +++ b/crates/codegen/src/top_level.rs @@ -191,6 +191,16 @@ impl GenRust for TopLevelKind { fn gen_rust(&self, ctx: &mut Context, cg: &mut RustCodegen) { match self { Self::ModAttribute => {} + Self::TypeAlias { name, generics, ty } => { + cg.add("type "); + name.gen_rust(ctx, cg); + if let Some(g) = generics { + g.gen_rust(ctx, cg); + } + cg.add(" = "); + ty.gen_rust(ctx, cg); + cg.addln(";"); + } Self::ConstDecl(decl) => { cg.add("const "); decl.decl.gen_rust(ctx, cg); @@ -200,7 +210,7 @@ impl GenRust for TopLevelKind { init.gen_rust(ctx, cg); } - cg.add(";"); + cg.addln(";"); } Self::StaticDecl(decl) => { cg.add("static "); @@ -211,7 +221,7 @@ impl GenRust for TopLevelKind { init.gen_rust(ctx, cg); } - cg.add(";"); + cg.addln(";"); } Self::Import(vis, path) => { cg.addln(&format!("{}use {};", vis.get_rust(), path.get_rust())) diff --git a/crates/parser/src/ast/top_level.rs b/crates/parser/src/ast/top_level.rs index e6c4394..5e5a13d 100644 --- a/crates/parser/src/ast/top_level.rs +++ b/crates/parser/src/ast/top_level.rs @@ -32,6 +32,11 @@ pub enum TopLevelKind { ImplDecl(ImplDecl), StaticDecl(VarDeclStmt), ConstDecl(VarDeclStmt), + TypeAlias { + name: Identifier, + generics: Option, + ty: TypeExpr, + }, TraitDecl { visibility: Visibility, name: Identifier, diff --git a/crates/parser/src/grammar.pest b/crates/parser/src/grammar.pest index d77efac..1f3891d 100644 --- a/crates/parser/src/grammar.pest +++ b/crates/parser/src/grammar.pest @@ -35,6 +35,7 @@ keyword = { | "unsafe" | "override" | "const" + | "type" } identifier = @{ @@ -369,13 +370,18 @@ function_decl = { const_decl = { "const" ~ var_decl_statement ~ ";" } static_decl = { "static" ~ var_decl_statement ~ ";" } +// ====================================================== +// Type aliases +// ====================================================== +type_alias = { "type" ~ identifier ~ generics_decl? ~ "=" ~ type_expr ~ ";" } + // ====================================================== // TOP LEVEL // ====================================================== top_level = { mod_attribute - | (attributes ~ (import | impl_for_decl | impl_decl | trait_decl | struct_decl | enum_decl | class_decl | declare_module | function_decl | const_decl | static_decl)) + | (attributes ~ (import | impl_for_decl | impl_decl | trait_decl | struct_decl | enum_decl | class_decl | declare_module | function_decl | const_decl | static_decl | type_alias)) } // ====================================================== diff --git a/crates/parser/src/parser/items/mod.rs b/crates/parser/src/parser/items/mod.rs index b6bd1cb..05064fd 100644 --- a/crates/parser/src/parser/items/mod.rs +++ b/crates/parser/src/parser/items/mod.rs @@ -125,6 +125,14 @@ impl<'a> TryFrom> for TopLevelKind { Rule::const_decl => Ok(TopLevelKind::ConstDecl(inner.next().unwrap().try_into()?)), Rule::static_decl => Ok(TopLevelKind::StaticDecl(inner.next().unwrap().try_into()?)), + Rule::type_alias => Ok(TopLevelKind::TypeAlias { + name: inner.next().unwrap().try_into()?, + generics: consume_rule(&mut inner, Rule::generics_decl) + .map(GenericsDecl::try_from) + .transpose()?, + ty: inner.next().unwrap().try_into()?, + }), + _ => AstError::bug_unimplemented(pair), } }