From 5346cd05bef64aa5fdab978bc291eff6f885437b Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Thu, 2 Jul 2026 06:51:04 +0200 Subject: [PATCH] constants and static #102 --- crates/codegen/src/fmt/top_level.rs | 20 ++++++++++++++++++++ crates/codegen/src/top_level.rs | 22 ++++++++++++++++++++++ crates/parser/src/ast/top_level.rs | 2 ++ crates/parser/src/grammar.pest | 9 ++++++++- crates/parser/src/parser/items/mod.rs | 3 +++ 5 files changed, 55 insertions(+), 1 deletion(-) diff --git a/crates/codegen/src/fmt/top_level.rs b/crates/codegen/src/fmt/top_level.rs index 13439ab..6d65979 100644 --- a/crates/codegen/src/fmt/top_level.rs +++ b/crates/codegen/src/fmt/top_level.rs @@ -167,6 +167,26 @@ impl GenMist for TopLevelKind { fn gen_mist(&self, ctx: &mut Context, cg: &mut MistCodegen) { match self { Self::ModAttribute => {} + Self::StaticDecl(decl) => { + cg.add("static "); + decl.decl.gen_mist(ctx, cg); + + if let Some(init) = &decl.init { + cg.add(" = "); + init.gen_mist(ctx, cg); + } + cg.add(";"); + } + Self::ConstDecl(decl) => { + cg.add("const "); + decl.decl.gen_mist(ctx, cg); + + if let Some(init) = &decl.init { + cg.add(" = "); + init.gen_mist(ctx, cg); + } + cg.add(";"); + } Self::Import(vis, path) => { cg.addln(&format!("{}use {};", vis.get_mist(), path.get_mist())) } diff --git a/crates/codegen/src/top_level.rs b/crates/codegen/src/top_level.rs index 2d627a8..58433e7 100644 --- a/crates/codegen/src/top_level.rs +++ b/crates/codegen/src/top_level.rs @@ -191,6 +191,28 @@ impl GenRust for TopLevelKind { fn gen_rust(&self, ctx: &mut Context, cg: &mut RustCodegen) { match self { Self::ModAttribute => {} + Self::ConstDecl(decl) => { + cg.add("const "); + decl.decl.gen_rust(ctx, cg); + + if let Some(init) = &decl.init { + cg.add(" = "); + init.gen_rust(ctx, cg); + } + + cg.add(";"); + } + Self::StaticDecl(decl) => { + cg.add("static "); + decl.decl.gen_rust(ctx, cg); + + if let Some(init) = &decl.init { + cg.add(" = "); + init.gen_rust(ctx, cg); + } + + cg.add(";"); + } 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 d7d58ad..e6c4394 100644 --- a/crates/parser/src/ast/top_level.rs +++ b/crates/parser/src/ast/top_level.rs @@ -30,6 +30,8 @@ pub enum TopLevelKind { Import(Visibility, Path), DeclareModule(Visibility, Identifier), ImplDecl(ImplDecl), + StaticDecl(VarDeclStmt), + ConstDecl(VarDeclStmt), TraitDecl { visibility: Visibility, name: Identifier, diff --git a/crates/parser/src/grammar.pest b/crates/parser/src/grammar.pest index f2dbf9f..d77efac 100644 --- a/crates/parser/src/grammar.pest +++ b/crates/parser/src/grammar.pest @@ -34,6 +34,7 @@ keyword = { | "loop" | "unsafe" | "override" + | "const" } identifier = @{ @@ -362,13 +363,19 @@ function_decl = { visibility? ~ ("void" | type_expr) ~ identifier ~ generics_decl? ~ "(" ~ method_args ~ ")" ~ override_kw? ~ (block | semicolon) } +// ====================================================== +// CONSTANTS / STATIC +// ====================================================== +const_decl = { "const" ~ var_decl_statement ~ ";" } +static_decl = { "static" ~ var_decl_statement ~ ";" } + // ====================================================== // 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)) + | (attributes ~ (import | impl_for_decl | impl_decl | trait_decl | struct_decl | enum_decl | class_decl | declare_module | function_decl | const_decl | static_decl)) } // ====================================================== diff --git a/crates/parser/src/parser/items/mod.rs b/crates/parser/src/parser/items/mod.rs index 7d451ca..b6bd1cb 100644 --- a/crates/parser/src/parser/items/mod.rs +++ b/crates/parser/src/parser/items/mod.rs @@ -122,6 +122,9 @@ impl<'a> TryFrom> for TopLevelKind { items: collect_recovered(&mut inner)?, }), + Rule::const_decl => Ok(TopLevelKind::ConstDecl(inner.next().unwrap().try_into()?)), + Rule::static_decl => Ok(TopLevelKind::StaticDecl(inner.next().unwrap().try_into()?)), + _ => AstError::bug_unimplemented(pair), } }