Skip to content

Commit 51e7861

Browse files
authored
type_resolver: fix map generic resolver (fix #24090) (#24092)
1 parent ccb93e6 commit 51e7861

2 files changed

Lines changed: 36 additions & 0 deletions

File tree

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
module main
2+
3+
fn encode_map[K, V](m map[K]V) string {
4+
return typeof(m).name
5+
}
6+
7+
fn encode_array[T](arr []T) string {
8+
for element in arr {
9+
$if T is $map {
10+
return encode_map(element)
11+
}
12+
}
13+
return ''
14+
}
15+
16+
fn test_main() {
17+
x := [{
18+
'123': '456'
19+
}, {
20+
'abc': 'def'
21+
}]
22+
assert encode_array(x) == 'map[string]string'
23+
}

‎vlib/v/type_resolver/generic_resolver.v‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,19 @@ pub fn (mut t TypeResolver) resolve_args(cur_fn &ast.FnDecl, func &ast.Fn, mut n
173173
ctyp = t.resolver.unwrap_generic(arg_sym.info.value_type)
174174
}
175175
}
176+
} else if arg_sym.kind == .any {
177+
cparam_type_sym := t.table.sym(t.resolver.unwrap_generic(ctyp))
178+
if param_sym.info is ast.Map && cparam_type_sym.info is ast.Map {
179+
if param_sym.info.key_type.has_flag(.generic) {
180+
comptime_args[k] = cparam_type_sym.info.key_type
181+
if param_sym.info.value_type.has_flag(.generic) {
182+
k++
183+
ctyp = cparam_type_sym.info.value_type
184+
}
185+
} else if param_sym.info.value_type.has_flag(.generic) {
186+
ctyp = cparam_type_sym.info.value_type
187+
}
188+
}
176189
}
177190
comptime_args[k] = ctyp
178191
}

0 commit comments

Comments
 (0)