From 2ae4ca510daa51497e23ee7945b75b6291ac1220 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Tue, 23 Jun 2026 03:26:30 +0200 Subject: [PATCH 01/10] Using & for refrences, and switched to type name --- crates/parser/src/grammar.pest | 17 ++++++----- crates/parser/src/parser/common/decl.rs | 7 +++-- crates/parser/src/parser/common/types.rs | 34 ++++++++++++++-------- crates/parser/src/parser/items/function.rs | 2 +- 4 files changed, 37 insertions(+), 23 deletions(-) diff --git a/crates/parser/src/grammar.pest b/crates/parser/src/grammar.pest index 561c979..57ff0bd 100644 --- a/crates/parser/src/grammar.pest +++ b/crates/parser/src/grammar.pest @@ -82,7 +82,7 @@ module_program = { visibility = { "pub" ~ ("(" ~ static_path ~ ")")? } mutable = { "mut" } -unsafe_kw = { "unsafe" } +unsafe_kw = { "unsafe" } // ====================================================== // GENERICS @@ -108,7 +108,7 @@ path_type = { ref_lifetime = { lifetime | unsafe_kw } ref_type = { - "*" ~ ref_lifetime? ~ mutable? ~ type_expr + mutable? ~ ref_lifetime? ~ "&" } dyn_type = { @@ -116,7 +116,7 @@ dyn_type = { } type_expr = { - (path_type | tuple_type | ref_type | dyn_type) + (path_type | tuple_type | dyn_type) ~ ref_type* } lifetime = { @@ -200,15 +200,16 @@ attributes = { // DECLARATION HELPERS // ====================================================== var_decl = { - "let" ~ pattern ~ type_expr? + ("let" | type_expr) ~ pattern } field = { - visibility? ~ identifier ~ type_expr + visibility? ~ type_expr ~ identifier } param = { - pattern ~ type_expr? + (type_expr ~ pattern) + | pattern } field_list = { @@ -286,7 +287,7 @@ class_field = { } self_param = { - (deref_px ~ lifetime?)? ~ mutable? ~ "self" + (ref_px ~ lifetime?)? ~ mutable? ~ "self" } method_args = _{ @@ -333,7 +334,7 @@ trait_decl = { override_kw = { "override" ~ ("(" ~ expr_path ~ ")")? } function_decl = { - visibility? ~ "fn" ~ ("void" | type_expr) ~ identifier ~ generics_decl? ~ "(" ~ method_args ~ ")" ~ override_kw? ~ (block | semicolon) + visibility? ~ ("void" | type_expr) ~ identifier ~ generics_decl? ~ "(" ~ method_args ~ ")" ~ override_kw? ~ (block | semicolon) } // ====================================================== diff --git a/crates/parser/src/parser/common/decl.rs b/crates/parser/src/parser/common/decl.rs index 7a07fb9..acf076d 100644 --- a/crates/parser/src/parser/common/decl.rs +++ b/crates/parser/src/parser/common/decl.rs @@ -3,6 +3,7 @@ use crate::{ ast::*, ast_expr, error::{AstError, IntoErr, collect_recovered}, + parser::consume_rule, }; impl<'a> TryFrom> for VarDeclStmt { @@ -52,8 +53,10 @@ impl<'a> TryFrom> for VarDecl { let mut inner = pair.into_inner(); ast_expr!(VarDecl { + type_: consume_rule(&mut inner, Rule::type_expr) + .map(TypeExpr::try_from) + .transpose(), name: Pattern::try_from(inner.next().unwrap()), - type_: inner.next().map(TypeExpr::try_from).transpose(), }) } @@ -72,8 +75,8 @@ impl<'a> TryFrom> for FieldDecl { ast_expr!(FieldDecl { visibility: Visibility::try_from(&mut inner), - name: Identifier::try_from(inner.next().unwrap()), type_: TypeExpr::try_from(inner.next().unwrap()), + name: Identifier::try_from(inner.next().unwrap()), }) } diff --git a/crates/parser/src/parser/common/types.rs b/crates/parser/src/parser/common/types.rs index 3d2fa2b..54d749d 100644 --- a/crates/parser/src/parser/common/types.rs +++ b/crates/parser/src/parser/common/types.rs @@ -2,7 +2,7 @@ use crate::{ Rule, ast::*, ast_ensure, ast_expr, - error::{AstError, AstResult, IntoErr, collect_recovered}, + error::{AstError, IntoErr, collect_recovered}, parser::{consume_rule, listen_rule}, }; @@ -15,7 +15,27 @@ impl<'a> TryFrom> for TypeExpr { match rule { Rule::generic => Self::try_from(inner.next().unwrap()), - Rule::type_expr => inner.next().unwrap().try_into(), + Rule::type_expr => { + let mut inner = inner; + + let mut ty = TypeExpr::try_from(inner.next().unwrap())?; + + for ref_pair in inner { + let mut ref_inner = ref_pair.into_inner(); + + ty = TypeExpr::Ref { + lifetime: consume_rule(&mut ref_inner, Rule::ref_lifetime) + .map(|v| v.into_inner().next().map(Lifetime::try_from)) + .unwrap_or_default() + .transpose() + .get()?, + mutable: listen_rule(&mut ref_inner, Rule::mutable), + ty: Box::new(ty), + }; + } + + Ok(ty) + } Rule::lifetime => ast_expr!(TypeExpr::Lifetime(inner.next().unwrap().try_into())), Rule::tuple_type => ast_expr!(TypeExpr::Tuple(collect_recovered(inner))), @@ -26,16 +46,6 @@ impl<'a> TryFrom> for TypeExpr { )) } - Rule::ref_type => { - ast_expr!(TypeExpr::Ref { - lifetime: consume_rule(&mut inner, Rule::ref_lifetime) - .map(|v| v.into_inner().next().map(Lifetime::try_from)) - .unwrap_or_default() - .transpose(), - mutable: Ok(listen_rule(&mut inner, Rule::mutable)) as AstResult, - ty: TypeExpr::try_from(inner.next().unwrap()).map(Box::new), - }) - } Rule::dyn_type => { ast_expr!(TypeExpr::Dyn( TypeExpr::try_from(inner.next().unwrap()).map(Box::new), diff --git a/crates/parser/src/parser/items/function.rs b/crates/parser/src/parser/items/function.rs index 10b519e..2bac071 100644 --- a/crates/parser/src/parser/items/function.rs +++ b/crates/parser/src/parser/items/function.rs @@ -27,7 +27,7 @@ impl<'a> TryFrom> for FunctionDecl { let self_param = consume_rule(&mut inner, Rule::self_param).map(|param| { let mut param_inner = param.into_inner(); - let is_ref = listen_rule(&mut param_inner, Rule::deref_px); + let is_ref = listen_rule(&mut param_inner, Rule::ref_px); let lifetime = consume_rule(&mut param_inner, Rule::lifetime); let mutable = listen_rule(&mut param_inner, Rule::mutable); let name = Pattern::Path(mutable && !is_ref, Path(vec![Identifier(String::from("self"))])); From 2f6303ba306dea5e91c98c1ce50b44b38ce64556 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Tue, 23 Jun 2026 03:44:54 +0200 Subject: [PATCH 02/10] Updated tests and fixed grammar --- crates/parser/src/grammar.pest | 3 +- mist-test/src/common/decl_test.mist | 32 +++++++++---------- mist-test/src/common/expr_test.mist | 36 ++++++++++----------- mist-test/src/common/package.mist | 2 +- mist-test/src/common/statement_test.mist | 36 ++++++++++----------- mist-test/src/common/types_test.mist | 40 ++++++++++++------------ mist-test/src/items/attribute_test.mist | 8 ++--- mist-test/src/items/class_test.mist | 16 +++++----- mist-test/src/items/enum_test.mist | 14 ++++----- mist-test/src/items/function_test.mist | 26 +++++++-------- mist-test/src/items/impl_test.mist | 20 ++++++------ mist-test/src/items/struct_test.mist | 18 +++++------ mist-test/src/items/trait_test.mist | 16 +++++----- mist-test/src/main.mist | 2 +- 14 files changed, 135 insertions(+), 134 deletions(-) diff --git a/crates/parser/src/grammar.pest b/crates/parser/src/grammar.pest index 57ff0bd..7bcfdf1 100644 --- a/crates/parser/src/grammar.pest +++ b/crates/parser/src/grammar.pest @@ -200,7 +200,8 @@ attributes = { // DECLARATION HELPERS // ====================================================== var_decl = { - ("let" | type_expr) ~ pattern + ("let" ~ pattern) | + type_expr ~ (!tuple_pattern ~ pattern) } field = { diff --git a/mist-test/src/common/decl_test.mist b/mist-test/src/common/decl_test.mist index d1a1688..57a8717 100644 --- a/mist-test/src/common/decl_test.mist +++ b/mist-test/src/common/decl_test.mist @@ -1,44 +1,44 @@ pub module decl_test; -pub fn void test_let_basic() { +pub void test_let_basic() { let x = 42; assert_eq!(x, 42); } -pub fn void test_let_typed() { - let x i32 = 42; +pub void test_let_typed() { + i32 x = 42; assert_eq!(x, 42); - let s *str = "hello"; + str& s = "hello"; assert_eq!(s, "hello"); - let b bool = true; + bool b = true; assert_eq!(b, true); - let f f64 = 3.14; + f64 f = 3.14; assert_eq!(f, 3.14); } -pub fn void test_let_mut() { +pub void test_let_mut() { let mut _x = 42; _x = 100; assert_eq!(_x, 100); } -pub fn void test_let_tuple_destructure() { +pub void test_let_tuple_destructure() { let (a, b) = (10, "hello"); assert_eq!(a, 10); assert_eq!(b, "hello"); } -pub fn void test_let_nested_tuple() { +pub void test_let_nested_tuple() { let (a, (b, c)) = (1, (2, 3)); assert_eq!(a, 1); assert_eq!(b, 2); assert_eq!(c, 3); } -pub fn void test_let_pattern_irrefutable() { +pub void test_let_pattern_irrefutable() { let x = 5; let (y, z) = (1, 2); assert_eq!(x, 5); @@ -46,30 +46,30 @@ pub fn void test_let_pattern_irrefutable() { assert_eq!(z, 2); } -pub fn void test_multiple_decls() { +pub void test_multiple_decls() { let a = 1; let b = 2; let c = 3; assert_eq!(a + b + c, 6); } -pub fn void test_let_with_type_and_init() { - let x f64 = 10.0; +pub void test_let_with_type_and_init() { + f64 x = 10.0; assert_eq!(x, 10.0); } -pub fn void test_string_literal() { +pub void test_string_literal() { let s = "hello, world!"; assert_eq!(s.len(), 13); } -pub fn void test_let_bool() { +pub void test_let_bool() { let t = true; let f = false; assert_eq!(t, !f); } -pub fn void run_tests() { +pub void run_tests() { test_let_basic(); test_let_typed(); test_let_mut(); diff --git a/mist-test/src/common/expr_test.mist b/mist-test/src/common/expr_test.mist index 88ab9b3..888447b 100644 --- a/mist-test/src/common/expr_test.mist +++ b/mist-test/src/common/expr_test.mist @@ -1,6 +1,6 @@ pub module expr_test; -pub fn void test_literals() { +pub void test_literals() { assert_eq!(42, 42); assert_eq!(3.14, 3.14); assert_eq!(true, true); @@ -8,28 +8,28 @@ pub fn void test_literals() { assert_eq!("hello", "hello"); } -pub fn void test_tuples() { +pub void test_tuples() { let t = (1, true, "three"); assert_eq!(t.0, 1); assert_eq!(t.1, true); assert_eq!(t.2, "three"); } -pub fn void test_arrays() { +pub void test_arrays() { let arr = [1, 2, 3]; assert_eq!(arr[0], 1); assert_eq!(arr[1], 2); assert_eq!(arr[2], 3); } -pub fn void test_array_repeat() { +pub void test_array_repeat() { let arr = [0; 5]; assert_eq!(arr[0], 0); assert_eq!(arr[4], 0); assert_eq!(arr.len(), 5); } -pub fn void test_binary_arith() { +pub void test_binary_arith() { assert_eq!(10 + 5, 15); assert_eq!(10 - 5, 5); assert_eq!(10 * 5, 50); @@ -37,7 +37,7 @@ pub fn void test_binary_arith() { assert_eq!(10 % 3, 1); } -pub fn void test_binary_cmp() { +pub void test_binary_cmp() { assert_eq!(5 < 10, true); assert_eq!(10 <= 10, true); assert_eq!(10 > 5, true); @@ -46,14 +46,14 @@ pub fn void test_binary_cmp() { assert_eq!(5 != 10, true); } -pub fn void test_binary_logic() { +pub void test_binary_logic() { assert_eq!(true && true, true); assert_eq!(true && false, false); assert_eq!(true || false, true); assert_eq!(false || false, false); } -pub fn void test_binary_bit() { +pub void test_binary_bit() { assert_eq!(5 & 3, 1); assert_eq!(5 | 3, 7); assert_eq!(5 ^ 3, 6); @@ -61,20 +61,20 @@ pub fn void test_binary_bit() { assert_eq!(4 >> 1, 2); } -pub fn void test_prefix() { +pub void test_prefix() { let x = 42; assert_eq!(-x, -42); assert_eq!(!true, false); assert_eq!(!false, true); } -pub fn void test_ref_deref() { +pub void test_ref_deref() { let x = 42; let r = &x; assert_eq!(*r, 42); } -pub fn void test_postfix_inc_dec() { +pub void test_postfix_inc_dec() { let mut x = 5; x++; assert_eq!(x, 6); @@ -82,17 +82,17 @@ pub fn void test_postfix_inc_dec() { assert_eq!(x, 5); } -pub fn void test_as_cast() { +pub void test_as_cast() { let x = 42; assert_eq!(x as f64, 42.0); } -pub fn void test_closure() { +pub void test_closure() { let add = fn(a, b) -> a + b; assert_eq!(add(2, 3), 5); } -pub fn void test_block_expr() { +pub void test_block_expr() { let x = { let y = 10; y + 5 @@ -100,7 +100,7 @@ pub fn void test_block_expr() { assert_eq!(x, 15); } -pub fn void test_if_expr() { +pub void test_if_expr() { let x = if true { 1 } else { 2 }; assert_eq!(x, 1); @@ -108,7 +108,7 @@ pub fn void test_if_expr() { assert_eq!(y, 2); } -pub fn void test_range_expr() { +pub void test_range_expr() { let r = 0..5; let mut count = 0; for i in r { @@ -117,7 +117,7 @@ pub fn void test_range_expr() { assert_eq!(count, 5); } -pub fn void test_binary_assign() { +pub void test_binary_assign() { let mut x = 10; x += 5; assert_eq!(x, 15); @@ -131,7 +131,7 @@ pub fn void test_binary_assign() { assert_eq!(x, 2); } -pub fn void run_tests() { +pub void run_tests() { test_literals(); test_tuples(); test_arrays(); diff --git a/mist-test/src/common/package.mist b/mist-test/src/common/package.mist index 324108d..3fb9503 100644 --- a/mist-test/src/common/package.mist +++ b/mist-test/src/common/package.mist @@ -1,3 +1,3 @@ pub module common; -pub fn void test_package() {} +pub void test_package() {} diff --git a/mist-test/src/common/statement_test.mist b/mist-test/src/common/statement_test.mist index ce9a7e9..e403751 100644 --- a/mist-test/src/common/statement_test.mist +++ b/mist-test/src/common/statement_test.mist @@ -1,23 +1,23 @@ pub module statement_test; -pub fn void test_var_decl() { +pub void test_var_decl() { let x = 42; assert_eq!(x, 42); - let y i32 = 10; + i32 y = 10; assert_eq!(y, 10); - let name *str = "mist"; + str& name = "mist"; assert_eq!(name, "mist"); } -pub fn void test_var_decl_with_init() { +pub void test_var_decl_with_init() { let mut x = 0; x = 5; assert_eq!(x, 5); } -pub fn void test_if_statement() { +pub void test_if_statement() { let mut x = 0; if true { @@ -33,7 +33,7 @@ pub fn void test_if_statement() { assert_eq!(x, 3); } -pub fn void test_if_else_if() { +pub void test_if_else_if() { let mut x = 0; if x == 1 { @@ -46,7 +46,7 @@ pub fn void test_if_else_if() { assert_eq!(x, 20); } -pub fn void test_while_loop() { +pub void test_while_loop() { let mut count = 0; while count < 5 { @@ -55,7 +55,7 @@ pub fn void test_while_loop() { assert_eq!(count, 5); } -pub fn void test_for_loop() { +pub void test_for_loop() { let mut sum = 0; for i in 0..4 { @@ -64,7 +64,7 @@ pub fn void test_for_loop() { assert_eq!(sum, 6); } -pub fn void test_loop_stmt() { +pub void test_loop_stmt() { let mut count = 0; loop { @@ -76,7 +76,7 @@ pub fn void test_loop_stmt() { assert_eq!(count, 3); } -pub fn void test_break_continue() { +pub void test_break_continue() { let mut sum = 0; for i in 0..10 { @@ -91,11 +91,11 @@ pub fn void test_break_continue() { assert_eq!(sum, 1 + 3 + 5); } -pub fn i32 test_return() { +pub i32 test_return() { return 42; } -pub fn void test_block_scope() { +pub void test_block_scope() { let x = { let inner = 10; inner + 5 @@ -103,7 +103,7 @@ pub fn void test_block_scope() { assert_eq!(x, 15); } -pub fn void test_match_literal() { +pub void test_match_literal() { let x = 2; let result; @@ -116,9 +116,9 @@ pub fn void test_match_literal() { assert_eq!(result, 20); } -pub fn void test_match_or_pattern() { +pub void test_match_or_pattern() { let x = 1; - let result i32; + i32 result; match x { 1 | 2 => { result = 100; } @@ -128,7 +128,7 @@ pub fn void test_match_or_pattern() { assert_eq!(result, 100); } -pub fn void test_match_default() { +pub void test_match_default() { let x = 99; let result; @@ -139,7 +139,7 @@ pub fn void test_match_default() { assert_eq!(result, 99); } -pub fn void test_for_with_pattern_destructure() { +pub void test_for_with_pattern_destructure() { let pairs = [(1, "a"), (2, "b")]; let mut keys = 0; @@ -149,7 +149,7 @@ pub fn void test_for_with_pattern_destructure() { assert_eq!(keys, 3); } -pub fn void run_tests() { +pub void run_tests() { test_var_decl(); test_var_decl_with_init(); test_if_statement(); diff --git a/mist-test/src/common/types_test.mist b/mist-test/src/common/types_test.mist index eaf2cf4..59f4f30 100644 --- a/mist-test/src/common/types_test.mist +++ b/mist-test/src/common/types_test.mist @@ -1,58 +1,58 @@ pub module types_test; -pub fn void test_integer_type() { - let x i32 = 42; +pub void test_integer_type() { + i32 x = 42; assert_eq!(x, 42); } -pub fn void test_float_type() { - let x f64 = 3.14; +pub void test_float_type() { + f64 x = 3.14; assert_eq!(x, 3.14); } -pub fn void test_bool_type() { - let x bool = true; +pub void test_bool_type() { + bool x = true; assert_eq!(x, true); - let y bool = false; + bool y = false; assert_eq!(y, false); } -pub fn void test_string_type() { - let s *str = "hello"; +pub void test_string_type() { + str& s = "hello"; assert_eq!(s, "hello"); } -pub fn void test_tuple_type() { - let t (i32, *str) = (42, "answer"); +pub void test_tuple_type() { + (i32, str&) t = (42, "answer"); assert_eq!(t.0, 42); assert_eq!(t.1, "answer"); } -pub fn void test_ref_type() { - let x i32 = 42; - let r *i32 = &x; +pub void test_ref_type() { + i32 x = 42; + i32& r = &x; assert_eq!(*r, 42); } -pub fn void test_mut_ref_type() { +pub void test_mut_ref_type() { let mut x = 42; - let r *mut i32 = &mut x; + i32 mut& r = &mut x; *r = 100; assert_eq!(x, 100); } -pub fn void test_void_type() {} +pub void test_void_type() {} -fn i32 add(a i32, b i32) { +i32 add(i32 a, i32 b) { a + b } -pub fn void test_fn_return_type() { +pub void test_fn_return_type() { assert_eq!(add(3, 4), 7); } -pub fn void run_tests() { +pub void run_tests() { test_integer_type(); test_float_type(); test_bool_type(); diff --git a/mist-test/src/items/attribute_test.mist b/mist-test/src/items/attribute_test.mist index 5363dd1..03dd461 100644 --- a/mist-test/src/items/attribute_test.mist +++ b/mist-test/src/items/attribute_test.mist @@ -2,22 +2,22 @@ pub module attribute_test; #[derive(Debug)] pub struct Debuggable { - value i32, + i32 value, } -pub fn void test_derive_attribute() { +pub void test_derive_attribute() { let d = Debuggable { value: 42 }; assert_eq!(d.value, 42); } #[allow(unused_variables)] -pub fn void test_allow_attribute() { +pub void test_allow_attribute() { let x = 42; let y = "unused"; assert_eq!(x, 42); } -pub fn void run_tests() { +pub void run_tests() { test_derive_attribute(); test_allow_attribute(); } diff --git a/mist-test/src/items/class_test.mist b/mist-test/src/items/class_test.mist index 3d7ab57..1bb6f20 100644 --- a/mist-test/src/items/class_test.mist +++ b/mist-test/src/items/class_test.mist @@ -1,21 +1,21 @@ pub module class_test; pub class Animal { - pub name String; + pub String name; constructor() { self.name = "Rex".to_string(); } - pub fn String speak(*self) { + pub String speak(&self) { "Unknown".to_string() } - pub fn void test_speak(*self) { + pub void test_speak(&self) { assert_eq!(self.speak(), "Woof!"); } - pub fn void static_method() {} + pub void static_method() {} } pub class Mammal : Animal { @@ -23,7 +23,7 @@ pub class Mammal : Animal { super = Super::new(); } - pub fn void args_test(*self, x i32, y *str) { + pub void args_test(&self, i32 x, str& y) { assert_eq!(x, 10); assert_eq!(y, "hello"); } @@ -34,18 +34,18 @@ pub class Dog : Mammal { super = Super::new(); } - pub fn String speak(*self) override(Animal) { + pub String speak(&self) override(Animal) { "Woof!".to_string() } impl std::fmt::Display { - fn Result<(), std::fmt::Error> fmt(*self, f *mut std::fmt::Formatter<'_>) { + Result<(), std::fmt::Error> fmt(&self, std::fmt::Formatter<'_> mut& f) { write!(f, "🐾 {}", self.name) } } } -pub fn void run_tests() { +pub void run_tests() { let dawg = Dog::new(); dawg.args_test(10, "hello"); diff --git a/mist-test/src/items/enum_test.mist b/mist-test/src/items/enum_test.mist index db6c763..2eafd99 100644 --- a/mist-test/src/items/enum_test.mist +++ b/mist-test/src/items/enum_test.mist @@ -5,7 +5,7 @@ enum OptionInt { Some(i32), } -pub fn void test_enum_named() { +pub void test_enum_named() { let x = OptionInt::None; match x { OptionInt::None => { assert_eq!(1, 1); } @@ -13,7 +13,7 @@ pub fn void test_enum_named() { } } -pub fn void test_enum_tuple() { +pub void test_enum_tuple() { let x = OptionInt::Some(42); match x { OptionInt::None => { assert_eq!(0, 1); } @@ -22,11 +22,11 @@ pub fn void test_enum_tuple() { } enum Shape { - Circle { radius i32 }, - Rect { w i32, h i32 }, + Circle { i32 radius }, + Rect { i32 w, i32 h }, } -pub fn void test_enum_struct() { +pub void test_enum_struct() { let c = Shape::Circle { radius: 5 }; match c { Shape::Circle { radius } => { assert_eq!(radius, 5); } @@ -46,7 +46,7 @@ enum Color { Blue, } -pub fn void test_enum_eq() { +pub void test_enum_eq() { let c = Color::Red; match c { Color::Red => { assert_eq!(1, 1); } @@ -54,7 +54,7 @@ pub fn void test_enum_eq() { } } -pub fn void run_tests() { +pub void run_tests() { test_enum_named(); test_enum_tuple(); test_enum_struct(); diff --git a/mist-test/src/items/function_test.mist b/mist-test/src/items/function_test.mist index 3cec722..a795225 100644 --- a/mist-test/src/items/function_test.mist +++ b/mist-test/src/items/function_test.mist @@ -1,60 +1,60 @@ pub module function_test; -fn void greet() { +void greet() { let mut x = 1; x++; } -pub fn void test_basic_function() { +pub void test_basic_function() { greet(); } -fn i32 add(a i32, b i32) { +i32 add(i32 a, i32 b) { a + b } -pub fn void test_fn_params() { +pub void test_fn_params() { assert_eq!(add(2, 3), 5); } -pub fn i32 test_fn_return() { +pub i32 test_fn_return() { 42 } -pub fn i32 test_fn_early_return() { +pub i32 test_fn_early_return() { return 100; 0 } -pub fn i32 test_fn_mut_param(mut x i32) { +pub i32 test_fn_mut_param(i32 mut x) { x = x + 10; x } -pub fn void test_method_call() { +pub void test_method_call() { let s = "hello"; assert_eq!(s.len(), 5); assert_eq!(s.to_uppercase(), "HELLO"); } -fn i32 triple(x i32) { +i32 triple(i32 x) { add(x, add(x, x)) } -pub fn void test_nested_fn_calls() { +pub void test_nested_fn_calls() { assert_eq!(triple(5), 15); } -fn i32 factorial(n i32) { +i32 factorial(i32 n) { if n <= 1 { 1 } else { n * factorial(n - 1) } } -pub fn void test_recursive_fn() { +pub void test_recursive_fn() { assert_eq!(factorial(5), 120); } -pub fn void run_tests() { +pub void run_tests() { test_basic_function(); test_fn_params(); assert_eq!(test_fn_return(), 42); diff --git a/mist-test/src/items/impl_test.mist b/mist-test/src/items/impl_test.mist index 68d0ed6..36c83ab 100644 --- a/mist-test/src/items/impl_test.mist +++ b/mist-test/src/items/impl_test.mist @@ -1,39 +1,39 @@ pub module impl_test; struct Vector2 { - x i32, - y i32, + i32 x, + i32 y, } impl Vector2 { - pub fn i32 magnitude(*self) { + pub i32 magnitude(&self) { self.x * self.x + self.y * self.y } } -pub fn void test_inherent_impl() { +pub void test_inherent_impl() { let v = Vector2 { x: 3, y: 4 }; assert_eq!(v.magnitude(), 25); } trait Display { - fn String display(*self); + String display(&self); } impl Display for Vector2 { - fn String display(*self) { + String display(&self) { format!("({}, {})", self.x, self.y) } } -pub fn void test_trait_impl_block() { +pub void test_trait_impl_block() { let v = Vector2 { x: 1, y: 2 }; let s = v.display(); assert_eq!(s.len() > 0, true); } impl Vector2 { - pub fn Vector2 add(*self, other Vector2) { + pub Vector2 add(&self, Vector2 other) { Vector2 { x: self.x + other.x, y: self.y + other.y, @@ -41,7 +41,7 @@ impl Vector2 { } } -pub fn void test_multiple_impls() { +pub void test_multiple_impls() { let a = Vector2 { x: 1, y: 2 }; let b = Vector2 { x: 3, y: 4 }; let c = a.add(b); @@ -49,7 +49,7 @@ pub fn void test_multiple_impls() { assert_eq!(c.y, 6); } -pub fn void run_tests() { +pub void run_tests() { test_inherent_impl(); test_trait_impl_block(); test_multiple_impls(); diff --git a/mist-test/src/items/struct_test.mist b/mist-test/src/items/struct_test.mist index d5e27b1..1bb4e3e 100644 --- a/mist-test/src/items/struct_test.mist +++ b/mist-test/src/items/struct_test.mist @@ -1,23 +1,23 @@ pub module struct_test; struct Point { - x i32, - y i32, + i32 x, + i32 y, } -pub fn void test_struct_create_access() { +pub void test_struct_create_access() { let p = Point { x: 10, y: 20 }; assert_eq!(p.x, 10); assert_eq!(p.y, 20); } -pub fn void test_struct_mut_field() { +pub void test_struct_mut_field() { let mut p = Point { x: 1, y: 2 }; p.x = 100; assert_eq!(p.x, 100); } -pub fn void test_struct_destructure() { +pub void test_struct_destructure() { let p = Point { x: 3, y: 4 }; let Point { x, y } = p; assert_eq!(x, 3); @@ -25,11 +25,11 @@ pub fn void test_struct_destructure() { } struct Line { - start Point, - end Point, + Point start, + Point end, } -pub fn void test_struct_nested() { +pub void test_struct_nested() { let l = Line { start: Point { x: 0, y: 0 }, end: Point { x: 5, y: 10 }, @@ -38,7 +38,7 @@ pub fn void test_struct_nested() { assert_eq!(l.end.y, 10); } -pub fn void run_tests() { +pub void run_tests() { test_struct_create_access(); test_struct_mut_field(); test_struct_destructure(); diff --git a/mist-test/src/items/trait_test.mist b/mist-test/src/items/trait_test.mist index 4e7a2bf..6a26325 100644 --- a/mist-test/src/items/trait_test.mist +++ b/mist-test/src/items/trait_test.mist @@ -1,41 +1,41 @@ pub module trait_test; trait Speak { - fn String speak(*self); + String speak(&self); } trait Greet : Speak { - fn String greet(*self); + String greet(&self); } struct Dog { - name String, + String name, } impl Speak for Dog { - fn String speak(*self) { + String speak(&self) { "woof".to_string() } } impl Greet for Dog { - fn String greet(*self) { + String greet(&self) { "hello".to_string() } } -pub fn void test_trait_impl() { +pub void test_trait_impl() { let d = Dog { name: "Rex".to_string() }; assert_eq!(d.speak(), "woof"); } -pub fn void test_trait_with_requirement() { +pub void test_trait_with_requirement() { let d = Dog { name: "Buddy".to_string() }; assert_eq!(d.speak(), "woof"); assert_eq!(d.greet(), "hello"); } -pub fn void run_tests() { +pub void run_tests() { test_trait_impl(); test_trait_with_requirement(); } diff --git a/mist-test/src/main.mist b/mist-test/src/main.mist index 0025a0c..548fa97 100644 --- a/mist-test/src/main.mist +++ b/mist-test/src/main.mist @@ -1,4 +1,4 @@ -fn void main() { +void main() { println!("running common tests..."); common::test_package(); common::expr_test::run_tests(); From 7f7c1e2000372195793a540c529e2496646656c7 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Tue, 23 Jun 2026 12:47:38 +0200 Subject: [PATCH 03/10] Fixed mod attributes --- crates/parser/src/grammar.pest | 3 +-- crates/parser/src/parser/items/mod.rs | 7 +++++-- crates/parser/src/parser/mod.rs | 12 ++++++++++++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/crates/parser/src/grammar.pest b/crates/parser/src/grammar.pest index 7bcfdf1..d4f09b7 100644 --- a/crates/parser/src/grammar.pest +++ b/crates/parser/src/grammar.pest @@ -343,8 +343,7 @@ function_decl = { // ====================================================== top_level = { - (attributes ~ (import | impl_for_decl | impl_decl | trait_decl | struct_decl | enum_decl | class_decl | declare_module | function_decl)) - | mod_attribute + mod_attribute | (attributes ~ (import | impl_for_decl | impl_decl | trait_decl | struct_decl | enum_decl | class_decl | declare_module | function_decl)) } // ====================================================== diff --git a/crates/parser/src/parser/items/mod.rs b/crates/parser/src/parser/items/mod.rs index 1bae6d0..ab4600b 100644 --- a/crates/parser/src/parser/items/mod.rs +++ b/crates/parser/src/parser/items/mod.rs @@ -16,12 +16,15 @@ impl<'a> TryFrom> for TopLevel { type Error = AstError<'a, Self>; fn try_from(pair: pest::iterators::Pair<'a, Rule>) -> Result { - let mut inner = pair.into_inner(); + let mut inner = pair.clone().into_inner(); let attributes = collect_recovered(inner.next().unwrap().into_inner()); ast_expr!(TopLevel( - inner.next().map(Spanned::try_from).unwrap(), + inner + .next() + .map(Spanned::try_from) + .unwrap_or_else(move || Ok(Spanned::new_pair(pair, TopLevelKind::ModAttribute))), attributes, )) } diff --git a/crates/parser/src/parser/mod.rs b/crates/parser/src/parser/mod.rs index 2e73885..6662791 100644 --- a/crates/parser/src/parser/mod.rs +++ b/crates/parser/src/parser/mod.rs @@ -28,6 +28,18 @@ pub fn consume_rule<'a>( if consumed { pairs.next() } else { None } } +impl Spanned { + fn new_pair(pair: pest::iterators::Pair<'_, Rule>, item: T) -> Self { + let span = pair.as_span().start_pos().line_col(); + + Self { + line: span.0, + column: span.1, + item, + } + } +} + impl<'a, T: TryFrom, Error = AstError<'a, T>>> TryFrom> for Spanned { From b73396afb7dd01c576f8d9d1c19bca56e390df60 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Tue, 23 Jun 2026 13:24:46 +0200 Subject: [PATCH 04/10] Fixed mod attribute generation --- crates/analyzer/src/transpiler.rs | 13 ++++++++----- crates/codegen/src/lib.rs | 8 ++++---- crates/mist-api/src/transpiler.mist | 10 ++++++---- crates/parser/src/lib.rs | 18 ++++++++++++++++-- 4 files changed, 34 insertions(+), 15 deletions(-) diff --git a/crates/analyzer/src/transpiler.rs b/crates/analyzer/src/transpiler.rs index 581ae12..cf0807c 100644 --- a/crates/analyzer/src/transpiler.rs +++ b/crates/analyzer/src/transpiler.rs @@ -1,8 +1,8 @@ use std::path::{Path, PathBuf}; use mist_codegen::RustCodegen; -use mist_parser::rev_mapper::Mapping; use mist_parser::parse; +use mist_parser::rev_mapper::Mapping; pub struct TranspiledFile { pub mist_path: PathBuf, @@ -26,20 +26,23 @@ pub fn transpile_mist( let parsed = parse(source).map_err(|e| format!("parse error: {e:?}"))?; - for item in &parsed { + for item in &parsed.items { mist_parser::semantics::check_class_semantics(item) .map_err(|e| format!("semantic error: {}", e[0].error_message))?; } let mut codegen = RustCodegen::new(mist_path.to_path_buf()); - let output = codegen.generate(parsed); - codegen.mapping.shift_rust(extra_mod_decl.lines().count() as isize, 0); + codegen.generate(parsed.mod_attributes); + + codegen.add(extra_mod_decl); + + let output = codegen.generate(parsed.items); Ok(TranspiledFile { mist_path: mist_path.to_path_buf(), rust_path, - rust_content: format!("{}{}", extra_mod_decl, output), + rust_content: output, mapping: codegen.mapping, }) } diff --git a/crates/codegen/src/lib.rs b/crates/codegen/src/lib.rs index 7c806f4..83217fb 100644 --- a/crates/codegen/src/lib.rs +++ b/crates/codegen/src/lib.rs @@ -48,7 +48,7 @@ impl RustCodegen { " ".repeat(self.indent) } - fn add(&mut self, s: &str) { + pub fn add(&mut self, s: &str) { let newline_count = bytecount::count(s.as_bytes(), b'\n'); if newline_count == 0 { @@ -63,17 +63,17 @@ impl RustCodegen { self.output.push_str(s); } - fn addln(&mut self, s: &str) { + pub fn addln(&mut self, s: &str) { self.add(s); self.add("\n"); } - fn add_indented(&mut self, s: &str) { + pub fn add_indented(&mut self, s: &str) { let line = format!("{}{}", self.indent_str(), s); self.add(&line); } - fn add_indentedln(&mut self, s: &str) { + pub fn add_indentedln(&mut self, s: &str) { let line = format!("{}{}\n", self.indent_str(), s); self.add(&line); } diff --git a/crates/mist-api/src/transpiler.mist b/crates/mist-api/src/transpiler.mist index 5bbed65..83ea5ed 100644 --- a/crates/mist-api/src/transpiler.mist +++ b/crates/mist-api/src/transpiler.mist @@ -212,13 +212,15 @@ pub fn Result<(PathBuf, mist_codegen::RustCodegen, String), TranspileError<'a>> let parsed = mist_parser::parse(source).map_err(TranspileError::Parse)?; - for i in &parsed { + for i in &parsed.items { let _ = mist_parser::semantics::check_class_semantics(i).map_err(TranspileError::Semantic)?; } - let output = gc.generate(parsed); + gc.generate(parsed.mod_attributes); - gc.mapping.shift_rust(mod_decl.lines().count() as isize, 0); + gc.add(mod_decl); + + let output = gc.generate(parsed.items); Ok((output_file, gc, output)) } @@ -232,7 +234,7 @@ pub fn void transpile_file(path *PathBuf, source *str, output_file PathBuf, mod_ } }; - let res = fs::write(&output_file, format!("{mod_decl}{output}")); + let res = fs::write(&output_file, output); let output_file_map = output_file.with_extension("map.json"); diff --git a/crates/parser/src/lib.rs b/crates/parser/src/lib.rs index cf905f0..7c6a1d1 100644 --- a/crates/parser/src/lib.rs +++ b/crates/parser/src/lib.rs @@ -15,7 +15,12 @@ use crate::error::{IntoErr, ParseError}; #[grammar = "./src/grammar.pest"] pub struct MistParser; -pub fn parse<'a>(source: &'a str) -> Result, ParseError<'a, Vec>> { +pub struct Program { + pub mod_attributes: Vec, + pub items: Vec, +} + +pub fn parse<'a>(source: &'a str) -> Result>> { let mut pairs = MistParser::parse(Rule::program, source)?; let mut statements = vec![]; @@ -29,7 +34,16 @@ pub fn parse<'a>(source: &'a str) -> Result, ParseError<'a, Vec Ok(v), + Ok(v) => { + let (mod_attributes, items): (Vec<_>, Vec<_>) = v + .into_iter() + .partition(|item| matches!(item.0.item, TopLevelKind::ModAttribute)); + + Ok(Program { + items, + mod_attributes, + }) + } Err(e) => { let rec = e.recovered.clone(); From 208e4dac6b338ff31345b80640e745b75dac361b Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Tue, 23 Jun 2026 16:41:56 +0200 Subject: [PATCH 05/10] Updated main bootstrap --- src/analyzer.mist | 2 +- src/main.mist | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/analyzer.mist b/src/analyzer.mist index 8793f1a..59bd4e5 100644 --- a/src/analyzer.mist +++ b/src/analyzer.mist @@ -1,3 +1,3 @@ -fn void main() { +void main() { mist_analyzer::start(); } diff --git a/src/main.mist b/src/main.mist index 7a6b07e..ba7b066 100644 --- a/src/main.mist +++ b/src/main.mist @@ -4,8 +4,8 @@ use std::fs; use mist_api::builder; use mist_api::transpiler; -fn void main() { - let args Vec = env::args().collect(); +void main() { + Vec args = env::args().collect(); if args.len() < 2 { print_usage(); @@ -44,7 +44,7 @@ fn void main() { } } -fn void print_usage() { +void print_usage() { println!("Mist - the mist compiler\n"); println!("󰖟 View our documentation! \x1b[35mhttps://mist.selimaj.dev\x1b[0m"); println!(" Follow us on github! \x1b[35mhttps://github.com/mist-go\x1b[0m\n"); @@ -66,7 +66,7 @@ fn void print_usage() { println!(" \x1b[36m mist help\x1b[0m print this message\n"); } -fn void init_project(mut args Vec) { +void init_project(Vec mut args) { args.remove(0); process::Command::new("cargo") @@ -77,7 +77,7 @@ fn void init_project(mut args Vec) { .spawn() .expect("Failed to run cargo").wait().expect("Unable to wait"); - let is_lib bool = fs::metadata("src/lib.rs").is_ok(); + bool is_lib = fs::metadata("src/lib.rs").is_ok(); if is_lib { fs::remove_file("src/lib.rs").expect("Failed to remove src/lib.rs"); @@ -92,10 +92,10 @@ fn void init_project(mut args Vec) { println!("\n\x1b[34minfo\x1b[0m: Please open Cargo.toml and adjust `\x1b[35mname\x1b[0m = ` as needed, Thank you for using Mist!\n"); } -fn void inject_mist_target(is_lib bool) { - let toml_content String = fs::read_to_string("Cargo.toml").expect("Failed to read Cargo.toml"); +void inject_mist_target(bool is_lib) { + String toml_content = fs::read_to_string("Cargo.toml").expect("Failed to read Cargo.toml"); - let inject *str = if is_lib { + str& inject = if is_lib { "\n[lib]\nname = \"my_lib\"\npath = \".mist/src/lib.rs\"\n" } else { "\n[[bin]]\nname = \"my_bin\"\npath = \".mist/src/main.rs\"\n" From e4b7b4abf966ad1022d10104471932f907e95d35 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Tue, 23 Jun 2026 17:25:26 +0200 Subject: [PATCH 06/10] Updated api bootstrap --- crates/mist-api/src/builder.mist | 20 +++++++------- crates/mist-api/src/modules.mist | 22 ++++++++++------ crates/mist-api/src/transpiler.mist | 41 +++++++++++++++++++---------- 3 files changed, 51 insertions(+), 32 deletions(-) diff --git a/crates/mist-api/src/builder.mist b/crates/mist-api/src/builder.mist index 4a055aa..27aa308 100644 --- a/crates/mist-api/src/builder.mist +++ b/crates/mist-api/src/builder.mist @@ -11,11 +11,11 @@ use mist_parser::rev_mapper; #[derive(Debug, Clone)] pub struct MistDiagnosticMessage { - pub message String, - pub file_path PathBuf, - pub file_name String , - pub line usize, - pub column usize, + pub String message, + pub PathBuf file_path, + pub String file_name, + pub usize line, + pub usize column, } #[derive(Debug, Clone)] @@ -25,7 +25,7 @@ pub enum MistDiagnostic { Rust(CompilerMessage), } -pub fn bool build(mut args Vec, root PathBuf) { +pub bool build(Vec mut args, PathBuf root) { args.remove(0); args.insert(1, "--message-format=json".to_string()); @@ -123,7 +123,7 @@ pub fn bool build(mut args Vec, root PathBuf) { false } -pub fn void print_diagnostics(diagnostics *Vec) { +pub void print_diagnostics(Vec& diagnostics) { let mut files = HashMap::new(); for diag in diagnostics { @@ -159,9 +159,9 @@ pub fn void print_diagnostics(diagnostics *Vec) { } } -pub fn Option get_line( - files *mut HashMap>, - msg *MistDiagnosticMessage, +pub Option get_line( + HashMap> mut& files, + MistDiagnosticMessage& msg, ) { let src_path = msg.file_path.clone(); diff --git a/crates/mist-api/src/modules.mist b/crates/mist-api/src/modules.mist index 6754844..4b5dc80 100644 --- a/crates/mist-api/src/modules.mist +++ b/crates/mist-api/src/modules.mist @@ -9,11 +9,11 @@ use crate::transpiler::MistConfig; #[derive(Debug)] pub class Module { - pub name String; - pub path PathBuf; - pub children Vec; + pub String name; + pub PathBuf path; + pub Vec children; - pub constructor(mist_path PathBuf, config *MistConfig) { + pub constructor(PathBuf mist_path, MistConfig& config) { self.children = Vec::new(); self.name = mist_path.file_stem() .and_then(fn(s) -> s.to_str()) @@ -37,7 +37,7 @@ pub class Module { } } - fn void scan_directory(*mut self, search_dir *Path, config *MistConfig) { + void scan_directory(&mut self, Path& search_dir, MistConfig& config) { let entries = match fs::read_dir(search_dir) { Ok(entries) => entries; Err(e) => { @@ -65,11 +65,11 @@ pub class Module { } } - pub fn bool is_package(*self) { + pub bool is_package(&self) { self.path.file_name().map(fn(v) -> v.to_str()).unwrap_or_default() == Some("package.mist") } - pub fn PathBuf output_dir(*self, parent_dir *PathBuf) { + pub PathBuf output_dir(&self, PathBuf& parent_dir) { if self.path.is_dir() || self.is_package() { parent_dir.join(&self.name) } else { @@ -77,7 +77,13 @@ pub class Module { } } - pub fn PathBuf output_path(*self, parent_dir *PathBuf, curr_mod_decl *Option<(mist_parser::ast::Visibility, mist_parser::ast::Identifier)>) { + pub PathBuf output_path(&self, + PathBuf& parent_dir, + Option<( + mist_parser::ast::Visibility, + mist_parser::ast::Identifier + )>& curr_mod_decl + ) { let name = if let Some((_, name)) = curr_mod_decl { &name.0 } else { diff --git a/crates/mist-api/src/transpiler.mist b/crates/mist-api/src/transpiler.mist index 83ea5ed..406284e 100644 --- a/crates/mist-api/src/transpiler.mist +++ b/crates/mist-api/src/transpiler.mist @@ -16,13 +16,13 @@ use serde::Deserialize; #[derive(Debug, Deserialize)] #[serde(default)] pub struct MistConfig { - pub package PathBuf, - pub packages Vec, - pub main_mods String + pub PathBuf package, + pub Vec packages, + pub String main_mods } impl MistConfig { - pub fn bool should_ignore(*self, path *Path) { + pub bool should_ignore(&self, Path& path) { if path == self.package { return true; } @@ -37,7 +37,7 @@ impl MistConfig { } } impl Default for MistConfig { - fn Self default() { + Self default() { Self { package: PathBuf::from("main.mist"), packages: Vec::new(), @@ -46,7 +46,7 @@ impl Default for MistConfig { } } -pub fn PathBuf transpile() { +pub PathBuf transpile() { let start = time::Instant::now(); let root = env::current_dir().expect("Unable to find project root"); @@ -58,7 +58,7 @@ pub fn PathBuf transpile() { let toml_content = fs::read_to_string(&toml_path) .unwrap_or_else(fn(_) -> panic!("Could not read file at {:?}", toml_path)); - let mut config MistConfig = toml::from_str(&toml_content) + MistConfig mut config = toml::from_str(&toml_content) .unwrap_or_else(fn(_) -> panic!("Failed to parse Mist.toml from {:?}", toml_path)); for pkg in &mut config.packages { @@ -85,7 +85,7 @@ pub fn PathBuf transpile() { } impl modules::Module { - fn (bool, String) transpile(*self, parent_dir *PathBuf, config *mut MistConfig) { + (bool, String) transpile(&self, PathBuf& parent_dir, MistConfig mut& config) { if !self.path.is_dir() && self.path.extension().and_then(fn(v) -> v.to_str()) != Some("mist") { let file_name = self.path.file_name() .and_then(fn(s) -> s.to_str()) @@ -124,7 +124,7 @@ impl modules::Module { self.write_transpile(output, parent_dir, child_changed) } - fn (bool, String) write_transpile(*self, output String, parent_dir *PathBuf, child_changed bool) { + (bool, String) write_transpile(&self, String output, PathBuf& parent_dir, bool child_changed) { if self.path.is_dir() { let output_file = self.output_path(parent_dir, &None); @@ -174,7 +174,7 @@ impl modules::Module { } } -fn std::io::Result is_source_newer(source *Path, output *Path) { +std::io::Result is_source_newer(Path& source, Path& output) { if !output.exists() { return Ok(true); } @@ -190,8 +190,14 @@ pub enum TranspileError<'a> { Semantic(Vec) } -pub fn Result<(PathBuf, mist_codegen::RustCodegen, String), TranspileError<'a>> - transpile_code<'a>(path *PathBuf, source *'a str, mut output_file PathBuf, mod_decl *str, curr_mod_decl *Option<(mist_parser::ast::Visibility, mist_parser::ast::Identifier)>) { +pub Result<(PathBuf, mist_codegen::RustCodegen, String), TranspileError<'a>> + transpile_code<'a>( + PathBuf& path, + str 'a& source, + PathBuf mut output_file, + str& mod_decl, + Option<(mist_parser::ast::Visibility, mist_parser::ast::Identifier)>& curr_mod_decl + ) { if let Some((_, name)) = &curr_mod_decl { if output_file.file_name().map(fn(v) -> v.to_str()).unwrap_or_default() != Some("mod.rs") { @@ -225,7 +231,14 @@ pub fn Result<(PathBuf, mist_codegen::RustCodegen, String), TranspileError<'a>> Ok((output_file, gc, output)) } -pub fn void transpile_file(path *PathBuf, source *str, output_file PathBuf, mod_decl *str, curr_mod_decl *Option<(mist_parser::ast::Visibility, mist_parser::ast::Identifier)>) { +pub void transpile_file( + PathBuf& path, + str& source, + PathBuf output_file, + str& mod_decl, + Option<(mist_parser::ast::Visibility, mist_parser::ast::Identifier)>& curr_mod_decl + ) { + let (output_file, gc, output) = match transpile_code(path, source, output_file, mod_decl, curr_mod_decl) { Ok(output) => output; Err(e) => { @@ -261,7 +274,7 @@ pub fn void transpile_file(path *PathBuf, source *str, output_file PathBuf, mod_ } } -pub fn void decode_err<'a>(err *TranspileError<'a>, path *PathBuf) { +pub void decode_err<'a>(TranspileError<'a>& err, PathBuf& path) { let curr_dir = std::env::current_dir().unwrap(); match err { From 2f12f5ac53f531f8ddda80b89beecaf3c021910c Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Tue, 23 Jun 2026 17:41:49 +0200 Subject: [PATCH 07/10] Updated closure syntax --- crates/parser/src/grammar.pest | 12 ++++++------ crates/parser/src/parser/common/expr.rs | 2 +- mist-test/src/common/expr_test.mist | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/crates/parser/src/grammar.pest b/crates/parser/src/grammar.pest index d4f09b7..c254af8 100644 --- a/crates/parser/src/grammar.pest +++ b/crates/parser/src/grammar.pest @@ -30,7 +30,6 @@ keyword = { | "false" | "dyn" | "loop" - | "fn" | "unsafe" | "override" } @@ -200,8 +199,8 @@ attributes = { // DECLARATION HELPERS // ====================================================== var_decl = { - ("let" ~ pattern) | - type_expr ~ (!tuple_pattern ~ pattern) + ("let" ~ pattern) + | type_expr ~ (!tuple_pattern ~ pattern) } field = { @@ -343,7 +342,8 @@ function_decl = { // ====================================================== top_level = { - mod_attribute | (attributes ~ (import | impl_for_decl | impl_decl | trait_decl | struct_decl | enum_decl | class_decl | declare_module | function_decl)) + mod_attribute + | (attributes ~ (import | impl_for_decl | impl_decl | trait_decl | struct_decl | enum_decl | class_decl | declare_module | function_decl)) } // ====================================================== @@ -466,8 +466,8 @@ match_stmt = { // ------------------------------------------------------ closure = { - "fn" ~ "(" ~ param_list ~ ")" ~ type_expr? ~ block - | "fn" ~ "(" ~ param_list ~ ")" ~ type_expr? ~ "->" ~ expr + ("(" ~ param_list ~ ")" ~ "=>" ~ expr) + | (type_expr ~ "(" ~ param_list ~ ")" ~ "=>" ~ expr) } // ------------------------------------------------------ diff --git a/crates/parser/src/parser/common/expr.rs b/crates/parser/src/parser/common/expr.rs index 01ae58b..5f4afa6 100644 --- a/crates/parser/src/parser/common/expr.rs +++ b/crates/parser/src/parser/common/expr.rs @@ -77,10 +77,10 @@ impl<'a> TryFrom> for Expression { Rule::closure => { ast_expr!(Expression::Closure { - params: collect_recovered(inner.next().unwrap().into_inner()), return_type: consume_rule(&mut inner, Rule::type_expr) .map(TypeExpr::try_from) .transpose(), + params: collect_recovered(inner.next().unwrap().into_inner()), body: Expression::try_from(inner.next().unwrap()).map(Box::new), }) } diff --git a/mist-test/src/common/expr_test.mist b/mist-test/src/common/expr_test.mist index 888447b..c344a00 100644 --- a/mist-test/src/common/expr_test.mist +++ b/mist-test/src/common/expr_test.mist @@ -88,7 +88,7 @@ pub void test_as_cast() { } pub void test_closure() { - let add = fn(a, b) -> a + b; + let add = (a, b) => a + b; assert_eq!(add(2, 3), 5); } From 97de75252d7cdf9a3bec12135df368cc231c824d Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Tue, 23 Jun 2026 18:33:05 +0200 Subject: [PATCH 08/10] Updated api bootstrap --- crates/mist-api/src/builder.mist | 8 ++++---- crates/mist-api/src/modules.mist | 4 ++-- crates/mist-api/src/transpiler.mist | 12 ++++++------ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/crates/mist-api/src/builder.mist b/crates/mist-api/src/builder.mist index 27aa308..6571786 100644 --- a/crates/mist-api/src/builder.mist +++ b/crates/mist-api/src/builder.mist @@ -57,7 +57,7 @@ pub bool build(Vec mut args, PathBuf root) { break; } - let map = mapping.entry(mapping_path.clone()).or_insert_with(fn() { + let map = mapping.entry(mapping_path.clone()).or_insert_with(() => { let map_str = fs::read_to_string(mapping_path).expect("Failed to read map file"); serde_json::from_str(&map_str).expect("Failed to parse map file") @@ -107,7 +107,7 @@ pub bool build(Vec mut args, PathBuf root) { let mut stdout = std::io::stdout(); std::io::copy(&mut raw_reader, &mut stdout) - .map_err(fn(v) -> v.to_string()) + .map_err((v) => v.to_string()) .expect("(Mist) Failed to copy IO"); command.wait().unwrap(); @@ -165,7 +165,7 @@ pub Option get_line( ) { let src_path = msg.file_path.clone(); - let lines = files.entry(src_path.clone()).or_insert_with(fn() { + let lines = files.entry(src_path.clone()).or_insert_with(() => { fs::read_to_string(src_path) .expect("Unable to read mist file") .lines() @@ -174,5 +174,5 @@ pub Option get_line( .collect() }); - lines.get(msg.line - 1).map(fn(v) -> v.trim().to_string()) + lines.get(msg.line - 1).map((v) => v.trim().to_string()) } diff --git a/crates/mist-api/src/modules.mist b/crates/mist-api/src/modules.mist index 4b5dc80..af7b8b3 100644 --- a/crates/mist-api/src/modules.mist +++ b/crates/mist-api/src/modules.mist @@ -16,7 +16,7 @@ pub class Module { pub constructor(PathBuf mist_path, MistConfig& config) { self.children = Vec::new(); self.name = mist_path.file_stem() - .and_then(fn(s) -> s.to_str()) + .and_then((s) => s.to_str()) .expect("Failed to get module name") .to_string(); self.path = mist_path; @@ -66,7 +66,7 @@ pub class Module { } pub bool is_package(&self) { - self.path.file_name().map(fn(v) -> v.to_str()).unwrap_or_default() == Some("package.mist") + self.path.file_name().map((v) => v.to_str()).unwrap_or_default() == Some("package.mist") } pub PathBuf output_dir(&self, PathBuf& parent_dir) { diff --git a/crates/mist-api/src/transpiler.mist b/crates/mist-api/src/transpiler.mist index 406284e..5b6ce8d 100644 --- a/crates/mist-api/src/transpiler.mist +++ b/crates/mist-api/src/transpiler.mist @@ -56,10 +56,10 @@ pub PathBuf transpile() { let out = root.join(".mist/src"); let toml_content = fs::read_to_string(&toml_path) - .unwrap_or_else(fn(_) -> panic!("Could not read file at {:?}", toml_path)); + .unwrap_or_else((_) => panic!("Could not read file at {:?}", toml_path)); MistConfig mut config = toml::from_str(&toml_content) - .unwrap_or_else(fn(_) -> panic!("Failed to parse Mist.toml from {:?}", toml_path)); + .unwrap_or_else((_) => panic!("Failed to parse Mist.toml from {:?}", toml_path)); for pkg in &mut config.packages { *pkg = src.join(&*pkg); @@ -86,9 +86,9 @@ pub PathBuf transpile() { impl modules::Module { (bool, String) transpile(&self, PathBuf& parent_dir, MistConfig mut& config) { - if !self.path.is_dir() && self.path.extension().and_then(fn(v) -> v.to_str()) != Some("mist") { + if !self.path.is_dir() && self.path.extension().and_then((v) => v.to_str()) != Some("mist") { let file_name = self.path.file_name() - .and_then(fn(s) -> s.to_str()) + .and_then((s) => s.to_str()) .expect("Failed to get file name"); fs::copy(&self.path, parent_dir.join(&file_name)).expect("Failed to copy SideFile"); @@ -200,8 +200,8 @@ pub Result<(PathBuf, mist_codegen::RustCodegen, String), TranspileError<'a>> ) { if let Some((_, name)) = &curr_mod_decl { - if output_file.file_name().map(fn(v) -> v.to_str()).unwrap_or_default() != Some("mod.rs") { - if let Some(ext) = output_file.extension().map(fn(e) -> e.to_owned()) { + if output_file.file_name().map((v) => v.to_str()).unwrap_or_default() != Some("mod.rs") { + if let Some(ext) = output_file.extension().map((e) => e.to_owned()) { let mut new_name = std::ffi::OsString::from(&name.0); new_name.push("."); From dc8acdc2bde05a2b83830b61f3ba371aba326a86 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Tue, 23 Jun 2026 19:03:47 +0200 Subject: [PATCH 09/10] Improved match statements --- crates/parser/src/grammar.pest | 2 +- mist-test/src/common/statement_test.mist | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/parser/src/grammar.pest b/crates/parser/src/grammar.pest index c254af8..719e55d 100644 --- a/crates/parser/src/grammar.pest +++ b/crates/parser/src/grammar.pest @@ -450,7 +450,7 @@ loop_stmt = { pattern_list = { pattern ~ ("|" ~ pattern)* } match_item = { - pattern_list ~ "=>" ~ statement + pattern_list ~ "=>" ~ (statement | (expr ~ ",")) } match_stmt = { diff --git a/mist-test/src/common/statement_test.mist b/mist-test/src/common/statement_test.mist index e403751..00ca939 100644 --- a/mist-test/src/common/statement_test.mist +++ b/mist-test/src/common/statement_test.mist @@ -109,8 +109,8 @@ pub void test_match_literal() { match x { 1 => { result = 10; } - 2 => { result = 20; } - 3 => { result = 30; } + 2 => result = 20; + 3 => result = 30, _ => panic!(); } assert_eq!(result, 20); From 9b1519b068fcedabd2b82fd4867ca42e0b3a3998 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Tue, 23 Jun 2026 19:19:22 +0200 Subject: [PATCH 10/10] Updated code and readme --- README.md | 2 +- code.png | Bin 53950 -> 56629 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 65880d9..36c69a7 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ The `div` reduces the vertical height. The `picture` prevents autolinking. **Fast and works with Rust** -- All of your favourite Rust libraries work with Mist +- All of your favorite Rust libraries work with Mist - Compiles directly into efficient Rust code - Zero-cost abstractions, no runtime overhead diff --git a/code.png b/code.png index 771f05d0de81b614356734f45faf216ce9b77467..d08de61f52e110c9e79764e23a807ed4f902276d 100644 GIT binary patch literal 56629 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 J7X0-2e*hKwn>GLd literal 53950 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

?FV|cSr;DtcGqbT}e>I?-lKfEzP$r9T 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