diff --git a/parser/src/ast.rs b/parser/src/ast.rs index 16a0968..ac6b1f0 100644 --- a/parser/src/ast.rs +++ b/parser/src/ast.rs @@ -120,6 +120,7 @@ pub enum EnumItem { #[derive(Debug, Clone, Serialize)] pub struct ClassConstructor { pub visibility: Visibility, + pub generics: Generics, pub params: ParamList, pub body: Block, } diff --git a/parser/src/grammar.pest b/parser/src/grammar.pest index 8ff673b..c557e5d 100644 --- a/parser/src/grammar.pest +++ b/parser/src/grammar.pest @@ -212,7 +212,7 @@ enum_decl = { // ====================================================== class_constructor = { - export? ~ "constructor" ~ "(" ~ param_list? ~ ")" ~ block + export? ~ "constructor" ~ generics? ~ "(" ~ param_list? ~ ")" ~ block } class_fields = { diff --git a/parser/src/lib.rs b/parser/src/lib.rs index 13113b1..fa01570 100644 --- a/parser/src/lib.rs +++ b/parser/src/lib.rs @@ -211,12 +211,17 @@ impl From> for ClassConstructor { let visibility = Visibility::from(&mut inner); + let generics = consume_rule(&mut inner, Rule::generics) + .map(Generics::from) + .unwrap_or_default(); + let params = consume_rule(&mut inner, Rule::param_list) .map(ParamList::from) .unwrap_or_else(|| ParamList(Vec::new())); Self { visibility, + generics, params, body: Block::from(inner.next().unwrap()), } diff --git a/src/codegen.rs b/src/codegen.rs index b8caf83..78299c7 100644 --- a/src/codegen.rs +++ b/src/codegen.rs @@ -394,8 +394,9 @@ impl ToRust for TopLevelKind { .join(", "); cg.add_indentedln(&format!( - "{}fn new({}) -> Self {{", + "{}fn new{}({}) -> Self {{", constructor.visibility.get_rust(), + constructor.generics.get_rust(), params_str )); cg.indent += 1; @@ -430,8 +431,9 @@ impl ToRust for TopLevelKind { // Constructor function cg.add_indentedln(&format!( - "{}fn construct_class(&mut self, {}) {{", + "{}fn construct_class{}(&mut self, {}) {{", constructor.visibility.get_rust(), + constructor.generics.get_rust(), params_str )); cg.indent += 1;