Skip to content

Commit 7532530

Browse files
committed
Update PdoStatementObjectType.php
1 parent e18ebfa commit 7532530

File tree

1 file changed

+31
-25
lines changed

1 file changed

+31
-25
lines changed

src/PdoReflection/PdoStatementObjectType.php

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

77
use PDOStatement;
8+
use PHPStan\ShouldNotHappenException;
89
use PHPStan\Type\ArrayType;
910
use PHPStan\Type\BenevolentUnionType;
1011
use PHPStan\Type\Constant\ConstantArrayTypeBuilder;
@@ -21,43 +22,48 @@
2122
use PHPStan\Type\UnionType;
2223
use staabm\PHPStanDba\QueryReflection\QueryReflector;
2324

24-
class PdoStatementObjectType extends GenericObjectType
25+
class PdoStatementObjectType extends ObjectType
2526
{
26-
/**
27-
* @var Type
28-
*/
29-
private $bothType;
27+
private ?Type $bothType;
3028

3129
/**
32-
* @param QueryReflector::FETCH_TYPE* $fetchType
30+
* @var null|QueryReflector::FETCH_TYPE*
3331
*/
34-
public function __construct(Type $bothType, int $fetchType)
35-
{
36-
$this->bothType = $bothType;
37-
38-
$rowTypeInFetchMode = $this->reduceBothType($bothType, $fetchType);
39-
40-
parent::__construct(PDOStatement::class, [$rowTypeInFetchMode]);
41-
}
32+
private ?int $fetchType;
4233

4334
public function getRowType(): Type
4435
{
45-
$genericTypes = $this->getTypes();
46-
47-
return $genericTypes[0];
36+
if ($this->bothType === null || $this->fetchType === null) {
37+
throw new ShouldNotHappenException();
38+
}
39+
return $this->reduceBothType($this->bothType, $this->fetchType);
4840
}
4941

5042
public function getIterableValueType(): Type
5143
{
5244
return $this->getRowType();
5345
}
5446

47+
/**
48+
* @param QueryReflector::FETCH_TYPE* $fetchType
49+
*/
50+
static public function newWithBothAndFetchType(Type $bothType, int $fetchType): self
51+
{
52+
$new = new self(PDOStatement::class);
53+
$new->bothType = $bothType;
54+
$new->fetchType = $fetchType;
55+
return $new;
56+
}
57+
5558
/**
5659
* @param QueryReflector::FETCH_TYPE* $fetchType
5760
*/
5861
public function newWithFetchType(int $fetchType): self
5962
{
60-
return new self($this->bothType, $fetchType);
63+
$new = new self($this->getClassName(), $this->getSubtractedType());
64+
$new->bothType = $this->bothType;
65+
$new->fetchType = $fetchType;
66+
return $new;
6167
}
6268

6369
/**
@@ -121,23 +127,23 @@ public static function createDefaultType(int $fetchType): Type
121127

122128
switch ($fetchType) {
123129
case QueryReflector::FETCH_TYPE_CLASS:
124-
return new GenericObjectType(PDOStatement::class, [new ObjectType('stdClass')]);
130+
return self::newWithBothAndFetchType(new ObjectType('stdClass'), $fetchType);
125131
case QueryReflector::FETCH_TYPE_KEY_VALUE:
126132
$arrayBuilder = ConstantArrayTypeBuilder::createEmpty();
127133
$arrayBuilder->setOffsetValueType(new ConstantIntegerType(0), new MixedType());
128134
$arrayBuilder->setOffsetValueType(new ConstantIntegerType(1), new MixedType());
129135

130-
return new GenericObjectType(PDOStatement::class, [$arrayBuilder->getArray()]);
136+
return self::newWithBothAndFetchType($arrayBuilder->getArray(), $fetchType);
131137
case QueryReflector::FETCH_TYPE_NUMERIC:
132-
return new GenericObjectType(PDOStatement::class, [new ArrayType(IntegerRangeType::fromInterval(0, null), $pdoScalar)]);
138+
return self::newWithBothAndFetchType(new ArrayType(IntegerRangeType::fromInterval(0, null), $pdoScalar), $fetchType);
133139
case QueryReflector::FETCH_TYPE_ASSOC:
134-
return new GenericObjectType(PDOStatement::class, [new ArrayType(new StringType(), $pdoScalar)]);
140+
return self::newWithBothAndFetchType(new ArrayType(new StringType(), $pdoScalar), $fetchType);
135141
case QueryReflector::FETCH_TYPE_BOTH:
136-
return new GenericObjectType(PDOStatement::class, [new ArrayType($arrayKey, $pdoScalar)]);
142+
return self::newWithBothAndFetchType(new ArrayType($arrayKey, $pdoScalar), $fetchType);
137143
case QueryReflector::FETCH_TYPE_COLUMN:
138-
return new GenericObjectType(PDOStatement::class, [$pdoScalar]);
144+
return self::newWithBothAndFetchType($pdoScalar, $fetchType);
139145
}
140146

141-
return new GenericObjectType(PDOStatement::class, [new MixedType()]);
147+
return self::newWithBothAndFetchType(new MixedType(), $fetchType);
142148
}
143149
}

0 commit comments

Comments
 (0)