From 195172a2938db16a2f8977c661cf0693b542240c Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Thu, 23 Apr 2026 18:10:48 +0200 Subject: [PATCH 1/6] Fix type values --- semantic/src/scope.rs | 28 ++++++++++++++++++++++++++-- test/src/main.mist | 8 +++++++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/semantic/src/scope.rs b/semantic/src/scope.rs index 78e88dc..a5d7ea5 100644 --- a/semantic/src/scope.rs +++ b/semantic/src/scope.rs @@ -90,9 +90,17 @@ impl LocalScope { pub fn with_statement(self: &Arc, statement: &mut Statement) { match statement { Statement::Block(b) => self.clone().with_block(b), - Statement::VarDecl { name, init, .. } => { + Statement::VarDecl { + name, init, type_, .. + } => { if let Some(init) = init { - let var_type = self.get_type_from_expr(init).unwrap(); + let init_type = self.get_type_from_expr(init); + let var_type = type_ + .as_mut() + .map(|t| self.get_type_from_type_expr(t)) + .or_else(|| Some(init_type)) + .unwrap() + .unwrap(); let var_name = name.clone(); @@ -193,6 +201,22 @@ impl LocalScope { Some(current_type) } + pub fn get_type_from_type_expr( + self: &Arc, + expr: &mut ast::TypeExpr, + ) -> Option> { + match expr { + ast::TypeExpr::Identifier(id) => { + if let Some(v) = self.get_type_reference(id).map(|r| r.var_type.clone()) { + *id = v.get_name(); + Some(v) + } else { + None + } + } + } + } + pub fn get_type_from_expr( self: &Arc, expr: &mut ast::Expression, diff --git a/test/src/main.mist b/test/src/main.mist index 7bc9895..2c08dfc 100644 --- a/test/src/main.mist +++ b/test/src/main.mist @@ -1,5 +1,11 @@ package main; +public struct Idk { + int a, + int b, +} + int test(int a, int b) { - return a + b; + Idk bro = 10; + return a + b + bro.a; } From 02c40d7f90dc3665bfa14e65d036a4b94346c451 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Thu, 23 Apr 2026 18:59:06 +0200 Subject: [PATCH 2/6] Golang codegen inside crate --- Cargo.lock | 8 - Cargo.toml | 1 - codegen/Cargo.lock | 248 --------------------------- codegen/Cargo.toml | 7 - codegen/src/lib.rs => src/codegen.rs | 0 src/compiler.rs | 2 +- src/main.rs | 1 + 7 files changed, 2 insertions(+), 265 deletions(-) delete mode 100644 codegen/Cargo.lock delete mode 100644 codegen/Cargo.toml rename codegen/src/lib.rs => src/codegen.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index 57bae6a..bd912aa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,13 +17,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" -[[package]] -name = "codegen" -version = "0.1.0" -dependencies = [ - "parser", -] - [[package]] name = "cpufeatures" version = "0.2.17" @@ -85,7 +78,6 @@ checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" name = "mist" version = "0.1.0" dependencies = [ - "codegen", "parser", "semantic", "serde", diff --git a/Cargo.toml b/Cargo.toml index 178909d..2a9e8f2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,4 +8,3 @@ serde = { version = "1.0.228", features = ["serde_derive"] } serde_json = "1.0.149" parser = { path = "./parser" } semantic = { path = "./semantic" } -codegen = { path = "./codegen" } diff --git a/codegen/Cargo.lock b/codegen/Cargo.lock deleted file mode 100644 index e2dce17..0000000 --- a/codegen/Cargo.lock +++ /dev/null @@ -1,248 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "cfg-if" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" - -[[package]] -name = "codegen" -version = "0.1.0" -dependencies = [ - "parser", -] - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crypto-common" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "itoa" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" - -[[package]] -name = "libc" -version = "0.2.185" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" - -[[package]] -name = "memchr" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" - -[[package]] -name = "parser" -version = "0.1.0" -dependencies = [ - "pest", - "pest_derive", - "serde", - "serde_json", -] - -[[package]] -name = "pest" -version = "2.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" -dependencies = [ - "memchr", - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pest_meta" -version = "2.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220" -dependencies = [ - "pest", - "sha2", -] - -[[package]] -name = "proc-macro2" -version = "1.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.149" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" -dependencies = [ - "itoa", - "memchr", - "serde", - "serde_core", - "zmij", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "syn" -version = "2.0.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "typenum" -version = "1.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" - -[[package]] -name = "ucd-trie" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" - -[[package]] -name = "unicode-ident" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "zmij" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/codegen/Cargo.toml b/codegen/Cargo.toml deleted file mode 100644 index c64ec89..0000000 --- a/codegen/Cargo.toml +++ /dev/null @@ -1,7 +0,0 @@ -[package] -name = "codegen" -version = "0.1.0" -edition = "2024" - -[dependencies] -parser = { path = "../parser" } diff --git a/codegen/src/lib.rs b/src/codegen.rs similarity index 100% rename from codegen/src/lib.rs rename to src/codegen.rs diff --git a/src/compiler.rs b/src/compiler.rs index c4071a8..d0f374e 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -63,7 +63,7 @@ pub fn build() { semantic::walk_ast(semantic::scope::Scope::from_top(&root, &ast), &mut ast); - let mut gc = codegen::GoCodegen::new(); + let mut gc = crate::codegen::GoCodegen::new(); let output = gc.generate(&ast); if let Err(e) = fs::create_dir_all(&out_dir) { diff --git a/src/main.rs b/src/main.rs index 2632a49..e874403 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ use std::process; +pub mod codegen; pub mod compiler; fn main() { From 488b9859920ee06ec2cbc4e4eb5e98c3880b160d Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Thu, 23 Apr 2026 19:04:01 +0200 Subject: [PATCH 3/6] Struct init grammar --- parser/src/grammar.pest | 13 ++++++++----- parser/src/script_grammar.pest | 13 ++++++++----- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/parser/src/grammar.pest b/parser/src/grammar.pest index 058b782..331b703 100644 --- a/parser/src/grammar.pest +++ b/parser/src/grammar.pest @@ -105,15 +105,18 @@ primary = { postfix = { field_px | call_px + | struct_px | index_px | binary_px } -field_px = { "." ~ identifier } -call_px = { "(" ~ (expr ~ ("," ~ expr)*)? ~ ")" } -index_px = { "[" ~ expr ~ "]" } -binary_px = { bin_op ~ expr } -bin_op = { "+" | "-" | "*" | "/" | "%" | "==" | "!=" | "<" | ">" | "<=" | ">=" } +field_px = { "." ~ identifier } +call_px = { "(" ~ (expr ~ ("," ~ expr)*)? ~ ")" } +struct_px = { "{" ~ (struct_field_decl ~ ("," ~ struct_field_decl)*)? ~ "}" } +index_px = { "[" ~ expr ~ "]" } +binary_px = { bin_op ~ expr } +bin_op = { "+" | "-" | "*" | "/" | "%" | "==" | "!=" | "<" | ">" | "<=" | ">=" } +struct_field_decl = { identifier ~ ":" ~ expr } expr = { primary ~ postfix* diff --git a/parser/src/script_grammar.pest b/parser/src/script_grammar.pest index 4cc1a94..5ba90bc 100644 --- a/parser/src/script_grammar.pest +++ b/parser/src/script_grammar.pest @@ -105,15 +105,18 @@ primary = { postfix = { field_px | call_px + | struct_px | index_px | binary_px } -field_px = { "." ~ identifier } -call_px = { "(" ~ (expr ~ ("," ~ expr)*)? ~ ")" } -index_px = { "[" ~ expr ~ "]" } -binary_px = { bin_op ~ expr } -bin_op = { "+" | "-" | "*" | "/" | "%" | "==" | "!=" | "<" | ">" | "<=" | ">=" } +field_px = { "." ~ identifier } +call_px = { "(" ~ (expr ~ ("," ~ expr)*)? ~ ")" } +struct_px = { "{" ~ (struct_field_decl ~ ("," ~ struct_field_decl)*)? ~ "}" } +index_px = { "[" ~ expr ~ "]" } +binary_px = { bin_op ~ expr } +bin_op = { "+" | "-" | "*" | "/" | "%" | "==" | "!=" | "<" | ">" | "<=" | ">=" } +struct_field_decl = { identifier ~ ":" ~ expr } expr = { primary ~ postfix* From 5855a6cb5bb6f1fc0f2d381d8e2229f9c7be588a Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Thu, 23 Apr 2026 19:10:52 +0200 Subject: [PATCH 4/6] AST struct call --- parser/src/ast.rs | 1 + src/codegen.rs | 8 ++++++++ test/src/main.mist | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/parser/src/ast.rs b/parser/src/ast.rs index 3c0f3d1..61e2152 100644 --- a/parser/src/ast.rs +++ b/parser/src/ast.rs @@ -50,6 +50,7 @@ pub enum TopLevel { pub enum Postfix { FieldAccess(String), Call(Vec), + StructCall(HashMap), Index(Expression), Binary(BinaryOp, Expression), } diff --git a/src/codegen.rs b/src/codegen.rs index 42c462e..7e3bb54 100644 --- a/src/codegen.rs +++ b/src/codegen.rs @@ -271,6 +271,14 @@ impl GoCodegen { .join(", "); format!("{}({})", result, args_str) } + Postfix::StructCall(fields) => { + let args_str = fields + .iter() + .map(|(a, b)| format!("{a}: {}", self.generate_expression(b))) + .collect::>() + .join(", "); + format!("{}{{{}}}", result, args_str) + } Postfix::Index(idx) => format!("{}[{}]", result, self.generate_expression(idx)), Postfix::Binary(op, rhs) => { let op_str = match op { diff --git a/test/src/main.mist b/test/src/main.mist index 2c08dfc..e217fc6 100644 --- a/test/src/main.mist +++ b/test/src/main.mist @@ -6,6 +6,6 @@ public struct Idk { } int test(int a, int b) { - Idk bro = 10; + Idk bro = Idk { a: 10, b: 10 }; return a + b + bro.a; } From 9594de08c75d3fbd0d2543d224bf4797684335b1 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Thu, 23 Apr 2026 19:16:35 +0200 Subject: [PATCH 5/6] Struct call ast parsing --- parser/src/lib.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/parser/src/lib.rs b/parser/src/lib.rs index bd9c374..60cd0c3 100644 --- a/parser/src/lib.rs +++ b/parser/src/lib.rs @@ -352,6 +352,18 @@ impl From> for Postfix { Rule::call_px => Postfix::Call(pair.into_inner().map(Expression::from).collect()), + Rule::struct_px => Postfix::StructCall( + pair.into_inner() + .map(|p| { + let mut pi = p.into_inner(); + ( + pi.next().unwrap().as_str().to_string(), + Expression::from(pi.next().unwrap()), + ) + }) + .collect(), + ), + Rule::index_px => Postfix::Index(Expression::from(pair.into_inner().next().unwrap())), Rule::binary_px => { From 056f955fe2cda69bfe6cf0562af15b1b02cd1bc0 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Thu, 23 Apr 2026 19:23:47 +0200 Subject: [PATCH 6/6] Working struct init --- semantic/src/scope.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/semantic/src/scope.rs b/semantic/src/scope.rs index a5d7ea5..a80a0de 100644 --- a/semantic/src/scope.rs +++ b/semantic/src/scope.rs @@ -176,6 +176,19 @@ impl LocalScope { } _ => unimplemented!(), }, + Postfix::StructCall(fields) => match &*current_type { + TypeRef::Struct(s) => { + let mut old_fields = fields.clone(); + + fields.clear(); + + for (name, mut expr) in old_fields.drain() { + self.get_type_from_expr(&mut expr); + fields.insert(s.fields.get(&name).unwrap().name.clone(), expr); + } + } + _ => unimplemented!(), + }, Postfix::Binary(op, right) => match op { parser::ast::BinaryOp::Equal | parser::ast::BinaryOp::NotEqual