diff --git a/README.md b/README.md index 973113f..3167933 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ This extension provides following features: * `Nette\DI\Container::getByType` and `createInstance` return type based on first parameter (`Foo::class`). * `Nette\Forms\Container::getValues` return type based on `$asArray` parameter. * `Nette\ComponentModel\Component::lookup` return type based on `$throw` parameter. +* `Nette\Application\UI\Component::getPresenter` return type based on `$throw` parameter. * Dynamic methods of [Nette\Utils\Html](https://doc.nette.org/en/2.4/html-elements) * Magic [Nette\Object and Nette\SmartObject](https://doc.nette.org/en/2.4/php-language-enhancements) properties * Event listeners through the `on*` properties diff --git a/extension.neon b/extension.neon index e649620..79680df 100644 --- a/extension.neon +++ b/extension.neon @@ -38,6 +38,11 @@ services: tags: - phpstan.broker.dynamicMethodReturnTypeExtension + - + class: PHPStan\Type\Nette\ComponentGetPresenterDynamicReturnTypeExtension + tags: + - phpstan.broker.dynamicMethodReturnTypeExtension + - class: PHPStan\Type\Nette\FormsBaseControlDynamicReturnTypeExtension tags: diff --git a/src/Type/Nette/ComponentGetPresenterDynamicReturnTypeExtension.php b/src/Type/Nette/ComponentGetPresenterDynamicReturnTypeExtension.php new file mode 100644 index 0000000..1288b35 --- /dev/null +++ b/src/Type/Nette/ComponentGetPresenterDynamicReturnTypeExtension.php @@ -0,0 +1,50 @@ +getName() === 'getPresenter'; + } + + public function getTypeFromMethodCall(MethodReflection $methodReflection, MethodCall $methodCall, Scope $scope): Type + { + $defaultReturnType = ParametersAcceptorSelector::selectSingle( + $methodReflection->getVariants() + )->getReturnType(); + if (count($methodCall->args) < 1) { + return $defaultReturnType; + } + + $paramNeedExpr = $methodCall->args[0]->value; + $paramNeedType = $scope->getType($paramNeedExpr); + + if ($paramNeedType instanceof ConstantBooleanType) { + if ($paramNeedType->getValue()) { + return TypeCombinator::removeNull($defaultReturnType); + } + + return TypeCombinator::addNull($defaultReturnType); + } + + return $defaultReturnType; + } + +}