diff --git a/codegen/src/lib.rs b/codegen/src/lib.rs index c406d09..a2513fc 100644 --- a/codegen/src/lib.rs +++ b/codegen/src/lib.rs @@ -119,6 +119,7 @@ impl GetRust for Spanned { impl GenRust for Spanned { fn gen_rust(&self, ctx: &mut Context, cg: &mut RustCodegen) { cg.add_indentedln(&format!("/* {}:{} */", self.line, self.column)); + cg.add_indented(""); self.item.gen_rust(ctx, cg); } } diff --git a/codegen/src/statement.rs b/codegen/src/statement.rs index e2a1ecb..2274f5c 100644 --- a/codegen/src/statement.rs +++ b/codegen/src/statement.rs @@ -6,29 +6,29 @@ use crate::{GenRust, GetRust, RustCodegen}; impl GenRust for Block { fn gen_rust(&self, ctx: &mut Context, cg: &mut RustCodegen) { + cg.addln("{"); + cg.indent += 1; + for stmt in &self.0 { ctx.expr_ensure_semicolon = true; - cg.add_indented(""); stmt.gen_rust(ctx, cg); + cg.addln(""); } if let Some(soft_return) = &self.1 { ctx.expr_ensure_semicolon = false; soft_return.gen_rust(ctx, cg); } + + cg.indent -= 1; + cg.add_indentedln("}"); } } impl GenRust for Statement { fn gen_rust(&self, ctx: &mut Context, cg: &mut RustCodegen) { match self { - Statement::Block(block) => { - cg.add_indentedln("{"); - cg.indent += 1; - block.gen_rust(ctx, cg); - cg.indent -= 1; - cg.add_indentedln("}"); - } + Statement::Block(block) => block.gen_rust(ctx, cg), Statement::VarDecl(VarDeclStmt { decl, init }) => { cg.add("let "); @@ -48,6 +48,8 @@ impl GenRust for Statement { for (pat, body) in match_items { for (i, p) in pat.iter().enumerate() { + cg.addln(""); + cg.add_indented(""); if i > 0 { cg.add(" | "); } @@ -55,7 +57,7 @@ impl GenRust for Statement { p.gen_rust(ctx, cg); } - cg.add("=> {"); + cg.add(" => {"); cg.indent += 1; body.gen_rust(ctx, cg); diff --git a/codegen/src/top_level.rs b/codegen/src/top_level.rs index a5c54a9..34bd69f 100644 --- a/codegen/src/top_level.rs +++ b/codegen/src/top_level.rs @@ -73,7 +73,7 @@ impl GenRust for ImplDecl { impl GenRust for FunctionDecl { fn gen_rust(&self, ctx: &mut Context, cg: &mut RustCodegen) { - cg.add_indentedln(&format!( + cg.add(&format!( "{}fn {}{}(", self.visibility.get_rust(), self.name.get_rust(), @@ -82,7 +82,7 @@ impl GenRust for FunctionDecl { for (i, param) in self.params.0.iter().enumerate() { if i > 0 { - cg.add(","); + cg.add(", "); } param.gen_rust(ctx, cg); @@ -92,11 +92,8 @@ impl GenRust for FunctionDecl { cg.add(&self.return_type.get_rust()); if let Some(body) = &self.body { - cg.add_indentedln(" {\n"); - cg.indent += 1; + cg.add(" "); body.gen_rust(ctx, cg); - cg.indent -= 1; - cg.add_indentedln("}\n"); } else { cg.add(";"); } @@ -170,17 +167,17 @@ impl GenRust for TopLevel { } } -impl GenRust for (&Vec>, &ClassConstructor) { +impl GenRust for (&Vec>, &Spanned) { fn gen_rust(&self, ctx: &mut Context, cg: &mut RustCodegen) { - cg.add_indentedln(&format!( + cg.add_indented(&format!( "{}fn new{}(", - self.1.visibility.get_rust(), - self.1.generics.get_rust() + self.1.item.visibility.get_rust(), + self.1.item.generics.get_rust() )); - self.1.params.gen_rust(ctx, cg); + self.1.item.params.gen_rust(ctx, cg); - cg.add(") -> Self {"); + cg.addln(") -> Self {"); cg.indent += 1; cg.add_indentedln("let mut this: Self = unsafe { std::mem::MaybeUninit::::zeroed().assume_init() };"); @@ -197,9 +194,9 @@ impl GenRust for (&Vec>, &ClassConstructor) { } } - cg.add_indentedln(&format!("this.constructor(")); + cg.add_indented(&format!("this.constructor(")); - for (i, param) in self.1.params.0.iter().enumerate() { + for (i, param) in self.1.item.params.0.iter().enumerate() { if i > 0 { cg.add(", "); } @@ -207,7 +204,7 @@ impl GenRust for (&Vec>, &ClassConstructor) { param.name.gen_rust(ctx, cg); } - cg.add(");"); + cg.addln(");"); cg.add_indentedln("this"); @@ -223,15 +220,19 @@ impl GenRust for (&Vec>, &ClassConstructor) { )), }]; - constructor_params.append(&mut self.1.params.0.clone()); + constructor_params.append(&mut self.1.item.params.0.clone()); - FunctionDecl { - visibility: self.1.visibility.clone(), - name: Identifier(String::from("constructor")), - generics: self.1.generics.clone(), - params: ParamList(constructor_params), - return_type: TypeExpr::no_px(TypeExprKind::Tuple(Vec::new())), - body: Some(self.1.body.clone()), + Spanned { + line: self.1.line, + column: self.1.column, + item: FunctionDecl { + visibility: self.1.item.visibility.clone(), + name: Identifier(String::from("constructor")), + generics: self.1.item.generics.clone(), + params: ParamList(constructor_params), + return_type: TypeExpr::no_px(TypeExprKind::Tuple(Vec::new())), + body: Some(self.1.item.body.clone()), + }, } .gen_rust(ctx, cg); } @@ -369,7 +370,7 @@ impl GenRust for TopLevelKind { cg.add_indentedln("#[allow(invalid_value)]"); cg.add_indentedln(&constructor_comment); - (fields, &constructor.item).gen_rust(ctx, cg); + (fields, constructor).gen_rust(ctx, cg); for item in items.clone() { match item { diff --git a/mist-test/src/logger.mist b/mist-test/src/logger.mist index ca23341..e8ee98a 100644 --- a/mist-test/src/logger.mist +++ b/mist-test/src/logger.mist @@ -19,7 +19,6 @@ impl fmt::Display for LogLevel { LogLevel::Warning => write!(f, "[WARN]"); LogLevel::Error => write!(f, "[ERROR]"); - } } }