From 01000d4398b3869be87f1b6f9154e43afef7bff7 Mon Sep 17 00:00:00 2001
From: Vincent Langlet <vincentlanglet@hotmail.fr>
Date: Sat, 25 Feb 2023 16:22:01 +0100
Subject: [PATCH] Solve phpstan deprecation

---
 .../QueryResultDynamicReturnTypeExtension.php | 47 ++++++++++++-------
 1 file changed, 30 insertions(+), 17 deletions(-)

diff --git a/src/Type/Doctrine/Query/QueryResultDynamicReturnTypeExtension.php b/src/Type/Doctrine/Query/QueryResultDynamicReturnTypeExtension.php
index a46f96be..b63ec5c3 100644
--- a/src/Type/Doctrine/Query/QueryResultDynamicReturnTypeExtension.php
+++ b/src/Type/Doctrine/Query/QueryResultDynamicReturnTypeExtension.php
@@ -209,19 +209,22 @@ static function (Type $type, callable $traverse) use ($objectManager): Type {
 
 	private function getScalarHydratedReturnType(Type $queryResultType): Type
 	{
-		if (!$queryResultType instanceof ArrayType) {
+		if (!$queryResultType->isArray()->yes()) {
 			return new ArrayType(new MixedType(), new MixedType());
 		}
 
-		$itemType = $queryResultType->getItemType();
-		$hasNoObject = (new ObjectWithoutClassType())->isSuperTypeOf($itemType)->no();
-		$hasNoArray = $itemType->isArray()->no();
+		foreach ($queryResultType->getArrays() as $arrayType) {
+			$itemType = $arrayType->getItemType();
 
-		if ($hasNoArray && $hasNoObject) {
-			return $queryResultType;
+			if (
+				!(new ObjectWithoutClassType())->isSuperTypeOf($itemType)->no()
+				|| !$itemType->isArray()->no()
+			) {
+				new ArrayType(new MixedType(), new MixedType());
+			}
 		}
 
-		return new ArrayType(new MixedType(), new MixedType());
+		return $queryResultType;
 	}
 
 	private function getSimpleObjectHydratedReturnType(Type $queryResultType): Type
@@ -236,31 +239,41 @@ private function getSimpleObjectHydratedReturnType(Type $queryResultType): Type
 	private function getSingleScalarHydratedReturnType(Type $queryResultType): Type
 	{
 		$queryResultType = $this->getScalarHydratedReturnType($queryResultType);
-		if (!$queryResultType instanceof ConstantArrayType) {
+		if (!$queryResultType->isConstantArray()->yes()) {
 			return new MixedType();
 		}
 
-		$values = $queryResultType->getValueTypes();
-		if (count($values) !== 1) {
-			return new MixedType();
+		$types = [];
+		foreach ($queryResultType->getConstantArrays() as $constantArrayType) {
+			$values = $constantArrayType->getValueTypes();
+			if (count($values) !== 1) {
+				return new MixedType();
+			}
+
+			$types[] = $constantArrayType->getFirstIterableValueType();
 		}
 
-		return $queryResultType->getFirstIterableValueType();
+		return TypeCombinator::union(...$types);
 	}
 
 	private function getScalarColumnHydratedReturnType(Type $queryResultType): Type
 	{
 		$queryResultType = $this->getScalarHydratedReturnType($queryResultType);
-		if (!$queryResultType instanceof ConstantArrayType) {
+		if (!$queryResultType->isConstantArray()->yes()) {
 			return new MixedType();
 		}
 
-		$values = $queryResultType->getValueTypes();
-		if (count($values) !== 1) {
-			return new MixedType();
+		$types = [];
+		foreach ($queryResultType->getConstantArrays() as $constantArrayType) {
+			$values = $constantArrayType->getValueTypes();
+			if (count($values) !== 1) {
+				return new MixedType();
+			}
+
+			$types[] = $constantArrayType->getFirstIterableValueType();
 		}
 
-		return $queryResultType->getFirstIterableValueType();
+		return TypeCombinator::union(...$types);
 	}
 
 	private function originalReturnType(MethodReflection $methodReflection): Type