diff --git a/Cargo.lock b/Cargo.lock index 70d4730..ed7f616 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -455,6 +455,17 @@ dependencies = [ "tower-lsp", ] +[[package]] +name = "mist-api" +version = "0.1.0" +dependencies = [ + "cargo_metadata", + "mist-codegen", + "mist-parser", + "serde", + "serde_json", +] + [[package]] name = "mist-codegen" version = "0.1.2" @@ -466,12 +477,8 @@ dependencies = [ name = "mist-lang" version = "0.0.5-alpha0" dependencies = [ - "cargo_metadata", "mist-analyzer", - "mist-codegen", - "mist-parser", - "serde", - "serde_json", + "mist-api", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index d02d359..429fcec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,19 +16,15 @@ include = [ ] [dependencies] -mist-parser = { workspace = true } mist-analyzer = { workspace = true } -mist-codegen = { workspace = true } - -serde = { version = "1.0.228", features = ["serde_derive"] } -serde_json = "1.0.149" -cargo_metadata = "0.23.1" +mist-api = { workspace = true } [workspace] members = [ "crates/parser", "crates/analyzer", "crates/codegen", + "crates/mist-api", ] exclude = [ @@ -39,6 +35,7 @@ exclude = [ mist-parser = { path = "crates/parser", version = "0.1.6" } mist-analyzer = { path = "crates/analyzer", version = "0.0.3" } mist-codegen = { path = "crates/codegen", version = "0.1.2" } +mist-api = { path = "crates/mist-api", version = "0.1.0" } [[bin]] name = "mist" @@ -48,10 +45,6 @@ path = ".mist/src/main.rs" name = "mist-lsp" path = ".mist/lsp/main.rs" -[[bin]] -name = "mist-header" -path = "src/_header.rs" - [[bin]] name = "mist-analyzer" path = ".mist/src/analyzer.rs" diff --git a/Mist.toml b/Mist.toml new file mode 100644 index 0000000..7a019d9 --- /dev/null +++ b/Mist.toml @@ -0,0 +1 @@ +package = "main.mist" diff --git a/crates/mist-api/Cargo.toml b/crates/mist-api/Cargo.toml new file mode 100644 index 0000000..3e112ea --- /dev/null +++ b/crates/mist-api/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "mist-api" +version = "0.1.0" +edition = "2024" + +[dependencies] +serde = { version = "1.0.228", features = ["serde_derive"] } +serde_json = "1.0.149" +cargo_metadata = "0.23.1" +mist-parser = { workspace = true } +mist-codegen = { workspace = true } + +[lib] +name = "mist_api" +path = ".mist/src/lib.rs" + +[[bin]] +name = "mist_lsp" +path = ".mist/lsp/main.rs" diff --git a/src/builder.rs b/crates/mist-api/src/builder.rs similarity index 100% rename from src/builder.rs rename to crates/mist-api/src/builder.rs diff --git a/crates/mist-api/src/lib.mist b/crates/mist-api/src/lib.mist new file mode 100644 index 0000000..ac42ad7 --- /dev/null +++ b/crates/mist-api/src/lib.mist @@ -0,0 +1,3 @@ +pub mod builder; +pub mod transpiler; +pub mod modules; \ No newline at end of file diff --git a/crates/mist-api/src/main.mist b/crates/mist-api/src/main.mist new file mode 100644 index 0000000..a9d9a94 --- /dev/null +++ b/crates/mist-api/src/main.mist @@ -0,0 +1,5 @@ +pub mod builder; +pub mod transpiler; +pub mod modules; + +void main() {} \ No newline at end of file diff --git a/crates/mist-api/src/modules.mist b/crates/mist-api/src/modules.mist new file mode 100644 index 0000000..c186634 --- /dev/null +++ b/crates/mist-api/src/modules.mist @@ -0,0 +1,80 @@ +use ; +use ; +use ; +use ; + +pub class Module { + pub String name; + pub PathBuf path; + pub Vec children; + + pub constructor(String name, PathBuf mist_path, PathBuf rust_path) { + self.children = new Vec(); + self.name = name; + 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 + ); + + 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); + } + }; + + 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)); + } + } + } +} + +pub Module new_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) +} + +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/src/transpiler.mist b/crates/mist-api/src/transpiler.mist similarity index 100% rename from src/transpiler.mist rename to crates/mist-api/src/transpiler.mist diff --git a/mist-test/Mist.toml b/mist-test/Mist.toml new file mode 100644 index 0000000..7a019d9 --- /dev/null +++ b/mist-test/Mist.toml @@ -0,0 +1 @@ +package = "main.mist" diff --git a/src/_header.rs b/src/_header.rs deleted file mode 100644 index 6f096e5..0000000 --- a/src/_header.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod builder; - -fn main() {} diff --git a/src/main.mist b/src/main.mist index 757b079..cf8ead0 100644 --- a/src/main.mist +++ b/src/main.mist @@ -1,9 +1,8 @@ use ; use ; use ; - -pub mod builder; -pub mod transpiler; +use ; +use ; void main() { Vec args = env::args().collect();