Assert now works for a variety of types.
Still some final work to finish and test. Things are good so far
This commit is contained in:
parent
60736b4a54
commit
4c8089c28a
|
@ -4,7 +4,7 @@ use indexmap::{IndexMap, IndexSet};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use uplc::{
|
use uplc::{
|
||||||
ast::{
|
ast::{
|
||||||
builder::{apply_wrap, choose_list, if_else},
|
builder::{apply_wrap, choose_list, delayed_choose_list, if_else},
|
||||||
Constant as UplcConstant, Name, Term, Type as UplcType,
|
Constant as UplcConstant, Name, Term, Type as UplcType,
|
||||||
},
|
},
|
||||||
builtins::DefaultFunction,
|
builtins::DefaultFunction,
|
||||||
|
@ -481,12 +481,13 @@ pub fn list_access_to_uplc(
|
||||||
tail: bool,
|
tail: bool,
|
||||||
current_index: usize,
|
current_index: usize,
|
||||||
term: Term<Name>,
|
term: Term<Name>,
|
||||||
tipo: &Type,
|
tipos: Vec<Arc<Type>>,
|
||||||
check_last_item: bool,
|
check_last_item: bool,
|
||||||
) -> Term<Name> {
|
) -> Term<Name> {
|
||||||
let (first, names) = names.split_first().unwrap();
|
let (first, names) = names.split_first().unwrap();
|
||||||
|
let (current_tipo, tipos) = tipos.split_first().unwrap();
|
||||||
|
|
||||||
let head_list = if tipo.is_map() {
|
let head_list = if current_tipo.is_map() {
|
||||||
apply_wrap(
|
apply_wrap(
|
||||||
Term::Builtin(DefaultFunction::HeadList).force_wrap(),
|
Term::Builtin(DefaultFunction::HeadList).force_wrap(),
|
||||||
Term::Var(Name {
|
Term::Var(Name {
|
||||||
|
@ -503,7 +504,7 @@ pub fn list_access_to_uplc(
|
||||||
unique: 0.into(),
|
unique: 0.into(),
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
&tipo.clone().get_inner_types()[0],
|
¤t_tipo.to_owned(),
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -559,7 +560,7 @@ pub fn list_access_to_uplc(
|
||||||
unique: 0.into(),
|
unique: 0.into(),
|
||||||
},
|
},
|
||||||
body: if check_last_item {
|
body: if check_last_item {
|
||||||
choose_list(
|
delayed_choose_list(
|
||||||
apply_wrap(
|
apply_wrap(
|
||||||
Term::Builtin(DefaultFunction::TailList).force_wrap(),
|
Term::Builtin(DefaultFunction::TailList).force_wrap(),
|
||||||
Term::Var(Name {
|
Term::Var(Name {
|
||||||
|
@ -587,13 +588,7 @@ pub fn list_access_to_uplc(
|
||||||
term.into()
|
term.into()
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
apply_wrap(
|
head_list,
|
||||||
Term::Builtin(DefaultFunction::HeadList).force_wrap(),
|
|
||||||
Term::Var(Name {
|
|
||||||
text: format!("tail_index_{}_{}", current_index, id_list[current_index]),
|
|
||||||
unique: 0.into(),
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
.into(),
|
.into(),
|
||||||
}
|
}
|
||||||
|
@ -616,7 +611,7 @@ pub fn list_access_to_uplc(
|
||||||
tail,
|
tail,
|
||||||
current_index + 1,
|
current_index + 1,
|
||||||
term,
|
term,
|
||||||
tipo,
|
tipos.to_owned(),
|
||||||
check_last_item,
|
check_last_item,
|
||||||
),
|
),
|
||||||
apply_wrap(
|
apply_wrap(
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use std::{sync::Arc, vec};
|
use std::{clone, sync::Arc, vec};
|
||||||
|
|
||||||
use indexmap::{IndexMap, IndexSet};
|
use indexmap::{IndexMap, IndexSet};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
|
@ -1541,13 +1541,10 @@ impl<'a> CodeGenerator<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
constr @ Pattern::Constructor { .. } => {
|
constr @ Pattern::Constructor { .. } => {
|
||||||
println!("ASSIGNMENT PROPERTIES {:#?}", assignment_properties);
|
|
||||||
println!("CURRENT TYPE IS {:#?}", tipo);
|
|
||||||
if matches!(assignment_properties.kind, AssignmentKind::Assert)
|
if matches!(assignment_properties.kind, AssignmentKind::Assert)
|
||||||
&& assignment_properties.value_is_data
|
&& assignment_properties.value_is_data
|
||||||
&& !tipo.is_data()
|
&& !tipo.is_data()
|
||||||
{
|
{
|
||||||
println!("GOT HERE FOR SURE");
|
|
||||||
self.recursive_assert_pattern(
|
self.recursive_assert_pattern(
|
||||||
constr,
|
constr,
|
||||||
pattern_vec,
|
pattern_vec,
|
||||||
|
@ -1928,14 +1925,15 @@ impl<'a> CodeGenerator<'a> {
|
||||||
if arguments_index.get(current_index).is_some()
|
if arguments_index.get(current_index).is_some()
|
||||||
&& arguments_index[current_index].1 == index
|
&& arguments_index[current_index].1 == index
|
||||||
{
|
{
|
||||||
final_args.push(arguments_index.get(index).unwrap().clone());
|
final_args.push(arguments_index.get(current_index).unwrap().clone());
|
||||||
current_index += 1;
|
current_index += 1;
|
||||||
} else {
|
} else {
|
||||||
final_args.push((format!("__field_{index}_{}", self.id_gen.next()), index));
|
let id_next = self.id_gen.next();
|
||||||
|
final_args.push((format!("__field_{index}_{}", id_next), index));
|
||||||
self.recursive_assert_tipo(
|
self.recursive_assert_tipo(
|
||||||
type_map.get(&index).unwrap(),
|
type_map.get(&index).unwrap(),
|
||||||
&mut nested_pattern,
|
&mut nested_pattern,
|
||||||
&format!("__field_{index}_{}", self.id_gen.next()),
|
&format!("__field_{index}_{}", id_next),
|
||||||
scope.clone(),
|
scope.clone(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -1994,11 +1992,12 @@ impl<'a> CodeGenerator<'a> {
|
||||||
final_args.push(arguments_index.get(index).unwrap().clone());
|
final_args.push(arguments_index.get(index).unwrap().clone());
|
||||||
current_index += 1;
|
current_index += 1;
|
||||||
} else {
|
} else {
|
||||||
final_args.push((format!("__field_{index}_{}", self.id_gen.next()), index));
|
let id_next = self.id_gen.next();
|
||||||
|
final_args.push((format!("__tuple_{index}_{}", id_next), index));
|
||||||
self.recursive_assert_tipo(
|
self.recursive_assert_tipo(
|
||||||
type_map.get(&index).unwrap(),
|
type_map.get(&index).unwrap(),
|
||||||
&mut nested_pattern,
|
&mut nested_pattern,
|
||||||
&format!("__field_{index}_{}", self.id_gen.next()),
|
&format!("__tuple_{index}_{}", id_next),
|
||||||
scope.clone(),
|
scope.clone(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -2006,7 +2005,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
|
|
||||||
if !arguments_index.is_empty() {
|
if !arguments_index.is_empty() {
|
||||||
pattern_vec.push(Air::TupleAccessor {
|
pattern_vec.push(Air::TupleAccessor {
|
||||||
scope: scope.clone(),
|
scope,
|
||||||
names: final_args.into_iter().map(|(item, _)| item).collect_vec(),
|
names: final_args.into_iter().map(|(item, _)| item).collect_vec(),
|
||||||
tipo: tipo.clone().into(),
|
tipo: tipo.clone().into(),
|
||||||
check_last_item: true,
|
check_last_item: true,
|
||||||
|
@ -2055,7 +2054,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
|
|
||||||
assert_vec.push(Air::Call {
|
assert_vec.push(Air::Call {
|
||||||
scope: scope.clone(),
|
scope: scope.clone(),
|
||||||
count: 3,
|
count: 2,
|
||||||
tipo: tipo.clone().into(),
|
tipo: tipo.clone().into(),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -2144,7 +2143,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
|
|
||||||
assert_vec.push(Air::Call {
|
assert_vec.push(Air::Call {
|
||||||
scope: scope.clone(),
|
scope: scope.clone(),
|
||||||
count: 3,
|
count: 2,
|
||||||
tipo: tipo.clone().into(),
|
tipo: tipo.clone().into(),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -3621,6 +3620,13 @@ impl<'a> CodeGenerator<'a> {
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let inner_types = tipo
|
||||||
|
.get_inner_types()
|
||||||
|
.into_iter()
|
||||||
|
.cycle()
|
||||||
|
.take(names.len())
|
||||||
|
.collect_vec();
|
||||||
|
|
||||||
term = apply_wrap(
|
term = apply_wrap(
|
||||||
Term::Lambda {
|
Term::Lambda {
|
||||||
parameter_name: Name {
|
parameter_name: Name {
|
||||||
|
@ -3640,7 +3646,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
tail,
|
tail,
|
||||||
current_index,
|
current_index,
|
||||||
term,
|
term,
|
||||||
&tipo,
|
inner_types,
|
||||||
check_last_item,
|
check_last_item,
|
||||||
),
|
),
|
||||||
apply_wrap(
|
apply_wrap(
|
||||||
|
@ -4228,7 +4234,13 @@ impl<'a> CodeGenerator<'a> {
|
||||||
|
|
||||||
arg_stack.push(term);
|
arg_stack.push(term);
|
||||||
}
|
}
|
||||||
Air::UnWrapData { scope, tipo } => todo!(),
|
Air::UnWrapData { tipo, .. } => {
|
||||||
|
let mut term = arg_stack.pop().unwrap();
|
||||||
|
|
||||||
|
term = convert_data_to_type(term, &tipo);
|
||||||
|
|
||||||
|
arg_stack.push(term);
|
||||||
|
}
|
||||||
Air::When {
|
Air::When {
|
||||||
subject_name, tipo, ..
|
subject_name, tipo, ..
|
||||||
} => {
|
} => {
|
||||||
|
@ -4691,220 +4703,84 @@ impl<'a> CodeGenerator<'a> {
|
||||||
|
|
||||||
arg_stack.push(term);
|
arg_stack.push(term);
|
||||||
}
|
}
|
||||||
Air::FieldsExpose { indices, .. } => {
|
Air::FieldsExpose {
|
||||||
// let mut id_list = vec![];
|
indices,
|
||||||
|
check_last_item,
|
||||||
// for _ in 0..names.len() {
|
..
|
||||||
// id_list.push(self.id_gen.next());
|
} => {
|
||||||
// }
|
|
||||||
|
|
||||||
// let current_index = 0;
|
|
||||||
// let (first_name, names) = names.split_first().unwrap();
|
|
||||||
|
|
||||||
// let head_list = convert_data_to_type(
|
|
||||||
// apply_wrap(
|
|
||||||
// Term::Builtin(DefaultFunction::HeadList).force_wrap(),
|
|
||||||
// Term::Var(Name {
|
|
||||||
// text: format!("__tuple_{}", list_id),
|
|
||||||
// unique: 0.into(),
|
|
||||||
// }),
|
|
||||||
// ),
|
|
||||||
// &tipo.get_inner_types()[0],
|
|
||||||
// );
|
|
||||||
|
|
||||||
// term = apply_wrap(
|
|
||||||
// Term::Lambda {
|
|
||||||
// parameter_name: Name {
|
|
||||||
// text: format!("__tuple_{}", list_id),
|
|
||||||
// unique: 0.into(),
|
|
||||||
// },
|
|
||||||
// body: apply_wrap(
|
|
||||||
// Term::Lambda {
|
|
||||||
// parameter_name: Name {
|
|
||||||
// text: first_name.clone(),
|
|
||||||
// unique: 0.into(),
|
|
||||||
// },
|
|
||||||
// body: apply_wrap(
|
|
||||||
// list_access_to_uplc(
|
|
||||||
// names,
|
|
||||||
// &id_list,
|
|
||||||
// false,
|
|
||||||
// current_index,
|
|
||||||
// term,
|
|
||||||
// &tipo,
|
|
||||||
// check_last_item,
|
|
||||||
// ),
|
|
||||||
// apply_wrap(
|
|
||||||
// Term::Builtin(DefaultFunction::TailList).force_wrap(),
|
|
||||||
// Term::Var(Name {
|
|
||||||
// text: format!("__tuple_{}", list_id),
|
|
||||||
// unique: 0.into(),
|
|
||||||
// }),
|
|
||||||
// ),
|
|
||||||
// )
|
|
||||||
// .into(),
|
|
||||||
// },
|
|
||||||
// head_list,
|
|
||||||
// )
|
|
||||||
// .into(),
|
|
||||||
// },
|
|
||||||
// value,
|
|
||||||
// );
|
|
||||||
self.needs_field_access = true;
|
self.needs_field_access = true;
|
||||||
|
|
||||||
let constr_var = arg_stack.pop().unwrap();
|
|
||||||
let mut body = arg_stack.pop().unwrap();
|
|
||||||
|
|
||||||
let mut indices = indices.into_iter().rev();
|
|
||||||
let highest = indices.next().unwrap();
|
|
||||||
let mut id_list = vec![];
|
let mut id_list = vec![];
|
||||||
|
let value = arg_stack.pop().unwrap();
|
||||||
|
let mut term = arg_stack.pop().unwrap();
|
||||||
|
let list_id = self.id_gen.next();
|
||||||
|
|
||||||
for _ in 0..highest.0 {
|
for _ in 0..indices.len() {
|
||||||
id_list.push(self.id_gen.next());
|
id_list.push(self.id_gen.next());
|
||||||
}
|
}
|
||||||
|
|
||||||
let constr_name_lam = format!("__constr_fields_{}", self.id_gen.next());
|
let current_index = 0;
|
||||||
let highest_loop_index = highest.0 as i32 - 1;
|
let (first_name, indices) = indices.split_first().unwrap();
|
||||||
let last_prev_tail = Term::Var(Name {
|
|
||||||
text: if highest_loop_index == -1 {
|
|
||||||
constr_name_lam.clone()
|
|
||||||
} else {
|
|
||||||
format!(
|
|
||||||
"__tail_{}_{}",
|
|
||||||
highest_loop_index, id_list[highest_loop_index as usize]
|
|
||||||
)
|
|
||||||
},
|
|
||||||
unique: 0.into(),
|
|
||||||
});
|
|
||||||
|
|
||||||
body = apply_wrap(
|
let head_list = convert_data_to_type(
|
||||||
Term::Lambda {
|
|
||||||
parameter_name: Name {
|
|
||||||
text: highest.1,
|
|
||||||
unique: 0.into(),
|
|
||||||
},
|
|
||||||
body: body.into(),
|
|
||||||
},
|
|
||||||
convert_data_to_type(
|
|
||||||
apply_wrap(
|
apply_wrap(
|
||||||
Term::Builtin(DefaultFunction::HeadList).force_wrap(),
|
Term::Builtin(DefaultFunction::HeadList).force_wrap(),
|
||||||
last_prev_tail,
|
Term::Var(Name {
|
||||||
),
|
text: format!("__constr_fields_{}", list_id),
|
||||||
&highest.2,
|
unique: 0.into(),
|
||||||
|
}),
|
||||||
),
|
),
|
||||||
|
&first_name.2,
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut current_field = None;
|
let names = indices.iter().cloned().map(|item| item.1).collect_vec();
|
||||||
for index in (0..highest.0).rev() {
|
let inner_types = indices.iter().cloned().map(|item| item.2).collect_vec();
|
||||||
let current_tail_index = index;
|
|
||||||
let previous_tail_index = if index == 0 { 0 } else { index - 1 };
|
|
||||||
let current_tail_id = id_list[index];
|
|
||||||
let previous_tail_id = if index == 0 { 0 } else { id_list[index - 1] };
|
|
||||||
if current_field.is_none() {
|
|
||||||
current_field = indices.next();
|
|
||||||
}
|
|
||||||
|
|
||||||
let prev_tail = if index == 0 {
|
term = apply_wrap(
|
||||||
Term::Var(Name {
|
|
||||||
text: constr_name_lam.clone(),
|
|
||||||
unique: 0.into(),
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
Term::Var(Name {
|
|
||||||
text: format!("__tail_{previous_tail_index}_{previous_tail_id}"),
|
|
||||||
unique: 0.into(),
|
|
||||||
})
|
|
||||||
};
|
|
||||||
|
|
||||||
if let Some(ref field) = current_field {
|
|
||||||
if field.0 == index {
|
|
||||||
let unwrapper = convert_data_to_type(
|
|
||||||
apply_wrap(
|
|
||||||
Term::Builtin(DefaultFunction::HeadList).force_wrap(),
|
|
||||||
prev_tail.clone(),
|
|
||||||
),
|
|
||||||
&field.2,
|
|
||||||
);
|
|
||||||
|
|
||||||
body = apply_wrap(
|
|
||||||
Term::Lambda {
|
Term::Lambda {
|
||||||
parameter_name: Name {
|
parameter_name: Name {
|
||||||
text: field.1.clone(),
|
text: format!("__constr_fields_{}", list_id),
|
||||||
unique: 0.into(),
|
unique: 0.into(),
|
||||||
},
|
},
|
||||||
body: apply_wrap(
|
body: apply_wrap(
|
||||||
Term::Lambda {
|
Term::Lambda {
|
||||||
parameter_name: Name {
|
parameter_name: Name {
|
||||||
text: format!(
|
text: first_name.1.clone(),
|
||||||
"__tail_{current_tail_index}_{current_tail_id}"
|
|
||||||
),
|
|
||||||
unique: 0.into(),
|
unique: 0.into(),
|
||||||
},
|
},
|
||||||
body: body.into(),
|
body: apply_wrap(
|
||||||
},
|
list_access_to_uplc(
|
||||||
|
&names,
|
||||||
|
&id_list,
|
||||||
|
false,
|
||||||
|
current_index,
|
||||||
|
term,
|
||||||
|
inner_types,
|
||||||
|
check_last_item,
|
||||||
|
),
|
||||||
apply_wrap(
|
apply_wrap(
|
||||||
Term::Builtin(DefaultFunction::TailList).force_wrap(),
|
Term::Builtin(DefaultFunction::TailList).force_wrap(),
|
||||||
prev_tail,
|
Term::Var(Name {
|
||||||
|
text: format!("__constr_fields_{}", list_id),
|
||||||
|
unique: 0.into(),
|
||||||
|
}),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.into(),
|
.into(),
|
||||||
},
|
},
|
||||||
unwrapper,
|
head_list,
|
||||||
);
|
)
|
||||||
|
.into(),
|
||||||
current_field = None;
|
|
||||||
} else {
|
|
||||||
body = apply_wrap(
|
|
||||||
Term::Lambda {
|
|
||||||
parameter_name: Name {
|
|
||||||
text: format!(
|
|
||||||
"__tail_{current_tail_index}_{current_tail_id}"
|
|
||||||
),
|
|
||||||
unique: 0.into(),
|
|
||||||
},
|
|
||||||
body: body.into(),
|
|
||||||
},
|
|
||||||
apply_wrap(
|
|
||||||
Term::Builtin(DefaultFunction::TailList).force_wrap(),
|
|
||||||
prev_tail,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
body = apply_wrap(
|
|
||||||
Term::Lambda {
|
|
||||||
parameter_name: Name {
|
|
||||||
text: format!("__tail_{current_tail_index}_{current_tail_id}"),
|
|
||||||
unique: 0.into(),
|
|
||||||
},
|
|
||||||
body: body.into(),
|
|
||||||
},
|
|
||||||
apply_wrap(
|
|
||||||
Term::Builtin(DefaultFunction::TailList).force_wrap(),
|
|
||||||
prev_tail,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
body = apply_wrap(
|
|
||||||
Term::Lambda {
|
|
||||||
parameter_name: Name {
|
|
||||||
text: constr_name_lam,
|
|
||||||
unique: 0.into(),
|
|
||||||
},
|
|
||||||
body: body.into(),
|
|
||||||
},
|
},
|
||||||
apply_wrap(
|
apply_wrap(
|
||||||
Term::Var(Name {
|
Term::Var(Name {
|
||||||
text: CONSTR_FIELDS_EXPOSER.to_string(),
|
text: CONSTR_FIELDS_EXPOSER.to_string(),
|
||||||
unique: 0.into(),
|
unique: 0.into(),
|
||||||
}),
|
}),
|
||||||
constr_var,
|
value,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
arg_stack.push(body);
|
arg_stack.push(term);
|
||||||
}
|
}
|
||||||
Air::Tuple { tipo, count, .. } => {
|
Air::Tuple { tipo, count, .. } => {
|
||||||
let mut args = vec![];
|
let mut args = vec![];
|
||||||
|
@ -5293,7 +5169,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
false,
|
false,
|
||||||
current_index,
|
current_index,
|
||||||
term,
|
term,
|
||||||
&tipo,
|
tipo.get_inner_types(),
|
||||||
check_last_item,
|
check_last_item,
|
||||||
),
|
),
|
||||||
apply_wrap(
|
apply_wrap(
|
||||||
|
|
Loading…
Reference in New Issue