diff --git a/vlib/compiler/expression.v b/vlib/compiler/expression.v index 6017af8bee..ab81f8228e 100644 --- a/vlib/compiler/expression.v +++ b/vlib/compiler/expression.v @@ -902,6 +902,13 @@ fn (p mut Parser) factor() string { if p.peek() == .str { return p.map_init() } + peek2 := p.tokens[p.token_idx + 1] + if p.peek() == .name && peek2.tok == .colon { + if !p.expected_type.ends_with('Config') { + p.error('short struct initialization syntax only works with structs that end with `Config`') + } + return p.struct_init(p.expected_type) + } // { user | name :'new name' } return p.assoc() } diff --git a/vlib/compiler/gen_c.v b/vlib/compiler/gen_c.v index db1a5ebef9..f7d3988084 100644 --- a/vlib/compiler/gen_c.v +++ b/vlib/compiler/gen_c.v @@ -488,7 +488,9 @@ fn (p mut Parser) gen_struct_init(typ string, t &Type) bool { if typ == 'tm' { p.cgen.lines[p.cgen.lines.len - 1] = '' } - p.next() + if p.tok != .lcbr { + p.next() + } p.check(.lcbr) ptr := typ.contains('*') // `user := User{foo:bar}` => `User user = (User){ .foo = bar}` diff --git a/vlib/compiler/struct.v b/vlib/compiler/struct.v index 951c69a11a..e5fefb931f 100644 --- a/vlib/compiler/struct.v +++ b/vlib/compiler/struct.v @@ -337,6 +337,7 @@ fn (p mut Parser) struct_decl(generic_param_types []string) { // p.fgenln('//kek') } // `User{ foo: bar }` +// tok == struct name fn (p mut Parser) struct_init(typ_ string) string { p.is_struct_init = true mut typ := typ_