Skip to content

Commit c3b6a4a

Browse files
staabmclxmstaab
andauthored
refactor (#56)
Co-authored-by: Markus Staab <m.staab@complex-it.de>
1 parent d71e6ec commit c3b6a4a

File tree

3 files changed

+46
-10
lines changed

3 files changed

+46
-10
lines changed

src/Extensions/PdoPrepareDynamicReturnTypeExtension.php

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use PDO;
88
use PDOStatement;
9+
use PhpParser\Node\Expr;
910
use PhpParser\Node\Expr\MethodCall;
1011
use PHPStan\Analyser\Scope;
1112
use PHPStan\Php\PhpVersion;
@@ -54,10 +55,20 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method
5455
return $defaultReturn;
5556
}
5657

58+
$resultType = $this->inferType($args[0]->value, $scope);
59+
if (null !== $resultType) {
60+
return $resultType;
61+
}
62+
63+
return $defaultReturn;
64+
}
65+
66+
private function inferType(Expr $queryExpr, Scope $scope): ?Type
67+
{
5768
$queryReflection = new QueryReflection();
58-
$queryString = $queryReflection->resolveQueryString($args[0]->value, $scope);
69+
$queryString = $queryReflection->resolveQueryString($queryExpr, $scope);
5970
if (null === $queryString) {
60-
return $defaultReturn;
71+
return null;
6172
}
6273

6374
$reflectionFetchType = QueryReflector::FETCH_TYPE_BOTH;
@@ -66,6 +77,6 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method
6677
return new GenericObjectType(PDOStatement::class, [$resultType]);
6778
}
6879

69-
return $defaultReturn;
80+
return null;
7081
}
7182
}

src/Extensions/PdoQueryDynamicReturnTypeExtension.php

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use PDO;
88
use PDOStatement;
9+
use PhpParser\Node\Expr;
910
use PhpParser\Node\Expr\MethodCall;
1011
use PHPStan\Analyser\Scope;
1112
use PHPStan\Php\PhpVersion;
@@ -59,11 +60,23 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method
5960
return $defaultReturn;
6061
}
6162

63+
$resultType = $this->inferType($methodCall, $args[0]->value, $scope);
64+
if (null !== $resultType) {
65+
return $resultType;
66+
}
67+
68+
return $defaultReturn;
69+
}
70+
71+
private function inferType(MethodCall $methodCall, Expr $queryExpr, Scope $scope): ?Type
72+
{
73+
$args = $methodCall->getArgs();
74+
6275
$reflectionFetchType = QueryReflector::FETCH_TYPE_BOTH;
6376
if (\count($args) >= 2) {
6477
$fetchModeType = $scope->getType($args[1]->value);
6578
if (!$fetchModeType instanceof ConstantIntegerType) {
66-
return $defaultReturn;
79+
return null;
6780
}
6881

6982
if (PDO::FETCH_ASSOC === $fetchModeType->getValue()) {
@@ -73,21 +86,21 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method
7386
} elseif (PDO::FETCH_BOTH === $fetchModeType->getValue()) {
7487
$reflectionFetchType = QueryReflector::FETCH_TYPE_BOTH;
7588
} else {
76-
return $defaultReturn;
89+
return null;
7790
}
7891
}
7992

8093
$queryReflection = new QueryReflection();
81-
$queryString = $queryReflection->resolveQueryString($args[0]->value, $scope);
94+
$queryString = $queryReflection->resolveQueryString($queryExpr, $scope);
8295
if (null === $queryString) {
83-
return $defaultReturn;
96+
return null;
8497
}
8598

8699
$resultType = $queryReflection->getResultType($queryString, $reflectionFetchType);
87100
if ($resultType) {
88101
return new GenericObjectType(PDOStatement::class, [$resultType]);
89102
}
90103

91-
return $defaultReturn;
104+
return null;
92105
}
93106
}

src/Extensions/PdoQuoteDynamicReturnTypeExtension.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,24 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method
5656
return $defaultReturn;
5757
}
5858

59+
$stringType = $this->inferType($methodCall, $scope);
60+
if (null !== $stringType) {
61+
return $stringType;
62+
}
63+
64+
return $defaultReturn;
65+
}
66+
67+
private function inferType(MethodCall $methodCall, Scope $scope): ?Type
68+
{
69+
$args = $methodCall->getArgs();
70+
5971
if (1 === \count($args)) {
6072
$type = PDO::PARAM_STR;
6173
} else {
6274
$typeType = $scope->getType($args[1]->value);
6375
if (!$typeType instanceof ConstantIntegerType) {
64-
return $defaultReturn;
76+
return null;
6577
}
6678
$type = $typeType->getValue();
6779
}
@@ -78,7 +90,7 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method
7890
return $stringType;
7991
}
8092

81-
return TypeCombinator::union($stringType, new ConstantBooleanType(false));
93+
return TypeCombinator::union($stringType, new ConstantBooleanType(false));;
8294
}
8395

8496
private function inferStringType(Type $argType): Type

0 commit comments

Comments
 (0)