Skip to content

Commit 6dac52e

Browse files
authored
doctrine-dbal might return list (#720)
1 parent b32c279 commit 6dac52e

File tree

2 files changed

+44
-12
lines changed

2 files changed

+44
-12
lines changed

src/DoctrineReflection/DoctrineReflection.php

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace staabm\PHPStanDba\DoctrineReflection;
66

77
use PHPStan\Reflection\MethodReflection;
8+
use PHPStan\Type\Accessory\AccessoryArrayListType;
89
use PHPStan\Type\ArrayType;
910
use PHPStan\Type\Constant\ConstantArrayTypeBuilder;
1011
use PHPStan\Type\Constant\ConstantBooleanType;
@@ -43,6 +44,7 @@ public function reduceResultType(MethodReflection $methodReflection, Type $resul
4344

4445
$usedMethod = strtolower($methodReflection->getName());
4546

47+
$returnsList = false;
4648
switch ($usedMethod) {
4749
case 'fetchallkeyvalue':
4850
case 'iteratekeyvalue':
@@ -52,16 +54,25 @@ public function reduceResultType(MethodReflection $methodReflection, Type $resul
5254
$fetchType = QueryReflector::FETCH_TYPE_ONE;
5355
break;
5456
case 'fetchfirstcolumn':
57+
$returnsList = true;
58+
$fetchType = QueryReflector::FETCH_TYPE_FIRST_COL;
59+
break;
5560
case 'iteratecolumn':
5661
$fetchType = QueryReflector::FETCH_TYPE_FIRST_COL;
5762
break;
5863
case 'fetchnumeric':
5964
case 'fetchallnumeric':
65+
$returnsList = true;
66+
$fetchType = QueryReflector::FETCH_TYPE_NUMERIC;
67+
break;
6068
case 'iteratenumeric':
6169
$fetchType = QueryReflector::FETCH_TYPE_NUMERIC;
6270
break;
63-
case 'fetchassociative':
6471
case 'fetchallassociative':
72+
$returnsList = true;
73+
$fetchType = QueryReflector::FETCH_TYPE_ASSOC;
74+
break;
75+
case 'fetchassociative':
6576
case 'iterateassociative':
6677
$fetchType = QueryReflector::FETCH_TYPE_ASSOC;
6778
break;
@@ -99,7 +110,14 @@ public function reduceResultType(MethodReflection $methodReflection, Type $resul
99110
return new GenericObjectType(Traversable::class, [new IntegerType(), $valueTypes[$i]]);
100111
}
101112

102-
return new ArrayType(IntegerRangeType::fromInterval(0, null), $valueTypes[$i]);
113+
$arrayType = new ArrayType(IntegerRangeType::fromInterval(0, null), $valueTypes[$i]);
114+
if ($returnsList) {
115+
return TypeCombinator::intersect(
116+
$arrayType,
117+
new AccessoryArrayListType()
118+
);
119+
}
120+
return $arrayType;
103121
}
104122

105123
if (QueryReflector::FETCH_TYPE_NUMERIC === $fetchType && $keyType->isInteger()->yes()) {
@@ -116,7 +134,21 @@ public function reduceResultType(MethodReflection $methodReflection, Type $resul
116134
}
117135

118136
if (\in_array($usedMethod, ['fetchallnumeric', 'fetchallassociative'], true)) {
119-
return new ArrayType(IntegerRangeType::fromInterval(0, null), $resultType);
137+
$arrayType = new ArrayType(IntegerRangeType::fromInterval(0, null), $resultType);
138+
if ($returnsList) {
139+
return TypeCombinator::intersect(
140+
$arrayType,
141+
new AccessoryArrayListType()
142+
);
143+
}
144+
return $arrayType;
145+
}
146+
147+
if ($returnsList) {
148+
$resultType = TypeCombinator::intersect(
149+
$resultType,
150+
new AccessoryArrayListType()
151+
);
120152
}
121153

122154
// false is returned if no rows are found.

tests/default/data/doctrine-dbal.php

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,16 @@ public function foo(Connection $conn)
2424
assertType('array{string, int<-32768, 32767>}|false', $fetch);
2525

2626
$fetch = $result->fetchFirstColumn();
27-
assertType('array<int<0, max>, string>', $fetch);
27+
assertType('list<string>', $fetch);
2828

2929
$fetch = $result->fetchAssociative();
3030
assertType('array{email: string, adaid: int<-32768, 32767>}|false', $fetch);
3131

3232
$fetch = $result->fetchAllNumeric();
33-
assertType('array<int<0, max>, array{string, int<-32768, 32767>}>', $fetch);
33+
assertType('list<array{string, int<-32768, 32767>}>', $fetch);
3434

3535
$fetch = $result->fetchAllAssociative();
36-
assertType('array<int<0, max>, array{email: string, adaid: int<-32768, 32767>}>', $fetch);
36+
assertType('list<array{email: string, adaid: int<-32768, 32767>}>', $fetch);
3737

3838
$fetch = $result->fetchAllKeyValue();
3939
assertType('array<string, int<-32768, 32767>>', $fetch);
@@ -155,33 +155,33 @@ public function fetchFirstColumn(Connection $conn)
155155
{
156156
$query = 'SELECT email, adaid FROM ada WHERE adaid = ?';
157157
$fetchResult = $conn->fetchFirstColumn($query, [1]);
158-
assertType('array<int<0, max>, string>', $fetchResult);
158+
assertType('list<string>', $fetchResult);
159159

160160
$query = 'SELECT email, adaid FROM ada';
161161
$fetchResult = $conn->fetchFirstColumn($query);
162-
assertType('array<int<0, max>, string>', $fetchResult);
162+
assertType('list<string>', $fetchResult);
163163
}
164164

165165
public function fetchAllNumeric(Connection $conn)
166166
{
167167
$query = 'SELECT email, adaid FROM ada WHERE adaid = ?';
168168
$fetchResult = $conn->fetchAllNumeric($query, [1]);
169-
assertType('array<int<0, max>, array{string, int<-32768, 32767>}>', $fetchResult);
169+
assertType('list<array{string, int<-32768, 32767>}>', $fetchResult);
170170

171171
$query = 'SELECT email, adaid FROM ada';
172172
$fetchResult = $conn->fetchAllNumeric($query);
173-
assertType('array<int<0, max>, array{string, int<-32768, 32767>}>', $fetchResult);
173+
assertType('list<array{string, int<-32768, 32767>}>', $fetchResult);
174174
}
175175

176176
public function fetchAllAssociative(Connection $conn)
177177
{
178178
$query = 'SELECT email, adaid FROM ada WHERE adaid = ?';
179179
$fetchResult = $conn->fetchAllAssociative($query, [1]);
180-
assertType('array<int<0, max>, array{email: string, adaid: int<-32768, 32767>}>', $fetchResult);
180+
assertType('list<array{email: string, adaid: int<-32768, 32767>}>', $fetchResult);
181181

182182
$query = 'SELECT email, adaid FROM ada';
183183
$fetchResult = $conn->fetchAllAssociative($query);
184-
assertType('array<int<0, max>, array{email: string, adaid: int<-32768, 32767>}>', $fetchResult);
184+
assertType('list<array{email: string, adaid: int<-32768, 32767>}>', $fetchResult);
185185
}
186186

187187
public function fetchAllKeyValue(Connection $conn)

0 commit comments

Comments
 (0)