diff --git a/parser/src/ast/mod.rs b/parser/src/ast/mod.rs index cea2418..f1d03f3 100644 --- a/parser/src/ast/mod.rs +++ b/parser/src/ast/mod.rs @@ -59,3 +59,9 @@ impl From for Generic { } } } + +impl Spanned { + pub fn get_comment(&self) -> String { + format!("/* {}:{} */", self.line, self.column) + } +} diff --git a/parser/src/ast/top_level.rs b/parser/src/ast/top_level.rs index 1771fb6..f347c34 100644 --- a/parser/src/ast/top_level.rs +++ b/parser/src/ast/top_level.rs @@ -41,29 +41,29 @@ pub enum TopLevelKind { visibility: Visibility, name: Identifier, generics: GenericsDecl, - fields: Vec, + fields: Vec>, }, StructDecl { visibility: Visibility, name: Identifier, generics: GenericsDecl, - fields: Vec, + fields: Vec>, }, FunctionDecl(FunctionDecl), ClassDecl { visibility: Visibility, name: Identifier, generics: GenericsDecl, - fields: Vec, - constructor: ClassConstructor, + fields: Vec>, + constructor: Spanned, items: Vec, }, } #[derive(Debug, Clone, Serialize)] pub enum ClassItem { - Method(FunctionDecl), - ImplDecl(ImplDecl), + Method(Spanned), + ImplDecl(Spanned), } #[derive(Debug, Clone, Serialize, Default)] diff --git a/parser/src/parser/items/mod.rs b/parser/src/parser/items/mod.rs index 8277660..84a961e 100644 --- a/parser/src/parser/items/mod.rs +++ b/parser/src/parser/items/mod.rs @@ -54,7 +54,7 @@ impl<'a> TryFrom> for TopLevelKind { fields: inner .next() - .map(|pair| collect_recovered::(pair.into_inner())) + .map(|pair| collect_recovered(pair.into_inner())) .transpose() .map(|v| v.unwrap_or_default()), }), diff --git a/src/codegen.rs b/src/codegen.rs index bd83301..6fdd3c9 100644 --- a/src/codegen.rs +++ b/src/codegen.rs @@ -425,7 +425,7 @@ impl ToRust for TopLevelKind { cg.indent += 1; for field in fields { - cg.add_indentedln(&(format!("{}", field.get_rust()) + ",")); + cg.add_indentedln(&(field.get_rust() + ",")); } cg.indent -= 1; @@ -481,7 +481,8 @@ impl ToRust for TopLevelKind { cg.indent += 1; for field in fields.clone() { - cg.add_indentedln(&field.decl.get_rust()); + cg.add_indentedln(&field.get_comment()); + cg.add_indentedln(&field.item.decl.get_rust()); } cg.indent -= 1; @@ -505,6 +506,10 @@ impl ToRust for TopLevelKind { )); cg.indent += 1; + let constructor_comment = constructor.get_comment(); + + let constructor = constructor.item; + let params_str = constructor .params .0 @@ -515,6 +520,7 @@ impl ToRust for TopLevelKind { .join(", "); cg.add_indentedln("#[allow(invalid_value)]"); + cg.add_indentedln(&constructor_comment); cg.add_indentedln(&format!( "{}fn new{}({}) -> Self {{", constructor.visibility.clone().get_rust(), @@ -526,10 +532,14 @@ impl ToRust for TopLevelKind { cg.add_indentedln("let mut this: Self = unsafe { std::mem::MaybeUninit::::zeroed().assume_init() };"); for field in fields { - if let Some(init) = field.init { + let comment = field.get_comment(); + + if let Some(init) = field.item.init { + cg.add_indentedln(&comment); + cg.add_indentedln(&format!( "this.{} = {};", - field.decl.name.get_rust(), + field.item.decl.name.get_rust(), init.get_rust() )); } @@ -552,6 +562,7 @@ impl ToRust for TopLevelKind { cg.add_indentedln("}\n"); // Constructor function + cg.add_indentedln(&constructor_comment); cg.add_indentedln(&format!( "{}fn construct_class{}(&mut self, {}) {{", constructor.visibility.get_rust(), @@ -580,8 +591,8 @@ impl ToRust for TopLevelKind { ClassItem::ImplDecl(impl_) => { let mut impl_ = impl_.clone(); - impl_.trait_ = Some(impl_.target); - impl_.target = + impl_.item.trait_ = Some(impl_.item.target); + impl_.item.target = TypeExpr(TypeExprKind::Path(Path(vec![name.clone()])), Vec::new()); impl_.to_rust(cg);