Skip to content

Commit 65de89f

Browse files
committed
extract LateResolvableTraverser
1 parent ce130a7 commit 65de89f

File tree

3 files changed

+50
-18
lines changed

3 files changed

+50
-18
lines changed

phpstan-baseline.neon

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1689,6 +1689,12 @@ parameters:
16891689
count: 2
16901690
path: src/Type/StringType.php
16911691

1692+
-
1693+
rawMessage: 'Doing instanceof PHPStan\Type\CallableType is error-prone and deprecated. Use Type::isCallable() and Type::getCallableParametersAcceptors() instead.'
1694+
identifier: phpstanApi.instanceofType
1695+
count: 1
1696+
path: src/Type/Traverser/LateResolvableTraverser.php
1697+
16921698
-
16931699
rawMessage: 'Doing instanceof PHPStan\Type\ArrayType is error-prone and deprecated. Use Type::isArray() or Type::getArrays() instead.'
16941700
identifier: phpstanApi.instanceofType
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\Type\Traverser;
4+
5+
use PHPStan\Type\CallableType;
6+
use PHPStan\Type\ClosureType;
7+
use PHPStan\Type\LateResolvableType;
8+
use PHPStan\Type\Type;
9+
10+
final class LateResolvableTraverser
11+
{
12+
13+
private int $ignoreResolveUnresolvableTypesLevel;
14+
15+
public function __construct(
16+
private readonly bool $resolveUnresolvableTypes,
17+
)
18+
{
19+
$this->ignoreResolveUnresolvableTypesLevel = 0;
20+
}
21+
22+
/**
23+
* @param callable(Type): Type $traverse
24+
*/
25+
public function __invoke(Type $type, callable $traverse): Type
26+
{
27+
while ($type instanceof LateResolvableType && (($this->resolveUnresolvableTypes && $this->ignoreResolveUnresolvableTypesLevel === 0) || $type->isResolvable())) {
28+
$type = $type->resolve();
29+
}
30+
31+
if ($type instanceof CallableType || $type instanceof ClosureType) {
32+
$this->ignoreResolveUnresolvableTypesLevel++;
33+
$result = $traverse($type);
34+
$this->ignoreResolveUnresolvableTypesLevel--;
35+
36+
return $result;
37+
}
38+
39+
return $traverse($type);
40+
}
41+
42+
}

src/Type/TypeUtils.php

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use PHPStan\Type\Generic\TemplateBenevolentUnionType;
1010
use PHPStan\Type\Generic\TemplateType;
1111
use PHPStan\Type\Generic\TemplateUnionType;
12+
use PHPStan\Type\Traverser\LateResolvableTraverser;
1213
use function array_merge;
1314

1415
/**
@@ -233,24 +234,7 @@ public static function containsTemplateType(Type $type): bool
233234

234235
public static function resolveLateResolvableTypes(Type $type, bool $resolveUnresolvableTypes = true): Type
235236
{
236-
/** @var int $ignoreResolveUnresolvableTypesLevel */
237-
$ignoreResolveUnresolvableTypesLevel = 0;
238-
239-
return TypeTraverser::map($type, static function (Type $type, callable $traverse) use ($resolveUnresolvableTypes, &$ignoreResolveUnresolvableTypesLevel): Type {
240-
while ($type instanceof LateResolvableType && (($resolveUnresolvableTypes && $ignoreResolveUnresolvableTypesLevel === 0) || $type->isResolvable())) {
241-
$type = $type->resolve();
242-
}
243-
244-
if ($type instanceof CallableType || $type instanceof ClosureType) {
245-
$ignoreResolveUnresolvableTypesLevel++;
246-
$result = $traverse($type);
247-
$ignoreResolveUnresolvableTypesLevel--;
248-
249-
return $result;
250-
}
251-
252-
return $traverse($type);
253-
});
237+
return TypeTraverser::map($type, new LateResolvableTraverser($resolveUnresolvableTypes));
254238
}
255239

256240
}

0 commit comments

Comments
 (0)