parser: fix struct name error

pull/4297/head
Daniel Däschle 2020-04-08 19:08:54 +02:00 committed by GitHub
parent 78fc9bd12b
commit 03c307a8c0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 13 deletions

View File

@ -171,6 +171,7 @@ fn (p mut Parser) fn_decl() ast.FnDecl {
is_c: is_c is_c: is_c
}) })
} }
// Body
mut stmts := []ast.Stmt mut stmts := []ast.Stmt
no_body := p.tok.kind != .lcbr no_body := p.tok.kind != .lcbr
if p.tok.kind == .lcbr { if p.tok.kind == .lcbr {

View File

@ -23,6 +23,8 @@ mut:
table &table.Table table &table.Table
is_c bool is_c bool
inside_if bool inside_if bool
inside_for bool
inside_fn bool
pref &pref.Preferences pref &pref.Preferences
builtin_mod bool builtin_mod bool
mod string mod string
@ -365,7 +367,7 @@ pub fn (p mut Parser) stmt() ast.Stmt {
return p.assign_stmt() return p.assign_stmt()
} }
.key_for { .key_for {
return p.for_statement() return p.for_stmt()
} }
.comment { .comment {
return p.comment() return p.comment()
@ -551,7 +553,8 @@ fn (p mut Parser) struct_init(short_syntax bool) ast.StructInit {
mut field_names := []string mut field_names := []string
mut exprs := []ast.Expr mut exprs := []ast.Expr
mut i := 0 mut i := 0
is_short_syntax := !(p.peek_tok.kind == .colon || p.tok.kind == .rcbr) // `Vec{a,b,c}` is_short_syntax := p.peek_tok.kind != .colon && p.tok.kind != .rcbr // `Vec{a,b,c}
// p.warn(is_short_syntax.str()) // p.warn(is_short_syntax.str())
for p.tok.kind != .rcbr { for p.tok.kind != .rcbr {
p.check_comment() p.check_comment()
@ -606,8 +609,7 @@ pub fn (p mut Parser) name_expr() ast.Expr {
return p.string_expr() return p.string_expr()
} }
known_var := p.scope.known_var(p.tok.lit) known_var := p.scope.known_var(p.tok.lit)
if p.peek_tok.kind == .dot && !known_var && (is_c || p.known_import(p.tok.lit) || p.mod.all_after('.') == if p.peek_tok.kind == .dot && !known_var && (is_c || p.known_import(p.tok.lit) || p.mod.all_after('.') == p.tok.lit) {
p.tok.lit) {
if is_c { if is_c {
mod = 'C' mod = 'C'
} else { } else {
@ -618,6 +620,7 @@ pub fn (p mut Parser) name_expr() ast.Expr {
p.check(.dot) p.check(.dot)
p.expr_mod = mod p.expr_mod = mod
} }
// p.warn('name expr $p.tok.lit $p.peek_tok.str()') // p.warn('name expr $p.tok.lit $p.peek_tok.str()')
// fn call or type cast // fn call or type cast
if p.peek_tok.kind == .lpar { if p.peek_tok.kind == .lpar {
@ -662,11 +665,11 @@ pub fn (p mut Parser) name_expr() ast.Expr {
x := p.call_expr(is_c, mod) // TODO `node,typ :=` should work x := p.call_expr(is_c, mod) // TODO `node,typ :=` should work
node = x node = x
} }
} else if p.peek_tok.kind == .lcbr && !p.inside_match_case && (is_c || p.tok.lit[0].is_capital() || } else if p.peek_tok.kind == .lcbr && (p.tok.lit[0].is_capital() || is_c || (p.builtin_mod && p.tok.lit in
(p.builtin_mod && p.tok.lit in table.builtin_type_names)) && (p.tok.lit.len in [1, 2, 3] || table.builtin_type_names)) && !p.inside_match_case && !p.inside_if && !p.inside_for {
!p.tok.lit[p.tok.lit.len - 1].is_capital() || p.table.known_type(p.tok.lit)) { // (p.tok.lit.len in [1, 2] || !p.tok.lit[p.tok.lit.len - 1].is_capital()) &&
// short_syntax: false // || p.table.known_type(p.tok.lit)) {
return p.struct_init(false) return p.struct_init(false) // short_syntax: false
} else if p.peek_tok.kind == .dot && (p.tok.lit[0].is_capital() && !known_var) { } else if p.peek_tok.kind == .dot && (p.tok.lit[0].is_capital() && !known_var) {
// `Color.green` // `Color.green`
mut enum_name := p.check_name() mut enum_name := p.check_name()
@ -1031,13 +1034,15 @@ fn (p mut Parser) enum_val() ast.EnumVal {
} }
} }
fn (p mut Parser) for_statement() ast.Stmt { fn (p mut Parser) for_stmt() ast.Stmt {
p.check(.key_for) p.check(.key_for)
pos := p.tok.position() pos := p.tok.position()
p.open_scope() p.open_scope()
p.inside_for = true
// defer { p.close_scope() } // defer { p.close_scope() }
// Infinite loop // Infinite loop
if p.tok.kind == .lcbr { if p.tok.kind == .lcbr {
p.inside_for = false
stmts := p.parse_block() stmts := p.parse_block()
p.close_scope() p.close_scope()
return ast.ForStmt{ return ast.ForStmt{
@ -1071,6 +1076,7 @@ fn (p mut Parser) for_statement() ast.Stmt {
// inc = p.stmt() // inc = p.stmt()
inc = p.expr(0) inc = p.expr(0)
} }
p.inside_for = false
stmts := p.parse_block() stmts := p.parse_block()
p.close_scope() p.close_scope()
return ast.ForCStmt{ return ast.ForCStmt{
@ -1116,6 +1122,7 @@ fn (p mut Parser) for_statement() ast.Stmt {
name: val_var_name name: val_var_name
}) })
} }
p.inside_for = false
stmts := p.parse_block() stmts := p.parse_block()
// println('nr stmts=$stmts.len') // println('nr stmts=$stmts.len')
p.close_scope() p.close_scope()
@ -1131,6 +1138,7 @@ fn (p mut Parser) for_statement() ast.Stmt {
} }
// `for cond {` // `for cond {`
cond := p.expr(0) cond := p.expr(0)
p.inside_for = false
stmts := p.parse_block() stmts := p.parse_block()
p.close_scope() p.close_scope()
return ast.ForStmt{ return ast.ForStmt{
@ -1141,11 +1149,11 @@ fn (p mut Parser) for_statement() ast.Stmt {
} }
fn (p mut Parser) if_expr() ast.IfExpr { fn (p mut Parser) if_expr() ast.IfExpr {
p.inside_if = true
pos := p.tok.position() pos := p.tok.position()
mut branches := []ast.IfBranch mut branches := []ast.IfBranch
mut has_else := false mut has_else := false
for p.tok.kind in [.key_if, .key_else] { for p.tok.kind in [.key_if, .key_else] {
p.inside_if = true
branch_pos := p.tok.position() branch_pos := p.tok.position()
mut comment := ast.Comment{} mut comment := ast.Comment{}
if p.tok.kind == .key_if { if p.tok.kind == .key_if {
@ -1160,6 +1168,7 @@ fn (p mut Parser) if_expr() ast.IfExpr {
p.check(.key_if) p.check(.key_if)
} else { } else {
has_else = true has_else = true
p.inside_if = false
branches << ast.IfBranch{ branches << ast.IfBranch{
stmts: p.parse_block() stmts: p.parse_block()
pos: branch_pos pos: branch_pos
@ -1790,7 +1799,7 @@ fn (p mut Parser) match_expr() ast.MatchExpr {
// Sum type match // Sum type match
// if sym.kind == .sum_type { // if sym.kind == .sum_type {
// p.warn('is sum') // p.warn('is sum')
// TODO `exprs << ast.Type{...}` // TODO `exprs << ast.Type{...}
typ := p.parse_type() typ := p.parse_type()
x := ast.Type{ x := ast.Type{
typ: typ typ: typ