diff --git a/codegen/src/expr.rs b/codegen/src/expr.rs index 1729525..298b6cb 100644 --- a/codegen/src/expr.rs +++ b/codegen/src/expr.rs @@ -166,9 +166,12 @@ impl GenRust for Postfix { Postfix::Call(args) => { cg.add("("); - for arg in args { + for (i, arg) in args.iter().enumerate() { + if i > 0 { + cg.add(", "); + } + arg.gen_rust(ctx, cg); - cg.add(", "); } cg.add(")"); diff --git a/codegen/src/lib.rs b/codegen/src/lib.rs index a2513fc..220cde2 100644 --- a/codegen/src/lib.rs +++ b/codegen/src/lib.rs @@ -81,6 +81,19 @@ impl RustCodegen { } } } + + pub fn ensure_brackets_expr(&mut self, ctx: &mut Context, expr: &Expression) { + match expr { + Expression::Statement(stmt) => self.ensure_brackets(ctx, stmt), + _ => { + self.add("{"); + self.indent += 1; + expr.gen_rust(ctx, self); + self.indent -= 1; + self.add("}"); + } + } + } } impl GenRust for Attribute { diff --git a/codegen/src/statement.rs b/codegen/src/statement.rs index 2274f5c..5ac4681 100644 --- a/codegen/src/statement.rs +++ b/codegen/src/statement.rs @@ -18,10 +18,11 @@ impl GenRust for Block { if let Some(soft_return) = &self.1 { ctx.expr_ensure_semicolon = false; soft_return.gen_rust(ctx, cg); + cg.addln(""); } cg.indent -= 1; - cg.add_indentedln("}"); + cg.add_indented("}"); } } @@ -57,17 +58,14 @@ impl GenRust for Statement { p.gen_rust(ctx, cg); } - cg.add(" => {"); - cg.indent += 1; + cg.add(" => "); - body.gen_rust(ctx, cg); - - cg.indent -= 1; - cg.add_indentedln("}"); + cg.ensure_brackets_expr(ctx, body); } cg.indent -= 1; - cg.add_indentedln("}"); + cg.addln(""); + cg.add_indented("}"); } Statement::If { @@ -77,16 +75,18 @@ impl GenRust for Statement { } => { cg.add("if "); initial.condition.gen_rust(ctx, cg); + cg.add(" "); cg.ensure_brackets(ctx, &initial.body); for else_if_branch in else_if { cg.add("else if"); else_if_branch.condition.gen_rust(ctx, cg); + cg.add(" "); cg.ensure_brackets(ctx, &else_if_branch.body); } if let Some(else_br) = else_branch { - cg.add("else"); + cg.add(" else "); cg.ensure_brackets(ctx, else_br); } } @@ -116,7 +116,9 @@ impl GenRust for Statement { cg.indent += 1; - cg.ensure_brackets(ctx, body); + ctx.expr_ensure_semicolon = true; + + body.gen_rust(ctx, cg); update.gen_rust(ctx, cg); diff --git a/src/main.mist b/src/main.mist index 05af30c..70447ac 100644 --- a/src/main.mist +++ b/src/main.mist @@ -15,7 +15,7 @@ void main() { match (args[1].as_str()) { "run" | "build" | "check" | "r" | "b" | "c" => { - var root = transpiler::build(); + var root = transpiler::build(false); println!(""); @@ -26,7 +26,7 @@ void main() { } } "transpile" | "t" => { - transpiler::build(); + transpiler::build(args.get(2).is_some()); } "init" => { init_project(args); diff --git a/src/transpiler.rs b/src/transpiler.rs index 77b2522..8c2a6ea 100644 --- a/src/transpiler.rs +++ b/src/transpiler.rs @@ -7,7 +7,7 @@ use std::{ use mist_parser::error::ParseError; -pub fn build() -> PathBuf { +pub fn build(force: bool) -> PathBuf { let start = Instant::now(); let root = std::env::current_dir() @@ -17,7 +17,7 @@ pub fn build() -> PathBuf { let src_dir = root.join("src"); let out_dir = root.join(".mist/src"); - build_dir(&root, &src_dir, &src_dir, &out_dir); + build_dir(&root, &src_dir, &src_dir, &out_dir, force); let elapsed = start.elapsed(); @@ -29,7 +29,7 @@ pub fn build() -> PathBuf { root } -fn build_dir(root: &Path, base_src: &Path, current_dir: &Path, out_dir: &Path) { +fn build_dir(root: &Path, base_src: &Path, current_dir: &Path, out_dir: &Path, force: bool) { let entries = match fs::read_dir(current_dir) { Ok(entries) => entries, Err(e) => { @@ -57,7 +57,7 @@ fn build_dir(root: &Path, base_src: &Path, current_dir: &Path, out_dir: &Path) { // recurse into nested directories if path.is_dir() { - build_dir(root, base_src, &path, out_dir); + build_dir(root, base_src, &path, out_dir, force); continue; } @@ -72,7 +72,7 @@ fn build_dir(root: &Path, base_src: &Path, current_dir: &Path, out_dir: &Path) { let _ = fs::create_dir_all(parent); } - if should_skip(&path, &dest_path) { + if !force && should_skip(&path, &dest_path) { continue; } @@ -83,7 +83,7 @@ fn build_dir(root: &Path, base_src: &Path, current_dir: &Path, out_dir: &Path) { let output_path = out_dir.join(relative).with_extension("rs"); // Cache layer: Skip if the generated .rs file is newer than the .mist source - if should_skip(&path, &output_path) { + if !force && should_skip(&path, &output_path) { continue; }