Skip to content

Commit 6d06a10

Browse files
committed
Keep an uncertain component type as mixed
1 parent 426d662 commit 6d06a10

4 files changed

+18
-8
lines changed

src/Type/Nette/ComponentModelArrayAccessDynamicReturnTypeExtension.php

+5
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
use PHPStan\Reflection\MethodReflection;
88
use PHPStan\Reflection\ParametersAcceptorSelector;
99
use PHPStan\Type\DynamicMethodReturnTypeExtension;
10+
use PHPStan\Type\MixedType;
1011
use PHPStan\Type\NullType;
12+
use PHPStan\Type\ObjectType;
1113
use PHPStan\Type\Type;
1214
use PHPStan\Type\TypeCombinator;
1315
use function count;
@@ -38,6 +40,9 @@ public function getTypeFromMethodCall(
3840
$calledOnType = $scope->getType($methodCall->var);
3941
$defaultType = ParametersAcceptorSelector::selectSingle($calledOnType->getMethod('createComponent', $scope)->getVariants())->getReturnType();
4042
$defaultType = TypeCombinator::remove($defaultType, new NullType());
43+
if ($defaultType->isSuperTypeOf(new ObjectType('Nette\ComponentModel\IComponent'))->yes()) {
44+
$defaultType = new MixedType();
45+
}
4146
$args = $methodCall->getArgs();
4247
if (count($args) !== 1) {
4348
return $defaultType;

src/Type/Nette/ComponentModelDynamicReturnTypeExtension.php

+5
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
use PHPStan\Reflection\MethodReflection;
88
use PHPStan\Reflection\ParametersAcceptorSelector;
99
use PHPStan\Type\DynamicMethodReturnTypeExtension;
10+
use PHPStan\Type\MixedType;
1011
use PHPStan\Type\NullType;
12+
use PHPStan\Type\ObjectType;
1113
use PHPStan\Type\Type;
1214
use PHPStan\Type\TypeCombinator;
1315
use function count;
@@ -37,6 +39,9 @@ public function getTypeFromMethodCall(
3739
{
3840
$calledOnType = $scope->getType($methodCall->var);
3941
$defaultType = ParametersAcceptorSelector::selectSingle($calledOnType->getMethod('createComponent', $scope)->getVariants())->getReturnType();
42+
if ($defaultType->isSuperTypeOf(new ObjectType('Nette\ComponentModel\IComponent'))->yes()) {
43+
$defaultType = new MixedType();
44+
}
4045
$args = $methodCall->getArgs();
4146
if (count($args) < 1) {
4247
return $defaultType;

tests/Type/Nette/data/componentModel.php

+6-6
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,16 @@ public function createComponent(string $name): AnotherControl {
3535

3636
$someControl = new SomeControl();
3737
assertType('PHPStan\Type\Nette\Data\ComponentModel\SomeControl', $someControl->getComponent('some'));
38-
assertType('Nette\ComponentModel\IComponent', $someControl->getComponent('unknown'));
39-
assertType('Nette\ComponentModel\IComponent|null', $someControl->getComponent('unknown', false));
40-
assertType('Nette\ComponentModel\IComponent', $someControl->getComponent('unknown', true));
38+
assertType('mixed~null', $someControl->getComponent('unknown'));
39+
assertType('mixed', $someControl->getComponent('unknown', false));
40+
assertType('mixed~null', $someControl->getComponent('unknown', true));
4141

4242
$anotherControl = new AnotherControl();
4343
assertType('PHPStan\Type\Nette\Data\ComponentModel\AnotherControl', $anotherControl->getComponent('another'));
4444
assertType('PHPStan\Type\Nette\Data\ComponentModel\SomeControl', $anotherControl->getComponent('some'));
45-
assertType('Nette\ComponentModel\IComponent', $anotherControl->getComponent('unknown'));
46-
assertType('Nette\ComponentModel\IComponent|null', $anotherControl->getComponent('unknown', false));
47-
assertType('Nette\ComponentModel\IComponent', $anotherControl->getComponent('unknown', true));
45+
assertType('mixed~null', $anotherControl->getComponent('unknown'));
46+
assertType('mixed', $anotherControl->getComponent('unknown', false));
47+
assertType('mixed~null', $anotherControl->getComponent('unknown', true));
4848

4949
$overrideCreateControl = new OverrideCreateControl();
5050
assertType('PHPStan\Type\Nette\Data\ComponentModel\AnotherControl', $overrideCreateControl->getComponent('some'));

tests/Type/Nette/data/componentModelArrayAccess.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@ public function createComponent(string $name): AnotherControl {
3535

3636
$someControl = new SomeControl();
3737
assertType('PHPStan\Type\Nette\Data\ComponentModelArrayAccess\SomeControl', $someControl['some']);
38-
assertType('Nette\ComponentModel\IComponent', $someControl['unknown']);
38+
assertType('mixed', $someControl['unknown']);
3939

4040
$anotherControl = new AnotherControl();
4141
assertType('PHPStan\Type\Nette\Data\ComponentModelArrayAccess\AnotherControl', $anotherControl['another']);
4242
assertType('PHPStan\Type\Nette\Data\ComponentModelArrayAccess\SomeControl', $anotherControl['some']);
43-
assertType('Nette\ComponentModel\IComponent', $anotherControl['unknown']);
43+
assertType('mixed', $anotherControl['unknown']);
4444

4545
$overrideCreateControl = new OverrideCreateControl();
4646
assertType('PHPStan\Type\Nette\Data\ComponentModelArrayAccess\AnotherControl', $overrideCreateControl['some']);

0 commit comments

Comments
 (0)