Skip to content

Commit 629d03e

Browse files
staabmclxmstaab
andauthored
added doctrine-ObjectTypes (#326)
Co-authored-by: Markus Staab <[email protected]>
1 parent dbae25f commit 629d03e

File tree

4 files changed

+48
-21
lines changed

4 files changed

+48
-21
lines changed

src/DoctrineReflection/DoctrineReflection.php

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44

55
namespace staabm\PHPStanDba\DoctrineReflection;
66

7-
use Doctrine\DBAL\Result;
8-
use Doctrine\DBAL\Statement;
97
use PHPStan\Reflection\MethodReflection;
108
use PHPStan\Type\ArrayType;
119
use PHPStan\Type\Constant\ConstantArrayType;
@@ -42,16 +40,8 @@ public function reduceResultType(MethodReflection $methodReflection, Type $resul
4240
return TypeCombinator::union(...$resultTypes);
4341
}
4442

45-
if ($resultType instanceof GenericObjectType) {
46-
$genericTypes = $resultType->getTypes();
47-
48-
if (1 !== \count($genericTypes)) {
49-
return null;
50-
}
51-
52-
$resultRowType = $genericTypes[0];
53-
54-
return $this->reduceResultType($methodReflection, $resultRowType);
43+
if ($resultType instanceof DoctrineResultObjectType) {
44+
return $this->reduceResultType($methodReflection, $resultType->getRowType());
5545
}
5646

5747
$resultRowType = $resultType;
@@ -156,7 +146,7 @@ public function createGenericStatement(iterable $queryStrings, int $reflectionFe
156146
return null;
157147
}
158148

159-
$genericObjects[] = new GenericObjectType(Statement::class, [$resultType]);
149+
$genericObjects[] = new DoctrineStatementObjectType($resultType);
160150
}
161151

162152
if (\count($genericObjects) > 1) {
@@ -185,7 +175,7 @@ public function createGenericResult(iterable $queryStrings, int $reflectionFetch
185175
return null;
186176
}
187177

188-
$genericObjects[] = new GenericObjectType(Result::class, [$resultType]);
178+
$genericObjects[] = new DoctrineResultObjectType($resultType);
189179
}
190180

191181
if (\count($genericObjects) > 1) {
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace staabm\PHPStanDba\DoctrineReflection;
6+
7+
use Doctrine\DBAL\Result;
8+
use PHPStan\Type\Generic\GenericObjectType;
9+
use PHPStan\Type\Type;
10+
11+
final class DoctrineResultObjectType extends GenericObjectType
12+
{
13+
public function __construct(Type $rowType)
14+
{
15+
parent::__construct(Result::class, [$rowType]);
16+
}
17+
18+
public function getRowType(): Type
19+
{
20+
$genericTypes = $this->getTypes();
21+
22+
return $genericTypes[0];
23+
}
24+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace staabm\PHPStanDba\DoctrineReflection;
6+
7+
use Doctrine\DBAL\Statement;
8+
use PHPStan\Type\Generic\GenericObjectType;
9+
use PHPStan\Type\Type;
10+
11+
final class DoctrineStatementObjectType extends GenericObjectType
12+
{
13+
public function __construct(Type $rowType)
14+
{
15+
parent::__construct(Statement::class, [$rowType]);
16+
}
17+
}

src/Extensions/DoctrineResultDynamicReturnTypeExtension.php

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
use PHPStan\Type\Constant\ConstantArrayType;
1616
use PHPStan\Type\Constant\ConstantIntegerType;
1717
use PHPStan\Type\DynamicMethodReturnTypeExtension;
18-
use PHPStan\Type\Generic\GenericObjectType;
1918
use PHPStan\Type\Type;
2019
use staabm\PHPStanDba\DoctrineReflection\DoctrineReflection;
20+
use staabm\PHPStanDba\DoctrineReflection\DoctrineResultObjectType;
2121

2222
final class DoctrineResultDynamicReturnTypeExtension implements DynamicMethodReturnTypeExtension
2323
{
@@ -57,12 +57,8 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method
5757

5858
$resultType = $scope->getType($methodCall->var);
5959
if ('columncount' === strtolower($methodReflection->getName())) {
60-
if ($resultType instanceof GenericObjectType) {
61-
$genericTypes = $resultType->getTypes();
62-
if (1 !== \count($genericTypes)) {
63-
return $defaultReturn;
64-
}
65-
$resultRowType = $genericTypes[0];
60+
if ($resultType instanceof DoctrineResultObjectType) {
61+
$resultRowType = $resultType->getRowType();
6662

6763
if ($resultRowType instanceof ConstantArrayType) {
6864
$columnCount = \count($resultRowType->getKeyTypes()) / 2;

0 commit comments

Comments
 (0)