v2 / vlib / v / ast / init.v
72 lines · 71 sloc · 1.38 KB · c51d30bf5309653c6b573ec815268e69a78ea8cc
Raw
1module ast
2
3pub fn (t &Table) resolve_init(node StructInit, typ Type) Expr {
4 sym := t.sym(typ)
5 match sym.info {
6 Array {
7 mut has_len := false
8 mut has_cap := false
9 mut has_init := false
10 mut len_expr := empty_expr
11 mut cap_expr := empty_expr
12 mut init_expr := empty_expr
13 mut exprs := []Expr{}
14 for field in node.init_fields {
15 match field.name {
16 'len' {
17 has_len = true
18 len_expr = field.expr
19 }
20 'cap' {
21 has_cap = true
22 cap_expr = field.expr
23 }
24 'init' {
25 has_init = true
26 init_expr = field.expr
27 }
28 else {
29 exprs << field.expr
30 }
31 }
32 }
33 return ArrayInit{
34 // TODO: mod is not being set for now, we could need this in future
35 // mod: mod
36 pos: node.pos
37 typ: typ
38 elem_type: sym.info.elem_type
39 has_len: has_len
40 has_cap: has_cap
41 has_init: has_init
42 len_expr: len_expr
43 cap_expr: cap_expr
44 init_expr: init_expr
45 exprs: exprs
46 }
47 }
48 Map {
49 mut keys := []Expr{}
50 mut vals := []Expr{}
51 for field in node.init_fields {
52 keys << StringLiteral{
53 val: field.name
54 }
55 vals << field.expr
56 }
57 return MapInit{
58 typ: typ
59 key_type: sym.info.key_type
60 value_type: sym.info.value_type
61 keys: keys
62 vals: vals
63 }
64 }
65 else {
66 return StructInit{
67 ...node
68 unresolved: false
69 }
70 }
71 }
72}
73