`map := { 'foo': 'bar' }` syntax
parent
bfddb9a80f
commit
a5f5b52204
|
@ -2241,6 +2241,10 @@ fn (p mut Parser) factor() string {
|
|||
// everything should do next()
|
||||
return p.array_init()
|
||||
case Token.lcbr:
|
||||
// `m := { 'one': 1 }`
|
||||
if p.peek() == .str {
|
||||
return p.map_init()
|
||||
}
|
||||
// { user | name :'new name' }
|
||||
return p.assoc()
|
||||
case Token.key_if:
|
||||
|
@ -2415,7 +2419,50 @@ fn (p mut Parser) string_expr() {
|
|||
}
|
||||
|
||||
// m := map[string]int{}
|
||||
// m := { 'one': 1 }
|
||||
fn (p mut Parser) map_init() string {
|
||||
// m := { 'one': 1, 'two': 2 }
|
||||
mut keys := []string // ['one', 'two']
|
||||
mut keys_gen := '' // ' (string[]){tos2("one"), tos2("two")}
|
||||
mut vals := []string // [1, 2]
|
||||
mut vals_gen := ''
|
||||
mut val_type := '' // 'int'
|
||||
if p.tok == .lcbr {
|
||||
p.check(.lcbr)
|
||||
mut i := 0
|
||||
for {
|
||||
key := p.lit
|
||||
keys << key
|
||||
keys_gen += 'tos2("$key"), '
|
||||
p.check(.str)
|
||||
p.check(.colon)
|
||||
p.cgen.start_tmp()
|
||||
t := p.bool_expression()
|
||||
if i == 0 {
|
||||
val_type = t
|
||||
}
|
||||
i++
|
||||
if val_type != t {
|
||||
if !p.check_types_no_throw(val_type, t) {
|
||||
p.error('bad map element type `$val_type` instead of `$t`')
|
||||
}
|
||||
}
|
||||
val_expr := p.cgen.end_tmp()
|
||||
vals << val_expr
|
||||
vals_gen += '$val_expr, '
|
||||
if p.tok == .rcbr {
|
||||
p.check(.rcbr)
|
||||
break
|
||||
}
|
||||
if p.tok == .comma {
|
||||
p.check(.comma)
|
||||
}
|
||||
}
|
||||
p.gen('new_map_init($keys.len, sizeof($val_type), ' +
|
||||
'(string[]){ $keys_gen }, ($val_type []){ $vals_gen } )')
|
||||
typ := 'map_$val_type'
|
||||
return typ
|
||||
}
|
||||
p.next()
|
||||
p.check(.lsbr)
|
||||
key_type := p.check_name()
|
||||
|
@ -2423,7 +2470,7 @@ fn (p mut Parser) map_init() string {
|
|||
p.error('only string key maps allowed for now')
|
||||
}
|
||||
p.check(.rsbr)
|
||||
val_type := p.check_name()
|
||||
val_type = p.check_name()
|
||||
if !p.table.known_type(val_type) {
|
||||
p.error('map init unknown type "$val_type"')
|
||||
}
|
||||
|
@ -2435,7 +2482,7 @@ fn (p mut Parser) map_init() string {
|
|||
return typ
|
||||
}
|
||||
|
||||
// [1,2,3]
|
||||
// `nums := [1, 2, 3]`
|
||||
fn (p mut Parser) array_init() string {
|
||||
p.is_alloc = true
|
||||
p.check(.lsbr)
|
||||
|
|
|
@ -501,6 +501,9 @@ fn (p mut Parser) _check_types(got, expected string, throw bool) bool {
|
|||
if got=='int' && expected=='byte*' {
|
||||
return true
|
||||
}
|
||||
//if got=='int' && expected=='voidptr*' {
|
||||
//return true
|
||||
//}
|
||||
// byteptr += int
|
||||
if got=='int' && expected=='byteptr' {
|
||||
return true
|
||||
|
|
|
@ -29,6 +29,18 @@ fn new_map(cap, elm_size int) map {
|
|||
return res
|
||||
}
|
||||
|
||||
// `m := { 'one': 1, 'two': 2 }`
|
||||
fn new_map_init(cap, elm_size int, keys *string, vals voidptr) map {
|
||||
mut res := map {
|
||||
element_size: elm_size
|
||||
root: 0
|
||||
}
|
||||
for i in 0 .. cap {
|
||||
res._set(keys[i], vals + i * elm_size)
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
fn new_node(key string, val voidptr, element_size int) *Node {
|
||||
new_e := &Node {
|
||||
key: key
|
||||
|
|
|
@ -60,6 +60,13 @@ fn test_map() {
|
|||
assert a.m['two'] == 2
|
||||
}
|
||||
|
||||
fn test_map_init() {
|
||||
m := { 'one': 1, 'two': 2, 'jooo': 'sdf' }
|
||||
assert m['one'] == 1
|
||||
assert m['two'] == 2
|
||||
assert m['three'] == 0
|
||||
}
|
||||
|
||||
fn test_string_map() {
|
||||
//m := map[string]Fn
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue