From 0ccfe60072f313c9ba4d6e7689a52f15b8e49e98 Mon Sep 17 00:00:00 2001 From: rvcas Date: Tue, 13 Feb 2024 21:29:24 -0500 Subject: [PATCH] feat: support nested void matching --- crates/aiken-lang/src/gen_uplc.rs | 13 +++++++++---- examples/acceptance_tests/093/aiken.lock | 7 +++++++ examples/acceptance_tests/093/aiken.toml | 4 ++++ examples/acceptance_tests/093/lib/foo.ak | 10 ++++++++++ 4 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 examples/acceptance_tests/093/aiken.lock create mode 100644 examples/acceptance_tests/093/aiken.toml create mode 100644 examples/acceptance_tests/093/lib/foo.ak diff --git a/crates/aiken-lang/src/gen_uplc.rs b/crates/aiken-lang/src/gen_uplc.rs index f2b49b2b..86fbeaeb 100644 --- a/crates/aiken-lang/src/gen_uplc.rs +++ b/crates/aiken-lang/src/gen_uplc.rs @@ -2568,10 +2568,6 @@ impl<'a> CodeGenerator<'a> { let (_, assign) = self.clause_pattern(pattern, subject_tipo, props, then); assign } else { - assert!( - !subject_tipo.is_void(), - "WHY ARE YOU PATTERN MATCHING ON A NESTED VOID???" - ); match pattern { Pattern::Int { value, .. } => { props.complex_clause = true; @@ -2700,6 +2696,13 @@ impl<'a> CodeGenerator<'a> { bool(), then, ) + } else if subject_tipo.is_void() { + AirTree::clause_guard( + &props.original_subject_name, + AirTree::void(), + void(), + then, + ) } else { let (cond, assign) = self.clause_pattern(pattern, subject_tipo, props, then); @@ -4791,6 +4794,8 @@ impl<'a> CodeGenerator<'a> { .force(); } Some(term) + } else if tipo.is_void() { + Some(then.lambda("_").apply(Term::var(subject_name))) } else { let condition = if tipo.is_int() { Term::equals_integer() diff --git a/examples/acceptance_tests/093/aiken.lock b/examples/acceptance_tests/093/aiken.lock new file mode 100644 index 00000000..6e350cda --- /dev/null +++ b/examples/acceptance_tests/093/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/093/aiken.toml b/examples/acceptance_tests/093/aiken.toml new file mode 100644 index 00000000..ee909d22 --- /dev/null +++ b/examples/acceptance_tests/093/aiken.toml @@ -0,0 +1,4 @@ +name = "thing/thing" +version = "0.0.0" +license = "Apache-2.0" +description = "Aiken contracts for project 'thing/thing'" diff --git a/examples/acceptance_tests/093/lib/foo.ak b/examples/acceptance_tests/093/lib/foo.ak new file mode 100644 index 00000000..e997c3ba --- /dev/null +++ b/examples/acceptance_tests/093/lib/foo.ak @@ -0,0 +1,10 @@ +pub fn wow(a: Void) -> Int { + when Some(a) is { + Some(Void) -> 42 + None -> 0 + } +} + +test wow_1() { + wow(Void) == 42 +}