From 5079b108197f0b5b70fb1ed4078e015e9ea2ba21 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Tue, 14 Jul 2026 07:32:42 +0200 Subject: [PATCH] Added other struct types #117 --- crates/codegen/src/top_level.rs | 27 +++++++++++++++++++++++++++ crates/parser/src/ast/top_level.rs | 6 ++++++ crates/parser/src/grammar.pest | 8 ++------ crates/parser/src/parser/items/mod.rs | 16 +++++++++++++++- mist-test/src/items/struct_test.mist | 3 +++ 5 files changed, 53 insertions(+), 7 deletions(-) diff --git a/crates/codegen/src/top_level.rs b/crates/codegen/src/top_level.rs index e4ed540..069d683 100644 --- a/crates/codegen/src/top_level.rs +++ b/crates/codegen/src/top_level.rs @@ -266,6 +266,33 @@ impl GenRust for TopLevelKind { cg.indent -= 1; cg.addln("}\n"); } + Self::StructDeclTupleUnit { + visibility, + name, + generics, + unit, + } => { + cg.addln(&format!( + "{}struct {}{}", + visibility.get_rust(), + name.get_rust(), + generics.get_rust() + )); + cg.indent += 1; + + if let Some(unit) = unit { + cg.add(" ("); + for unit in unit { + cg.add_indented(""); + unit.gen_rust(ctx, cg); + cg.add(", "); + } + cg.add(")"); + } + + cg.indent -= 1; + cg.addln(";\n"); + } Self::EnumDecl { visibility, name, diff --git a/crates/parser/src/ast/top_level.rs b/crates/parser/src/ast/top_level.rs index 20ceba9..741edbe 100644 --- a/crates/parser/src/ast/top_level.rs +++ b/crates/parser/src/ast/top_level.rs @@ -59,6 +59,12 @@ pub enum TopLevelKind { generics: GenericsDecl, fields: Vec>, }, + StructDeclTupleUnit { + visibility: Visibility, + name: Identifier, + generics: GenericsDecl, + unit: Option>>, + }, FunctionDecl(FunctionDecl), ClassDecl { visibility: Visibility, diff --git a/crates/parser/src/grammar.pest b/crates/parser/src/grammar.pest index f6aa8c1..483b0fa 100644 --- a/crates/parser/src/grammar.pest +++ b/crates/parser/src/grammar.pest @@ -288,11 +288,7 @@ struct_decl = { } tuple_struct_decl = { - visibility? ~ "struct" ~ identifier ~ generics_decl? ~ tuple_type ~ ";" -} - -empty_struct_decl = { - visibility? ~ "struct" ~ identifier ~ generics_decl? ~ ";" + visibility? ~ "struct" ~ identifier ~ generics_decl? ~ tuple_type? ~ ";" } // ====================================================== @@ -407,7 +403,7 @@ type_alias = { "type" ~ identifier ~ generics_decl? ~ "=" ~ type_expr ~ ";" } top_level = { mod_attribute - | (attributes ~ (include_global | include_local | include_use_global | import | impl_for_decl | impl_decl | trait_decl | struct_decl | tuple_struct_decl | empty_struct_decl | enum_decl | class_decl | declare_module | function_decl | const_decl | static_decl | type_alias)) + | (attributes ~ (include_global | include_local | include_use_global | import | impl_for_decl | impl_decl | trait_decl | struct_decl | tuple_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 4022024..6b7e30d 100644 --- a/crates/parser/src/parser/items/mod.rs +++ b/crates/parser/src/parser/items/mod.rs @@ -57,6 +57,21 @@ impl<'a> TryFrom> for TopLevelKind { fields: collect_recovered(inner.next().unwrap().into_inner())?, }), + Rule::tuple_struct_decl => Ok(TopLevelKind::StructDeclTupleUnit { + visibility: Visibility::try_from(&mut inner)?, + + name: inner.next().unwrap().try_into()?, + + generics: consume_rule(&mut inner, Rule::generics_decl) + .map(GenericsDecl::try_from) + .transpose() + .map(|v| v.unwrap_or_default())?, + + unit: consume_rule(&mut inner, Rule::tuple_type) + .map(|v| collect_recovered(v.into_inner())) + .transpose()?, + }), + Rule::class_decl => Ok(TopLevelKind::ClassDecl { visibility: Visibility::try_from(&mut inner)?, @@ -147,7 +162,6 @@ impl<'a> TryFrom> for TopLevelKind { .unwrap() .to_string(), )), - _ => AstError::bug_unimplemented(pair), } } diff --git a/mist-test/src/items/struct_test.mist b/mist-test/src/items/struct_test.mist index 93a8379..a8aaa3b 100644 --- a/mist-test/src/items/struct_test.mist +++ b/mist-test/src/items/struct_test.mist @@ -100,6 +100,9 @@ pub void test_struct_destructure_rename() assert_eq!(b, 15); } +struct TuplePoint(i32, i32); +struct Unit; + pub void run_tests() { test_struct_create_access();