diff --git a/.phpstan-dba.cache b/.phpstan-dba.cache index 1886c3627..9cba86f9c 100644 --- a/.phpstan-dba.cache +++ b/.phpstan-dba.cache @@ -3487,7 +3487,7 @@ Simulated query: SELECT email, adaid FROM ada . WHERE email=\'my_other_table\' L 'error' => NULL, 'result' => array ( - 5 => + 3 => PHPStan\Type\Constant\ConstantArrayType::__set_state(array( 'allArrays' => NULL, 'keyTypes' => @@ -3498,18 +3498,10 @@ Simulated query: SELECT email, adaid FROM ada . WHERE email=\'my_other_table\' L 'isClassString' => false, )), 1 => - PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( - 'value' => 0, - )), - 2 => PHPStan\Type\Constant\ConstantStringType::__set_state(array( 'value' => 'adaid', 'isClassString' => false, )), - 3 => - PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( - 'value' => 1, - )), ), 'valueTypes' => array ( @@ -3517,20 +3509,12 @@ Simulated query: SELECT email, adaid FROM ada . WHERE email=\'my_other_table\' L PHPStan\Type\StringType::__set_state(array( )), 1 => - PHPStan\Type\StringType::__set_state(array( - )), - 2 => - PHPStan\Type\IntegerRangeType::__set_state(array( - 'min' => 0, - 'max' => 4294967295, - )), - 3 => PHPStan\Type\IntegerRangeType::__set_state(array( 'min' => 0, 'max' => 4294967295, )), ), - 'nextAutoIndex' => 2, + 'nextAutoIndex' => 0, 'optionalKeys' => array ( ), @@ -3539,19 +3523,11 @@ Simulated query: SELECT email, adaid FROM ada . WHERE email=\'my_other_table\' L 'types' => array ( 0 => - PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( - 'value' => 0, - )), - 1 => - PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( - 'value' => 1, - )), - 2 => PHPStan\Type\Constant\ConstantStringType::__set_state(array( 'value' => 'adaid', 'isClassString' => false, )), - 3 => + 1 => PHPStan\Type\Constant\ConstantStringType::__set_state(array( 'value' => 'email', 'isClassString' => false, @@ -3573,7 +3549,7 @@ Simulated query: SELECT email, adaid FROM ada . WHERE email=\'my_other_table\' L ), )), )), - 3 => + 5 => PHPStan\Type\Constant\ConstantArrayType::__set_state(array( 'allArrays' => NULL, 'keyTypes' => @@ -3584,10 +3560,18 @@ Simulated query: SELECT email, adaid FROM ada . WHERE email=\'my_other_table\' L 'isClassString' => false, )), 1 => + PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( + 'value' => 0, + )), + 2 => PHPStan\Type\Constant\ConstantStringType::__set_state(array( 'value' => 'adaid', 'isClassString' => false, )), + 3 => + PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( + 'value' => 1, + )), ), 'valueTypes' => array ( @@ -3595,12 +3579,20 @@ Simulated query: SELECT email, adaid FROM ada . WHERE email=\'my_other_table\' L PHPStan\Type\StringType::__set_state(array( )), 1 => + PHPStan\Type\StringType::__set_state(array( + )), + 2 => + PHPStan\Type\IntegerRangeType::__set_state(array( + 'min' => 0, + 'max' => 4294967295, + )), + 3 => PHPStan\Type\IntegerRangeType::__set_state(array( 'min' => 0, 'max' => 4294967295, )), ), - 'nextAutoIndex' => 0, + 'nextAutoIndex' => 2, 'optionalKeys' => array ( ), @@ -3609,11 +3601,19 @@ Simulated query: SELECT email, adaid FROM ada . WHERE email=\'my_other_table\' L 'types' => array ( 0 => + PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( + 'value' => 0, + )), + 1 => + PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( + 'value' => 1, + )), + 2 => PHPStan\Type\Constant\ConstantStringType::__set_state(array( 'value' => 'adaid', 'isClassString' => false, )), - 1 => + 3 => PHPStan\Type\Constant\ConstantStringType::__set_state(array( 'value' => 'email', 'isClassString' => false, @@ -4446,7 +4446,7 @@ Simulated query: SELECT email, adaid FROM ada . WHERE email=\'my_other_table\' L 'error' => NULL, 'result' => array ( - 3 => + 5 => PHPStan\Type\Constant\ConstantArrayType::__set_state(array( 'allArrays' => NULL, 'keyTypes' => @@ -4457,20 +4457,36 @@ Simulated query: SELECT email, adaid FROM ada . WHERE email=\'my_other_table\' L 'isClassString' => false, )), 1 => + PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( + 'value' => 0, + )), + 2 => PHPStan\Type\Constant\ConstantStringType::__set_state(array( 'value' => 'adaid', 'isClassString' => false, )), - 2 => + 3 => + PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( + 'value' => 1, + )), + 4 => PHPStan\Type\Constant\ConstantStringType::__set_state(array( 'value' => 'gesperrt', 'isClassString' => false, )), - 3 => + 5 => + PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( + 'value' => 2, + )), + 6 => PHPStan\Type\Constant\ConstantStringType::__set_state(array( 'value' => 'freigabe1u1', 'isClassString' => false, )), + 7 => + PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( + 'value' => 3, + )), ), 'valueTypes' => array ( @@ -4478,22 +4494,40 @@ Simulated query: SELECT email, adaid FROM ada . WHERE email=\'my_other_table\' L PHPStan\Type\StringType::__set_state(array( )), 1 => + PHPStan\Type\StringType::__set_state(array( + )), + 2 => PHPStan\Type\IntegerRangeType::__set_state(array( 'min' => 0, 'max' => 4294967295, )), - 2 => + 3 => + PHPStan\Type\IntegerRangeType::__set_state(array( + 'min' => 0, + 'max' => 4294967295, + )), + 4 => PHPStan\Type\IntegerRangeType::__set_state(array( 'min' => -128, 'max' => 127, )), - 3 => + 5 => + PHPStan\Type\IntegerRangeType::__set_state(array( + 'min' => -128, + 'max' => 127, + )), + 6 => + PHPStan\Type\IntegerRangeType::__set_state(array( + 'min' => -128, + 'max' => 127, + )), + 7 => PHPStan\Type\IntegerRangeType::__set_state(array( 'min' => -128, 'max' => 127, )), ), - 'nextAutoIndex' => 0, + 'nextAutoIndex' => 4, 'optionalKeys' => array ( ), @@ -4502,21 +4536,37 @@ Simulated query: SELECT email, adaid FROM ada . WHERE email=\'my_other_table\' L 'types' => array ( 0 => + PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( + 'value' => 0, + )), + 1 => + PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( + 'value' => 1, + )), + 2 => + PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( + 'value' => 2, + )), + 3 => + PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( + 'value' => 3, + )), + 4 => PHPStan\Type\Constant\ConstantStringType::__set_state(array( 'value' => 'adaid', 'isClassString' => false, )), - 1 => + 5 => PHPStan\Type\Constant\ConstantStringType::__set_state(array( 'value' => 'email', 'isClassString' => false, )), - 2 => + 6 => PHPStan\Type\Constant\ConstantStringType::__set_state(array( 'value' => 'freigabe1u1', 'isClassString' => false, )), - 3 => + 7 => PHPStan\Type\Constant\ConstantStringType::__set_state(array( 'value' => 'gesperrt', 'isClassString' => false, @@ -4538,7 +4588,7 @@ Simulated query: SELECT email, adaid FROM ada . WHERE email=\'my_other_table\' L ), )), )), - 5 => + 3 => PHPStan\Type\Constant\ConstantArrayType::__set_state(array( 'allArrays' => NULL, 'keyTypes' => @@ -4549,36 +4599,20 @@ Simulated query: SELECT email, adaid FROM ada . WHERE email=\'my_other_table\' L 'isClassString' => false, )), 1 => - PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( - 'value' => 0, - )), - 2 => PHPStan\Type\Constant\ConstantStringType::__set_state(array( 'value' => 'adaid', 'isClassString' => false, )), - 3 => - PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( - 'value' => 1, - )), - 4 => + 2 => PHPStan\Type\Constant\ConstantStringType::__set_state(array( 'value' => 'gesperrt', 'isClassString' => false, )), - 5 => - PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( - 'value' => 2, - )), - 6 => + 3 => PHPStan\Type\Constant\ConstantStringType::__set_state(array( 'value' => 'freigabe1u1', 'isClassString' => false, )), - 7 => - PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( - 'value' => 3, - )), ), 'valueTypes' => array ( @@ -4586,40 +4620,22 @@ Simulated query: SELECT email, adaid FROM ada . WHERE email=\'my_other_table\' L PHPStan\Type\StringType::__set_state(array( )), 1 => - PHPStan\Type\StringType::__set_state(array( - )), - 2 => PHPStan\Type\IntegerRangeType::__set_state(array( 'min' => 0, 'max' => 4294967295, )), - 3 => - PHPStan\Type\IntegerRangeType::__set_state(array( - 'min' => 0, - 'max' => 4294967295, - )), - 4 => - PHPStan\Type\IntegerRangeType::__set_state(array( - 'min' => -128, - 'max' => 127, - )), - 5 => - PHPStan\Type\IntegerRangeType::__set_state(array( - 'min' => -128, - 'max' => 127, - )), - 6 => + 2 => PHPStan\Type\IntegerRangeType::__set_state(array( 'min' => -128, 'max' => 127, )), - 7 => + 3 => PHPStan\Type\IntegerRangeType::__set_state(array( 'min' => -128, 'max' => 127, )), ), - 'nextAutoIndex' => 4, + 'nextAutoIndex' => 0, 'optionalKeys' => array ( ), @@ -4628,37 +4644,21 @@ Simulated query: SELECT email, adaid FROM ada . WHERE email=\'my_other_table\' L 'types' => array ( 0 => - PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( - 'value' => 0, - )), - 1 => - PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( - 'value' => 1, - )), - 2 => - PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( - 'value' => 2, - )), - 3 => - PHPStan\Type\Constant\ConstantIntegerType::__set_state(array( - 'value' => 3, - )), - 4 => PHPStan\Type\Constant\ConstantStringType::__set_state(array( 'value' => 'adaid', 'isClassString' => false, )), - 5 => + 1 => PHPStan\Type\Constant\ConstantStringType::__set_state(array( 'value' => 'email', 'isClassString' => false, )), - 6 => + 2 => PHPStan\Type\Constant\ConstantStringType::__set_state(array( 'value' => 'freigabe1u1', 'isClassString' => false, )), - 7 => + 3 => PHPStan\Type\Constant\ConstantStringType::__set_state(array( 'value' => 'gesperrt', 'isClassString' => false, diff --git a/src/Extensions/DoctrineResultDynamicReturnTypeExtension.php b/src/Extensions/DoctrineResultDynamicReturnTypeExtension.php index ac4109109..09de92c2b 100644 --- a/src/Extensions/DoctrineResultDynamicReturnTypeExtension.php +++ b/src/Extensions/DoctrineResultDynamicReturnTypeExtension.php @@ -21,6 +21,19 @@ final class DoctrineResultDynamicReturnTypeExtension implements DynamicMethodReturnTypeExtension { + private const METHODS = [ + 'columncount', + 'fetchone', + 'fetchfirstcolumn', + 'fetchnumeric', + 'fetchallnumeric', + 'fetchassociative', + 'fetchallassociative', + 'iteratenumeric', + 'iterateassociative', + 'iteratecolumn', + ]; + public function getClass(): string { return Result::class; @@ -28,7 +41,7 @@ public function getClass(): string public function isMethodSupported(MethodReflection $methodReflection): bool { - return \in_array(strtolower($methodReflection->getName()), ['columncount', 'fetchfirstcolumn', 'fetchnumeric', 'fetchallnumeric', 'fetchassociative', 'fetchallassociative'], true); + return \in_array(strtolower($methodReflection->getName()), self::METHODS, true); } public function getTypeFromMethodCall(MethodReflection $methodReflection, MethodCall $methodCall, Scope $scope): Type diff --git a/tests/data/doctrine-dbal.php b/tests/data/doctrine-dbal.php index 43a28beee..bfaddcf53 100644 --- a/tests/data/doctrine-dbal.php +++ b/tests/data/doctrine-dbal.php @@ -13,6 +13,12 @@ public function foo(Connection $conn) $result = $conn->query('SELECT email, adaid, gesperrt, freigabe1u1 FROM ada'); assertType('Doctrine\DBAL\Result, 1: int<0, 4294967295>, gesperrt: int<-128, 127>, 2: int<-128, 127>, freigabe1u1: int<-128, 127>, 3: int<-128, 127>}>', $result); + $columnCount = $result->columnCount(); + assertType('4', $columnCount); + + $fetch = $result->fetchOne(); + assertType('string', $fetch); + $fetch = $result->fetchNumeric(); assertType('array{string, int<0, 4294967295>, int<-128, 127>, int<-128, 127>}|false', $fetch); @@ -28,8 +34,14 @@ public function foo(Connection $conn) $fetch = $result->fetchAllAssociative(); assertType('array, array{email: string, adaid: int<0, 4294967295>, gesperrt: int<-128, 127>, freigabe1u1: int<-128, 127>}>', $fetch); - $columnCount = $result->columnCount(); - assertType('4', $columnCount); + $fetch = $result->iterateNumeric(); + assertType('Traversable, int<-128, 127>, int<-128, 127>}>', $fetch); + + $fetch = $result->iterateAssociative(); + assertType('Traversable, gesperrt: int<-128, 127>, freigabe1u1: int<-128, 127>}>', $fetch); + + $fetch = $result->iterateColumn(); + assertType('Traversable', $fetch); } public function executeQuery(Connection $conn, array $types, QueryCacheProfile $qcp)