1
0
Fork 0
mirror of synced 2025-09-23 12:18:44 +00:00

pass type to member expressions

This commit is contained in:
schaeff 2021-05-27 16:45:48 +02:00
parent 429ace784f
commit 7d48c6be12
3 changed files with 23 additions and 15 deletions

View file

@ -1048,6 +1048,7 @@ impl<'ast, 'a, T: Field> ResultFolder<'ast, T> for Propagator<'ast, 'a, T> {
E: Expr<'ast, T> + Member<'ast, T> + From<TypedExpression<'ast, T>>,
>(
&mut self,
_: &E::Ty,
m: MemberExpression<'ast, T, E>,
) -> Result<ThisOrUncle<MemberExpression<'ast, T, E>, E::Inner>, Self::Error> {
let id = m.id;

View file

@ -193,9 +193,10 @@ pub trait Folder<'ast, T: Field>: Sized {
E: Expr<'ast, T> + Member<'ast, T> + From<TypedExpression<'ast, T>>,
>(
&mut self,
ty: &E::Ty,
e: MemberExpression<'ast, T, E>,
) -> ThisOrUncle<MemberExpression<'ast, T, E>, E::Inner> {
fold_member_expression(self, e)
fold_member_expression(self, ty, e)
}
fn fold_select_expression<
@ -363,7 +364,7 @@ pub fn fold_array_expression_inner<'ast, T: Field, F: Folder<'ast, T>>(
ThisOrUncle::This(s) => ArrayExpressionInner::Select(s),
ThisOrUncle::Uncle(u) => u,
},
ArrayExpressionInner::Member(m) => match f.fold_member_expression(m) {
ArrayExpressionInner::Member(m) => match f.fold_member_expression(ty, m) {
ThisOrUncle::This(m) => ArrayExpressionInner::Member(m),
ThisOrUncle::Uncle(u) => u,
},
@ -413,7 +414,7 @@ pub fn fold_struct_expression_inner<'ast, T: Field, F: Folder<'ast, T>>(
ThisOrUncle::This(s) => StructExpressionInner::Select(s),
ThisOrUncle::Uncle(u) => u,
},
StructExpressionInner::Member(m) => match f.fold_member_expression(m) {
StructExpressionInner::Member(m) => match f.fold_member_expression(ty, m) {
ThisOrUncle::This(m) => StructExpressionInner::Member(m),
ThisOrUncle::Uncle(u) => u,
},
@ -487,7 +488,8 @@ pub fn fold_field_expression<'ast, T: Field, F: Folder<'ast, T>>(
ThisOrUncle::Uncle(u) => u,
}
}
FieldElementExpression::Member(m) => match f.fold_member_expression(m) {
FieldElementExpression::Member(m) => match f.fold_member_expression(&Type::FieldElement, m)
{
ThisOrUncle::This(m) => FieldElementExpression::Member(m),
ThisOrUncle::Uncle(u) => u,
},
@ -501,6 +503,7 @@ pub fn fold_member_expression<
F: Folder<'ast, T>,
>(
f: &mut F,
_: &E::Ty,
e: MemberExpression<'ast, T, E>,
) -> ThisOrUncle<MemberExpression<'ast, T, E>, E::Inner> {
ThisOrUncle::This(MemberExpression::new(
@ -638,7 +641,7 @@ pub fn fold_boolean_expression<'ast, T: Field, F: Folder<'ast, T>>(
ThisOrUncle::This(s) => BooleanExpression::Select(s),
ThisOrUncle::Uncle(u) => u,
},
BooleanExpression::Member(m) => match f.fold_member_expression(m) {
BooleanExpression::Member(m) => match f.fold_member_expression(&Type::Boolean, m) {
ThisOrUncle::This(m) => BooleanExpression::Member(m),
ThisOrUncle::Uncle(u) => u,
},
@ -763,7 +766,7 @@ pub fn fold_uint_expression_inner<'ast, T: Field, F: Folder<'ast, T>>(
let alt = f.fold_uint_expression(alt);
UExpressionInner::IfElse(box cond, box cons, box alt)
}
UExpressionInner::Member(m) => match f.fold_member_expression(m) {
UExpressionInner::Member(m) => match f.fold_member_expression(&ty, m) {
ThisOrUncle::This(m) => UExpressionInner::Member(m),
ThisOrUncle::Uncle(u) => u,
},

View file

@ -149,9 +149,10 @@ pub trait ResultFolder<'ast, T: Field>: Sized {
E: Expr<'ast, T> + Member<'ast, T> + From<TypedExpression<'ast, T>>,
>(
&mut self,
ty: &E::Ty,
e: MemberExpression<'ast, T, E>,
) -> Result<ThisOrUncle<MemberExpression<'ast, T, E>, E::Inner>, Self::Error> {
fold_member_expression(self, e)
fold_member_expression(self, ty, e)
}
fn fold_select_expression<
@ -404,7 +405,7 @@ pub fn fold_array_expression_inner<'ast, T: Field, F: ResultFolder<'ast, T>>(
box f.fold_array_expression(alternative)?,
)
}
ArrayExpressionInner::Member(m) => match f.fold_member_expression(m)? {
ArrayExpressionInner::Member(m) => match f.fold_member_expression(ty, m)? {
ThisOrUncle::This(m) => ArrayExpressionInner::Member(m),
ThisOrUncle::Uncle(u) => u,
},
@ -463,7 +464,7 @@ pub fn fold_struct_expression_inner<'ast, T: Field, F: ResultFolder<'ast, T>>(
box f.fold_struct_expression(alternative)?,
)
}
StructExpressionInner::Member(m) => match f.fold_member_expression(m)? {
StructExpressionInner::Member(m) => match f.fold_member_expression(ty, m)? {
ThisOrUncle::This(m) => StructExpressionInner::Member(m),
ThisOrUncle::Uncle(u) => u,
},
@ -539,10 +540,12 @@ pub fn fold_field_expression<'ast, T: Field, F: ResultFolder<'ast, T>>(
.collect::<Result<_, _>>()?;
FieldElementExpression::FunctionCall(key, generics, exps)
}
FieldElementExpression::Member(m) => match f.fold_member_expression(m)? {
ThisOrUncle::This(m) => FieldElementExpression::Member(m),
ThisOrUncle::Uncle(u) => u,
},
FieldElementExpression::Member(m) => {
match f.fold_member_expression(&Type::FieldElement, m)? {
ThisOrUncle::This(m) => FieldElementExpression::Member(m),
ThisOrUncle::Uncle(u) => u,
}
}
FieldElementExpression::Select(select) => {
match f.fold_select_expression(&Type::FieldElement, select)? {
ThisOrUncle::This(s) => FieldElementExpression::Select(s),
@ -584,6 +587,7 @@ pub fn fold_member_expression<
F: ResultFolder<'ast, T>,
>(
f: &mut F,
_: &E::Ty,
e: MemberExpression<'ast, T, E>,
) -> Result<ThisOrUncle<MemberExpression<'ast, T, E>, E::Inner>, F::Error> {
Ok(ThisOrUncle::This(MemberExpression::new(
@ -720,7 +724,7 @@ pub fn fold_boolean_expression<'ast, T: Field, F: ResultFolder<'ast, T>>(
ThisOrUncle::Uncle(u) => u,
}
}
BooleanExpression::Member(m) => match f.fold_member_expression(m)? {
BooleanExpression::Member(m) => match f.fold_member_expression(&Type::Boolean, m)? {
ThisOrUncle::This(m) => BooleanExpression::Member(m),
ThisOrUncle::Uncle(u) => u,
},
@ -849,7 +853,7 @@ pub fn fold_uint_expression_inner<'ast, T: Field, F: ResultFolder<'ast, T>>(
let alt = f.fold_uint_expression(alt)?;
UExpressionInner::IfElse(box cond, box cons, box alt)
}
UExpressionInner::Member(m) => match f.fold_member_expression(m)? {
UExpressionInner::Member(m) => match f.fold_member_expression(&ty, m)? {
ThisOrUncle::This(m) => UExpressionInner::Member(m),
ThisOrUncle::Uncle(u) => u,
},