Skip to content

Commit 8b0541c

Browse files
Seldaekstaabm
authored andcommitted
WIP for bound parameter type forwarding
1 parent 5e37fec commit 8b0541c

6 files changed

+22
-17
lines changed

src/Extensions/DoctrineConnectionExecuteQueryDynamicReturnTypeExtension.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,28 +54,33 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method
5454
}
5555

5656
$params = null;
57+
$paramTypes = null;
5758
if (\count($args) > 1) {
5859
$params = $args[1]->value;
5960
}
61+
if (\count($args) > 2) {
62+
$paramTypes = $args[2]->value;
63+
}
6064

61-
$resultType = $this->inferType($args[0]->value, $params, $scope);
65+
$resultType = $this->inferType($args[0]->value, $params, $paramTypes, $scope);
6266
if (null !== $resultType) {
6367
return $resultType;
6468
}
6569

6670
return $defaultReturn;
6771
}
6872

69-
private function inferType(Expr $queryExpr, ?Expr $paramsExpr, Scope $scope): ?Type
73+
private function inferType(Expr $queryExpr, ?Expr $paramsExpr, ?Expr $paramTypesExpr, Scope $scope): ?Type
7074
{
7175
if (null === $paramsExpr) {
7276
$queryReflection = new QueryReflection();
7377
$queryStrings = $queryReflection->resolveQueryStrings($queryExpr, $scope);
7478
} else {
7579
$parameterTypes = $scope->getType($paramsExpr);
80+
$boundParameterTypes = $scope->getType($paramsExpr);
7681

7782
$queryReflection = new QueryReflection();
78-
$queryStrings = $queryReflection->resolvePreparedQueryStrings($queryExpr, $parameterTypes, $scope);
83+
$queryStrings = $queryReflection->resolvePreparedQueryStrings($queryExpr, $parameterTypes, $boundParameterTypes, $scope);
7984
}
8085

8186
$doctrineReflection = new DoctrineReflection();

src/Extensions/DoctrineConnectionFetchDynamicReturnTypeExtension.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ private function inferType(MethodReflection $methodReflection, Expr $queryExpr,
8888
$queryStrings = $queryReflection->resolveQueryStrings($queryExpr, $scope);
8989
} else {
9090
$parameterTypes = $scope->getType($paramsExpr);
91-
$queryStrings = $queryReflection->resolvePreparedQueryStrings($queryExpr, $parameterTypes, $scope);
91+
$queryStrings = $queryReflection->resolvePreparedQueryStrings($queryExpr, $parameterTypes, null, $scope);
9292
}
9393

9494
return $doctrineReflection->createFetchType($queryStrings, $methodReflection);

src/Extensions/DoctrineStatementExecuteDynamicReturnTypeExtension.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ private function inferType(MethodReflection $methodReflection, MethodCall $metho
7070
}
7171

7272
$queryReflection = new QueryReflection();
73-
$queryStrings = $queryReflection->resolvePreparedQueryStrings($queryExpr, $parameterTypes, $scope);
73+
$queryStrings = $queryReflection->resolvePreparedQueryStrings($queryExpr, $parameterTypes, null, $scope);
7474

7575
return $doctrineReflection->createGenericResult($queryStrings, QueryReflector::FETCH_TYPE_BOTH);
7676
}

