Skip to content

Commit 0db092b

Browse files
committed
Introduce TypeTraverserCallable interface
1 parent c42ca1d commit 0db092b

11 files changed

Lines changed: 55 additions & 55 deletions

phpstan-baseline.neon

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -72,36 +72,6 @@ parameters:
7272
count: 1
7373
path: src/Analyser/RuleErrorTransformer.php
7474

75-
-
76-
rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
77-
identifier: phpstanApi.instanceofType
78-
count: 1
79-
path: src/Analyser/Traverser/CloneTypeTraverser.php
80-
81-
-
82-
rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
83-
identifier: phpstanApi.instanceofType
84-
count: 1
85-
path: src/Analyser/Traverser/InstanceOfClassTypeTraverser.php
86-
87-
-
88-
rawMessage: 'Doing instanceof PHPStan\Type\Generic\GenericClassStringType is error-prone and deprecated. Use Type::isClassStringType() and Type::getClassStringObjectType() instead.'
89-
identifier: phpstanApi.instanceofType
90-
count: 1
91-
path: src/Analyser/Traverser/InstanceOfClassTypeTraverser.php
92-
93-
-
94-
rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
95-
identifier: phpstanApi.instanceofType
96-
count: 1
97-
path: src/Analyser/Traverser/InstanceOfClassTypeTraverser.php
98-
99-
-
100-
rawMessage: Doing instanceof PHPStan\Type\IntersectionType is error-prone and deprecated.
101-
identifier: phpstanApi.instanceofType
102-
count: 1
103-
path: src/Analyser/Traverser/VoidToNullTraverser.php
104-
10575
-
10676
rawMessage: 'Doing instanceof PHPStan\Type\ConstantScalarType is error-prone and deprecated. Use Type::isConstantScalarValue() or Type::getConstantScalarTypes() or Type::getConstantScalarValues() instead.'
10777
identifier: phpstanApi.instanceofType
@@ -1707,12 +1677,6 @@ parameters:
17071677
count: 2
17081678
path: src/Type/StringType.php
17091679

1710-
-
1711-
rawMessage: 'Doing instanceof PHPStan\Type\CallableType is error-prone and deprecated. Use Type::isCallable() and Type::getCallableParametersAcceptors() instead.'
1712-
identifier: phpstanApi.instanceofType
1713-
count: 1
1714-
path: src/Type/Traverser/LateResolvableTraverser.php
1715-
17161680
-
17171681
rawMessage: 'Doing instanceof PHPStan\Type\ArrayType is error-prone and deprecated. Use Type::isArray() or Type::getArrays() instead.'
17181682
identifier: phpstanApi.instanceofType

src/Analyser/Traverser/CloneTypeTraverser.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,16 @@
66
use PHPStan\Type\StaticType;
77
use PHPStan\Type\ThisType;
88
use PHPStan\Type\Type;
9+
use PHPStan\Type\TypeTraverserCallable;
910
use PHPStan\Type\UnionType;
1011

