diff --git a/extension.neon b/extension.neon index 1fe57183..21e8e248 100644 --- a/extension.neon +++ b/extension.neon @@ -21,6 +21,10 @@ services: repositoryClass: %doctrine.repositoryClass% tags: - phpstan.broker.dynamicMethodReturnTypeExtension + - + class: PHPStan\Type\Doctrine\ObjectManagerMergeDynamicReturnTypeExtension + tags: + - phpstan.broker.dynamicMethodReturnTypeExtension - class: PHPStan\Type\Doctrine\EntityRepositoryDynamicReturnTypeExtension tags: diff --git a/src/Type/Doctrine/ObjectManagerMergeDynamicReturnTypeExtension.php b/src/Type/Doctrine/ObjectManagerMergeDynamicReturnTypeExtension.php new file mode 100644 index 00000000..e562f5f6 --- /dev/null +++ b/src/Type/Doctrine/ObjectManagerMergeDynamicReturnTypeExtension.php @@ -0,0 +1,36 @@ +getName() === 'merge'; + } + + public function getTypeFromMethodCall( + MethodReflection $methodReflection, + MethodCall $methodCall, + Scope $scope + ): Type + { + if (count($methodCall->args) === 0) { + return $methodReflection->getReturnType(); + } + + return $scope->getType($methodCall->args[0]->value); + } + +}