mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
parser: anonymous structs (part 1)
This commit is contained in:
parent
5f78647137
commit
9b4dec7b98
@ -133,7 +133,9 @@ pub fn (mut p Parser) check_expr(precedence int) ?ast.Expr {
|
||||
node = p.select_expr()
|
||||
}
|
||||
.key_nil {
|
||||
node = ast.Nil{pos:p.tok.pos()}
|
||||
node = ast.Nil{
|
||||
pos: p.tok.pos()
|
||||
}
|
||||
p.next()
|
||||
}
|
||||
.number {
|
||||
|
@ -423,6 +423,13 @@ pub fn (mut p Parser) parse_type() ast.Type {
|
||||
nr_muls++
|
||||
p.next()
|
||||
}
|
||||
// Anon structs
|
||||
if p.tok.kind == .key_struct {
|
||||
p.struct_decl(true)
|
||||
p.next()
|
||||
return p.table.find_type_idx('anon_struct') // TODO
|
||||
}
|
||||
|
||||
language := p.parse_language()
|
||||
mut typ := ast.void_type
|
||||
is_array := p.tok.kind == .lsbr
|
||||
|
@ -620,7 +620,7 @@ pub fn (mut p Parser) top_stmt() ast.Stmt {
|
||||
return p.fn_decl()
|
||||
}
|
||||
.key_struct, .key_union {
|
||||
return p.struct_decl()
|
||||
return p.struct_decl(false)
|
||||
}
|
||||
.key_interface {
|
||||
return p.interface_decl()
|
||||
@ -662,7 +662,7 @@ pub fn (mut p Parser) top_stmt() ast.Stmt {
|
||||
return p.fn_decl()
|
||||
}
|
||||
.key_struct {
|
||||
return p.struct_decl()
|
||||
return p.struct_decl(false)
|
||||
}
|
||||
.dollar {
|
||||
if p.peek_tok.kind == .eof {
|
||||
@ -689,7 +689,7 @@ pub fn (mut p Parser) top_stmt() ast.Stmt {
|
||||
return p.enum_decl()
|
||||
}
|
||||
.key_union {
|
||||
return p.struct_decl()
|
||||
return p.struct_decl(false)
|
||||
}
|
||||
.comment {
|
||||
return p.comment_stmt()
|
||||
|
@ -7,7 +7,7 @@ import v.ast
|
||||
import v.token
|
||||
import v.util
|
||||
|
||||
fn (mut p Parser) struct_decl() ast.StructDecl {
|
||||
fn (mut p Parser) struct_decl(is_anon bool) ast.StructDecl {
|
||||
p.top_level_statement_start()
|
||||
// save attributes, they will be changed later in fields
|
||||
attrs := p.attrs
|
||||
@ -39,7 +39,7 @@ fn (mut p Parser) struct_decl() ast.StructDecl {
|
||||
if p.disallow_declarations_in_script_mode() {
|
||||
return ast.StructDecl{}
|
||||
}
|
||||
mut name := p.check_name()
|
||||
mut name := if is_anon { '' } else { p.check_name()}
|
||||
if name.len == 1 && name[0].is_capital() {
|
||||
p.error_with_pos('single letter capital names are reserved for generic template types.',
|
||||
name_pos)
|
||||
@ -322,7 +322,7 @@ fn (mut p Parser) struct_decl() ast.StructDecl {
|
||||
p.check(.rcbr)
|
||||
}
|
||||
is_minify := attrs.contains('minify')
|
||||
mut t := ast.TypeSymbol{
|
||||
mut sym := ast.TypeSymbol{
|
||||
kind: .struct_
|
||||
language: language
|
||||
name: name
|
||||
@ -341,11 +341,11 @@ fn (mut p Parser) struct_decl() ast.StructDecl {
|
||||
}
|
||||
is_pub: is_pub
|
||||
}
|
||||
if p.table.has_deep_child_no_ref(&t, name) {
|
||||
if p.table.has_deep_child_no_ref(&sym, name) {
|
||||
p.error_with_pos('invalid recursive struct `$orig_name`', name_pos)
|
||||
return ast.StructDecl{}
|
||||
}
|
||||
mut ret := p.table.register_sym(t)
|
||||
mut ret := p.table.register_sym(sym)
|
||||
// allow duplicate c struct declarations
|
||||
if ret == -1 && language != .c {
|
||||
p.error_with_pos('cannot register struct `$name`, another type with this name exists',
|
||||
|
Loading…
Reference in New Issue
Block a user