chore: rename unwrapData and wrapData
add validator cast function for extra validator params
This commit is contained in:
parent
55dd1a1a56
commit
18ea44adb0
|
@ -119,9 +119,12 @@ impl<'a> CodeGenerator<'a> {
|
||||||
// optimizations on air tree
|
// optimizations on air tree
|
||||||
|
|
||||||
let full_vec = full_tree.to_vec();
|
let full_vec = full_tree.to_vec();
|
||||||
|
|
||||||
println!("FULL VEC {:#?}", full_vec);
|
println!("FULL VEC {:#?}", full_vec);
|
||||||
|
|
||||||
|
let mut term = self.uplc_code_gen(full_vec);
|
||||||
|
|
||||||
|
if let Some(other) = other_fun {}
|
||||||
|
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,7 +244,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
let mut arg_val = self.build(&arg.value);
|
let mut arg_val = self.build(&arg.value);
|
||||||
|
|
||||||
if arg_tipo.is_data() && !arg.value.tipo().is_data() {
|
if arg_tipo.is_data() && !arg.value.tipo().is_data() {
|
||||||
arg_val = AirTree::wrap_data(arg_val, arg.value.tipo())
|
arg_val = AirTree::cast_to_data(arg_val, arg.value.tipo())
|
||||||
}
|
}
|
||||||
arg_val
|
arg_val
|
||||||
})
|
})
|
||||||
|
@ -273,7 +276,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
let mut arg_val = self.build(&arg.value);
|
let mut arg_val = self.build(&arg.value);
|
||||||
|
|
||||||
if arg_tipo.is_data() && !arg.value.tipo().is_data() {
|
if arg_tipo.is_data() && !arg.value.tipo().is_data() {
|
||||||
arg_val = AirTree::wrap_data(arg_val, arg.value.tipo())
|
arg_val = AirTree::cast_to_data(arg_val, arg.value.tipo())
|
||||||
}
|
}
|
||||||
arg_val
|
arg_val
|
||||||
})
|
})
|
||||||
|
@ -295,7 +298,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
let mut arg_val = self.build(&arg.value);
|
let mut arg_val = self.build(&arg.value);
|
||||||
|
|
||||||
if arg_tipo.is_data() && !arg.value.tipo().is_data() {
|
if arg_tipo.is_data() && !arg.value.tipo().is_data() {
|
||||||
arg_val = AirTree::wrap_data(arg_val, arg.value.tipo())
|
arg_val = AirTree::cast_to_data(arg_val, arg.value.tipo())
|
||||||
}
|
}
|
||||||
arg_val
|
arg_val
|
||||||
})
|
})
|
||||||
|
@ -558,9 +561,9 @@ impl<'a> CodeGenerator<'a> {
|
||||||
props: AssignmentProperties,
|
props: AssignmentProperties,
|
||||||
) -> AirTree {
|
) -> AirTree {
|
||||||
if props.value_type.is_data() && props.kind.is_expect() && !tipo.is_data() {
|
if props.value_type.is_data() && props.kind.is_expect() && !tipo.is_data() {
|
||||||
value = AirTree::unwrap_data(value, tipo.clone());
|
value = AirTree::cast_from_data(value, tipo.clone());
|
||||||
} else if !props.value_type.is_data() && tipo.is_data() {
|
} else if !props.value_type.is_data() && tipo.is_data() {
|
||||||
value = AirTree::wrap_data(value, tipo.clone());
|
value = AirTree::cast_to_data(value, tipo.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
match pattern {
|
match pattern {
|
||||||
|
@ -2802,7 +2805,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn uplc_code_gen(&mut self, ir_stack: &mut Vec<Air>) -> Term<Name> {
|
fn uplc_code_gen(&mut self, mut ir_stack: Vec<Air>) -> Term<Name> {
|
||||||
let mut arg_stack: Vec<Term<Name>> = vec![];
|
let mut arg_stack: Vec<Term<Name>> = vec![];
|
||||||
|
|
||||||
while let Some(ir_element) = ir_stack.pop() {
|
while let Some(ir_element) = ir_stack.pop() {
|
||||||
|
@ -3128,7 +3131,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
let name_module = format!("{module_name}_{function_name}");
|
let name_module = format!("{module_name}_{function_name}");
|
||||||
let name = function_name.to_string();
|
let name = function_name.to_string();
|
||||||
if text == &name || text == &name_module {
|
if text == &name || text == &name_module {
|
||||||
let mut term = self.uplc_code_gen(&mut ir.clone());
|
let mut term = self.uplc_code_gen(ir.clone());
|
||||||
term = term
|
term = term
|
||||||
.constr_get_field()
|
.constr_get_field()
|
||||||
.constr_fields_exposer()
|
.constr_fields_exposer()
|
||||||
|
@ -3391,14 +3394,14 @@ impl<'a> CodeGenerator<'a> {
|
||||||
|
|
||||||
arg_stack.push(term);
|
arg_stack.push(term);
|
||||||
}
|
}
|
||||||
Air::UnWrapData { tipo, .. } => {
|
Air::CastFromData { tipo, .. } => {
|
||||||
let mut term = arg_stack.pop().unwrap();
|
let mut term = arg_stack.pop().unwrap();
|
||||||
|
|
||||||
term = builder::convert_data_to_type(term, &tipo);
|
term = builder::convert_data_to_type(term, &tipo);
|
||||||
|
|
||||||
arg_stack.push(term);
|
arg_stack.push(term);
|
||||||
}
|
}
|
||||||
Air::WrapData { tipo, .. } => {
|
Air::CastToData { tipo, .. } => {
|
||||||
let mut term = arg_stack.pop().unwrap();
|
let mut term = arg_stack.pop().unwrap();
|
||||||
|
|
||||||
term = builder::convert_type_to_data(term, &tipo);
|
term = builder::convert_type_to_data(term, &tipo);
|
||||||
|
|
|
@ -70,10 +70,10 @@ pub enum Air {
|
||||||
Let {
|
Let {
|
||||||
name: String,
|
name: String,
|
||||||
},
|
},
|
||||||
UnWrapData {
|
CastFromData {
|
||||||
tipo: Arc<Type>,
|
tipo: Arc<Type>,
|
||||||
},
|
},
|
||||||
WrapData {
|
CastToData {
|
||||||
tipo: Arc<Type>,
|
tipo: Arc<Type>,
|
||||||
},
|
},
|
||||||
AssertConstr {
|
AssertConstr {
|
||||||
|
|
|
@ -14,7 +14,7 @@ use uplc::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
ast::{AssignmentKind, DataType, Pattern, Span, TypedClause, TypedDataType},
|
ast::{AssignmentKind, DataType, Pattern, Span, TypedArg, TypedClause, TypedDataType},
|
||||||
builtins::bool,
|
builtins::bool,
|
||||||
expr::TypedExpr,
|
expr::TypedExpr,
|
||||||
tipo::{PatternConstructor, TypeVar, ValueConstructor, ValueConstructorVariant},
|
tipo::{PatternConstructor, TypeVar, ValueConstructor, ValueConstructorVariant},
|
||||||
|
@ -1357,3 +1357,20 @@ pub fn get_list_elements_len_and_tail(
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn cast_validator_args(term: Term<Name>, arguments: &[TypedArg]) -> Term<Name> {
|
||||||
|
let mut term = term;
|
||||||
|
for arg in arguments.iter().rev() {
|
||||||
|
if !matches!(arg.tipo.get_uplc_type(), UplcType::Data) {
|
||||||
|
term = term
|
||||||
|
.lambda(arg.arg_name.get_variable_name().unwrap_or("_"))
|
||||||
|
.apply(convert_data_to_type(
|
||||||
|
Term::var(arg.arg_name.get_variable_name().unwrap_or("_")),
|
||||||
|
&arg.tipo,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
term = term.lambda(arg.arg_name.get_variable_name().unwrap_or("_"))
|
||||||
|
}
|
||||||
|
term
|
||||||
|
}
|
||||||
|
|
|
@ -248,11 +248,11 @@ pub enum AirExpression {
|
||||||
arg: Box<AirTree>,
|
arg: Box<AirTree>,
|
||||||
},
|
},
|
||||||
|
|
||||||
UnWrapData {
|
CastFromData {
|
||||||
tipo: Arc<Type>,
|
tipo: Arc<Type>,
|
||||||
value: Box<AirTree>,
|
value: Box<AirTree>,
|
||||||
},
|
},
|
||||||
WrapData {
|
CastToData {
|
||||||
tipo: Arc<Type>,
|
tipo: Arc<Type>,
|
||||||
value: Box<AirTree>,
|
value: Box<AirTree>,
|
||||||
},
|
},
|
||||||
|
@ -478,14 +478,14 @@ impl AirTree {
|
||||||
hoisted_over: None,
|
hoisted_over: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn unwrap_data(value: AirTree, tipo: Arc<Type>) -> AirTree {
|
pub fn cast_from_data(value: AirTree, tipo: Arc<Type>) -> AirTree {
|
||||||
AirTree::Expression(AirExpression::UnWrapData {
|
AirTree::Expression(AirExpression::CastFromData {
|
||||||
tipo,
|
tipo,
|
||||||
value: value.into(),
|
value: value.into(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
pub fn wrap_data(value: AirTree, tipo: Arc<Type>) -> AirTree {
|
pub fn cast_to_data(value: AirTree, tipo: Arc<Type>) -> AirTree {
|
||||||
AirTree::Expression(AirExpression::WrapData {
|
AirTree::Expression(AirExpression::CastToData {
|
||||||
tipo,
|
tipo,
|
||||||
value: value.into(),
|
value: value.into(),
|
||||||
})
|
})
|
||||||
|
@ -1066,12 +1066,12 @@ impl AirTree {
|
||||||
air_vec.push(Air::UnOp { op: *op });
|
air_vec.push(Air::UnOp { op: *op });
|
||||||
arg.create_air_vec(air_vec);
|
arg.create_air_vec(air_vec);
|
||||||
}
|
}
|
||||||
AirExpression::UnWrapData { tipo, value } => {
|
AirExpression::CastFromData { tipo, value } => {
|
||||||
air_vec.push(Air::UnWrapData { tipo: tipo.clone() });
|
air_vec.push(Air::CastFromData { tipo: tipo.clone() });
|
||||||
value.create_air_vec(air_vec);
|
value.create_air_vec(air_vec);
|
||||||
}
|
}
|
||||||
AirExpression::WrapData { tipo, value } => {
|
AirExpression::CastToData { tipo, value } => {
|
||||||
air_vec.push(Air::WrapData { tipo: tipo.clone() });
|
air_vec.push(Air::CastToData { tipo: tipo.clone() });
|
||||||
value.create_air_vec(air_vec);
|
value.create_air_vec(air_vec);
|
||||||
}
|
}
|
||||||
AirExpression::When {
|
AirExpression::When {
|
||||||
|
@ -1254,7 +1254,7 @@ impl AirTree {
|
||||||
| AirExpression::Call { tipo, .. }
|
| AirExpression::Call { tipo, .. }
|
||||||
| AirExpression::Builtin { tipo, .. }
|
| AirExpression::Builtin { tipo, .. }
|
||||||
| AirExpression::BinOp { tipo, .. }
|
| AirExpression::BinOp { tipo, .. }
|
||||||
| AirExpression::UnWrapData { tipo, .. }
|
| AirExpression::CastFromData { tipo, .. }
|
||||||
| AirExpression::When { tipo, .. }
|
| AirExpression::When { tipo, .. }
|
||||||
| AirExpression::If { tipo, .. }
|
| AirExpression::If { tipo, .. }
|
||||||
| AirExpression::Constr { tipo, .. }
|
| AirExpression::Constr { tipo, .. }
|
||||||
|
@ -1270,7 +1270,7 @@ impl AirTree {
|
||||||
UnOp::Not => bool(),
|
UnOp::Not => bool(),
|
||||||
UnOp::Negate => int(),
|
UnOp::Negate => int(),
|
||||||
},
|
},
|
||||||
AirExpression::WrapData { .. } => data(),
|
AirExpression::CastToData { .. } => data(),
|
||||||
AirExpression::Clause { then, .. }
|
AirExpression::Clause { then, .. }
|
||||||
| AirExpression::ListClause { then, .. }
|
| AirExpression::ListClause { then, .. }
|
||||||
| AirExpression::WrapClause { then, .. }
|
| AirExpression::WrapClause { then, .. }
|
||||||
|
@ -1303,8 +1303,8 @@ impl AirTree {
|
||||||
| AirExpression::Tuple { tipo, .. }
|
| AirExpression::Tuple { tipo, .. }
|
||||||
| AirExpression::Call { tipo, .. }
|
| AirExpression::Call { tipo, .. }
|
||||||
| AirExpression::Builtin { tipo, .. }
|
| AirExpression::Builtin { tipo, .. }
|
||||||
| AirExpression::UnWrapData { tipo, .. }
|
| AirExpression::CastFromData { tipo, .. }
|
||||||
| AirExpression::WrapData { tipo, .. }
|
| AirExpression::CastToData { tipo, .. }
|
||||||
| AirExpression::If { tipo, .. }
|
| AirExpression::If { tipo, .. }
|
||||||
| AirExpression::RecordUpdate { tipo, .. }
|
| AirExpression::RecordUpdate { tipo, .. }
|
||||||
| AirExpression::RecordAccess { tipo, .. }
|
| AirExpression::RecordAccess { tipo, .. }
|
||||||
|
@ -1523,7 +1523,7 @@ impl AirTree {
|
||||||
with,
|
with,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
AirExpression::UnWrapData { value, .. } => {
|
AirExpression::CastFromData { value, .. } => {
|
||||||
value.do_traverse_tree_with(
|
value.do_traverse_tree_with(
|
||||||
tree_path,
|
tree_path,
|
||||||
current_depth + 1,
|
current_depth + 1,
|
||||||
|
@ -1531,7 +1531,7 @@ impl AirTree {
|
||||||
with,
|
with,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
AirExpression::WrapData { value, .. } => {
|
AirExpression::CastToData { value, .. } => {
|
||||||
value.do_traverse_tree_with(
|
value.do_traverse_tree_with(
|
||||||
tree_path,
|
tree_path,
|
||||||
current_depth + 1,
|
current_depth + 1,
|
||||||
|
@ -1912,14 +1912,14 @@ impl AirTree {
|
||||||
panic!("Tree Path index outside tree children nodes")
|
panic!("Tree Path index outside tree children nodes")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AirExpression::UnWrapData { value, .. } => {
|
AirExpression::CastFromData { value, .. } => {
|
||||||
if *index == 0 {
|
if *index == 0 {
|
||||||
value.as_mut().do_find_air_tree_node(tree_path_iter)
|
value.as_mut().do_find_air_tree_node(tree_path_iter)
|
||||||
} else {
|
} else {
|
||||||
panic!("Tree Path index outside tree children nodes")
|
panic!("Tree Path index outside tree children nodes")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AirExpression::WrapData { value, .. } => {
|
AirExpression::CastToData { value, .. } => {
|
||||||
if *index == 0 {
|
if *index == 0 {
|
||||||
value.as_mut().do_find_air_tree_node(tree_path_iter)
|
value.as_mut().do_find_air_tree_node(tree_path_iter)
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue