Skip to content

Commit 136a231

Browse files
authored
[11.x] Update PHPStan to 2.x (#53716)
* Update phpstan/phpstan to 2.0 👍 * Update many types in types/ * Fix type errors in types/ * Update return type of `HasAttributes::getAttributes()` * Add `@phpstan-ignore` comment on src/ * Fix variable.undefined error
1 parent 928a709 commit 136a231

File tree

19 files changed

+182
-168
lines changed

19 files changed

+182
-168
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@
114114
"orchestra/testbench-core": "^9.6",
115115
"pda/pheanstalk": "^5.0.6",
116116
"php-http/discovery": "^1.15",
117-
"phpstan/phpstan": "^1.11.5",
117+
"phpstan/phpstan": "^2.0",
118118
"phpunit/phpunit": "^10.5.35|^11.3.6",
119119
"predis/predis": "^2.3",
120120
"resend/resend-php": "^0.10.0",

src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1884,7 +1884,7 @@ protected function normalizeCastClassResponse($key, $value)
18841884
/**
18851885
* Get all of the current attributes on the model.
18861886
*
1887-
* @return array
1887+
* @return array<string, mixed>
18881888
*/
18891889
public function getAttributes()
18901890
{

src/Illuminate/Process/PendingProcess.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,9 +246,8 @@ public function run(array|string|null $command = null, ?callable $output = null)
246246
{
247247
$this->command = $command ?: $this->command;
248248

249+
$process = $this->toSymfonyProcess($command);
249250
try {
250-
$process = $this->toSymfonyProcess($command);
251-
252251
if ($fake = $this->fakeFor($command = $process->getCommandline())) {
253252
return tap($this->resolveSynchronousFake($command, $fake), function ($result) {
254253
$this->factory->recordIfRecording($this, $result);

types/Cache/Repository.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@
1818
assertType('mixed', $cache->pull('cache', function (): int {
1919
return 30;
2020
}));
21-
assertType('int', $cache->sear('cache', function (): int {
21+
assertType('33', $cache->sear('cache', function (): int {
2222
return 33;
2323
}));
24-
assertType('int', $cache->remember('cache', now(), function (): int {
24+
assertType('36', $cache->remember('cache', now(), function (): int {
2525
return 36;
2626
}));
27-
assertType('int', $cache->rememberForever('cache', function (): int {
27+
assertType('36', $cache->rememberForever('cache', function (): int {
2828
return 36;
2929
}));

types/Collections/helpers.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
use function PHPStan\Testing\assertType;
44

5-
assertType('string', value('foo', 42));
6-
assertType('int', value(fn () => 42));
7-
assertType('int', value(function ($foo) {
8-
assertType('bool', $foo);
5+
assertType("'foo'", value('foo', 42));
6+
assertType('42', value(fn () => 42));
7+
assertType('42', value(function ($foo) {
8+
assertType('true', $foo);
99

1010
return 42;
1111
}, true));

types/Contracts/Cache/Repository.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,16 @@
1414
}));
1515

1616
assertType('mixed', $cache->pull('key'));
17-
assertType('int', $cache->pull('cache', 28));
18-
assertType('int', $cache->pull('cache', function (): int {
17+
assertType('28', $cache->pull('cache', 28));
18+
assertType('30', $cache->pull('cache', function (): int {
1919
return 30;
2020
}));
21-
assertType('int', $cache->sear('cache', function (): int {
21+
assertType('33', $cache->sear('cache', function (): int {
2222
return 33;
2323
}));
24-
assertType('int', $cache->remember('cache', now(), function (): int {
24+
assertType('36', $cache->remember('cache', now(), function (): int {
2525
return 36;
2626
}));
27-
assertType('int', $cache->rememberForever('cache', function (): int {
27+
assertType('36', $cache->rememberForever('cache', function (): int {
2828
return 36;
2929
}));

types/Contracts/Validation/ValidationRule.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
use function PHPStan\Testing\assertType;
66

7-
new class implements ValidationRule
7+
$class = new class implements ValidationRule
88
{
99
public function validate(string $attribute, mixed $value, Closure $fail): void
1010
{

types/Database/Eloquent/Builder.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,11 @@ function test(
4646
assertType('Illuminate\Database\Eloquent\Collection<int, User>', $query->findOr([1], callback: fn () => 42));
4747
assertType('User', $query->findOrFail(1));
4848
assertType('User|null', $query->find(1));
49-
assertType('int|User', $query->findOr(1, fn () => 42));
50-
assertType('int|User', $query->findOr(1, callback: fn () => 42));
49+
assertType('42|User', $query->findOr(1, fn () => 42));
50+
assertType('42|User', $query->findOr(1, callback: fn () => 42));
5151
assertType('User|null', $query->first());
52-
assertType('int|User', $query->firstOr(fn () => 42));
53-
assertType('int|User', $query->firstOr(callback: fn () => 42));
52+
assertType('42|User', $query->firstOr(fn () => 42));
53+
assertType('42|User', $query->firstOr(callback: fn () => 42));
5454
assertType('User', $query->firstOrNew(['id' => 1]));
5555
assertType('User', $query->findOrNew(1));
5656
assertType('User', $query->firstOrCreate(['id' => 1]));

types/Database/Eloquent/Collection.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
assertType('Illuminate\Database\Eloquent\Collection<int, User>', $collection);
77

88
assertType('User|null', $collection->find(1));
9-
assertType('string|User', $collection->find(1, 'string'));
9+
assertType("'string'|User", $collection->find(1, 'string'));
1010
assertType('Illuminate\Database\Eloquent\Collection<int, User>', $collection->find([1]));
1111

1212
assertType('Illuminate\Database\Eloquent\Collection<int, User>', $collection->load('string'));

types/Database/Eloquent/Relations.php

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,16 @@ function test(User $user, Post $post, Comment $comment, ChildUser $child): void
4646
assertType('Illuminate\Database\Eloquent\Collection<int, Illuminate\Types\Relations\Role>', $user->roles()->findMany([1, 2, 3]));
4747
assertType('Illuminate\Database\Eloquent\Collection<int, Illuminate\Types\Relations\Role>', $user->roles()->findOrNew([1]));
4848
assertType('Illuminate\Database\Eloquent\Collection<int, Illuminate\Types\Relations\Role>', $user->roles()->findOrFail([1]));
49-
assertType('Illuminate\Database\Eloquent\Collection<int, Illuminate\Types\Relations\Role>|int', $user->roles()->findOr([1], fn () => 42));
50-
assertType('Illuminate\Database\Eloquent\Collection<int, Illuminate\Types\Relations\Role>|int', $user->roles()->findOr([1], callback: fn () => 42));
49+
assertType('42|Illuminate\Database\Eloquent\Collection<int, Illuminate\Types\Relations\Role>', $user->roles()->findOr([1], fn () => 42));
50+
assertType('42|Illuminate\Database\Eloquent\Collection<int, Illuminate\Types\Relations\Role>', $user->roles()->findOr([1], callback: fn () => 42));
5151
assertType('Illuminate\Types\Relations\Role', $user->roles()->findOrNew(1));
5252
assertType('Illuminate\Types\Relations\Role', $user->roles()->findOrFail(1));
5353
assertType('Illuminate\Types\Relations\Role|null', $user->roles()->find(1));
54-
assertType('Illuminate\Types\Relations\Role|int', $user->roles()->findOr(1, fn () => 42));
55-
assertType('Illuminate\Types\Relations\Role|int', $user->roles()->findOr(1, callback: fn () => 42));
54+
assertType('42|Illuminate\Types\Relations\Role', $user->roles()->findOr(1, fn () => 42));
55+
assertType('42|Illuminate\Types\Relations\Role', $user->roles()->findOr(1, callback: fn () => 42));
5656
assertType('Illuminate\Types\Relations\Role|null', $user->roles()->first());
57-
assertType('Illuminate\Types\Relations\Role|int', $user->roles()->firstOr(fn () => 42));
58-
assertType('Illuminate\Types\Relations\Role|int', $user->roles()->firstOr(callback: fn () => 42));
57+
assertType('42|Illuminate\Types\Relations\Role', $user->roles()->firstOr(fn () => 42));
58+
assertType('42|Illuminate\Types\Relations\Role', $user->roles()->firstOr(callback: fn () => 42));
5959
assertType('Illuminate\Types\Relations\Role|null', $user->roles()->firstWhere('foo'));
6060
assertType('Illuminate\Types\Relations\Role', $user->roles()->firstOrNew());
6161
assertType('Illuminate\Types\Relations\Role', $user->roles()->firstOrFail());
@@ -81,14 +81,14 @@ function test(User $user, Post $post, Comment $comment, ChildUser $child): void
8181
assertType('Illuminate\Database\Eloquent\Relations\HasOneThrough<Illuminate\Types\Relations\Car, Illuminate\Types\Relations\Mechanic, Illuminate\Types\Relations\User>', $user->car());
8282
assertType('Illuminate\Types\Relations\Car|null', $user->car()->getResults());
8383
assertType('Illuminate\Database\Eloquent\Collection<int, Illuminate\Types\Relations\Car>', $user->car()->find([1]));
84-
assertType('Illuminate\Database\Eloquent\Collection<int, Illuminate\Types\Relations\Car>|int', $user->car()->findOr([1], fn () => 42));
85-
assertType('Illuminate\Database\Eloquent\Collection<int, Illuminate\Types\Relations\Car>|int', $user->car()->findOr([1], callback: fn () => 42));
84+
assertType('42|Illuminate\Database\Eloquent\Collection<int, Illuminate\Types\Relations\Car>', $user->car()->findOr([1], fn () => 42));
85+
assertType('42|Illuminate\Database\Eloquent\Collection<int, Illuminate\Types\Relations\Car>', $user->car()->findOr([1], callback: fn () => 42));
8686
assertType('Illuminate\Types\Relations\Car|null', $user->car()->find(1));
87-
assertType('Illuminate\Types\Relations\Car|int', $user->car()->findOr(1, fn () => 42));
88-
assertType('Illuminate\Types\Relations\Car|int', $user->car()->findOr(1, callback: fn () => 42));
87+
assertType('42|Illuminate\Types\Relations\Car', $user->car()->findOr(1, fn () => 42));
88+
assertType('42|Illuminate\Types\Relations\Car', $user->car()->findOr(1, callback: fn () => 42));
8989
assertType('Illuminate\Types\Relations\Car|null', $user->car()->first());
90-
assertType('Illuminate\Types\Relations\Car|int', $user->car()->firstOr(fn () => 42));
91-
assertType('Illuminate\Types\Relations\Car|int', $user->car()->firstOr(callback: fn () => 42));
90+
assertType('42|Illuminate\Types\Relations\Car', $user->car()->firstOr(fn () => 42));
91+
assertType('42|Illuminate\Types\Relations\Car', $user->car()->firstOr(callback: fn () => 42));
9292
assertType('Illuminate\Support\LazyCollection<int, Illuminate\Types\Relations\Car>', $user->car()->lazy());
9393
assertType('Illuminate\Support\LazyCollection<int, Illuminate\Types\Relations\Car>', $user->car()->lazyById());
9494
assertType('Illuminate\Support\LazyCollection<int, Illuminate\Types\Relations\Car>', $user->car()->cursor());

types/Database/Query/Builder.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ function test(Builder $query, EloquentBuilder $userQuery): void
1212
{
1313
assertType('object|null', $query->first());
1414
assertType('object|null', $query->find(1));
15-
assertType('int|object', $query->findOr(1, fn () => 42));
16-
assertType('int|object', $query->findOr(1, callback: fn () => 42));
15+
assertType('42|object', $query->findOr(1, fn () => 42));
16+
assertType('42|object', $query->findOr(1, callback: fn () => 42));
1717
assertType('Illuminate\Database\Query\Builder', $query->selectSub($userQuery, 'alias'));
1818
assertType('Illuminate\Database\Query\Builder', $query->fromSub($userQuery, 'alias'));
1919
assertType('Illuminate\Database\Query\Builder', $query->from($userQuery, 'alias'));

types/Foundation/Configuration/Middleware.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66
$middleware = new Middleware();
77

88
$middleware->convertEmptyStringsToNull(except: [
9-
fn ($request) => $request->has('skip-all-1'),
10-
fn ($request) => $request->has('skip-all-2'),
9+
fn (Request $request): bool => $request->has('skip-all-1'),
10+
fn (Request $request): bool => $request->has('skip-all-2'),
1111
]);
1212

1313
$middleware->trimStrings(except: [
1414
'aaa',
15-
fn ($request) => $request->has('skip-all'),
15+
fn (Request $request): bool => $request->has('skip-all'),
1616
]);
1717

1818
$middleware->trustProxies(at: '*');

types/Foundation/Helpers.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@
3535
assertType('Illuminate\Log\LogManager', logs());
3636
assertType('Psr\Log\LoggerInterface', logs('foo'));
3737

38-
assertType('int|null', rescue(fn () => 123));
39-
assertType('int', rescue(fn () => 123, 345));
40-
assertType('int', rescue(fn () => 123, fn () => 345));
38+
assertType('123|null', rescue(fn () => 123));
39+
assertType('123|345', rescue(fn () => 123, 345));
40+
assertType('123|345', rescue(fn () => 123, fn () => 345));
4141

4242
assertType('Illuminate\Routing\Redirector', redirect());
4343
assertType('Illuminate\Http\RedirectResponse', redirect('foo'));

types/Support/Arr.php

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,20 @@
88
/** @var iterable<int, User> $iterable */
99
$iterable = [];
1010
/** @var Traversable<int, User> $traversable */
11-
$traversable = [];
11+
$traversable = new ArrayIterator([new User]);
1212

1313
assertType('User|null', Arr::first($array));
1414
assertType('User|null', Arr::first($array, function ($user) {
1515
assertType('User', $user);
1616

1717
return true;
1818
}));
19-
assertType('string|User', Arr::first($array, function ($user) {
19+
assertType("'string'|User", Arr::first($array, function ($user) {
2020
assertType('User', $user);
2121

2222
return false;
2323
}, 'string'));
24-
assertType('string|User', Arr::first($array, null, function () {
24+
assertType("'string'|User", Arr::first($array, null, function () {
2525
return 'string';
2626
}));
2727

@@ -31,12 +31,12 @@
3131

3232
return true;
3333
}));
34-
assertType('string|User', Arr::first($iterable, function ($user) {
34+
assertType("'string'|User", Arr::first($iterable, function ($user) {
3535
assertType('User', $user);
3636

3737
return false;
3838
}, 'string'));
39-
assertType('string|User', Arr::first($iterable, null, function () {
39+
assertType("'string'|User", Arr::first($iterable, null, function () {
4040
return 'string';
4141
}));
4242

@@ -46,12 +46,12 @@
4646

4747
return true;
4848
}));
49-
assertType('string|User', Arr::first($traversable, function ($user) {
49+
assertType("'string'|User", Arr::first($traversable, function ($user) {
5050
assertType('User', $user);
5151

5252
return false;
5353
}, 'string'));
54-
assertType('string|User', Arr::first($traversable, null, function () {
54+
assertType("'string'|User", Arr::first($traversable, null, function () {
5555
return 'string';
5656
}));
5757

@@ -61,12 +61,12 @@
6161

6262
return true;
6363
}));
64-
assertType('string|User', Arr::last($array, function ($user) {
64+
assertType("'string'|User", Arr::last($array, function ($user) {
6565
assertType('User', $user);
6666

6767
return false;
6868
}, 'string'));
69-
assertType('string|User', Arr::last($array, null, function () {
69+
assertType("'string'|User", Arr::last($array, null, function () {
7070
return 'string';
7171
}));
7272

@@ -76,12 +76,12 @@
7676

7777
return true;
7878
}));
79-
assertType('string|User', Arr::last($iterable, function ($user) {
79+
assertType("'string'|User", Arr::last($iterable, function ($user) {
8080
assertType('User', $user);
8181

8282
return false;
8383
}, 'string'));
84-
assertType('string|User', Arr::last($iterable, null, function () {
84+
assertType("'string'|User", Arr::last($iterable, null, function () {
8585
return 'string';
8686
}));
8787

@@ -91,11 +91,11 @@
9191

9292
return true;
9393
}));
94-
assertType('string|User', Arr::last($traversable, function ($user) {
94+
assertType("'string'|User", Arr::last($traversable, function ($user) {
9595
assertType('User', $user);
9696

9797
return false;
9898
}, 'string'));
99-
assertType('string|User', Arr::last($traversable, null, function () {
99+
assertType("'string'|User", Arr::last($traversable, null, function () {
100100
return 'string';
101101
}));

0 commit comments

Comments
 (0)