diff --git a/crates/codegen/src/top_level.rs b/crates/codegen/src/top_level.rs index bbe1490..e4ed540 100644 --- a/crates/codegen/src/top_level.rs +++ b/crates/codegen/src/top_level.rs @@ -24,7 +24,21 @@ impl GetRust for GenericsDecl { impl GetRust for GenericDecl { fn get_rust(&self) -> String { match self { - GenericDecl::Lifetime(name) => format!("'{}", name.get_rust()), + GenericDecl::Lifetime(name, requirements) => { + format!("'{}", name.get_rust()) + + &(if requirements.len() != 0 { + format!( + ": {}", + requirements + .into_iter() + .map(GetRust::get_rust) + .collect::>() + .join("+") + ) + } else { + String::new() + }) + } GenericDecl::Type(name, requirements) => { name.get_rust() + &(if requirements.len() != 0 { @@ -32,7 +46,7 @@ impl GetRust for GenericDecl { ": {}", requirements .into_iter() - .map(TypeExpr::get_rust) + .map(GetRust::get_rust) .collect::>() .join("+") ) diff --git a/crates/parser/src/ast/mod.rs b/crates/parser/src/ast/mod.rs index 4731ba0..5b52ebb 100644 --- a/crates/parser/src/ast/mod.rs +++ b/crates/parser/src/ast/mod.rs @@ -60,7 +60,7 @@ pub struct Spanned { impl From for Generic { fn from(value: GenericDecl) -> Self { match value { - GenericDecl::Lifetime(life) => Generic::Lifetime(life), + GenericDecl::Lifetime(life, _) => Generic::Lifetime(life), GenericDecl::Type(ty, _) => Generic::Type(TypeExpr::Path(Path(vec![ty]), None)), } } diff --git a/crates/parser/src/ast/top_level.rs b/crates/parser/src/ast/top_level.rs index fd8427e..20ceba9 100644 --- a/crates/parser/src/ast/top_level.rs +++ b/crates/parser/src/ast/top_level.rs @@ -82,8 +82,8 @@ pub struct GenericsDecl(pub Vec); #[derive(Debug, Clone, Serialize)] pub enum GenericDecl { - Lifetime(Identifier), - Type(Identifier, Vec), + Lifetime(Identifier, Vec), + Type(Identifier, Vec), } #[derive(Debug, Clone, Serialize)] diff --git a/crates/parser/src/grammar.pest b/crates/parser/src/grammar.pest index a51c7e2..391ef69 100644 --- a/crates/parser/src/grammar.pest +++ b/crates/parser/src/grammar.pest @@ -90,7 +90,7 @@ mutable = { "mut" } // ====================================================== // GENERICS // ====================================================== -generic_decl = { lifetime | (identifier ~ (":" ~ generic ~ ("+" ~ generic)*)?) } +generic_decl = { (lifetime | identifier) ~ (":" ~ generic ~ ("+" ~ generic)*)? } generics_decl = { "<" ~ (generic_decl ~ ("," ~ generic_decl)*)? ~ ">" } generic = { lifetime | type_expr } @@ -125,9 +125,9 @@ fn_kind_mut = { "FnMut" } fn_kind = _{ fn_kind_fn | fn_kind_unsafe - | fn_kind_closure | fn_kind_once | fn_kind_mut + | fn_kind_closure } fn_type = { diff --git a/crates/parser/src/parser/common/types.rs b/crates/parser/src/parser/common/types.rs index 341733e..ddb4bdc 100644 --- a/crates/parser/src/parser/common/types.rs +++ b/crates/parser/src/parser/common/types.rs @@ -131,6 +131,7 @@ impl<'a> TryFrom> for GenericDecl { if let Some(pair) = consume_rule(&mut inner, Rule::lifetime) { Ok(GenericDecl::Lifetime( pair.into_inner().next().unwrap().try_into()?, + collect_recovered(inner)?, )) } else { Ok(GenericDecl::Type(