Improved codegen
This commit is contained in:
+5
-2
@@ -166,11 +166,14 @@ impl GenRust for Postfix {
|
||||
Postfix::Call(args) => {
|
||||
cg.add("(");
|
||||
|
||||
for arg in args {
|
||||
arg.gen_rust(ctx, cg);
|
||||
for (i, arg) in args.iter().enumerate() {
|
||||
if i > 0 {
|
||||
cg.add(", ");
|
||||
}
|
||||
|
||||
arg.gen_rust(ctx, cg);
|
||||
}
|
||||
|
||||
cg.add(")");
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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,11 +75,13 @@ 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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
+2
-2
@@ -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);
|
||||
|
||||
+6
-6
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user