From 082981f0bde1ccca58c44d0e47f94e150138b095 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Mon, 1 Jun 2026 11:40:01 +0200 Subject: [PATCH 1/4] Working module reading --- crates/mist-api/src/modules.mist | 87 ++++++++++++++++++----------- crates/mist-api/src/transpiler.mist | 4 ++ 2 files changed, 58 insertions(+), 33 deletions(-) diff --git a/crates/mist-api/src/modules.mist b/crates/mist-api/src/modules.mist index c186634..a554a7c 100644 --- a/crates/mist-api/src/modules.mist +++ b/crates/mist-api/src/modules.mist @@ -3,6 +3,7 @@ use ; use ; use ; +#[derive(Debug)] pub class Module { pub String name; pub PathBuf path; @@ -14,55 +15,75 @@ pub class Module { self.path = mist_path; if (self.path.is_dir()) { - var entries = match (fs::read_dir(&self.path)) { - Ok[entries] => entries; - Err[e] => { - eprintln!( - "error: failed to read directory {}\n {}", - self.path.display(), - e - ); + PathBuf dir = self.path.clone(); + // Behavior 2: It's a directory node. Check for gateway package.mist first. + PathBuf pkg_gate = self.path.join("package.mist"); + if (pkg_gate.exists()) { + self.path = pkg_gate; + } + + self.scan_directory(&dir, &rust_path); + } + } + + void scan_directory(self mut*, Path* search_dir, Path* rust_path) { + var entries = match (fs::read_dir(search_dir)) { + Ok[entries] => entries; + Err[e] => { + eprintln!("error: failed to read directory {}\n {}", search_dir.display(), e); + process::exit(1); + } + }; + + for (entry : entries) { + var entry = match (entry) { + Ok[entry] => entry; + Err[e] => { + eprintln!("error: failed to read directory entry\n {}", e); process::exit(1); } }; - for (entry : entries) { - var entry = match (entry) { - Ok[entry] => entry; - Err[e] => { - eprintln!("error: failed to read directory entry\n {}", e); + PathBuf child_path = entry.path(); - process::exit(1); - } - }; - - PathBuf child_path = entry.path(); - - String child_name = child_path.file_stem() - .and_then(|var s| s.to_str()) - .expect("Failed to get module name") - .to_string(); - - PathBuf child_output = rust_path.join(&child_name).with_extension("rs"); - - if (should_skip(&child_path, &child_output)) { - continue; - } - - self.children.push(new Module(child_name, child_path, child_output)); + if (child_path == self.path) { + continue; } + + String child_name = child_path.file_stem() + .and_then(|var s| s.to_str()) + .expect("Failed to get module name") + .to_string(); + + PathBuf child_output = rust_path.join(&child_name).with_extension("rs"); + + if (!child_path.is_dir() && should_skip(&child_path, &child_output)) { + continue; + } + + self.children.push(new Module(child_name, child_path, child_output)); } } } -pub Module new_package(PathBuf mist_path, PathBuf rust_path) { +pub Module master_package(PathBuf mist_path, PathBuf rust_path) { String name = mist_path.file_stem() .and_then(|var s| s.to_str()) .expect("Failed to get module name") .to_string(); - new Module(name, mist_path, rust_path) + var mut root_mod = new Module(name, mist_path.clone(), rust_path.clone()); + + if (!mist_path.is_dir()) { + PathBuf parent_dir = mist_path.parent() + .expect("Failed to get parent directory of root file") + .to_path_buf(); + + root_mod.scan_directory(&parent_dir, &rust_path); + } + + root_mod } bool should_skip(Path* source, Path* output) { diff --git a/crates/mist-api/src/transpiler.mist b/crates/mist-api/src/transpiler.mist index d7ffc2a..25415e4 100644 --- a/crates/mist-api/src/transpiler.mist +++ b/crates/mist-api/src/transpiler.mist @@ -6,6 +6,7 @@ use ; use ; use ; +use ; pub PathBuf build(bool force) { var start = time::Instant::now(); @@ -15,8 +16,11 @@ pub PathBuf build(bool force) { PathBuf src = root.join("src"); PathBuf out = root.join(".mist/src"); + build_dir(&root, &src, &src, &out, force); + var master = modules::master_package(src.join("main.mist"), out.join("main.rs")); + var elapsed = start.elapsed(); println!( From cfd1910f395a0824b9b9abff110f2633fa41c86f Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Mon, 1 Jun 2026 12:10:33 +0200 Subject: [PATCH 2/4] Working transpiler --- crates/mist-api/src/transpiler.mist | 177 ++++++++++++---------------- 1 file changed, 73 insertions(+), 104 deletions(-) diff --git a/crates/mist-api/src/transpiler.mist b/crates/mist-api/src/transpiler.mist index 25415e4..1c5cc37 100644 --- a/crates/mist-api/src/transpiler.mist +++ b/crates/mist-api/src/transpiler.mist @@ -16,11 +16,12 @@ pub PathBuf build(bool force) { PathBuf src = root.join("src"); PathBuf out = root.join(".mist/src"); - - build_dir(&root, &src, &src, &out, force); + // build_dir(&root, &src, &src, &out, force); var master = modules::master_package(src.join("main.mist"), out.join("main.rs")); + master.transpile(&out); + var elapsed = start.elapsed(); println!( @@ -31,123 +32,91 @@ pub PathBuf build(bool force) { root } -void build_dir(Path* root, Path* base_src, Path* current, Path* out, bool force) { - var entries = match (fs::read_dir(current)) { - Ok[entries] => entries; +impl modules::Module { + void transpile(self*, PathBuf* parent_dir) { + if (self.path.is_dir()) { + PathBuf dir = parent_dir.join(&self.name); + + for (child : &self.children) { + child.transpile(&dir); + } + } else { + if (Some("package.mist") == self.path.file_name().unwrap().to_str()) { + PathBuf dir = parent_dir.join(&self.name); + PathBuf output_file = dir.join("mod.rs"); + + transpile_file(&self.path, &output_file); + + for (child : &self.children) { + child.transpile(&dir); + } + } else { + PathBuf output_file = parent_dir.join(&self.name).with_extension("rs"); + + transpile_file(&self.path, &output_file); + + for (child : &self.children) { + child.transpile(parent_dir); + } + } + } + } +} + +void transpile_file(PathBuf* path, PathBuf* output_file) { + String source = match (fs::read_to_string(path)) { + Ok[s] => s; Err[e] => { - eprintln!( - "error: failed to read directory {}\n {}", - current.display(), - e - ); + eprintln!("error: failed to read file {}\n {}", path.display(), e); process::exit(1); } }; - for (entry : entries) { - var entry = match (entry) { - Ok[entry] => entry; - Err[e] => { - eprintln!("error: failed to read directory entry\n {}", e); + var mut gc = mist_codegen::RustCodegen::new(); - process::exit(1); - } - }; + String output = gc.generate(match (mist_parser::parse(&source)) { + Ok[ast] => ast; + Err[e] => { + match (e) { + error::ParseError::Ast[e] => { + var start_pos = e.span.start_pos().line_col(); - PathBuf path = entry.path(); + var span = e.span.as_str(); - if (path.is_dir()) { - build_dir(root, base_src, &path, out, force); - continue; - } + eprintln!( + "\n{}:{}:{}\n \x1b[31mError\x1b[0m: {}\n\t{}{}\t{}", + path.as_os_str().display(), + start_pos.0, + start_pos.1, + e.error_message, + span, + if span.ends_with("\n") { "" } else { "\n" }, + "^".repeat(span.trim().len()), + ); - Path* relative = path.strip_prefix(base_src).expect("Failed to strip base src from path"); + process::exit(1); + } - if (path.extension().and_then(|var e| e.to_str()) != Some("mist")) { - PathBuf dest = out.join(relative); + error::ParseError::PreAst[e] => { + eprintln!("error: parse failed in {}\n{}", path.display(), e); - Option parent = dest.parent(); - - if (parent.is_some()) { - fs::create_dir_all(parent.unwrap()).expect("failed to create output directory"); - } - - if (!force && should_skip(&path, &dest)) { - continue - } - - fs::copy(&path, dest).expect("Failed to copy non-mist file"); - - continue; - } - - PathBuf output_file = out.join(relative).with_extension("rs"); - - if (!force && should_skip(&path, &output_file)) { - continue; - } - - Option parent = output_file.parent(); - - if (parent.is_some()) { - fs::create_dir_all(parent.unwrap()).expect("failed to create output directory"); - } - - String source = match (fs::read_to_string(&path)) { - Ok[s] => s; - Err[e] => { - eprintln!("error: failed to read file {}\n {}", path.display(), e); - - process::exit(1); - } - }; - - var mut gc = mist_codegen::RustCodegen::new(); - - String output = gc.generate(match (mist_parser::parse(&source)) { - Ok[ast] => ast; - Err[e] => { - match (e) { - error::ParseError::Ast[e] => { - var start_pos = e.span.start_pos().line_col(); - - var span = e.span.as_str(); - - eprintln!( - "\n{}:{}:{}\n \x1b[31mError\x1b[0m: {}\n\t{}{}\t{}", - path.as_os_str().display(), - start_pos.0, - start_pos.1, - e.error_message, - span, - if span.ends_with("\n") { "" } else { "\n" }, - "^".repeat(span.trim().len()), - ); - - process::exit(1); - } - - error::ParseError::PreAst[e] => { - eprintln!("error: parse failed in {}\n{}", path.display(), e); - - process::exit(1); - } + process::exit(1); } } - }); - - var res = fs::write(&output_file, output); - - if (res.is_err()) { - eprintln!( - "error: failed to write output {}\n {}", - output_file.display(), - res.unwrap_err(), - ); - - process::exit(1); } + }); + + var res = fs::write(&output_file, output); + + if (res.is_err()) { + eprintln!( + "error: failed to write output {}\n {}", + output_file.display(), + res.unwrap_err(), + ); + + process::exit(1); } } From aff15f67c7fa24b9070dcf7f663ea76f3a535026 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Mon, 1 Jun 2026 12:26:20 +0200 Subject: [PATCH 3/4] Working module system --- crates/mist-api/src/transpiler.mist | 41 +++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/crates/mist-api/src/transpiler.mist b/crates/mist-api/src/transpiler.mist index 1c5cc37..9812e33 100644 --- a/crates/mist-api/src/transpiler.mist +++ b/crates/mist-api/src/transpiler.mist @@ -16,8 +16,6 @@ pub PathBuf build(bool force) { PathBuf src = root.join("src"); PathBuf out = root.join(".mist/src"); - // build_dir(&root, &src, &src, &out, force); - var master = modules::master_package(src.join("main.mist"), out.join("main.rs")); master.transpile(&out); @@ -33,37 +31,58 @@ pub PathBuf build(bool force) { } impl modules::Module { - void transpile(self*, PathBuf* parent_dir) { + String transpile(self*, PathBuf* parent_dir) { if (self.path.is_dir()) { PathBuf dir = parent_dir.join(&self.name); - + PathBuf output_file = dir.join("mod.rs"); + + String mut output = String::new(); + for (child : &self.children) { - child.transpile(&dir); + output.push_str(&child.transpile(&dir)); + } + + var res = fs::write(&output_file, output); + + if (res.is_err()) { + eprintln!( + "error: failed to write output {}\n {}", + output_file.display(), + res.unwrap_err(), + ); + + process::exit(1); } } else { if (Some("package.mist") == self.path.file_name().unwrap().to_str()) { PathBuf dir = parent_dir.join(&self.name); PathBuf output_file = dir.join("mod.rs"); - transpile_file(&self.path, &output_file); + String mut output = String::new(); for (child : &self.children) { - child.transpile(&dir); + output.push_str(&child.transpile(&dir)); } + + transpile_file(&self.path, &output_file, &output); } else { PathBuf output_file = parent_dir.join(&self.name).with_extension("rs"); - transpile_file(&self.path, &output_file); + String mut output = String::new(); for (child : &self.children) { - child.transpile(parent_dir); + output.push_str(&child.transpile(&parent_dir)); } + + transpile_file(&self.path, &output_file, &output); } } + + format!("pub mod {};\n", self.name) } } -void transpile_file(PathBuf* path, PathBuf* output_file) { +void transpile_file(PathBuf* path, PathBuf* output_file, str* mod_decl) { String source = match (fs::read_to_string(path)) { Ok[s] => s; Err[e] => { @@ -107,7 +126,7 @@ void transpile_file(PathBuf* path, PathBuf* output_file) { } }); - var res = fs::write(&output_file, output); + var res = fs::write(&output_file, format!("{mod_decl}{output}")); if (res.is_err()) { eprintln!( From be6d2de39c78eb89ed9202764783790cc8b04afc Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Mon, 1 Jun 2026 13:10:46 +0200 Subject: [PATCH 4/4] improved code quality --- crates/mist-api/src/modules.mist | 16 +++++++++ crates/mist-api/src/transpiler.mist | 56 +++++++---------------------- mist-test/src/main.mist | 6 ---- 3 files changed, 28 insertions(+), 50 deletions(-) diff --git a/crates/mist-api/src/modules.mist b/crates/mist-api/src/modules.mist index a554a7c..edf47d2 100644 --- a/crates/mist-api/src/modules.mist +++ b/crates/mist-api/src/modules.mist @@ -65,6 +65,22 @@ pub class Module { self.children.push(new Module(child_name, child_path, child_output)); } } + + pub PathBuf output_dir(self*, PathBuf* parent_dir) { + if (self.path.is_dir() || Some("package.mist") == self.path.file_name().unwrap().to_str()) { + parent_dir.join(&self.name) + } else { + parent_dir.clone() + } + } + + pub PathBuf output_path(self*, PathBuf* parent_dir) { + if (self.path.is_dir() || Some("package.mist") == self.path.file_name().unwrap().to_str()) { + parent_dir.join(&self.name).join("mod.rs") + } else { + parent_dir.join(&self.name).with_extension("rs") + } + } } pub Module master_package(PathBuf mist_path, PathBuf rust_path) { diff --git a/crates/mist-api/src/transpiler.mist b/crates/mist-api/src/transpiler.mist index 9812e33..da5a49b 100644 --- a/crates/mist-api/src/transpiler.mist +++ b/crates/mist-api/src/transpiler.mist @@ -32,16 +32,18 @@ pub PathBuf build(bool force) { impl modules::Module { String transpile(self*, PathBuf* parent_dir) { + PathBuf dir = self.output_dir(&parent_dir); + PathBuf output_file = self.output_path(&parent_dir); + + var _ = fs::create_dir_all(&dir); + + String mut output = String::new(); + + for (child : &self.children) { + output.push_str(&child.transpile(&dir)); + } + if (self.path.is_dir()) { - PathBuf dir = parent_dir.join(&self.name); - PathBuf output_file = dir.join("mod.rs"); - - String mut output = String::new(); - - for (child : &self.children) { - output.push_str(&child.transpile(&dir)); - } - var res = fs::write(&output_file, output); if (res.is_err()) { @@ -54,28 +56,7 @@ impl modules::Module { process::exit(1); } } else { - if (Some("package.mist") == self.path.file_name().unwrap().to_str()) { - PathBuf dir = parent_dir.join(&self.name); - PathBuf output_file = dir.join("mod.rs"); - - String mut output = String::new(); - - for (child : &self.children) { - output.push_str(&child.transpile(&dir)); - } - - transpile_file(&self.path, &output_file, &output); - } else { - PathBuf output_file = parent_dir.join(&self.name).with_extension("rs"); - - String mut output = String::new(); - - for (child : &self.children) { - output.push_str(&child.transpile(&parent_dir)); - } - - transpile_file(&self.path, &output_file, &output); - } + transpile_file(&self.path, &output_file, &output); } format!("pub mod {};\n", self.name) @@ -139,16 +120,3 @@ void transpile_file(PathBuf* path, PathBuf* output_file, str* mod_decl) { } } -bool should_skip(Path* source, Path* output) { - var src_time = fs::metadata(source) - .ok() - .and_then(|var v| v.modified().ok()); - - var out_time = fs::metadata(output) - .ok() - .and_then(|var v| v.modified().ok()); - - out_time - .map(|var out_time| out_time >= src_time.unwrap()) - .unwrap_or_default() -} diff --git a/mist-test/src/main.mist b/mist-test/src/main.mist index 59ecadb..317b44f 100644 --- a/mist-test/src/main.mist +++ b/mist-test/src/main.mist @@ -1,9 +1,3 @@ -pub mod app; -pub mod task; -pub mod plugin; -pub mod logger; -pub mod event; - void main() { var mut app_instance = new app::Application("mist-app");