From ae396c0224e56260a3bf359c4e62956b968deba3 Mon Sep 17 00:00:00 2001 From: microproofs Date: Thu, 7 Mar 2024 00:41:43 -0500 Subject: [PATCH] Fix opaque type destructuring in code gen --- crates/aiken-lang/src/gen_uplc.rs | 5 +++-- examples/acceptance_tests/097/aiken.lock | 7 +++++++ examples/acceptance_tests/097/aiken.toml | 3 +++ examples/acceptance_tests/097/lib/foo.ak | 24 ++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 examples/acceptance_tests/097/aiken.lock create mode 100644 examples/acceptance_tests/097/aiken.toml create mode 100644 examples/acceptance_tests/097/lib/foo.ak diff --git a/crates/aiken-lang/src/gen_uplc.rs b/crates/aiken-lang/src/gen_uplc.rs index f87c8fc8..104b4a46 100644 --- a/crates/aiken-lang/src/gen_uplc.rs +++ b/crates/aiken-lang/src/gen_uplc.rs @@ -250,7 +250,7 @@ impl<'a> CodeGenerator<'a> { panic!("Dangling expressions without an assignment") }; - let replaced_type = convert_opaque_type(tipo, &self.data_types, true); + // let replaced_type = convert_opaque_type(tipo, &self.data_types, true); let air_value = self.build(value, module_build_name, &[]); @@ -294,7 +294,7 @@ impl<'a> CodeGenerator<'a> { pattern, air_value, then, - &replaced_type, + tipo, AssignmentProperties { value_type: value.tipo(), kind: *kind, @@ -1200,6 +1200,7 @@ impl<'a> CodeGenerator<'a> { // TODO: See if we can combine these two if-conditions; // // i.e. can we lift data_type assignment out of the first if? + let then = if props.kind.is_expect() { let data_type = lookup_data_type_by_tipo(&self.data_types, tipo) .unwrap_or_else(|| { diff --git a/examples/acceptance_tests/097/aiken.lock b/examples/acceptance_tests/097/aiken.lock new file mode 100644 index 00000000..6e350cda --- /dev/null +++ b/examples/acceptance_tests/097/aiken.lock @@ -0,0 +1,7 @@ +# This file was generated by Aiken +# You typically do not need to edit this file + +requirements = [] +packages = [] + +[etags] diff --git a/examples/acceptance_tests/097/aiken.toml b/examples/acceptance_tests/097/aiken.toml new file mode 100644 index 00000000..bea4b604 --- /dev/null +++ b/examples/acceptance_tests/097/aiken.toml @@ -0,0 +1,3 @@ +name = "aiken-lang/acceptance_test_097" +version = "0.0.0" +description = "" diff --git a/examples/acceptance_tests/097/lib/foo.ak b/examples/acceptance_tests/097/lib/foo.ak new file mode 100644 index 00000000..4888407f --- /dev/null +++ b/examples/acceptance_tests/097/lib/foo.ak @@ -0,0 +1,24 @@ +pub opaque type Dict { + inner: List<(a, b)>, +} + +pub opaque type Value { + inner: Dict>, +} + +fn to_dict(v: Value) { + v.inner +} + +fn to_list(d: Dict) { + d.inner +} + +test opaque_destructure() { + let x = Value { inner: Dict { inner: [(#"", Dict { inner: [("ab", 3)] })] } } + + expect [(policy_a, Dict{inner: [(asset_name_a, quantity_a), ..]}), ..] = + x |> to_dict() |> to_list() + + quantity_a > 2 +}