Type aliases

This commit is contained in:
2026-07-02 07:05:19 +02:00
parent d62d884add
commit 579d229cad
4 changed files with 32 additions and 3 deletions
+12 -2
View File
@@ -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()))
+5
View File
@@ -32,6 +32,11 @@ pub enum TopLevelKind {
ImplDecl(ImplDecl),
StaticDecl(VarDeclStmt),
ConstDecl(VarDeclStmt),
TypeAlias {
name: Identifier,
generics: Option<GenericsDecl>,
ty: TypeExpr,
},
TraitDecl {
visibility: Visibility,
name: Identifier,
+7 -1
View File
@@ -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))
}
// ======================================================
+8
View File
@@ -125,6 +125,14 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> 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),
}
}