simplify asyncfutures, asyncmacro (#17633)
This commit is contained in:
parent
56c37759d6
commit
d6242d7fe1
5 changed files with 62 additions and 92 deletions
|
|
@ -1,6 +1,8 @@
|
|||
discard """
|
||||
output: '''
|
||||
42
|
||||
43
|
||||
43
|
||||
1
|
||||
2
|
||||
3
|
||||
|
|
@ -8,16 +10,30 @@ discard """
|
|||
'''
|
||||
"""
|
||||
|
||||
# xxx move to tests/async/tasyncintemplate.nim
|
||||
import asyncdispatch
|
||||
|
||||
# bug #16159
|
||||
template foo() =
|
||||
proc temp(): Future[int] {.async.} = return 42
|
||||
proc tempVoid(): Future[void] {.async.} = echo await temp()
|
||||
block: # bug #16159
|
||||
template foo() =
|
||||
proc temp(): Future[int] {.async.} = return 42
|
||||
proc tempVoid(): Future[void] {.async.} = echo await temp()
|
||||
foo()
|
||||
waitFor tempVoid()
|
||||
|
||||
foo()
|
||||
waitFor tempVoid()
|
||||
block: # aliasing `void`
|
||||
template foo() =
|
||||
type Foo = void
|
||||
proc temp(): Future[int] {.async.} = return 43
|
||||
proc tempVoid(): Future[Foo] {.async.} = echo await temp()
|
||||
proc tempVoid2() {.async.} = echo await temp()
|
||||
foo()
|
||||
waitFor tempVoid()
|
||||
waitFor tempVoid2()
|
||||
|
||||
block: # sanity check
|
||||
template foo() =
|
||||
proc bad(): int {.async.} = discard
|
||||
doAssert not compiles(bad())
|
||||
|
||||
block: # bug #16786
|
||||
block:
|
||||
|
|
|
|||
|
|
@ -6,7 +6,8 @@ tgcsafety.nim(30, 18) Error: type mismatch: got <AsyncHttpServer, Port, proc (re
|
|||
but expected one of:
|
||||
proc serve(server: AsyncHttpServer; port: Port;
|
||||
callback: proc (request: Request): Future[void] {.closure, gcsafe.};
|
||||
address = ""; assumedDescriptorsPerRequest = -1): owned(Future[void])
|
||||
address = ""; assumedDescriptorsPerRequest = -1): owned(
|
||||
Future[void])
|
||||
first type mismatch at position: 3
|
||||
required type for callback: proc (request: Request): Future[system.void]{.closure, gcsafe.}
|
||||
but expression 'cb' is of type: proc (req: Request): Future[system.void]{.locks: <unknown>.}
|
||||
|
|
|
|||
|
|
@ -262,6 +262,10 @@ block:
|
|||
doAssert input.treeRepr & "\n" == expectedRepr
|
||||
return input
|
||||
|
||||
macro expectedAstRepr(expectedRepr: static[string], input: untyped): untyped =
|
||||
doAssert input.repr == expectedRepr
|
||||
return input
|
||||
|
||||
const procTypeAst = """
|
||||
ProcTy
|
||||
FormalParams
|
||||
|
|
@ -280,20 +284,10 @@ ProcTy
|
|||
static: doAssert Foo is proc(x: int): Future[void]
|
||||
|
||||
const asyncProcTypeAst = """
|
||||
ProcTy
|
||||
FormalParams
|
||||
BracketExpr
|
||||
Ident "Future"
|
||||
Ident "void"
|
||||
IdentDefs
|
||||
Ident "s"
|
||||
Ident "string"
|
||||
Empty
|
||||
Pragma
|
||||
"""
|
||||
|
||||
proc (s: string): Future[void] {..}"""
|
||||
# using expectedAst would show `OpenSymChoice` for Future[void], which is fragile.
|
||||
type
|
||||
Bar = proc (s: string) {.async, expectedAst(asyncProcTypeAst).}
|
||||
Bar = proc (s: string) {.async, expectedAstRepr(asyncProcTypeAst).}
|
||||
|
||||
static: doAssert Bar is proc(x: string): Future[void]
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue