cgen: fix `for k,_ in map { x << k }`

pull/5581/head
Delyan Angelov 2020-07-01 11:48:46 +03:00
parent 77bde09c13
commit ca1f47a742
2 changed files with 20 additions and 2 deletions

View File

@ -290,3 +290,16 @@ fn test_plus_assign_string() {
assert m.len == 1 assert m.len == 1
assert m['one'] == '1' assert m['one'] == '1'
} }
fn test_map_keys_to_array() {
m := {'a': 'b', 'c': 'd'}
mut arr := []string{}
for k, _ in m {
arr << k
}
sarr := arr.str()
println(sarr)
assert sarr == "['a', 'c']"
}

View File

@ -864,9 +864,14 @@ fn (mut g Gen) for_in(it ast.ForInStmt) {
g.writeln(';') g.writeln(';')
g.writeln('array_$key_styp $keys_tmp = map_keys(&$atmp);') g.writeln('array_$key_styp $keys_tmp = map_keys(&$atmp);')
g.writeln('for (int $idx = 0; $idx < ${keys_tmp}.len; ++$idx) {') g.writeln('for (int $idx = 0; $idx < ${keys_tmp}.len; ++$idx) {')
g.writeln('\t$key_styp $key = (($key_styp*)${keys_tmp}.data)[$idx];') // TODO: analyze whether it.key_type has a .clone() method and call .clone() for all types:
if it.key_type == table.string_type {
g.writeln('\t$key_styp $key = /*kkkk*/ string_clone( (($key_styp*)${keys_tmp}.data)[$idx] );')
} else {
g.writeln('\t$key_styp $key = /*kkkk*/ (($key_styp*)${keys_tmp}.data)[$idx];')
}
if it.val_var != '_' { if it.val_var != '_' {
g.write('\t$val_styp ${c_name(it.val_var)} = (*($val_styp*)map_get($atmp') g.write('\t$val_styp ${c_name(it.val_var)} = /*vvv*/ (*($val_styp*)map_get($atmp')
g.writeln(', $key, &($val_styp[]){ $zero }));') g.writeln(', $key, &($val_styp[]){ $zero }));')
} }
g.stmts(it.stmts) g.stmts(it.stmts)