Skip to content

Commit a71c977

Browse files
committed
Make it work?
1 parent af88720 commit a71c977

File tree

4 files changed

+39
-9
lines changed

4 files changed

+39
-9
lines changed

Diff for: src/Reflection/ParametersAcceptorSelector.php

+8-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use PHPStan\Type\NullType;
1818
use PHPStan\Type\Type;
1919
use PHPStan\Type\TypeCombinator;
20+
use PHPStan\Type\TypeUtils;
2021
use PHPStan\Type\UnionType;
2122
use function array_key_last;
2223
use function array_slice;
@@ -32,7 +33,7 @@ class ParametersAcceptorSelector
3233
/**
3334
* @template T of ParametersAcceptor
3435
* @param T[] $parametersAcceptors
35-
* @return T
36+
* @return T|SingleParametersAcceptor
3637
*/
3738
public static function selectSingle(
3839
array $parametersAcceptors,
@@ -48,7 +49,12 @@ public static function selectSingle(
4849
throw new ShouldNotHappenException('Multiple variants - use selectFromArgs() instead.');
4950
}
5051

51-
return new SingleParametersAcceptor($parametersAcceptors[0]);
52+
$parametersAcceptor = $parametersAcceptors[0];
53+
if (TypeUtils::containsConditional($parametersAcceptor->getReturnType())) {
54+
return new SingleParametersAcceptor($parametersAcceptor);
55+
}
56+
57+
return $parametersAcceptor;
5258
}
5359

5460
/**

Diff for: src/Reflection/SingleParametersAcceptor.php

+12-6
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
class SingleParametersAcceptor implements ParametersAcceptor
1212
{
1313

14+
private ?Type $returnType = null;
15+
1416
public function __construct(private ParametersAcceptor $acceptor)
1517
{
1618
}
@@ -40,13 +42,17 @@ public function isVariadic(): bool
4042

4143
public function getReturnType(): Type
4244
{
43-
return TypeTraverser::map($this->acceptor->getReturnType(), static function (Type $type, callable $traverse) {
44-
while ($type instanceof ConditionalType || $type instanceof ConditionalTypeForParameter) {
45-
$type = $type->getResult();
46-
}
45+
if ($this->returnType === null) {
46+
return $this->returnType = TypeTraverser::map($this->acceptor->getReturnType(), static function (Type $type, callable $traverse) {
47+
while ($type instanceof ConditionalType || $type instanceof ConditionalTypeForParameter) {
48+
$type = $type->getResult();
49+
}
50+
51+
return $traverse($type);
52+
});
53+
}
4754

48-
return $traverse($type);
49-
});
55+
return $this->returnType;
5056
}
5157

5258
}

Diff for: src/Type/TypeUtils.php

+18
Original file line numberDiff line numberDiff line change
@@ -328,4 +328,22 @@ public static function containsCallable(Type $type): bool
328328
return false;
329329
}
330330

331+
public static function containsConditional(Type $type): bool
332+
{
333+
if ($type instanceof ConditionalType || $type instanceof ConditionalTypeForParameter) {
334+
return true;
335+
}
336+
337+
$contains = false;
338+
TypeTraverser::map($type, static function (Type $type, callable $traverse) use (&$contains): Type {
339+
if ($type instanceof ConditionalType || $type instanceof ConditionalTypeForParameter) {
340+
$contains = true;
341+
}
342+
343+
return !$contains ? $traverse($type) : $type;
344+
});
345+
346+
return $contains;
347+
}
348+
331349
}

Diff for: tests/PHPStan/Analyser/AnalyserIntegrationTest.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -622,7 +622,7 @@ public function testBug6896(): void
622622
}
623623

624624
$errors = $this->runAnalyse(__DIR__ . '/data/bug-6896.php');
625-
$this->assertCount(4, $errors);
625+
$this->assertCount(2, $errors);
626626
}
627627

628628
public function testBug6940(): void

0 commit comments

Comments
 (0)