From 51e78616182df8fb76a2ba08785aaf7112efd56b Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 30 Mar 2025 19:31:55 -0300 Subject: [PATCH] type_resolver: fix map generic resolver (fix #24090) (#24092) --- .../comptime_infer_generic_map_test.v | 23 +++++++++++++++++++ vlib/v/type_resolver/generic_resolver.v | 13 +++++++++++ 2 files changed, 36 insertions(+) create mode 100644 vlib/v/tests/comptime/comptime_infer_generic_map_test.v diff --git a/vlib/v/tests/comptime/comptime_infer_generic_map_test.v b/vlib/v/tests/comptime/comptime_infer_generic_map_test.v new file mode 100644 index 000000000..1436c9bd3 --- /dev/null +++ b/vlib/v/tests/comptime/comptime_infer_generic_map_test.v @@ -0,0 +1,23 @@ +module main + +fn encode_map[K, V](m map[K]V) string { + return typeof(m).name +} + +fn encode_array[T](arr []T) string { + for element in arr { + $if T is $map { + return encode_map(element) + } + } + return '' +} + +fn test_main() { + x := [{ + '123': '456' + }, { + 'abc': 'def' + }] + assert encode_array(x) == 'map[string]string' +} diff --git a/vlib/v/type_resolver/generic_resolver.v b/vlib/v/type_resolver/generic_resolver.v index 39a44c6ae..212c0979c 100644 --- a/vlib/v/type_resolver/generic_resolver.v +++ b/vlib/v/type_resolver/generic_resolver.v @@ -173,6 +173,19 @@ pub fn (mut t TypeResolver) resolve_args(cur_fn &ast.FnDecl, func &ast.Fn, mut n ctyp = t.resolver.unwrap_generic(arg_sym.info.value_type) } } + } else if arg_sym.kind == .any { + cparam_type_sym := t.table.sym(t.resolver.unwrap_generic(ctyp)) + if param_sym.info is ast.Map && cparam_type_sym.info is ast.Map { + if param_sym.info.key_type.has_flag(.generic) { + comptime_args[k] = cparam_type_sym.info.key_type + if param_sym.info.value_type.has_flag(.generic) { + k++ + ctyp = cparam_type_sym.info.value_type + } + } else if param_sym.info.value_type.has_flag(.generic) { + ctyp = cparam_type_sym.info.value_type + } + } } comptime_args[k] = ctyp } -- 2.39.5