11-
final class CloneTypeTraverser
12+
final class CloneTypeTraverser implements TypeTraverserCallable
1213
{
1314

1415
/**
1516
* @param callable(Type): Type $traverse
1617
*/
17-
public function __invoke(Type $type, callable $traverse): Type
18+
public function traverse(Type $type, callable $traverse): Type
1819
{
1920
if ($type instanceof UnionType || $type instanceof IntersectionType) {
2021
return $traverse($type);

src/Analyser/Traverser/ConstructorClassTemplateTraverser.php

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

55
use PHPStan\Type\Generic\TemplateType;
66
use PHPStan\Type\Type;
7+
use PHPStan\Type\TypeTraverserCallable;
78
use function array_key_exists;
89

9-
final class ConstructorClassTemplateTraverser
10+
final class ConstructorClassTemplateTraverser implements TypeTraverserCallable
1011
{
1112

1213
/**
@@ -21,7 +22,7 @@ public function __construct(
2122
/**
2223
* @param callable(Type): Type $traverse
2324
*/
24-
public function __invoke(Type $type, callable $traverse): Type
25+
public function traverse(Type $type, callable $traverse): Type
2526
{
2627
if ($type instanceof TemplateType && array_key_exists($type->getName(), $this->classTemplateTypes)) {
2728
$classTemplateType = $this->classTemplateTypes[$type->getName()];

src/Analyser/Traverser/GenericTypeTemplateTraverser.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77
use PHPStan\Type\Generic\TemplateTypeHelper;
88
use PHPStan\Type\Generic\TemplateTypeMap;
99
use PHPStan\Type\Type;
10+
use PHPStan\Type\TypeTraverserCallable;
1011

11-
final class GenericTypeTemplateTraverser
12+
final class GenericTypeTemplateTraverser implements TypeTraverserCallable
1213
{
1314

1415
public function __construct(
@@ -20,7 +21,7 @@ public function __construct(
2021
/**
2122
* @param callable(Type): Type $traverse
2223
*/
23-
public function __invoke(Type $type, callable $traverse): Type
24+
public function traverse(Type $type, callable $traverse): Type
2425
{
2526
if ($type instanceof TemplateType && !$type->isArgument()) {
2627
$newType = $this->resolvedTemplateTypeMap->getType($type->getName());

src/Analyser/Traverser/InstanceOfClassTypeTraverser.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,18 @@
88
use PHPStan\Type\MixedType;
99
use PHPStan\Type\ObjectType;
1010
use PHPStan\Type\Type;
11+
use PHPStan\Type\TypeTraverserCallable;
1112
use PHPStan\Type\UnionType;
1213

13-
final class InstanceOfClassTypeTraverser
14+
final class InstanceOfClassTypeTraverser implements TypeTraverserCallable
1415
{
1516

1617
private bool $uncertainty = false;
1718

1819
/**
1920
* @param callable(Type): Type $traverse
2021
*/
21-
public function __invoke(Type $type, callable $traverse): Type
22+
public function traverse(Type $type, callable $traverse): Type
2223
{
2324
if ($type instanceof UnionType || $type instanceof IntersectionType) {
2425
return $traverse($type);

src/Analyser/Traverser/TransformStaticTypeTraverser.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
use PHPStan\Type\StaticType;
77
use PHPStan\Type\ThisType;
88
use PHPStan\Type\Type;
9+
use PHPStan\Type\TypeTraverserCallable;
910

10-
final class TransformStaticTypeTraverser
11+
final class TransformStaticTypeTraverser implements TypeTraverserCallable
1112
{
1213

1314
public function __construct(
@@ -19,7 +20,7 @@ public function __construct(
1920
/**
2021
* @param callable(Type): Type $traverse
2122
*/
22-
public function __invoke(Type $type, callable $traverse): Type
23+
public function traverse(Type $type, callable $traverse): Type
2324
{
2425
if (!$this->scope->isInClass()) {
2526
return $type;

src/Analyser/Traverser/VoidToNullTraverser.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@
55
use PHPStan\Type\IntersectionType;
66
use PHPStan\Type\NullType;
77
use PHPStan\Type\Type;
8+
use PHPStan\Type\TypeTraverserCallable;
89
use PHPStan\Type\UnionType;
910

10-
final class VoidToNullTraverser
11+
final class VoidToNullTraverser implements TypeTraverserCallable
1112
{
1213

1314
/**
1415
* @param callable(Type): Type $traverse
1516
*/
16-
public function __invoke(Type $type, callable $traverse): Type
17+
public function traverse(Type $type, callable $traverse): Type
1718
{
1819
if ($type instanceof UnionType || $type instanceof IntersectionType) {
1920
return $traverse($type);

src/Rules/Api/ApiInstanceofTypeRule.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
use PHPStan\Type\ObjectType;
4444
use PHPStan\Type\ObjectWithoutClassType;
4545
use PHPStan\Type\StringType;
46+
use PHPStan\Type\TypeTraverserCallable;
4647
use PHPStan\Type\TypeWithClassName;
4748
use PHPStan\Type\VoidType;
4849
use function array_key_exists;
@@ -125,6 +126,14 @@ public function processNode(Node $node, Scope $scope): array
125126
return [];
126127
}
127128

129+
if ($scope->isInClass()) {
130+
$classReflection = $scope->getClassReflection();
131+
132+
if ($classReflection->implementsInterface(TypeTraverserCallable::class)) {
133+
return [];
134+
}
135+
}
136+
128137
$className = $scope->resolveName($node->class);
129138
$lowerClassName = strtolower($className);
130139
if (!array_key_exists($lowerClassName, $this->lowerMap)) {

src/Type/Traverser/LateResolvableTraverser.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
use PHPStan\Type\ClosureType;
77
use PHPStan\Type\LateResolvableType;
88
use PHPStan\Type\Type;
9+
use PHPStan\Type\TypeTraverserCallable;
910

10-
final class LateResolvableTraverser
11+
final class LateResolvableTraverser implements TypeTraverserCallable
1112
{
1213

1314
private int $ignoreResolveUnresolvableTypesLevel;
@@ -22,7 +23,7 @@ public function __construct(
2223
/**
2324
* @param callable(Type): Type $traverse
2425
*/
25-
public function __invoke(Type $type, callable $traverse): Type
26+
public function traverse(Type $type, callable $traverse): Type
2627
{
2728
while ($type instanceof LateResolvableType && (($this->resolveUnresolvableTypes && $this->ignoreResolveUnresolvableTypesLevel === 0) || $type->isResolvable())) {
2829
$type = $type->resolve();

src/Type/TypeTraverser.php

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,23 @@ final class TypeTraverser
3131
* });
3232
*
3333
* @api
34-
* @param callable(Type $type, callable(Type): Type $traverse): Type $cb
34+
* @param TypeTraverserCallable|callable(Type $type, callable(Type): Type $traverse): Type $cb
3535
*/
36-
public static function map(Type $type, callable $cb): Type
36+
public static function map(Type $type, TypeTraverserCallable|callable $cb): Type
3737
{
3838
$self = new self($cb);
3939

4040
return $self->mapInternal($type);
4141
}
4242

43-
/** @param callable(Type $type, callable(Type): Type $traverse): Type $cb */
44-
private function __construct(callable $cb)
43+
/** @param TypeTraverserCallable|callable(Type $type, callable(Type): Type $traverse): Type $cb */
44+
private function __construct(TypeTraverserCallable|callable $cb)
4545
{
46-
$this->cb = $cb;
46+
if ($cb instanceof TypeTraverserCallable) {
47+
$this->cb = $cb->traverse(...);
48+
} else {
49+
$this->cb = $cb;
50+
}
4751
}
4852

4953
/** @internal */

0 commit comments

Comments
 (0)