pass type to select expression
This commit is contained in:
parent
ecba82b144
commit
429ace784f
6 changed files with 48 additions and 27 deletions
|
@ -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)?;
|
||||
|
|
|
@ -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)?;
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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,
|
||||
},
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
},
|
||||
|
|
Loading…
Reference in a new issue