Skip to content

Commit e9c6e86

Browse files
committed
Add template annotations to async and await
These annotations will aid static analyses like PHPStan and Psalm to enhance type-safety for this project and projects depending on it
1 parent 4dae336 commit e9c6e86

File tree

4 files changed

+33
-5
lines changed

4 files changed

+33
-5
lines changed

.github/workflows/ci.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,16 @@ jobs:
2020
coverage: xdebug
2121
- run: composer install
2222
- run: vendor/bin/phpunit --coverage-text
23+
24+
static-analysis:
25+
name: PHPStan
26+
runs-on: ubuntu-20.04
27+
continue-on-error: true
28+
steps:
29+
- uses: actions/checkout@v3
30+
- uses: shivammathur/setup-php@v2
31+
with:
32+
php-version: 8.1
33+
- run: composer require phpstan/phpstan
34+
- name: Execute type checking
35+
run: vendor/bin/phpstan --configuration="phpstan.types.neon.dist"

phpstan.types.neon.dist

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
parameters:
2+
paths:
3+
- types
4+
level: max

src/functions.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -174,9 +174,9 @@
174174
* $promise->cancel();
175175
* await($promise);
176176
* ```
177-
*
178-
* @param callable(mixed ...$args):mixed $function
179-
* @return callable(): PromiseInterface<mixed>
177+
* @template T
178+
* @param callable(): T $function
179+
* @return callable(): PromiseInterface<T>
180180
* @since 4.0.0
181181
* @see coroutine()
182182
*/
@@ -266,8 +266,9 @@ function async(callable $function): callable
266266
* }
267267
* ```
268268
*
269-
* @param PromiseInterface $promise
270-
* @return mixed returns whatever the promise resolves to
269+
* @template T
270+
* @param PromiseInterface<T> $promise
271+
* @return T
271272
* @throws \Exception when the promise is rejected with an `Exception`
272273
* @throws \Throwable when the promise is rejected with a `Throwable`
273274
* @throws \UnexpectedValueException when the promise is rejected with an unexpected value (Promise API v1 or v2 only)

types/await.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
use function PHPStan\Testing\assertType;
4+
use function React\Async\await;
5+
use function React\Promise\resolve;
6+
7+
$passThroughBoolFn = static fn (bool $bool): bool => $bool;
8+
9+
assertType('bool', await(resolve(true)));
10+
assertType('bool', await(resolve(true)->then($passThroughBoolFn)));

0 commit comments

Comments
 (0)