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

pass type to select expression

This commit is contained in:
schaeff 2021-05-27 16:39:31 +02:00
parent ecba82b144
commit 429ace784f
6 changed files with 48 additions and 27 deletions

View file

@ -60,6 +60,7 @@ impl<'ast, T: Field> ResultFolder<'ast, T> for BoundsChecker {
E: Expr<'ast, T> + Select<'ast, T> + From<TypedExpression<'ast, T>>,
>(
&mut self,
_: &E::Ty,
select: SelectExpression<'ast, T, E>,
) -> Result<ThisOrUncle<SelectExpression<'ast, T, E>, E::Inner>, Self::Error> {
let array = self.fold_array_expression(*select.array)?;

View file

@ -1080,6 +1080,7 @@ impl<'ast, 'a, T: Field> ResultFolder<'ast, T> for Propagator<'ast, 'a, T> {
E: Expr<'ast, T> + Select<'ast, T> + From<TypedExpression<'ast, T>>,
>(
&mut self,
_: &E::Ty,
e: SelectExpression<'ast, T, E>,
) -> Result<ThisOrUncle<SelectExpression<'ast, T, E>, E::Inner>, Self::Error> {
let array = self.fold_array_expression(*e.array)?;

View file

@ -93,6 +93,7 @@ impl<'ast, T: Field> Folder<'ast, T> for VariableReadRemover<'ast, T> {
E: Expr<'ast, T> + Select<'ast, T> + IfElse<'ast, T> + From<TypedExpression<'ast, T>>,
>(
&mut self,
_: &E::Ty,
e: SelectExpression<'ast, T, E>,
) -> ThisOrUncle<SelectExpression<'ast, T, E>, E::Inner> {
ThisOrUncle::Uncle(self.select(e))

View file

@ -202,9 +202,10 @@ pub trait Folder<'ast, T: Field>: Sized {
E: Expr<'ast, T> + Select<'ast, T> + IfElse<'ast, T> + From<TypedExpression<'ast, T>>,
>(
&mut self,
ty: &E::Ty,
e: SelectExpression<'ast, T, E>,
) -> ThisOrUncle<SelectExpression<'ast, T, E>, E::Inner> {
fold_select_expression(self, e)
fold_select_expression(self, ty, e)
}
fn fold_array_expression(&mut self, e: ArrayExpression<'ast, T>) -> ArrayExpression<'ast, T> {
@ -329,7 +330,7 @@ pub fn fold_statement<'ast, T: Field, F: Folder<'ast, T>>(
pub fn fold_array_expression_inner<'ast, T: Field, F: Folder<'ast, T>>(
f: &mut F,
_: &ArrayType<'ast, T>,
ty: &ArrayType<'ast, T>,
e: ArrayExpressionInner<'ast, T>,
) -> ArrayExpressionInner<'ast, T> {
match e {
@ -358,7 +359,7 @@ pub fn fold_array_expression_inner<'ast, T: Field, F: Folder<'ast, T>>(
box f.fold_array_expression(alternative),
)
}
ArrayExpressionInner::Select(select) => match f.fold_select_expression(select) {
ArrayExpressionInner::Select(select) => match f.fold_select_expression(ty, select) {
ThisOrUncle::This(s) => ArrayExpressionInner::Select(s),
ThisOrUncle::Uncle(u) => u,
},
@ -382,7 +383,7 @@ pub fn fold_array_expression_inner<'ast, T: Field, F: Folder<'ast, T>>(
pub fn fold_struct_expression_inner<'ast, T: Field, F: Folder<'ast, T>>(
f: &mut F,
_: &StructType<'ast, T>,
ty: &StructType<'ast, T>,
e: StructExpressionInner<'ast, T>,
) -> StructExpressionInner<'ast, T> {
match e {
@ -408,7 +409,7 @@ pub fn fold_struct_expression_inner<'ast, T: Field, F: Folder<'ast, T>>(
box f.fold_struct_expression(alternative),
)
}
StructExpressionInner::Select(select) => match f.fold_select_expression(select) {
StructExpressionInner::Select(select) => match f.fold_select_expression(ty, select) {
ThisOrUncle::This(s) => StructExpressionInner::Select(s),
ThisOrUncle::Uncle(u) => u,
},
@ -480,10 +481,12 @@ pub fn fold_field_expression<'ast, T: Field, F: Folder<'ast, T>>(
let exps = exps.into_iter().map(|e| f.fold_expression(e)).collect();
FieldElementExpression::FunctionCall(key, generics, exps)
}
FieldElementExpression::Select(select) => match f.fold_select_expression(select) {
ThisOrUncle::This(s) => FieldElementExpression::Select(s),
ThisOrUncle::Uncle(u) => u,
},
FieldElementExpression::Select(select) => {
match f.fold_select_expression(&Type::FieldElement, select) {
ThisOrUncle::This(s) => FieldElementExpression::Select(s),
ThisOrUncle::Uncle(u) => u,
}
}
FieldElementExpression::Member(m) => match f.fold_member_expression(m) {
ThisOrUncle::This(m) => FieldElementExpression::Member(m),
ThisOrUncle::Uncle(u) => u,
@ -513,6 +516,7 @@ pub fn fold_select_expression<
F: Folder<'ast, T>,
>(
f: &mut F,
_: &E::Ty,
e: SelectExpression<'ast, T, E>,
) -> ThisOrUncle<SelectExpression<'ast, T, E>, E::Inner> {
ThisOrUncle::This(SelectExpression::new(
@ -629,7 +633,8 @@ pub fn fold_boolean_expression<'ast, T: Field, F: Folder<'ast, T>>(
let alt = f.fold_boolean_expression(alt);
BooleanExpression::IfElse(box cond, box cons, box alt)
}
BooleanExpression::Select(select) => match f.fold_select_expression(select) {
BooleanExpression::Select(select) => match f.fold_select_expression(&Type::Boolean, select)
{
ThisOrUncle::This(s) => BooleanExpression::Select(s),
ThisOrUncle::Uncle(u) => u,
},
@ -652,7 +657,7 @@ pub fn fold_uint_expression<'ast, T: Field, F: Folder<'ast, T>>(
pub fn fold_uint_expression_inner<'ast, T: Field, F: Folder<'ast, T>>(
f: &mut F,
_: UBitwidth,
ty: UBitwidth,
e: UExpressionInner<'ast, T>,
) -> UExpressionInner<'ast, T> {
match e {
@ -748,7 +753,7 @@ pub fn fold_uint_expression_inner<'ast, T: Field, F: Folder<'ast, T>>(
let exps = exps.into_iter().map(|e| f.fold_expression(e)).collect();
UExpressionInner::FunctionCall(key, generics, exps)
}
UExpressionInner::Select(select) => match f.fold_select_expression(select) {
UExpressionInner::Select(select) => match f.fold_select_expression(&ty, select) {
ThisOrUncle::This(s) => UExpressionInner::Select(s),
ThisOrUncle::Uncle(u) => u,
},

View file

@ -1592,6 +1592,7 @@ impl<'ast, T: Field> From<Variable<'ast, T>> for TypedExpression<'ast, T> {
pub trait Expr<'ast, T> {
type Inner;
type Ty;
fn into_inner(self) -> Self::Inner;
@ -1600,6 +1601,7 @@ pub trait Expr<'ast, T> {
impl<'ast, T> Expr<'ast, T> for FieldElementExpression<'ast, T> {
type Inner = Self;
type Ty = Type<'ast, T>;
fn into_inner(self) -> Self::Inner {
self
@ -1612,6 +1614,7 @@ impl<'ast, T> Expr<'ast, T> for FieldElementExpression<'ast, T> {
impl<'ast, T> Expr<'ast, T> for BooleanExpression<'ast, T> {
type Inner = Self;
type Ty = Type<'ast, T>;
fn into_inner(self) -> Self::Inner {
self
@ -1624,6 +1627,7 @@ impl<'ast, T> Expr<'ast, T> for BooleanExpression<'ast, T> {
impl<'ast, T> Expr<'ast, T> for UExpression<'ast, T> {
type Inner = UExpressionInner<'ast, T>;
type Ty = UBitwidth;
fn into_inner(self) -> Self::Inner {
self.inner
@ -1636,6 +1640,7 @@ impl<'ast, T> Expr<'ast, T> for UExpression<'ast, T> {
impl<'ast, T> Expr<'ast, T> for StructExpression<'ast, T> {
type Inner = StructExpressionInner<'ast, T>;
type Ty = StructType<'ast, T>;
fn into_inner(self) -> Self::Inner {
self.inner
@ -1648,6 +1653,7 @@ impl<'ast, T> Expr<'ast, T> for StructExpression<'ast, T> {
impl<'ast, T> Expr<'ast, T> for ArrayExpression<'ast, T> {
type Inner = ArrayExpressionInner<'ast, T>;
type Ty = ArrayType<'ast, T>;
fn into_inner(self) -> Self::Inner {
self.inner
@ -1660,6 +1666,7 @@ impl<'ast, T> Expr<'ast, T> for ArrayExpression<'ast, T> {
impl<'ast, T> Expr<'ast, T> for IntExpression<'ast, T> {
type Inner = Self;
type Ty = Type<'ast, T>;
fn into_inner(self) -> Self::Inner {
self

View file

@ -158,9 +158,10 @@ pub trait ResultFolder<'ast, T: Field>: Sized {
E: Expr<'ast, T> + Select<'ast, T> + From<TypedExpression<'ast, T>>,
>(
&mut self,
ty: &E::Ty,
e: SelectExpression<'ast, T, E>,
) -> Result<ThisOrUncle<SelectExpression<'ast, T, E>, E::Inner>, Self::Error> {
fold_select_expression(self, e)
fold_select_expression(self, ty, e)
}
fn fold_array_type(
@ -371,7 +372,7 @@ pub fn fold_statement<'ast, T: Field, F: ResultFolder<'ast, T>>(
pub fn fold_array_expression_inner<'ast, T: Field, F: ResultFolder<'ast, T>>(
f: &mut F,
_: &ArrayType<'ast, T>,
ty: &ArrayType<'ast, T>,
e: ArrayExpressionInner<'ast, T>,
) -> Result<ArrayExpressionInner<'ast, T>, F::Error> {
let e = match e {
@ -407,7 +408,7 @@ pub fn fold_array_expression_inner<'ast, T: Field, F: ResultFolder<'ast, T>>(
ThisOrUncle::This(m) => ArrayExpressionInner::Member(m),
ThisOrUncle::Uncle(u) => u,
},
ArrayExpressionInner::Select(select) => match f.fold_select_expression(select)? {
ArrayExpressionInner::Select(select) => match f.fold_select_expression(ty, select)? {
ThisOrUncle::This(m) => ArrayExpressionInner::Select(m),
ThisOrUncle::Uncle(u) => u,
},
@ -428,7 +429,7 @@ pub fn fold_array_expression_inner<'ast, T: Field, F: ResultFolder<'ast, T>>(
pub fn fold_struct_expression_inner<'ast, T: Field, F: ResultFolder<'ast, T>>(
f: &mut F,
_: &StructType<'ast, T>,
ty: &StructType<'ast, T>,
e: StructExpressionInner<'ast, T>,
) -> Result<StructExpressionInner<'ast, T>, F::Error> {
let e = match e {
@ -466,7 +467,7 @@ pub fn fold_struct_expression_inner<'ast, T: Field, F: ResultFolder<'ast, T>>(
ThisOrUncle::This(m) => StructExpressionInner::Member(m),
ThisOrUncle::Uncle(u) => u,
},
StructExpressionInner::Select(select) => match f.fold_select_expression(select)? {
StructExpressionInner::Select(select) => match f.fold_select_expression(ty, select)? {
ThisOrUncle::This(m) => StructExpressionInner::Select(m),
ThisOrUncle::Uncle(u) => u,
},
@ -542,10 +543,12 @@ pub fn fold_field_expression<'ast, T: Field, F: ResultFolder<'ast, T>>(
ThisOrUncle::This(m) => FieldElementExpression::Member(m),
ThisOrUncle::Uncle(u) => u,
},
FieldElementExpression::Select(select) => match f.fold_select_expression(select)? {
ThisOrUncle::This(s) => FieldElementExpression::Select(s),
ThisOrUncle::Uncle(u) => u,
},
FieldElementExpression::Select(select) => {
match f.fold_select_expression(&Type::FieldElement, select)? {
ThisOrUncle::This(s) => FieldElementExpression::Select(s),
ThisOrUncle::Uncle(u) => u,
}
}
};
Ok(e)
}
@ -596,6 +599,7 @@ pub fn fold_select_expression<
F: ResultFolder<'ast, T>,
>(
f: &mut F,
_: &E::Ty,
e: SelectExpression<'ast, T, E>,
) -> Result<ThisOrUncle<SelectExpression<'ast, T, E>, E::Inner>, F::Error> {
Ok(ThisOrUncle::This(SelectExpression::new(
@ -710,10 +714,12 @@ pub fn fold_boolean_expression<'ast, T: Field, F: ResultFolder<'ast, T>>(
let alt = f.fold_boolean_expression(alt)?;
BooleanExpression::IfElse(box cond, box cons, box alt)
}
BooleanExpression::Select(select) => match f.fold_select_expression(select)? {
ThisOrUncle::This(s) => BooleanExpression::Select(s),
ThisOrUncle::Uncle(u) => u,
},
BooleanExpression::Select(select) => {
match f.fold_select_expression(&Type::Boolean, select)? {
ThisOrUncle::This(s) => BooleanExpression::Select(s),
ThisOrUncle::Uncle(u) => u,
}
}
BooleanExpression::Member(m) => match f.fold_member_expression(m)? {
ThisOrUncle::This(m) => BooleanExpression::Member(m),
ThisOrUncle::Uncle(u) => u,
@ -734,7 +740,7 @@ pub fn fold_uint_expression<'ast, T: Field, F: ResultFolder<'ast, T>>(
pub fn fold_uint_expression_inner<'ast, T: Field, F: ResultFolder<'ast, T>>(
f: &mut F,
_: UBitwidth,
ty: UBitwidth,
e: UExpressionInner<'ast, T>,
) -> Result<UExpressionInner<'ast, T>, F::Error> {
let e = match e {
@ -833,7 +839,7 @@ pub fn fold_uint_expression_inner<'ast, T: Field, F: ResultFolder<'ast, T>>(
.collect::<Result<_, _>>()?;
UExpressionInner::FunctionCall(key, generics, exps)
}
UExpressionInner::Select(select) => match f.fold_select_expression(select)? {
UExpressionInner::Select(select) => match f.fold_select_expression(&ty, select)? {
ThisOrUncle::This(s) => UExpressionInner::Select(s),
ThisOrUncle::Uncle(u) => u,
},