cgen: fix comptime for in field selector (#12457)
parent
61b99e1915
commit
fb997eb5fe
|
@ -810,6 +810,16 @@ fn (mut g Gen) method_call(node ast.CallExpr) {
|
|||
if rec_type.has_flag(.shared_f) {
|
||||
rec_type = rec_type.clear_flag(.shared_f).set_nr_muls(0)
|
||||
}
|
||||
if node.left is ast.ComptimeSelector {
|
||||
if node.left.field_expr is ast.SelectorExpr {
|
||||
if node.left.field_expr.expr is ast.Ident {
|
||||
key_str := '${node.left.field_expr.expr.name}.typ'
|
||||
rec_type = g.comptime_var_type_map[key_str] or { rec_type }
|
||||
g.gen_expr_to_string(node.left, rec_type)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
g.get_str_fn(rec_type)
|
||||
} else if node.name == 'free' {
|
||||
mut rec_type := node.receiver_type
|
||||
|
@ -1113,6 +1123,14 @@ fn (mut g Gen) fn_call(node ast.CallExpr) {
|
|||
g.writeln('; ${c_name(print_method)}($tmp); string_free(&$tmp);')
|
||||
} else {
|
||||
g.write('${c_name(print_method)}(')
|
||||
if expr is ast.ComptimeSelector {
|
||||
if expr.field_expr is ast.SelectorExpr {
|
||||
if expr.field_expr.expr is ast.Ident {
|
||||
key_str := '${expr.field_expr.expr.name}.typ'
|
||||
typ = g.comptime_var_type_map[key_str] or { typ }
|
||||
}
|
||||
}
|
||||
}
|
||||
g.gen_expr_to_string(expr, typ)
|
||||
g.write(')')
|
||||
}
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
fn print_field_values<T>(s T) {
|
||||
mut value_list := []string{}
|
||||
|
||||
$for field in T.fields {
|
||||
println(s.$(field.name))
|
||||
value_list << s.$(field.name).str()
|
||||
}
|
||||
assert value_list.len == 4
|
||||
assert value_list[0] == 'Simon'
|
||||
assert value_list[1] == 'simon1234'
|
||||
assert value_list[2] == 'simon@gmail.com'
|
||||
assert value_list[3] == '15'
|
||||
}
|
||||
|
||||
struct Foo {
|
||||
name string
|
||||
password string
|
||||
email string
|
||||
age int
|
||||
}
|
||||
|
||||
fn test_comptime_for_in_field_selector() {
|
||||
bar := Foo{
|
||||
name: 'Simon'
|
||||
password: 'simon1234'
|
||||
email: 'simon@gmail.com'
|
||||
age: 15
|
||||
}
|
||||
print_field_values<Foo>(bar)
|
||||
}
|
Loading…
Reference in New Issue