Skip to content

Commit 88fd3b2

Browse files
authored
refactored PdoStatementReflection (#264)
1 parent 91283ee commit 88fd3b2

File tree

3 files changed

+35
-24
lines changed

3 files changed

+35
-24
lines changed

src/Extensions/PdoQueryDynamicReturnTypeExtension.php

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@
1313
use PHPStan\Reflection\MethodReflection;
1414
use PHPStan\Reflection\ParametersAcceptorSelector;
1515
use PHPStan\Type\Constant\ConstantBooleanType;
16-
use PHPStan\Type\Constant\ConstantIntegerType;
1716
use PHPStan\Type\DynamicMethodReturnTypeExtension;
1817
use PHPStan\Type\Generic\GenericObjectType;
1918
use PHPStan\Type\MixedType;
2019
use PHPStan\Type\Type;
2120
use PHPStan\Type\TypeCombinator;
21+
use staabm\PHPStanDba\PdoReflection\PdoStatementReflection;
2222
use staabm\PHPStanDba\QueryReflection\QueryReflection;
2323
use staabm\PHPStanDba\QueryReflection\QueryReflector;
2424

@@ -76,21 +76,14 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method
7676
private function inferType(MethodCall $methodCall, Expr $queryExpr, Scope $scope): ?Type
7777
{
7878
$args = $methodCall->getArgs();
79+
$pdoStatementReflection = new PdoStatementReflection();
7980

8081
$reflectionFetchType = QueryReflector::FETCH_TYPE_BOTH;
8182
if (\count($args) >= 2) {
8283
$fetchModeType = $scope->getType($args[1]->value);
83-
if (!$fetchModeType instanceof ConstantIntegerType) {
84-
return null;
85-
}
8684

87-
if (PDO::FETCH_ASSOC === $fetchModeType->getValue()) {
88-
$reflectionFetchType = QueryReflector::FETCH_TYPE_ASSOC;
89-
} elseif (PDO::FETCH_NUM === $fetchModeType->getValue()) {
90-
$reflectionFetchType = QueryReflector::FETCH_TYPE_NUMERIC;
91-
} elseif (PDO::FETCH_BOTH === $fetchModeType->getValue()) {
92-
$reflectionFetchType = QueryReflector::FETCH_TYPE_BOTH;
93-
} else {
85+
$reflectionFetchType = $pdoStatementReflection->getFetchType($fetchModeType);
86+
if (null === $reflectionFetchType) {
9487
return null;
9588
}
9689
}

src/Extensions/PdoStatementFetchDynamicReturnTypeExtension.php

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

55
namespace staabm\PHPStanDba\Extensions;
66

7-
use PDO;
87
use PDOStatement;
98
use PhpParser\Node\Expr\MethodCall;
109
use PHPStan\Analyser\Scope;
@@ -13,7 +12,6 @@
1312
use PHPStan\Reflection\ParametersAcceptorSelector;
1413
use PHPStan\Type\ArrayType;
1514
use PHPStan\Type\Constant\ConstantBooleanType;
16-
use PHPStan\Type\Constant\ConstantIntegerType;
1715
use PHPStan\Type\DynamicMethodReturnTypeExtension;
1816
use PHPStan\Type\IntegerType;
1917
use PHPStan\Type\MixedType;
@@ -22,6 +20,7 @@
2220
use PHPStan\Type\UnionType;
2321
use staabm\PHPStanDba\PdoReflection\PdoStatementReflection;
2422
use staabm\PHPStanDba\QueryReflection\QueryReflection;
23+
use staabm\PHPStanDba\QueryReflection\QueryReflector;
2524

2625
final class PdoStatementFetchDynamicReturnTypeExtension implements DynamicMethodReturnTypeExtension
2726
{
@@ -64,22 +63,20 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method
6463
private function inferType(MethodReflection $methodReflection, MethodCall $methodCall, Scope $scope): ?Type
6564
{
6665
$args = $methodCall->getArgs();
66+
$pdoStatementReflection = new PdoStatementReflection();
67+
6768
$statementType = $scope->getType($methodCall->var);
6869

69-
$fetchType = PDO::FETCH_BOTH;
70+
$fetchType = QueryReflector::FETCH_TYPE_BOTH;
7071
if (\count($args) > 0) {
7172
$fetchModeType = $scope->getType($args[0]->value);
72-
if (!$fetchModeType instanceof ConstantIntegerType) {
73-
return null;
74-
}
75-
$fetchType = $fetchModeType->getValue();
73+
$fetchType = $pdoStatementReflection->getFetchType($fetchModeType);
7674

77-
if (!\in_array($fetchType, [PDO::FETCH_ASSOC, PDO::FETCH_NUM, PDO::FETCH_BOTH], true)) {
75+
if (null === $fetchType) {
7876
return null;
7977
}
8078
}
8179

82-
$pdoStatementReflection = new PdoStatementReflection();
8380
$resultType = $pdoStatementReflection->getStatementResultType($statementType, $fetchType);
8481
if (null === $resultType) {
8582
return null;

src/PdoReflection/PdoStatementReflection.php

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use PHPStan\Type\Generic\GenericObjectType;
1515
use PHPStan\Type\Type;
1616
use staabm\PHPStanDba\QueryReflection\ExpressionFinder;
17+
use staabm\PHPStanDba\QueryReflection\QueryReflector;
1718

1819
final class PdoStatementReflection
1920
{
@@ -33,7 +34,27 @@ public function findPrepareQueryStringExpression(MethodCall $methodCall): ?Expr
3334
}
3435

3536
/**
36-
* @param PDO::FETCH* $fetchType
37+
* @return QueryReflector::FETCH_TYPE*|null
38+
*/
39+
public function getFetchType(Type $fetchModeType): ?int
40+
{
41+
if (!$fetchModeType instanceof ConstantIntegerType) {
42+
return null;
43+
}
44+
45+
if (PDO::FETCH_ASSOC === $fetchModeType->getValue()) {
46+
return QueryReflector::FETCH_TYPE_ASSOC;
47+
} elseif (PDO::FETCH_NUM === $fetchModeType->getValue()) {
48+
return QueryReflector::FETCH_TYPE_NUMERIC;
49+
} elseif (PDO::FETCH_BOTH === $fetchModeType->getValue()) {
50+
return QueryReflector::FETCH_TYPE_BOTH;
51+
}
52+
53+
return null;
54+
}
55+
56+
/**
57+
* @param QueryReflector::FETCH_TYPE* $fetchType
3758
*/
3859
public function getStatementResultType(Type $statementType, int $fetchType): ?Type
3960
{
@@ -47,17 +68,17 @@ public function getStatementResultType(Type $statementType, int $fetchType): ?Ty
4768
}
4869

4970
$resultType = $genericTypes[0];
50-
if ((PDO::FETCH_NUM === $fetchType || PDO::FETCH_ASSOC === $fetchType) &&
71+
if ((QueryReflector::FETCH_TYPE_NUMERIC === $fetchType || QueryReflector::FETCH_TYPE_ASSOC === $fetchType) &&
5172
$resultType instanceof ConstantArrayType && \count($resultType->getValueTypes()) > 0) {
5273
$builder = ConstantArrayTypeBuilder::createEmpty();
5374

5475
$keyTypes = $resultType->getKeyTypes();
5576
$valueTypes = $resultType->getValueTypes();
5677

5778
foreach ($keyTypes as $i => $keyType) {
58-
if (PDO::FETCH_NUM === $fetchType && $keyType instanceof ConstantIntegerType) {
79+
if (QueryReflector::FETCH_TYPE_NUMERIC === $fetchType && $keyType instanceof ConstantIntegerType) {
5980
$builder->setOffsetValueType($keyType, $valueTypes[$i]);
60-
} elseif (PDO::FETCH_ASSOC === $fetchType && $keyType instanceof ConstantStringType) {
81+
} elseif (QueryReflector::FETCH_TYPE_ASSOC === $fetchType && $keyType instanceof ConstantStringType) {
6182
$builder->setOffsetValueType($keyType, $valueTypes[$i]);
6283
}
6384
}

0 commit comments

Comments
 (0)