feat: add and/or keywords, handle alias, --watch flag, JS tree-shaking
- WISH-008: `and`/`or` as aliases for `&&`/`||` boolean operators - WISH-006: `handle` as alias for `run ... with` (same AST output) - WISH-005: `--watch` flag for `lux compile` recompiles on file change - WISH-009: Tree-shake unused runtime sections from JS output based on which effects are actually used (Console, Random, Time, Http, Dom) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
70
src/main.rs
70
src/main.rs
@@ -193,10 +193,12 @@ fn main() {
|
||||
eprintln!(" lux compile <file.lux> --run");
|
||||
eprintln!(" lux compile <file.lux> --emit-c [-o file.c]");
|
||||
eprintln!(" lux compile <file.lux> --target js [-o file.js]");
|
||||
eprintln!(" lux compile <file.lux> --watch");
|
||||
std::process::exit(1);
|
||||
}
|
||||
let run_after = args.iter().any(|a| a == "--run");
|
||||
let emit_c = args.iter().any(|a| a == "--emit-c");
|
||||
let watch = args.iter().any(|a| a == "--watch");
|
||||
let target_js = args.iter()
|
||||
.position(|a| a == "--target")
|
||||
.and_then(|i| args.get(i + 1))
|
||||
@@ -212,6 +214,16 @@ fn main() {
|
||||
} else {
|
||||
compile_to_c(&args[2], output_path, run_after, emit_c);
|
||||
}
|
||||
|
||||
if watch {
|
||||
// Build the args to replay for each recompilation (without --watch)
|
||||
let compile_args: Vec<String> = args.iter()
|
||||
.skip(1)
|
||||
.filter(|a| a.as_str() != "--watch")
|
||||
.cloned()
|
||||
.collect();
|
||||
watch_and_rerun(&args[2], &compile_args);
|
||||
}
|
||||
}
|
||||
"repl" => {
|
||||
// Start REPL
|
||||
@@ -1351,6 +1363,64 @@ fn watch_file(path: &str) {
|
||||
}
|
||||
}
|
||||
|
||||
fn watch_and_rerun(path: &str, compile_args: &[String]) {
|
||||
use std::time::{Duration, SystemTime};
|
||||
use std::path::Path;
|
||||
|
||||
let file_path = Path::new(path);
|
||||
if !file_path.exists() {
|
||||
eprintln!("File not found: {}", path);
|
||||
std::process::exit(1);
|
||||
}
|
||||
|
||||
println!();
|
||||
println!("Watching {} for changes (Ctrl+C to stop)...", path);
|
||||
|
||||
let mut last_modified = std::fs::metadata(file_path)
|
||||
.and_then(|m| m.modified())
|
||||
.unwrap_or(SystemTime::UNIX_EPOCH);
|
||||
|
||||
loop {
|
||||
std::thread::sleep(Duration::from_millis(500));
|
||||
|
||||
let modified = match std::fs::metadata(file_path).and_then(|m| m.modified()) {
|
||||
Ok(m) => m,
|
||||
Err(_) => continue,
|
||||
};
|
||||
|
||||
if modified > last_modified {
|
||||
last_modified = modified;
|
||||
|
||||
// Clear screen
|
||||
print!("\x1B[2J\x1B[H");
|
||||
|
||||
println!("=== Compiling {} ===", path);
|
||||
println!();
|
||||
|
||||
let result = std::process::Command::new(std::env::current_exe().unwrap())
|
||||
.args(compile_args)
|
||||
.status();
|
||||
|
||||
match result {
|
||||
Ok(status) if status.success() => {
|
||||
println!();
|
||||
println!("=== Success ===");
|
||||
}
|
||||
Ok(_) => {
|
||||
println!();
|
||||
println!("=== Failed ===");
|
||||
}
|
||||
Err(e) => {
|
||||
eprintln!("Error running compiler: {}", e);
|
||||
}
|
||||
}
|
||||
|
||||
println!();
|
||||
println!("Watching for changes...");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn serve_static_files(dir: &str, port: u16) {
|
||||
use std::io::{Write, BufRead, BufReader};
|
||||
use std::net::TcpListener;
|
||||
|
||||
Reference in New Issue
Block a user