Better error message and tests for bad await (#19622)
* Better error message and tests for bad await * Use compiles to check if await is valid * temp: disable windows noasync test * Better error report, simplify test Co-authored-by: flywind <xzsflywind@gmail.com>
This commit is contained in:
parent
98cebad7de
commit
ef7d7f2459
2 changed files with 45 additions and 6 deletions
|
|
@ -126,9 +126,19 @@ template await*(f: typed): untyped {.used.} =
|
|||
error "await expects Future[T], got " & $typeof(f)
|
||||
|
||||
template await*[T](f: Future[T]): auto {.used.} =
|
||||
var internalTmpFuture: FutureBase = f
|
||||
yield internalTmpFuture
|
||||
(cast[typeof(f)](internalTmpFuture)).read()
|
||||
template yieldFuture = yield FutureBase()
|
||||
|
||||
when compiles(yieldFuture):
|
||||
var internalTmpFuture: FutureBase = f
|
||||
yield internalTmpFuture
|
||||
(cast[typeof(f)](internalTmpFuture)).read()
|
||||
else:
|
||||
macro errorAsync(futureError: Future[T]) =
|
||||
error(
|
||||
"Can only 'await' inside a proc marked as 'async'. Use " &
|
||||
"'waitFor' when calling an 'async' proc in a non-async scope instead",
|
||||
futureError)
|
||||
errorAsync(f)
|
||||
|
||||
proc asyncSingleProc(prc: NimNode): NimNode =
|
||||
## This macro transforms a single procedure into a closure iterator.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue