parser: fix parsing of `go` call expression (#8138)
parent
5de287a6e7
commit
1c6fe83408
|
@ -90,41 +90,21 @@ fn (mut p Parser) partial_assign_stmt(left []ast.Expr, left_comments []ast.Comme
|
||||||
op := p.tok.kind
|
op := p.tok.kind
|
||||||
pos := p.tok.position()
|
pos := p.tok.position()
|
||||||
p.next()
|
p.next()
|
||||||
|
mut comments := []ast.Comment{cap: 2 * left_comments.len + 1}
|
||||||
|
comments << left_comments
|
||||||
|
comments << p.eat_comments()
|
||||||
mut right_comments := []ast.Comment{}
|
mut right_comments := []ast.Comment{}
|
||||||
mut right := []ast.Expr{cap: left.len}
|
mut right := []ast.Expr{cap: left.len}
|
||||||
if p.tok.kind == .key_go {
|
if p.tok.kind == .key_go {
|
||||||
spos := p.tok.position()
|
stmt := p.stmt(false)
|
||||||
p.next()
|
go_stmt := stmt as ast.GoStmt
|
||||||
right_comments = p.eat_comments()
|
|
||||||
mut mod := ''
|
|
||||||
mut language := table.Language.v
|
|
||||||
if p.peek_tok.kind == .dot {
|
|
||||||
if p.tok.lit == 'C' {
|
|
||||||
language = table.Language.c
|
|
||||||
p.check_for_impure_v(language, p.tok.position())
|
|
||||||
} else if p.tok.lit == 'JS' {
|
|
||||||
language = table.Language.js
|
|
||||||
p.check_for_impure_v(language, p.tok.position())
|
|
||||||
} else {
|
|
||||||
mod = p.tok.lit
|
|
||||||
}
|
|
||||||
p.next()
|
|
||||||
p.next()
|
|
||||||
}
|
|
||||||
call_expr := p.call_expr(language, mod)
|
|
||||||
allpos := spos.extend(p.tok.position())
|
|
||||||
right << ast.GoExpr{
|
right << ast.GoExpr{
|
||||||
go_stmt: ast.GoStmt{
|
go_stmt: go_stmt
|
||||||
call_expr: call_expr
|
pos: go_stmt.pos
|
||||||
pos: allpos
|
|
||||||
}
|
|
||||||
pos: allpos
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
right, right_comments = p.expr_list()
|
right, right_comments = p.expr_list()
|
||||||
}
|
}
|
||||||
mut comments := []ast.Comment{cap: left_comments.len + right_comments.len}
|
|
||||||
comments << left_comments
|
|
||||||
comments << right_comments
|
comments << right_comments
|
||||||
end_comments := p.eat_line_end_comments()
|
end_comments := p.eat_line_end_comments()
|
||||||
mut has_cross_var := false
|
mut has_cross_var := false
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
struct Test {
|
||||||
|
sub SubTest
|
||||||
|
}
|
||||||
|
|
||||||
|
struct SubTest {
|
||||||
|
test string
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_method_go_wait() {
|
||||||
|
a := Test{
|
||||||
|
sub: SubTest{
|
||||||
|
test: 'hi'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
thread := go a.sub.get()
|
||||||
|
r := thread.wait()
|
||||||
|
assert r == 'hi'
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (t SubTest) get() string {
|
||||||
|
return t.test
|
||||||
|
}
|
Loading…
Reference in New Issue