File tree Expand file tree Collapse file tree 2 files changed +48
-0
lines changed Expand file tree Collapse file tree 2 files changed +48
-0
lines changed Original file line number Diff line number Diff line change @@ -810,6 +810,16 @@ fn (mut g Gen) method_call(node ast.CallExpr) {
810
810
if rec_type.has_flag (.shared_f) {
811
811
rec_type = rec_type.clear_flag (.shared_f).set_nr_muls (0 )
812
812
}
813
+ if node.left is ast.ComptimeSelector {
814
+ if node.left.field_expr is ast.SelectorExpr {
815
+ if node.left.field_expr.expr is ast.Ident {
816
+ key_str := '${node.left.field_expr.expr.name} .typ'
817
+ rec_type = g.comptime_var_type_map[key_str] or { rec_type }
818
+ g.gen_expr_to_string (node.left, rec_type)
819
+ return
820
+ }
821
+ }
822
+ }
813
823
g.get_str_fn (rec_type)
814
824
} else if node.name == 'free' {
815
825
mut rec_type := node.receiver_type
@@ -1113,6 +1123,14 @@ fn (mut g Gen) fn_call(node ast.CallExpr) {
1113
1123
g.writeln ('; ${c_name(print_method)} ($tmp ); string_free(&$tmp );' )
1114
1124
} else {
1115
1125
g.write ('${c_name(print_method)} (' )
1126
+ if expr is ast.ComptimeSelector {
1127
+ if expr.field_expr is ast.SelectorExpr {
1128
+ if expr.field_expr.expr is ast.Ident {
1129
+ key_str := '${expr.field_expr.expr.name} .typ'
1130
+ typ = g.comptime_var_type_map[key_str] or { typ }
1131
+ }
1132
+ }
1133
+ }
1116
1134
g.gen_expr_to_string (expr, typ)
1117
1135
g.write (')' )
1118
1136
}
Original file line number Diff line number Diff line change
1
+ fn print_field_values <T >(s T) {
2
+ mut value_list := []string {}
3
+
4
+ $for field in T.fields {
5
+ println (s.$(field.name))
6
+ value_list << s.$(field.name).str ()
7
+ }
8
+ assert value_list.len == 4
9
+ assert value_list[0 ] == 'Simon'
10
+ assert value_list[1 ] == 'simon1234'
11
+ assert value_list[2 ] == 'simon@gmail.com'
12
+ assert value_list[3 ] == '15'
13
+ }
14
+
15
+ struct Foo {
16
+ name string
17
+ password string
18
+ email string
19
+ age int
20
+ }
21
+
22
+ fn test_comptime_for_in_field_selector () {
23
+ bar := Foo{
24
+ name: 'Simon'
25
+ password: 'simon1234'
26
+ email: 'simon@gmail.com'
27
+ age: 15
28
+ }
29
+ print_field_values <Foo >(bar)
30
+ }
You can’t perform that action at this time.
0 commit comments