src/Extensions/PdoStatementExecuteTypeSpecifyingExtension.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ private function inferStatementType(MethodReflection $methodReflection, MethodCa
6666
$parameterTypes = $scope->getType($args[0]->value);
6767

6868
$queryReflection = new QueryReflection();
69-
$queryStrings = $queryReflection->resolvePreparedQueryStrings($queryExpr, $parameterTypes, $scope);
69+
$queryStrings = $queryReflection->resolvePreparedQueryStrings($queryExpr, $parameterTypes, null, $scope);
7070

7171
$reflectionFetchType = QueryReflection::getRuntimeConfiguration()->getDefaultFetchMode();
7272

src/QueryReflection/QueryReflection.php

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,12 @@ public function getResultType(string $queryString, int $fetchType): ?Type
7373
*
7474
* @throws UnresolvableQueryException
7575
*/
76-
public function resolvePreparedQueryStrings(Expr $queryExpr, Type $parameterTypes, Scope $scope): iterable
76+
public function resolvePreparedQueryStrings(Expr $queryExpr, Type $parameterTypes, ?Type $boundParameterTypes, Scope $scope): iterable
7777
{
7878
$type = $scope->getType($queryExpr);
7979

8080
if ($type instanceof UnionType) {
81-
$parameters = $this->resolveParameters($parameterTypes);
81+
$parameters = $this->resolveParameters($parameterTypes, $boundParameterTypes);
8282
if (null === $parameters) {
8383
return null;
8484
}
@@ -103,15 +103,15 @@ public function resolvePreparedQueryStrings(Expr $queryExpr, Type $parameterType
103103
*
104104
* @throws UnresolvableQueryException
105105
*/
106-
public function resolvePreparedQueryString(Expr $queryExpr, Type $parameterTypes, Scope $scope): ?string
106+
public function resolvePreparedQueryString(Expr $queryExpr, Type $parameterTypes, ?Type, $boundParameterTypes, Scope $scope): ?string
107107
{
108108
$queryString = $this->resolveQueryExpr($queryExpr, $scope);
109109

110110
if (null === $queryString) {
111111
return null;
112112
}
113113

114-
$parameters = $this->resolveParameters($parameterTypes);
114+
$parameters = $this->resolveParameters($parameterTypes, $boundParameterTypes);
115115
if (null === $parameters) {
116116
return null;
117117
}
@@ -211,20 +211,20 @@ public static function getQueryType(string $query): ?string
211211
*
212212
* @throws UnresolvableQueryException
213213
*/
214-
public function resolveParameters(Type $parameterTypes): ?array
214+
public function resolveParameters(Type $parameterTypes, ?Type $boundParameterTypes): ?array
215215
{
216216
$parameters = [];
217217

218218
if ($parameterTypes instanceof UnionType) {
219219
foreach (TypeUtils::getConstantArrays($parameterTypes) as $constantArray) {
220-
$parameters = $parameters + $this->resolveConstantArray($constantArray, true);
220+
$parameters = $parameters + $this->resolveConstantArray($constantArray, $boundParameterTypes, true);
221221
}
222222

223223
return $parameters;
224224
}
225225

226226
if ($parameterTypes instanceof ConstantArrayType) {
227-
return $this->resolveConstantArray($parameterTypes, false);
227+
return $this->resolveConstantArray($parameterTypes, $boundParameterTypes, false);
228228
}
229229

230230
return null;
@@ -235,7 +235,7 @@ public function resolveParameters(Type $parameterTypes): ?array
235235
*
236236
* @throws UnresolvableQueryException
237237
*/
238-
private function resolveConstantArray(ConstantArrayType $parameterTypes, bool $forceOptional): array
238+
private function resolveConstantArray(ConstantArrayType $parameterTypes, ?Type $boundParameterTypes, bool $forceOptional): array
239239
{
240240
$parameters = [];
241241

@@ -259,7 +259,7 @@ private function resolveConstantArray(ConstantArrayType $parameterTypes, bool $f
259259
$param = new Parameter(
260260
$placeholderName,
261261
$valueTypes[$i],
262-
QuerySimulation::simulateParamValueType($valueTypes[$i], true),
262+
QuerySimulation::simulateParamValueType($valueTypes[$i], true), // TODO pass $i of $boundParameterTypes here if a resolved constant type is available?
263263
$isOptional
264264
);
265265

@@ -268,7 +268,7 @@ private function resolveConstantArray(ConstantArrayType $parameterTypes, bool $f
268268
$param = new Parameter(
269269
null,
270270
$valueTypes[$i],
271-
QuerySimulation::simulateParamValueType($valueTypes[$i], true),
271+
QuerySimulation::simulateParamValueType($valueTypes[$i], true), // TODO pass $i of $boundParameterTypes here if a resolved constant type is available?
272272
$isOptional
273273
);
274274

src/Rules/PdoStatementExecuteMethodRule.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ private function checkErrors(MethodReflection $methodReflection, MethodCall $met
9595
}
9696

9797
try {
98-
$parameters = $queryReflection->resolveParameters($parameterTypes) ?? [];
98+
$parameters = $queryReflection->resolveParameters($parameterTypes, null) ?? [];
9999
} catch (UnresolvableQueryException $exception) {
100100
return [
101101
RuleErrorBuilder::message($exception->asRuleMessage())->tip(UnresolvableQueryException::RULE_TIP)->line($methodCall->getLine())->build(),

0 commit comments

Comments
 (0)