diff --git a/crates/codegen/src/lib.rs b/crates/codegen/src/lib.rs index 53e70e2..6e397ce 100644 --- a/crates/codegen/src/lib.rs +++ b/crates/codegen/src/lib.rs @@ -236,6 +236,8 @@ impl GetRust for TypeExprKind { impl GenRust for Pattern { fn gen_rust(&self, ctx: &mut Context, cg: &mut RustCodegen) { match self { + Self::Etc => cg.add(".."), + Self::Literal(lit) => lit.gen_rust(ctx, cg), Self::Path(mutable, path) => { if *mutable { cg.add("mut "); @@ -243,19 +245,26 @@ impl GenRust for Pattern { cg.add(&path.get_rust()) } - Self::Literal(lit) => lit.gen_rust(ctx, cg), - Self::Struct(path, inner) => { cg.add(&path.get_rust()); cg.add(" {"); - for (name, pat) in inner { - cg.add(&name.get_rust()); - if let Some(pat) = pat { - cg.add(": "); - pat.gen_rust(ctx, cg); + + for (idx, i) in inner.iter().enumerate() { + if idx > 0 { + cg.add(", "); + } + + if let Some((name, pat)) = i { + cg.add(&name.get_rust()); + if let Some(pat) = pat { + cg.add(": "); + pat.gen_rust(ctx, cg); + } + } else { + cg.add(".."); } - cg.add(","); } + cg.add("}"); } diff --git a/crates/parser/src/ast/expr.rs b/crates/parser/src/ast/expr.rs index b51e492..08c3af3 100644 --- a/crates/parser/src/ast/expr.rs +++ b/crates/parser/src/ast/expr.rs @@ -33,10 +33,11 @@ pub enum Literal { #[derive(Debug, Clone, Serialize)] pub enum Pattern { NamedTuple(Path, Vec>), - Struct(Path, Vec<(Identifier, Option>)>), + Struct(Path, Vec>)>>), Tuple(Vec>), Literal(Literal), Path(bool, Path), + Etc, } #[derive(Debug, Clone, Serialize)] diff --git a/crates/parser/src/grammar.pest b/crates/parser/src/grammar.pest index ee78db8..26a7994 100644 --- a/crates/parser/src/grammar.pest +++ b/crates/parser/src/grammar.pest @@ -134,12 +134,14 @@ literal = { // PATTERNS // ====================================================== +etc_pattern = { ".." } + multi_pat_template = _{ - (pattern ~ ("," ~ pattern)*)? + ((pattern | etc_pattern) ~ ("," ~ (pattern | etc_pattern))*)? } tuple_pattern = { - "[" ~ pattern ~ "," ~ multi_pat_template ~ "]" + "[" ~ (pattern | etc_pattern) ~ "," ~ multi_pat_template ~ "]" } named_tuple_pattern = { @@ -151,7 +153,7 @@ struct_destruct = { } struct_pattern = { - static_path ~ "{" ~ (struct_destruct ~ ("," ~ struct_destruct)*)? ~ "}" + static_path ~ "{" ~ ((struct_destruct | etc_pattern) ~ ("," ~ (struct_destruct | etc_pattern))*)? ~ "}" } path_pattern = { diff --git a/crates/parser/src/parser/common/mod.rs b/crates/parser/src/parser/common/mod.rs index e626cae..6994f64 100644 --- a/crates/parser/src/parser/common/mod.rs +++ b/crates/parser/src/parser/common/mod.rs @@ -72,14 +72,19 @@ impl<'a> TryFrom> for Pattern { Rule::struct_pattern => ast_expr!(Pattern::Struct( Path::try_from(inner.next().unwrap()), collect_recovered_map(inner, |v| { - let mut inner = v.into_inner(); - ast_expr!(( + if v.as_rule() == Rule::etc_pattern { + return Ok(None); + } + + let mut inner = dbg!(v).into_inner(); + Some(ast_expr!(( Identifier::try_from(inner.next().unwrap()), inner .next() .map(|v| Self::try_from(v).map(Box::new).get_map(Box::new)) .transpose() - )) + ))) + .transpose() }), )), @@ -90,6 +95,8 @@ impl<'a> TryFrom> for Pattern { inner.next().unwrap().try_into() )), + Rule::etc_pattern => Ok(Pattern::Etc), + _ => AstError::bug_unimplemented(pair), } } diff --git a/mist-test/src/main.mist b/mist-test/src/main.mist index 994f30e..1a14ec9 100644 --- a/mist-test/src/main.mist +++ b/mist-test/src/main.mist @@ -1,7 +1,3 @@ -class Bro { - constructor([str*, str*] [idk, bro]) {} -} - void main() { test_package::hello(); }