parser: fix struct name error
parent
78fc9bd12b
commit
03c307a8c0
|
@ -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 {
|
||||||
|
@ -203,7 +204,7 @@ fn (p mut Parser) fn_args() ([]table.Arg, bool) {
|
||||||
mut args := []table.Arg
|
mut args := []table.Arg
|
||||||
mut is_variadic := false
|
mut is_variadic := false
|
||||||
// `int, int, string` (no names, just types)
|
// `int, int, string` (no names, just types)
|
||||||
types_only := p.tok.kind in [.amp, .and] || (p.peek_tok.kind == .comma && p.table.known_type(p.tok.lit)) ||
|
types_only := p.tok.kind in [.amp, .and] || (p.peek_tok.kind == .comma && p.table.known_type(p.tok.lit)) ||
|
||||||
p.peek_tok.kind == .rpar
|
p.peek_tok.kind == .rpar
|
||||||
if types_only {
|
if types_only {
|
||||||
// p.warn('types only')
|
// p.warn('types only')
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue