From e25fbfc729e4c2b4f82a79fa687acf76db504857 Mon Sep 17 00:00:00 2001 From: Gears Date: Mon, 13 Apr 2026 22:30:22 +0100 Subject: [PATCH] Fix recursive generic functions --- .../recursive_generic_function.accepted | 11 +++++++++++ src/trick.gleam | 3 +-- test/trick_test.gleam | 15 +++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 birdie_snapshots/recursive_generic_function.accepted diff --git a/birdie_snapshots/recursive_generic_function.accepted b/birdie_snapshots/recursive_generic_function.accepted new file mode 100644 index 0000000..3420b32 --- /dev/null +++ b/birdie_snapshots/recursive_generic_function.accepted @@ -0,0 +1,11 @@ +--- +version: 1.5.4 +title: recursive_generic_function +file: ./test/trick_test.gleam +test_name: recursive_generic_function_test +--- +pub fn swap(a: a, b: b) -> f { + swap(b, a) +} + + diff --git a/src/trick.gleam b/src/trick.gleam index 59f963d..5b536c8 100644 --- a/src/trick.gleam +++ b/src/trick.gleam @@ -2237,8 +2237,7 @@ pub fn recursive( let type_ = Function(parameters: parameter_types, return: return_type, field_map: None) - let expression = - doc_to_expression(Compiled(doc.from_string(name), type_, precedence_unit)) + let expression = instantiated(doc.from_string(name), type_, precedence_unit) let body = continue(expression) diff --git a/test/trick_test.gleam b/test/trick_test.gleam index c0ae48a..56ca503 100644 --- a/test/trick_test.gleam +++ b/test/trick_test.gleam @@ -1724,3 +1724,18 @@ pub fn custom_type_used_in_function_parameter_test() { |> unwrap |> birdie.snap("custom_type_used_in_function_parameter") } + +pub fn recursive_generic_function_test() { + { + use _ <- trick.function("swap", trick.Public, { + use a <- trick.parameter("a", trick.generic("a")) + use b <- trick.parameter("b", trick.generic("b")) + use swap <- trick.recursive + swap |> trick.call([b, a]) |> trick.expression + }) + trick.end_module() + } + |> trick.to_string + |> unwrap + |> birdie.snap("recursive_generic_function") +} -- 2.51.2