parser: don't require unary `>` prefix for `select` timeout (#10928)
parent
1999850f88
commit
1e5627e777
|
@ -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 {
|
||||||
|
|
|
@ -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')
|
||||||
}
|
}
|
||||||
|
|
|
@ -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')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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) }
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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{}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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 | }
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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 | }
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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 | }
|
||||||
|
|
|
@ -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')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 | }
|
||||||
|
|
Loading…
Reference in New Issue