feat: finish record update
This commit is contained in:
parent
ea135e6f42
commit
42c8d50fa1
|
@ -483,7 +483,6 @@ impl<'a> CodeGenerator<'a> {
|
||||||
let mut index_types = vec![];
|
let mut index_types = vec![];
|
||||||
let mut highest_index = 0;
|
let mut highest_index = 0;
|
||||||
spread_scope.push(self.id_gen.next());
|
spread_scope.push(self.id_gen.next());
|
||||||
println!("{:#?}", args);
|
|
||||||
|
|
||||||
self.build_ir(spread, &mut update_ir, spread_scope);
|
self.build_ir(spread, &mut update_ir, spread_scope);
|
||||||
|
|
||||||
|
@ -3719,7 +3718,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
} => {
|
} => {
|
||||||
let tail_name_prefix = "__tail_index".to_string();
|
let tail_name_prefix = "__tail_index".to_string();
|
||||||
|
|
||||||
let mut record = arg_stack.pop().unwrap();
|
let record = arg_stack.pop().unwrap();
|
||||||
|
|
||||||
let mut args = HashMap::new();
|
let mut args = HashMap::new();
|
||||||
let mut unchanged_field_indices = vec![];
|
let mut unchanged_field_indices = vec![];
|
||||||
|
@ -3727,6 +3726,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
for (index, tipo) in indices
|
for (index, tipo) in indices
|
||||||
.iter()
|
.iter()
|
||||||
.sorted_by(|(index1, _), (index2, _)| index1.cmp(index2))
|
.sorted_by(|(index1, _), (index2, _)| index1.cmp(index2))
|
||||||
|
.rev()
|
||||||
{
|
{
|
||||||
let arg = arg_stack.pop().unwrap();
|
let arg = arg_stack.pop().unwrap();
|
||||||
args.insert(*index, (tipo.clone(), arg));
|
args.insert(*index, (tipo.clone(), arg));
|
||||||
|
@ -3753,15 +3753,114 @@ impl<'a> CodeGenerator<'a> {
|
||||||
if let Some((tipo, arg)) = args.get(¤t_index) {
|
if let Some((tipo, arg)) = args.get(¤t_index) {
|
||||||
term = apply_wrap(
|
term = apply_wrap(
|
||||||
apply_wrap(
|
apply_wrap(
|
||||||
Term::Builtin(DefaultFunction::MkCons),
|
Term::Builtin(DefaultFunction::MkCons).force_wrap(),
|
||||||
convert_type_to_data(arg.clone(), tipo),
|
convert_type_to_data(arg.clone(), tipo),
|
||||||
),
|
),
|
||||||
term,
|
term,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
|
term = apply_wrap(
|
||||||
|
apply_wrap(
|
||||||
|
Term::Builtin(DefaultFunction::MkCons).force_wrap(),
|
||||||
|
apply_wrap(
|
||||||
|
Term::Builtin(DefaultFunction::HeadList).force_wrap(),
|
||||||
|
Term::Var(Name {
|
||||||
|
text: tail_name,
|
||||||
|
unique: 0.into(),
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
term,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
todo!()
|
|
||||||
|
term = apply_wrap(
|
||||||
|
apply_wrap(
|
||||||
|
Term::Builtin(DefaultFunction::ConstrData),
|
||||||
|
Term::Constant(UplcConstant::Integer(0)),
|
||||||
|
),
|
||||||
|
term,
|
||||||
|
);
|
||||||
|
|
||||||
|
if !unchanged_field_indices.is_empty() {
|
||||||
|
prev_index = highest_index;
|
||||||
|
for index in unchanged_field_indices.into_iter() {
|
||||||
|
let tail_name = format!("{tail_name_prefix}_{}", prev_index);
|
||||||
|
let prev_tail_name = format!("{tail_name_prefix}_{index}");
|
||||||
|
|
||||||
|
let mut tail_list = Term::Var(Name {
|
||||||
|
text: prev_tail_name,
|
||||||
|
unique: 0.into(),
|
||||||
|
});
|
||||||
|
|
||||||
|
if index < prev_index {
|
||||||
|
for _ in index..prev_index {
|
||||||
|
tail_list = apply_wrap(
|
||||||
|
Term::Builtin(DefaultFunction::TailList).force_wrap(),
|
||||||
|
tail_list,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
term = apply_wrap(
|
||||||
|
Term::Lambda {
|
||||||
|
parameter_name: Name {
|
||||||
|
text: tail_name,
|
||||||
|
unique: 0.into(),
|
||||||
|
},
|
||||||
|
body: term.into(),
|
||||||
|
},
|
||||||
|
tail_list,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
prev_index = index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let tail_name = format!("{tail_name_prefix}_{prev_index}");
|
||||||
|
let prev_tail_name = format!("{tail_name_prefix}_0");
|
||||||
|
|
||||||
|
let mut tail_list = Term::Var(Name {
|
||||||
|
text: prev_tail_name.clone(),
|
||||||
|
unique: 0.into(),
|
||||||
|
});
|
||||||
|
|
||||||
|
for _ in 0..prev_index {
|
||||||
|
tail_list = apply_wrap(
|
||||||
|
Term::Builtin(DefaultFunction::TailList).force_wrap(),
|
||||||
|
tail_list,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if prev_index != 0 {
|
||||||
|
term = apply_wrap(
|
||||||
|
Term::Lambda {
|
||||||
|
parameter_name: Name {
|
||||||
|
text: tail_name,
|
||||||
|
unique: 0.into(),
|
||||||
|
},
|
||||||
|
body: term.into(),
|
||||||
|
},
|
||||||
|
tail_list,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
self.needs_field_access = true;
|
||||||
|
term = apply_wrap(
|
||||||
|
Term::Lambda {
|
||||||
|
parameter_name: Name {
|
||||||
|
text: prev_tail_name,
|
||||||
|
unique: 0.into(),
|
||||||
|
},
|
||||||
|
body: term.into(),
|
||||||
|
},
|
||||||
|
apply_wrap(
|
||||||
|
Term::Var(Name {
|
||||||
|
text: CONSTR_FIELDS_EXPOSER.to_string(),
|
||||||
|
unique: 0.into(),
|
||||||
|
}),
|
||||||
|
record,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
arg_stack.push(term);
|
||||||
}
|
}
|
||||||
Air::UnOp { op, .. } => {
|
Air::UnOp { op, .. } => {
|
||||||
let value = arg_stack.pop().unwrap();
|
let value = arg_stack.pop().unwrap();
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
# This file was generated by Aiken
|
||||||
|
# You typically do not need to edit this file
|
||||||
|
|
||||||
|
requirements = []
|
||||||
|
packages = []
|
|
@ -0,0 +1,2 @@
|
||||||
|
name = "aiken-lang/acceptance_test_039"
|
||||||
|
version = "0.0.0"
|
|
@ -0,0 +1,60 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
pub type Door{
|
||||||
|
locked: Bool,
|
||||||
|
hinge_angle: Int
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
pub type Car{
|
||||||
|
owner: ByteArray,
|
||||||
|
wheels: Int,
|
||||||
|
door: Door,
|
||||||
|
vin: ByteArray,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub fn update_owner(new_owner: ByteArray, car: Car){
|
||||||
|
Car{..car, owner: new_owner}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn update_vin(new_vin: ByteArray, car: Car){
|
||||||
|
Car{..car, vin: new_vin}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub fn update_door_angle(new_hinge_angle: Int, car: Car){
|
||||||
|
Car{..car, door: Door{..car.door, hinge_angle: new_hinge_angle}}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn update_door_locked_and_wheels(new_locked: Bool, new_wheels: Int, car: Car){
|
||||||
|
Car{..car, door: Door{..car.door, locked: new_locked}, wheels: new_wheels}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
test update_owner1(){
|
||||||
|
let initial_car = Car{owner: #[], wheels: 4, vin: #[1,1,1,1,1,1,1], door: Door{locked: False, hinge_angle: 45}}
|
||||||
|
let final_car = Car{owner: #[244, 244, 244, 244], wheels: 4, vin: #[1,1,1,1,1,1,1], door: Door{locked: False, hinge_angle: 45}}
|
||||||
|
update_owner(#[244, 244, 244, 244], initial_car) == final_car
|
||||||
|
}
|
||||||
|
|
||||||
|
test update_vin1(){
|
||||||
|
let initial_car = Car{owner: #[], wheels: 4, vin: #[1,1,1,1,1,1,1], door: Door{locked: False, hinge_angle: 45}}
|
||||||
|
let final_car = Car{owner: #[], wheels: 4, vin: #[2,2,2,2,2,2,2,2,2], door: Door{locked: False, hinge_angle: 45}}
|
||||||
|
update_vin(#[2,2,2,2,2,2,2,2,2], initial_car) == final_car
|
||||||
|
}
|
||||||
|
|
||||||
|
test update_door_angle1(){
|
||||||
|
let initial_car = Car{owner: #[], wheels: 4, vin: #[1,1,1,1,1,1,1], door: Door{locked: False, hinge_angle: 45}}
|
||||||
|
let final_car = Car{owner: #[], wheels: 4, vin: #[1,1,1,1,1,1,1], door: Door{locked: False, hinge_angle: 90}}
|
||||||
|
update_door_angle(90, initial_car) == final_car
|
||||||
|
}
|
||||||
|
|
||||||
|
test update_door_locked_and_wheels1(){
|
||||||
|
let initial_car = Car{owner: #[], wheels: 4, vin: #[1,1,1,1,1,1,1], door: Door{locked: False, hinge_angle: 45}}
|
||||||
|
let final_car = Car{owner: #[], wheels: 5, vin: #[1,1,1,1,1,1,1], door: Door{locked: True, hinge_angle: 45}}
|
||||||
|
update_door_locked_and_wheels(True, 5, initial_car) == final_car
|
||||||
|
}
|
Loading…
Reference in New Issue