1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

doc, fmt: use map{key: value} syntax for map literals (#8623)

This commit is contained in:
Nick Treleaven 2021-02-08 14:57:42 +00:00 committed by GitHub
parent 8ae23cd89e
commit 9e751f72c4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 81 additions and 69 deletions

View File

@ -130,7 +130,7 @@ fn (vd VDoc) render_search_index(out Output) {
} }
fn (mut vd VDoc) render_static_html(out Output) { fn (mut vd VDoc) render_static_html(out Output) {
vd.assets = { vd.assets = map{
'doc_css': vd.get_resource(css_js_assets[0], out) 'doc_css': vd.get_resource(css_js_assets[0], out)
'normalize_css': vd.get_resource(css_js_assets[1], out) 'normalize_css': vd.get_resource(css_js_assets[1], out)
'doc_js': vd.get_resource(css_js_assets[2], out) 'doc_js': vd.get_resource(css_js_assets[2], out)

View File

@ -798,9 +798,12 @@ println(m['one']) // "1"
println(m['bad_key']) // "0" println(m['bad_key']) // "0"
println('bad_key' in m) // Use `in` to detect whether such key exists println('bad_key' in m) // Use `in` to detect whether such key exists
m.delete('two') m.delete('two')
// NB: map keys can have any type, `int` in this case, ```
// and the whole map can be initialized using this short syntax: Maps can have keys of type string, rune, integer, float or voidptr.
numbers := {
The whole map can be initialized using this short syntax:
```v
numbers := map{
1: 'one' 1: 'one'
2: 'two' 2: 'two'
} }
@ -810,12 +813,14 @@ println(numbers)
If a key is not found, a zero value is returned by default: If a key is not found, a zero value is returned by default:
```v ```v
sm := { sm := map{
'abc': 'xyz' 'abc': 'xyz'
} }
val := sm['bad_key'] val := sm['bad_key']
println(val) // '' println(val) // ''
intm := { ```
```v
intm := map{
1: 1234 1: 1234
2: 5678 2: 5678
} }
@ -1061,7 +1066,7 @@ To do the opposite, use `!in`.
nums := [1, 2, 3] nums := [1, 2, 3]
println(1 in nums) // true println(1 in nums) // true
println(4 !in nums) // true println(4 !in nums) // true
m := { m := map{
'one': 1 'one': 1
'two': 2 'two': 2
} }
@ -1132,7 +1137,7 @@ When an identifier is just a single underscore, it is ignored.
#### Map `for` #### Map `for`
```v ```v
m := { m := map{
'one': 1 'one': 1
'two': 2 'two': 2
} }
@ -1145,7 +1150,7 @@ for key, value in m {
Either key or value can be ignored by using a single underscore as the identifier. Either key or value can be ignored by using a single underscore as the identifier.
```v ```v
m := { m := map{
'one': 1 'one': 1
'two': 2 'two': 2
} }
@ -1698,7 +1703,7 @@ fn main() {
// You can even have an array/map of functions: // You can even have an array/map of functions:
fns := [sqr, cube] fns := [sqr, cube]
println((10)) // "100" println((10)) // "100"
fns_map := { fns_map := map{
'sqr': sqr 'sqr': sqr
'cube': cube 'cube': cube
} }

View File

@ -1198,20 +1198,20 @@ fn test_struct_array_of_multi_type_in() {
ivan := Person{ ivan := Person{
name: 'ivan' name: 'ivan'
nums: [1, 2, 3] nums: [1, 2, 3]
kv: { kv: map{
'aaa': '111' 'aaa': '111'
} }
} }
people := [Person{ people := [Person{
name: 'ivan' name: 'ivan'
nums: [1, 2, 3] nums: [1, 2, 3]
kv: { kv: map{
'aaa': '111' 'aaa': '111'
} }
}, Person{ }, Person{
name: 'bob' name: 'bob'
nums: [2] nums: [2]
kv: { kv: map{
'bbb': '222' 'bbb': '222'
} }
}] }]
@ -1223,20 +1223,20 @@ fn test_struct_array_of_multi_type_index() {
ivan := Person{ ivan := Person{
name: 'ivan' name: 'ivan'
nums: [1, 2, 3] nums: [1, 2, 3]
kv: { kv: map{
'aaa': '111' 'aaa': '111'
} }
} }
people := [Person{ people := [Person{
name: 'ivan' name: 'ivan'
nums: [1, 2, 3] nums: [1, 2, 3]
kv: { kv: map{
'aaa': '111' 'aaa': '111'
} }
}, Person{ }, Person{
name: 'bob' name: 'bob'
nums: [2] nums: [2]
kv: { kv: map{
'bbb': '222' 'bbb': '222'
} }
}] }]

View File

@ -12,7 +12,7 @@ fn test_map_of_f32() {
} }
fn test_map_of_f64() { fn test_map_of_f64() {
mut m64 := { mut m64 := map{
3.14: 'pi' 3.14: 'pi'
} }
m64[1.0] = 'one' m64[1.0] = 'one'

View File

@ -274,25 +274,25 @@ fn test_map_assign() {
mut a := map[string]f64{} mut a := map[string]f64{}
mut b := map[string]int{} mut b := map[string]int{}
mut c := map[string]u16{} mut c := map[string]u16{}
a = { a = map{
'x': 12.4 'x': 12.4
'y': 3 'y': 3
} }
b = { b = map{
'u': -13 'u': -13
'v': 12 'v': 12
} }
c = { c = map{
's': u16(5) 's': u16(5)
't': 3 't': 3
} }
_ := Mstruct1{{ _ := Mstruct1{map{
'p': 12 'p': 12
}} }}
_ := Mstruct2{{ _ := Mstruct2{map{
'q': 1.7 'q': 1.7
}} }}
_ := Mstruct3{{ _ := Mstruct3{map{
'r': u16(6) 'r': u16(6)
's': 5 's': 5
}} }}
@ -335,7 +335,7 @@ fn test_map_in_directly() {
} }
fn test_plus_assign_string() { fn test_plus_assign_string() {
mut m := { mut m := map{
'one': '' 'one': ''
} }
m['one'] += '1' m['one'] += '1'
@ -344,7 +344,7 @@ fn test_plus_assign_string() {
} }
fn test_map_keys_to_array() { fn test_map_keys_to_array() {
m := { m := map{
'a': 'b' 'a': 'b'
'c': 'd' 'c': 'd'
} }
@ -364,7 +364,7 @@ fn map_in_mut(mut m map[string]int) {
} }
fn test_map_in_mut() { fn test_map_in_mut() {
mut m := { mut m := map{
'one': 1 'one': 1
} }
map_in_mut(mut m) map_in_mut(mut m)
@ -372,7 +372,7 @@ fn test_map_in_mut() {
} }
fn test_map_in() { fn test_map_in() {
m := { m := map{
'Foo': 'bar' 'Foo': 'bar'
} }
if 'foo'.capitalize() in m { if 'foo'.capitalize() in m {
@ -404,7 +404,7 @@ fn mut_map_with_relation_op_in_fn(mut m map[string]int) {
} }
fn test_mut_map_with_relation_op_in_fn() { fn test_mut_map_with_relation_op_in_fn() {
mut m := { mut m := map{
'one': 1 'one': 1
'two': 2 'two': 2
} }
@ -418,7 +418,7 @@ fn test_mut_map_with_relation_op_in_fn() {
} }
fn test_map_str_after_delete() { fn test_map_str_after_delete() {
mut m := { mut m := map{
'first': 1 'first': 1
'second': 2 'second': 2
'third': 3 'third': 3
@ -432,7 +432,7 @@ fn test_map_str_after_delete() {
} }
fn test_modify_map_value() { fn test_modify_map_value() {
mut m1 := { mut m1 := map{
'foo': 3 'foo': 3
'bar': -7 'bar': -7
} }
@ -443,7 +443,7 @@ fn test_modify_map_value() {
} }
fn test_map_clone() { fn test_map_clone() {
mut nums := { mut nums := map{
'foo': 1 'foo': 1
'bar': 2 'bar': 2
} }
@ -470,7 +470,7 @@ fn test_map_default_zero() {
} }
fn test_map_or() { fn test_map_or() {
m := { m := map{
'first': 1 'first': 1
'second': 2 'second': 2
'third': 3 'third': 3
@ -489,7 +489,7 @@ fn test_int_keys() {
m[5] += 24 m[5] += 24
m[5]++ m[5]++
assert m[5] == 25 assert m[5] == 25
m2 := { m2 := map{
3: 9 3: 9
4: 16 4: 16
5: 25 5: 25
@ -521,7 +521,7 @@ fn test_voidptr_keys() {
} }
fn test_rune_keys() { fn test_rune_keys() {
mut m := { mut m := map{
`!`: 2 `!`: 2
`%`: 3 `%`: 3
} }
@ -541,62 +541,62 @@ fn test_rune_keys() {
} }
fn test_eq() { fn test_eq() {
a := { a := map{
'a': 1 'a': 1
'b': 2 'b': 2
} }
assert a == { assert a == map{
'a': 1 'a': 1
'b': 2 'b': 2
} }
b := { b := map{
'a': [[1]] 'a': [[1]]
'b': [[2]] 'b': [[2]]
} }
assert b == { assert b == map{
'a': [[1]] 'a': [[1]]
'b': [[2]] 'b': [[2]]
} }
c := { c := map{
'a': { 'a': map{
'11': 1 '11': 1
} }
'b': { 'b': map{
'22': 2 '22': 2
} }
} }
assert c == { assert c == map{
'a': { 'a': map{
'11': 1 '11': 1
} }
'b': { 'b': map{
'22': 2 '22': 2
} }
} }
d := { d := map{
'a': MValue{ 'a': MValue{
name: 'aa' name: 'aa'
misc: { misc: map{
'11': '1' '11': '1'
} }
} }
'b': MValue{ 'b': MValue{
name: 'bb' name: 'bb'
misc: { misc: map{
'22': '2' '22': '2'
} }
} }
} }
assert d == { assert d == map{
'a': MValue{ 'a': MValue{
name: 'aa' name: 'aa'
misc: { misc: map{
'11': '1' '11': '1'
} }
} }
'b': MValue{ 'b': MValue{
name: 'bb' name: 'bb'
misc: { misc: map{
'22': '2' '22': '2'
} }
} }
@ -604,24 +604,24 @@ fn test_eq() {
} }
fn test_non_string_key_map_str() { fn test_non_string_key_map_str() {
assert { assert map{
23: 4 23: 4
}.str() == '{23: 4}' }.str() == '{23: 4}'
assert { assert map{
`a`: 12 `a`: 12
`b`: 13 `b`: 13
}.str() == '{`a`: 12, `b`: 13}' }.str() == '{`a`: 12, `b`: 13}'
assert { assert map{
23: 'foo' 23: 'foo'
25: 'bar' 25: 'bar'
}.str() == "{23: 'foo', 25: 'bar'}" }.str() == "{23: 'foo', 25: 'bar'}"
} }
fn test_map_assign_empty_map_init() { fn test_map_assign_empty_map_init() {
mut a := { mut a := map{
'one': 1 'one': 1
} }
a = {} a = map{}
println(a) println(a)
assert a == map[string]int{} assert a == map[string]int{}
assert '$a' == '{}' assert '$a' == '{}'

View File

@ -2593,6 +2593,8 @@ pub fn (mut c Checker) assign_stmt(mut assign_stmt ast.AssignStmt) {
// `map = {}` // `map = {}`
sym := c.table.get_type_symbol(left_type) sym := c.table.get_type_symbol(left_type)
if sym.kind == .map && assign_stmt.right[i] is ast.StructInit { if sym.kind == .map && assign_stmt.right[i] is ast.StructInit {
c.warn('assigning a struct literal to a map is deprecated - use `map{}` instead',
assign_stmt.right[i].position())
assign_stmt.right[i] = ast.MapInit{} assign_stmt.right[i] = ast.MapInit{}
} }
} }

View File

@ -218,7 +218,7 @@ pub fn (mut d Doc) stmt(stmt ast.Stmt, filename string) ?DocNode {
kind: .variable kind: .variable
parent_name: node.name parent_name: node.name
pos: d.convert_pos(filename, param.pos) pos: d.convert_pos(filename, param.pos)
attrs: { attrs: map{
'mut': param.is_mut.str() 'mut': param.is_mut.str()
} }
return_type: d.type_to_str(param.typ) return_type: d.type_to_str(param.typ)

View File

@ -2034,12 +2034,17 @@ pub fn (mut f Fmt) array_init(it ast.ArrayInit) {
pub fn (mut f Fmt) map_init(it ast.MapInit) { pub fn (mut f Fmt) map_init(it ast.MapInit) {
if it.keys.len == 0 { if it.keys.len == 0 {
if it.typ > table.void_type {
f.mark_types_import_as_used(it.typ) f.mark_types_import_as_used(it.typ)
f.write(f.table.type_to_str(it.typ)) f.write(f.table.type_to_str(it.typ))
} else {
// m = map{}
f.write('map')
}
f.write('{}') f.write('{}')
return return
} }
f.writeln('{') f.writeln('map{')
f.indent++ f.indent++
mut max_field_len := 0 mut max_field_len := 0
for key in it.keys { for key in it.keys {

View File

@ -18,10 +18,10 @@ fn main() {
'eggs', 'eggs',
] ]
_ := []int{len: 10, cap: 10, init: 7} _ := []int{len: 10, cap: 10, init: 7}
_ := []map[string]string{len: 5, cap: 50, init: { _ := []map[string]string{len: 5, cap: 50, init: map{
'a': 'a' 'a': 'a'
}} }}
_ := []map[string][]int{len: 7, cap: 100, init: { _ := []map[string][]int{len: 7, cap: 100, init: map{
'a': [1, 2] 'a': [1, 2]
}} }}
} }

View File

@ -1,5 +1,5 @@
const ( const (
reserved_types = { reserved_types = map{
'i8': true 'i8': true
'i16': true 'i16': true
'int': true 'int': true
@ -8,7 +8,7 @@ const (
} }
) )
numbers := { numbers := map{
'one': 1 'one': 1
'two': 2 'two': 2
'sevenhundredseventyseven': 777 'sevenhundredseventyseven': 777

View File

@ -5,11 +5,11 @@ fn workaround() {
fn main() { fn main() {
mut ams := []map[string]string{} mut ams := []map[string]string{}
ams << { ams << map{
'a': 'b' 'a': 'b'
'c': 'd' 'c': 'd'
} }
ams << { ams << map{
'e': 'f' 'e': 'f'
'g': 'h' 'g': 'h'
} }

View File

@ -445,7 +445,7 @@ fn (mut g Gen) gen_str_for_multi_return(info table.MultiReturn, styp string, str
fn (mut g Gen) gen_str_for_struct(info table.Struct, styp string, str_fn_name string) { fn (mut g Gen) gen_str_for_struct(info table.Struct, styp string, str_fn_name string) {
// TODO: short it if possible // TODO: short it if possible
// generates all definitions of substructs // generates all definitions of substructs
mut fnames2strfunc := { mut fnames2strfunc := map{
'': '' '': ''
} // map[string]string // TODO vfmt bug } // map[string]string // TODO vfmt bug
for field in info.fields { for field in info.fields {

View File

@ -20,7 +20,7 @@ pub const (
) )
pub const ( pub const (
external_module_dependencies_for_tool = { external_module_dependencies_for_tool = map{
'vdoc': ['markdown'] 'vdoc': ['markdown']
} }
) )

View File

@ -208,7 +208,7 @@ fn testsuite_end() {
// It sends a request to the server to shutdown. // It sends a request to the server to shutdown.
x := http.fetch('http://127.0.0.1:$sport/shutdown', x := http.fetch('http://127.0.0.1:$sport/shutdown',
method: .get method: .get
cookies: { cookies: map{
'skey': 'superman' 'skey': 'superman'
} }
) or { ) or {

View File

@ -19,7 +19,7 @@ pub const (
headers_close = '$header_server$header_connection_close\r\n' headers_close = '$header_server$header_connection_close\r\n'
http_404 = 'HTTP/1.1 404 Not Found\r\nContent-Type: text/plain\r\nContent-Length: 13\r\n${headers_close}404 Not Found' http_404 = 'HTTP/1.1 404 Not Found\r\nContent-Type: text/plain\r\nContent-Length: 13\r\n${headers_close}404 Not Found'
http_500 = 'HTTP/1.1 500 Internal Server Error\r\nContent-Type: text/plain\r\n${headers_close}500 Internal Server Error' http_500 = 'HTTP/1.1 500 Internal Server Error\r\nContent-Type: text/plain\r\n${headers_close}500 Internal Server Error'
mime_types = { mime_types = map{
'.css': 'text/css; charset=utf-8' '.css': 'text/css; charset=utf-8'
'.gif': 'image/gif' '.gif': 'image/gif'
'.htm': 'text/html; charset=utf-8' '.htm': 'text/html; charset=utf-8'