parser: don't require unary `>` prefix for `select` timeout (#10928)

pull/10936/head
Uwe Krüger 2021-07-23 22:24:27 +02:00 committed by GitHub
parent 1999850f88
commit 1e5627e777
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 65 additions and 56 deletions

View File

@ -270,7 +270,7 @@ fn (mut context Context) compilation_runner_loop() {
return return
} }
} }
> 100 * time.millisecond { 100 * time.millisecond {
should_restart := RerunCommand.restart in cmds should_restart := RerunCommand.restart in cmds
cmds = [] cmds = []
if should_restart { if should_restart {

View File

@ -3350,7 +3350,7 @@ fn main() {
time.sleep(5 * time.millisecond) time.sleep(5 * time.millisecond)
eprintln('> c: $c was send on channel ch3') eprintln('> c: $c was send on channel ch3')
} }
> 500 * time.millisecond { 500 * time.millisecond {
// do something if no channel has become ready within 0.5s // do something if no channel has become ready within 0.5s
eprintln('> more than 0.5s passed without a channel being ready') eprintln('> more than 0.5s passed without a channel being ready')
} }

View File

@ -99,7 +99,7 @@ fn example_with_deadline() {
ctx_ch := ctx.done() ctx_ch := ctx.done()
select { select {
_ := <-ctx_ch {} _ := <-ctx_ch {}
> 1 * time.second { 1 * time.second {
panic('This should not happen') panic('This should not happen')
} }
} }
@ -130,7 +130,7 @@ fn example_with_timeout() {
ctx_ch := ctx.done() ctx_ch := ctx.done()
select { select {
_ := <-ctx_ch {} _ := <-ctx_ch {}
> 1 * time.second { 1 * time.second {
panic('This should not happen') panic('This should not happen')
} }
} }

View File

@ -22,7 +22,7 @@ fn test_with_deadline() {
ctx_ch := ctx.done() ctx_ch := ctx.done()
select { select {
_ := <-ctx_ch {} _ := <-ctx_ch {}
> 1 * time.second { 1 * time.second {
panic('This should not happen') panic('This should not happen')
} }
} }
@ -41,7 +41,7 @@ fn test_with_timeout() {
ctx_ch := ctx.done() ctx_ch := ctx.done()
select { select {
_ := <-ctx_ch {} _ := <-ctx_ch {}
> 1 * time.second { 1 * time.second {
panic('This should not happen') panic('This should not happen')
} }
} }

View File

@ -32,7 +32,7 @@ fn f1(ch1 chan int, ch2 chan St, ch3 chan int, ch4 chan int, ch5 chan int, mut s
ch5 <- getint() { ch5 <- getint() {
a = 9 a = 9
} }
> 300 * time.millisecond { 300 * time.millisecond {
a = 3 a = 3
} }
} }

View File

@ -6330,7 +6330,7 @@ pub fn (mut c Checker) select_expr(mut node ast.SelectExpr) ast.Type {
if branch.is_timeout { if branch.is_timeout {
if !branch.stmt.typ.is_int() { if !branch.stmt.typ.is_int() {
tsym := c.table.get_type_symbol(branch.stmt.typ) tsym := c.table.get_type_symbol(branch.stmt.typ)
c.error('invalid type `$tsym.name` for timeout - expected integer type aka `time.Duration`', c.error('invalid type `$tsym.name` for timeout - expected integer number of nanoseconds aka `time.Duration`',
branch.stmt.pos) branch.stmt.pos)
} }
} else { } else {

View File

@ -2169,9 +2169,6 @@ pub fn (mut f Fmt) select_expr(node ast.SelectExpr) {
if branch.is_else { if branch.is_else {
f.write('else {') f.write('else {')
} else { } else {
if branch.is_timeout {
f.write('> ')
}
f.single_line_if = true f.single_line_if = true
match branch.stmt { match branch.stmt {
ast.ExprStmt { f.expr(branch.stmt.expr) } ast.ExprStmt { f.expr(branch.stmt.expr) }

View File

@ -34,7 +34,7 @@ fn f1(ch1 chan int, ch2 chan St, ch3 chan int, ch4 chan int, ch5 chan int, sem s
ch5 <- getint() { ch5 <- getint() {
a = 9 a = 9
} }
> 300 * time.millisecond { 300 * time.millisecond {
a = 3 a = 3
} }
// post comment // post comment

View File

@ -309,30 +309,14 @@ fn (mut p Parser) select_expr() ast.SelectExpr {
is_else = true is_else = true
has_else = true has_else = true
p.next() p.next()
} else if p.tok.kind == .gt {
if has_else {
p.error_with_pos('`else` and timeout `> t` are mutually exclusive `select` keys',
p.tok.position())
return ast.SelectExpr{}
}
if has_timeout {
p.error_with_pos('at most one timeout `> t` branch allowed in `select` block',
p.tok.position())
return ast.SelectExpr{}
}
is_timeout = true
has_timeout = true
p.next()
p.inside_match = true
expr := p.expr(0)
p.inside_match = false
stmt = ast.ExprStmt{
expr: expr
pos: expr.position()
comments: [comment]
is_expr: true
}
} else { } else {
mut is_gt := false
if p.tok.kind == .gt {
is_gt = true
p.note_with_pos('`>` is deprecated and will soon be forbidden - just state the timeout in nanoseconds',
p.tok.position())
p.next()
}
p.inside_match = true p.inside_match = true
p.inside_select = true p.inside_select = true
exprs, comments := p.expr_list() exprs, comments := p.expr_list()
@ -354,6 +338,7 @@ fn (mut p Parser) select_expr() ast.SelectExpr {
p.inside_select = false p.inside_select = false
match mut stmt { match mut stmt {
ast.ExprStmt { ast.ExprStmt {
mut check_timeout := false
if !stmt.is_expr { if !stmt.is_expr {
p.error_with_pos('select: invalid expression', stmt.pos) p.error_with_pos('select: invalid expression', stmt.pos)
return ast.SelectExpr{} return ast.SelectExpr{}
@ -361,17 +346,30 @@ fn (mut p Parser) select_expr() ast.SelectExpr {
match mut stmt.expr { match mut stmt.expr {
ast.InfixExpr { ast.InfixExpr {
if stmt.expr.op != .arrow { if stmt.expr.op != .arrow {
p.error_with_pos('select key: `<-` operator expected', check_timeout = true
stmt.expr.pos) } else if is_gt {
return ast.SelectExpr{} p.error_with_pos('send expression cannot be used as timeout',
stmt.pos)
} }
} }
else { else {
p.error_with_pos('select key: send expression (`ch <- x`) expected', check_timeout = true
}
}
}
if check_timeout {
if has_else {
p.error_with_pos('`else` and timeout value are mutually exclusive `select` keys',
stmt.pos) stmt.pos)
return ast.SelectExpr{} return ast.SelectExpr{}
} }
if has_timeout {
p.error_with_pos('at most one timeout branch allowed in `select` block',
stmt.pos)
return ast.SelectExpr{}
} }
is_timeout = true
has_timeout = true
} }
} }
ast.AssignStmt { ast.AssignStmt {
@ -392,7 +390,8 @@ fn (mut p Parser) select_expr() ast.SelectExpr {
} }
} }
else { else {
p.error_with_pos('select: transmission statement expected', stmt.pos) p.error_with_pos('select: transmission statement, timeout (in ns) or `else` expected',
stmt.pos)
return ast.SelectExpr{} return ast.SelectExpr{}
} }
} }

View File

@ -1,3 +1,10 @@
vlib/v/parser/tests/select_bad_key_1.vv:19:3: notice: `>` is deprecated and will soon be forbidden - just state the timeout in nanoseconds
17 | a++
18 | }
19 | > 50 * time.millisecond {
| ^
20 | println('timeout')
21 | }
vlib/v/parser/tests/select_bad_key_1.vv:39:8: error: select key: receive expression expected vlib/v/parser/tests/select_bad_key_1.vv:39:8: error: select key: receive expression expected
37 | fn f3_bad(ch1 chan St) { 37 | fn f3_bad(ch1 chan St) {
38 | select { 38 | select {

View File

@ -1,7 +1,7 @@
vlib/v/parser/tests/select_bad_key_2.vv:7:5: error: select key: `<-` operator expected vlib/v/parser/tests/select_bad_key_2.vv:7:3: error: invalid type `f64` for timeout - expected integer number of nanoseconds aka `time.Duration`
5 | println(b) 5 | println(b)
6 | } 6 | }
7 | a + 7 { 7 | a + 7 {
| ^ | ~~~~~
8 | println("shouldn't get here") 8 | println("shouldn't get here")
9 | } 9 | }

View File

@ -1,5 +1,5 @@
fn f3_bad(ch1 chan int) { fn f3_bad(ch1 chan int) {
a := 5 a := 3.75
select { select {
b := <-ch1 { b := <-ch1 {
println(b) println(b)

View File

@ -1,7 +1,7 @@
vlib/v/parser/tests/select_bad_key_3.vv:7:3: error: select key: send expression (`ch <- x`) expected vlib/v/parser/tests/select_bad_key_3.vv:6:3: error: invalid type `void` for timeout - expected integer number of nanoseconds aka `time.Duration`
5 | println(b) 4 | println(b)
6 | } 5 | }
7 | println(7) { 6 | println(7) {
| ~~~~~~~~~~ | ~~~~~~~~~~
8 | println("shouldn't get here") 7 | println("shouldn't get here")
9 | } 8 | }

View File

@ -1,5 +1,4 @@
fn f3_bad(ch1 chan int) { fn f3_bad(ch1 chan int) {
a := 5
select { select {
b := <-ch1 { b := <-ch1 {
println(b) println(b)

View File

@ -1,7 +1,7 @@
vlib/v/parser/tests/select_else_1.vv:12:3: error: `else` and timeout `> t` are mutually exclusive `select` keys vlib/v/parser/tests/select_else_1.vv:12:3: error: `else` and timeout value are mutually exclusive `select` keys
10 | println("shouldn't get here") 10 | println("shouldn't get here")
11 | } 11 | }
12 | > 30 * time.millisecond { 12 | 30 * time.millisecond {
| ^ | ~~~~~~~~~~~~~~~~~~~~~
13 | println('bad') 13 | println('bad')
14 | } 14 | }

View File

@ -9,7 +9,7 @@ fn f3_bad(ch1 chan int) {
else { else {
println("shouldn't get here") println("shouldn't get here")
} }
> 30 * time.millisecond { 30 * time.millisecond {
println('bad') println('bad')
} }
} }

View File

@ -1,3 +1,10 @@
vlib/v/parser/tests/select_else_2.vv:9:3: notice: `>` is deprecated and will soon be forbidden - just state the timeout in nanoseconds
7 | println(b)
8 | }
9 | > 30 * time.millisecond {
| ^
10 | println('bad')
11 | }
vlib/v/parser/tests/select_else_2.vv:12:3: error: timeout `> t` and `else` are mutually exclusive `select` keys vlib/v/parser/tests/select_else_2.vv:12:3: error: timeout `> t` and `else` are mutually exclusive `select` keys
10 | println('bad') 10 | println('bad')
11 | } 11 | }