From d7600b2d2068a18dd57be86f3cf64f0e66fb7802 Mon Sep 17 00:00:00 2001 From: microproofs Date: Tue, 9 Apr 2024 23:34:36 -0400 Subject: [PATCH] fix errors --- crates/aiken-lang/src/ast.rs | 3 + crates/aiken-lang/src/gen_uplc.rs | 211 ++++++++------------- crates/aiken-lang/src/gen_uplc/tree.rs | 2 +- crates/aiken-project/src/tests/gen_uplc.rs | 14 +- 4 files changed, 89 insertions(+), 141 deletions(-) diff --git a/crates/aiken-lang/src/ast.rs b/crates/aiken-lang/src/ast.rs index 38cb41ea6..1e1fc5c6d 100644 --- a/crates/aiken-lang/src/ast.rs +++ b/crates/aiken-lang/src/ast.rs @@ -1119,6 +1119,9 @@ impl Annotation { elems.iter().find_map(|arg| arg.find_node(byte_index)) } Annotation::Var { .. } | Annotation::Hole { .. } => None, + Annotation::Pair { fst, snd, .. } => fst + .find_node(byte_index) + .or_else(|| snd.find_node(byte_index)), }; located.or(Some(Located::Annotation(self))) diff --git a/crates/aiken-lang/src/gen_uplc.rs b/crates/aiken-lang/src/gen_uplc.rs index f4307d519..b38175df1 100644 --- a/crates/aiken-lang/src/gen_uplc.rs +++ b/crates/aiken-lang/src/gen_uplc.rs @@ -372,42 +372,32 @@ impl<'a> CodeGenerator<'a> { }, .. } => { - if tipo.is_pair() { - assert!(args.len() == 2); + let data_type = lookup_data_type_by_tipo(&self.data_types, tipo) + .expect("Creating a record with no record definition."); - let arg1 = self.build(&args[0].value, module_build_name, &[]); - - let arg2 = self.build(&args[1].value, module_build_name, &[]); - - AirTree::pair(arg1, arg2, tipo.clone()) - } else { - let data_type = lookup_data_type_by_tipo(&self.data_types, tipo) - .expect("Creating a record with no record definition."); - - let (constr_index, _) = data_type - .constructors - .iter() - .enumerate() - .find(|(_, dt)| &dt.name == constr_name) - .unwrap(); + let (constr_index, _) = data_type + .constructors + .iter() + .enumerate() + .find(|(_, dt)| &dt.name == constr_name) + .unwrap(); - let constr_args = args - .iter() - .zip(constr_tipo.arg_types().unwrap()) - .map(|(arg, tipo)| { - if tipo.is_data() { - AirTree::cast_to_data( - self.build(&arg.value, module_build_name, &[]), - arg.value.tipo(), - ) - } else { - self.build(&arg.value, module_build_name, &[]) - } - }) - .collect_vec(); + let constr_args = args + .iter() + .zip(constr_tipo.arg_types().unwrap()) + .map(|(arg, tipo)| { + if tipo.is_data() { + AirTree::cast_to_data( + self.build(&arg.value, module_build_name, &[]), + arg.value.tipo(), + ) + } else { + self.build(&arg.value, module_build_name, &[]) + } + }) + .collect_vec(); - AirTree::create_constr(constr_index, constr_tipo.clone(), constr_args) - } + AirTree::create_constr(constr_index, constr_tipo.clone(), constr_args) } TypedExpr::Var { @@ -659,12 +649,6 @@ impl<'a> CodeGenerator<'a> { } => { if check_replaceable_opaque_type(&record.tipo(), &self.data_types) { self.build(record, module_build_name, &[]) - } else if record.tipo().is_pair() { - AirTree::pair_index( - *index, - tipo.clone(), - self.build(record, module_build_name, &[]), - ) } else { let function_name = format!("__access_index_{}", *index); @@ -714,19 +698,7 @@ impl<'a> CodeGenerator<'a> { field_map, .. } => { - let val_constructor = if tipo.is_pair() { - ValueConstructor::public( - tipo.clone(), - ValueConstructorVariant::Record { - module: "".into(), - name: name.clone(), - field_map: field_map.clone(), - arity: 2, - location: Span::empty(), - constructors_count: 1, - }, - ) - } else { + let val_constructor = { let data_type = lookup_data_type_by_tipo(&self.data_types, tipo); ValueConstructor::public( @@ -792,35 +764,43 @@ impl<'a> CodeGenerator<'a> { TypedExpr::TupleIndex { index, tuple, tipo, .. } => { - let function_name = format!("__access_index_{}", *index); + if tuple.tipo().is_pair() { + AirTree::pair_index( + *index, + tipo.clone(), + self.build(tuple, module_build_name, &[]), + ) + } else { + let function_name = format!("__access_index_{}", *index); - if self.code_gen_functions.get(&function_name).is_none() { - let mut body = AirTree::local_var("__fields", list(data())); + if self.code_gen_functions.get(&function_name).is_none() { + let mut body = AirTree::local_var("__fields", list(data())); - for _ in 0..*index { - body = AirTree::builtin( - DefaultFunction::TailList, - list(data()), - vec![body], - ) - } + for _ in 0..*index { + body = AirTree::builtin( + DefaultFunction::TailList, + list(data()), + vec![body], + ) + } - body = AirTree::builtin(DefaultFunction::HeadList, data(), vec![body]); + body = AirTree::builtin(DefaultFunction::HeadList, data(), vec![body]); - self.code_gen_functions.insert( - function_name.clone(), - CodeGenFunction::Function { - body, - params: vec!["__fields".to_string()], - }, - ); - } + self.code_gen_functions.insert( + function_name.clone(), + CodeGenFunction::Function { + body, + params: vec!["__fields".to_string()], + }, + ); + } - AirTree::index_access( - function_name, - tipo.clone(), - self.build(tuple, module_build_name, &[]), - ) + AirTree::index_access( + function_name, + tipo.clone(), + self.build(tuple, module_build_name, &[]), + ) + } } TypedExpr::ErrorTerm { tipo, .. } => AirTree::error(tipo.clone(), false), @@ -828,66 +808,32 @@ impl<'a> CodeGenerator<'a> { TypedExpr::RecordUpdate { tipo, spread, args, .. } => { - if tipo.is_pair() { - assert!(args.len() == 1); + let mut index_types = vec![]; + let mut update_args = vec![]; - let Some(arg) = args.first() else { - unreachable!("Pair update with no arguments") - }; + let mut highest_index = 0; + for arg in args + .iter() + .sorted_by(|arg1, arg2| arg1.index.cmp(&arg2.index)) + { let arg_val = self.build(&arg.value, module_build_name, &[]); - let other_pair = self.build(spread, module_build_name, &[]); - - if arg.index == 0 { - AirTree::pair( - arg_val, - AirTree::pair_index( - 1, - tipo.get_inner_types()[1].clone(), - other_pair, - ), - tipo.clone(), - ) - } else { - AirTree::pair( - AirTree::pair_index( - 0, - tipo.get_inner_types()[0].clone(), - other_pair, - ), - arg_val, - tipo.clone(), - ) - } - } else { - let mut index_types = vec![]; - let mut update_args = vec![]; - - let mut highest_index = 0; - - for arg in args - .iter() - .sorted_by(|arg1, arg2| arg1.index.cmp(&arg2.index)) - { - let arg_val = self.build(&arg.value, module_build_name, &[]); - - if arg.index > highest_index { - highest_index = arg.index; - } - - index_types.push((arg.index, arg.value.tipo())); - update_args.push(arg_val); + if arg.index > highest_index { + highest_index = arg.index; } - AirTree::record_update( - index_types, - highest_index, - tipo.clone(), - self.build(spread, module_build_name, &[]), - update_args, - ) + index_types.push((arg.index, arg.value.tipo())); + update_args.push(arg_val); } + + AirTree::record_update( + index_types, + highest_index, + tipo.clone(), + self.build(spread, module_build_name, &[]), + update_args, + ) } TypedExpr::UnOp { value, op, .. } => { AirTree::unop(*op, self.build(value, module_build_name, &[])) @@ -4512,8 +4458,9 @@ impl<'a> CodeGenerator<'a> { arg_vec.push(arg_stack.pop().unwrap()); } - let tipo = match tipo.as_ref() { + let ret_tipo = match tipo.as_ref() { Type::Fn { ret, .. } => ret, + // In this case the Air Opcode only holds the return type and not the function type _ => &tipo, }; @@ -4528,11 +4475,11 @@ impl<'a> CodeGenerator<'a> { } DefaultFunction::FstPair | DefaultFunction::SndPair => { - builder::undata_builtin(&func, count, tipo, arg_vec) + builder::undata_builtin(&func, count, ret_tipo, arg_vec) } DefaultFunction::HeadList if !tipo.is_pair() => { - builder::undata_builtin(&func, count, tipo, arg_vec) + builder::undata_builtin(&func, count, ret_tipo, arg_vec) } DefaultFunction::MkCons | DefaultFunction::MkPairData => { diff --git a/crates/aiken-lang/src/gen_uplc/tree.rs b/crates/aiken-lang/src/gen_uplc/tree.rs index 4c923f012..8de60875a 100644 --- a/crates/aiken-lang/src/gen_uplc/tree.rs +++ b/crates/aiken-lang/src/gen_uplc/tree.rs @@ -937,7 +937,7 @@ impl AirTree { } } - pub fn pair_index(index: u64, tipo: Rc, tuple: AirTree) -> AirTree { + pub fn pair_index(index: usize, tipo: Rc, tuple: AirTree) -> AirTree { AirTree::cast_from_data( AirTree::builtin( if index == 0 { diff --git a/crates/aiken-project/src/tests/gen_uplc.rs b/crates/aiken-project/src/tests/gen_uplc.rs index a36757cc4..be24a1422 100644 --- a/crates/aiken-project/src/tests/gen_uplc.rs +++ b/crates/aiken-project/src/tests/gen_uplc.rs @@ -2117,7 +2117,7 @@ fn acceptance_test_22_filter_map() { fn acceptance_test_23_to_list() { let src = r#" pub type Map = - List> + List> pub opaque type AssocList { inner: Map, @@ -2143,11 +2143,11 @@ fn acceptance_test_23_to_list() { when elems is { [] -> [Pair(k, v)] - [Pair { fst: k2, snd: v2 }, ..rest] -> + [Pair(k2, v2), ..rest] -> if k == k2 { - [Pair(k, v), ..rest] + [Pair(k, v), ..rest] } else { - [Pair(k2, v2), ..do_insert(rest, k, v)] + [Pair(k2, v2), ..do_insert(rest, k, v)] } } } @@ -2159,7 +2159,7 @@ fn acceptance_test_23_to_list() { } test to_list_2() { - to_list(fixture_1()) == [Pair("foo", 42), Pair("bar", 14)] + to_list(fixture_1()) == [Pair("foo", 42).2nd, Pair("bar", 14)] } "#; @@ -2996,8 +2996,6 @@ fn acceptance_test_28_unique_list() { #[test] fn acceptance_test_29_union_pair() { let src = r#" - type Map = List> - pub opaque type AssocList { inner: Map, } @@ -3054,7 +3052,7 @@ fn acceptance_test_29_union_pair() { when left is { [] -> right - [Pair{fst: k, snd: v}, ..rest] -> + [Pair(k, v), ..rest] -> do_union(rest, do_insert(right, k, v)) } }