Fixed constructor args

This commit is contained in:
2026-06-04 10:39:41 +02:00
parent a4df59927e
commit 7a5e03afd6
6 changed files with 57 additions and 30 deletions
+6 -2
View File
@@ -248,8 +248,12 @@ impl GenRust for Pattern {
Self::Struct(path, inner) => {
cg.add(&path.get_rust());
cg.add(" {");
for pat in inner {
pat.gen_rust(ctx, cg);
for (name, pat) in inner {
cg.add(&name.get_rust());
if let Some(pat) = pat {
cg.add(": ");
pat.gen_rust(ctx, cg);
}
cg.add(",");
}
cg.add("}");
+27 -25
View File
@@ -175,7 +175,27 @@ impl GenRust for (&Vec<Spanned<FieldDeclStmt>>, &Spanned<ClassConstructor>) {
self.1.item.generics.get_rust()
));
self.1.item.params.gen_rust(ctx, cg);
let params = self
.1
.item
.params
.0
.clone()
.into_iter()
.enumerate()
.map(|(idx, mut v)| {
v.name = construct_pattern(&v.name, idx);
(idx, v)
})
.collect::<Vec<_>>();
for (i, param) in &params {
if *i > 0 {
cg.add(", ");
}
param.gen_rust(ctx, cg);
}
cg.addln(") -> Self {");
cg.indent += 1;
@@ -196,21 +216,13 @@ impl GenRust for (&Vec<Spanned<FieldDeclStmt>>, &Spanned<ClassConstructor>) {
cg.add_indented(&format!("this.constructor("));
for (i, param) in self
.1
.item
.params
.0
.iter()
.map(|v| expr_pattern(&v.name))
.enumerate()
{
for (i, param) in params {
if i > 0 {
cg.add(", ");
}
ctx.expr_ensure_semicolon = false;
param.gen_rust(ctx, cg);
param.name.gen_rust(ctx, cg);
}
cg.addln(");");
@@ -246,21 +258,11 @@ impl GenRust for (&Vec<Spanned<FieldDeclStmt>>, &Spanned<ClassConstructor>) {
}
}
pub fn expr_pattern(pat: &Pattern) -> Expression {
fn construct_pattern(pat: &Pattern, idx: usize) -> Pattern {
match pat {
Pattern::Literal(v) => Expression::Literal(v.clone()),
Pattern::Path(_, v) => Expression::Path(v.clone().into()),
Pattern::Tuple(items) => Expression::Literal(Literal::Tuple(
items.iter().map(|v| expr_pattern(&v)).collect(),
)),
Pattern::NamedTuple(path, items) => Expression::Fix {
initial: Box::new(Expression::Path(path.clone().into())),
prefixes: Vec::new(),
postfixes: vec![Postfix::Call(
items.iter().map(|v| expr_pattern(&v)).collect(),
)],
},
Pattern::Struct(_, _) => unimplemented!(),
Pattern::Literal(v) => Pattern::Literal(v.clone()),
Pattern::Path(is_mut, v) => Pattern::Path(*is_mut, v.clone().into()),
_ => Pattern::Path(false, Path(vec![Identifier(format!("_{idx}"))])),
}
}