| 1 | // Regression test for https://github.com/vlang/v/issues/27076 — |
| 2 | // `$for method in field.methods` inside `$for field in T.fields` evaluated |
| 3 | // `$if method.name == ...` against an empty method name and dropped the body. |
| 4 | |
| 5 | struct Comp1 { |
| 6 | mut: |
| 7 | a int |
| 8 | } |
| 9 | |
| 10 | fn (mut c Comp1) on_init() { |
| 11 | c.a = 42 |
| 12 | } |
| 13 | |
| 14 | struct Comp2 { |
| 15 | mut: |
| 16 | b int |
| 17 | } |
| 18 | |
| 19 | fn (mut c Comp2) on_init() { |
| 20 | c.b = 42 |
| 21 | } |
| 22 | |
| 23 | struct Comp3 { |
| 24 | mut: |
| 25 | c int |
| 26 | } |
| 27 | |
| 28 | fn (mut c Comp3) on_init() { |
| 29 | c.c = 42 |
| 30 | } |
| 31 | |
| 32 | struct Container { |
| 33 | mut: |
| 34 | id string |
| 35 | cmp1 Comp1 |
| 36 | cmp2 Comp2 |
| 37 | cmp3 Comp3 |
| 38 | cmp4 Comp1 |
| 39 | cmp5 Comp2 |
| 40 | cmp6 Comp3 |
| 41 | cmp7 Comp1 |
| 42 | cmp8 Comp2 |
| 43 | cmp9 Comp3 |
| 44 | } |
| 45 | |
| 46 | fn test_comptime_method_dispatch_on_struct_fields() { |
| 47 | mut app := Container{} |
| 48 | $for field in Container.fields { |
| 49 | $if field.is_struct { |
| 50 | $for method in field.methods { |
| 51 | $if method.name == 'on_init' { |
| 52 | app.$(field.name).on_init() |
| 53 | } |
| 54 | } |
| 55 | } |
| 56 | } |
| 57 | assert app.cmp1.a == 42 |
| 58 | assert app.cmp2.b == 42 |
| 59 | assert app.cmp3.c == 42 |
| 60 | assert app.cmp4.a == 42 |
| 61 | assert app.cmp5.b == 42 |
| 62 | assert app.cmp6.c == 42 |
| 63 | assert app.cmp7.a == 42 |
| 64 | assert app.cmp8.b == 42 |
| 65 | assert app.cmp9.c == 42 |
| 66 | } |
| 67 | |