From 1de37e3a3e53f7044f7406df4edfdce003a29e54 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Tue, 4 Jan 2022 21:08:11 +0100 Subject: [PATCH 1/3] refactoring --- src/DbaException.php | 2 +- ...RunMysqlQueryDynamicReturnTypeExtension.php | 7 ++++++- .../MysqliQueryDynamicReturnTypeExtension.php | 7 ++++++- .../PdoQueryDynamicReturnTypeExtension.php | 7 ++++++- src/QueryReflection/QueryReflection.php | 18 ++++++------------ src/Rules/SyntaxErrorInQueryFunctionRule.php | 13 +++++++++---- src/Rules/SyntaxErrorInQueryMethodRule.php | 13 +++++++++---- 7 files changed, 43 insertions(+), 24 deletions(-) diff --git a/src/DbaException.php b/src/DbaException.php index ec7377cc3..f5ec678f3 100644 --- a/src/DbaException.php +++ b/src/DbaException.php @@ -2,6 +2,6 @@ namespace staabm\PHPStanDba; -final class DbaException extends \Exception +final class DbaException extends \RuntimeException { } diff --git a/src/Extensions/DeployerRunMysqlQueryDynamicReturnTypeExtension.php b/src/Extensions/DeployerRunMysqlQueryDynamicReturnTypeExtension.php index 51c9750ab..ddb14a752 100644 --- a/src/Extensions/DeployerRunMysqlQueryDynamicReturnTypeExtension.php +++ b/src/Extensions/DeployerRunMysqlQueryDynamicReturnTypeExtension.php @@ -35,7 +35,12 @@ public function getTypeFromFunctionCall(FunctionReflection $functionReflection, } $queryReflection = new QueryReflection(); - $resultType = $queryReflection->getResultType($args[0]->value, $scope, QueryReflector::FETCH_TYPE_NUMERIC); + $queryString = $queryReflection->resolveQueryString($args[0]->value, $scope); + if (null === $queryString) { + return ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType(); + } + + $resultType = $queryReflection->getResultType($queryString, QueryReflector::FETCH_TYPE_NUMERIC); if ($resultType instanceof ConstantArrayType) { $builder = ConstantArrayTypeBuilder::createEmpty(); foreach ($resultType->getKeyTypes() as $keyType) { diff --git a/src/Extensions/MysqliQueryDynamicReturnTypeExtension.php b/src/Extensions/MysqliQueryDynamicReturnTypeExtension.php index d7c1540b8..c00edf776 100644 --- a/src/Extensions/MysqliQueryDynamicReturnTypeExtension.php +++ b/src/Extensions/MysqliQueryDynamicReturnTypeExtension.php @@ -47,7 +47,12 @@ public function getTypeFromFunctionCall(FunctionReflection $functionReflection, } $queryReflection = new QueryReflection(); - $resultType = $queryReflection->getResultType($args[1]->value, $scope, QueryReflector::FETCH_TYPE_ASSOC); + $queryString = $queryReflection->resolveQueryString($args[1]->value, $scope); + if ($queryString === null) { + return ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType(); + } + + $resultType = $queryReflection->getResultType($queryString, QueryReflector::FETCH_TYPE_ASSOC); if ($resultType) { return TypeCombinator::union( new GenericObjectType(mysqli_result::class, [$resultType]), diff --git a/src/Extensions/PdoQueryDynamicReturnTypeExtension.php b/src/Extensions/PdoQueryDynamicReturnTypeExtension.php index 3f0954edd..1ed3052b5 100644 --- a/src/Extensions/PdoQueryDynamicReturnTypeExtension.php +++ b/src/Extensions/PdoQueryDynamicReturnTypeExtension.php @@ -62,7 +62,12 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method } $queryReflection = new QueryReflection(); - $resultType = $queryReflection->getResultType($args[0]->value, $scope, $reflectionFetchType); + $queryString = $queryReflection->resolveQueryString($args[0]->value, $scope); + if ($queryString === null){ + return $defaultReturn; + } + + $resultType = $queryReflection->getResultType($queryString, $reflectionFetchType); if ($resultType) { return new GenericObjectType(PDOStatement::class, [$resultType]); } diff --git a/src/QueryReflection/QueryReflection.php b/src/QueryReflection/QueryReflection.php index a451d4e78..9fb656df8 100644 --- a/src/QueryReflection/QueryReflection.php +++ b/src/QueryReflection/QueryReflection.php @@ -33,9 +33,9 @@ public static function setupReflector(QueryReflector $reflector): void self::$reflector = $reflector; } - public function validateQueryString(Expr $expr, Scope $scope): ?Error + public function validateQueryString(string $queryString): ?Error { - $queryString = $this->builtSimulatedQuery($expr, $scope); + $queryString = $this->builtSimulatedQuery($queryString); if (null === $queryString) { return null; @@ -47,9 +47,9 @@ public function validateQueryString(Expr $expr, Scope $scope): ?Error /** * @param QueryReflector::FETCH_TYPE* $fetchType */ - public function getResultType(Expr $expr, Scope $scope, int $fetchType): ?Type + public function getResultType(string $queryString, int $fetchType): ?Type { - $queryString = $this->builtSimulatedQuery($expr, $scope); + $queryString = $this->builtSimulatedQuery($queryString); if (null === $queryString) { return null; @@ -58,14 +58,8 @@ public function getResultType(Expr $expr, Scope $scope, int $fetchType): ?Type return self::reflector()->getResultType($queryString, $fetchType); } - private function builtSimulatedQuery(Expr $expr, Scope $scope): ?string + private function builtSimulatedQuery(string $queryString): ?string { - $queryString = $this->resolveQueryString($expr, $scope); - - if (null === $queryString) { - return null; - } - if ('SELECT' !== $this->getQueryType($queryString)) { return null; } @@ -78,7 +72,7 @@ private function builtSimulatedQuery(Expr $expr, Scope $scope): ?string return $queryString; } - private function resolveQueryString(Expr $expr, Scope $scope): ?string + public function resolveQueryString(Expr $expr, Scope $scope): ?string { if ($expr instanceof Concat) { $left = $expr->left; diff --git a/src/Rules/SyntaxErrorInQueryFunctionRule.php b/src/Rules/SyntaxErrorInQueryFunctionRule.php index d63c3e8df..474512866 100644 --- a/src/Rules/SyntaxErrorInQueryFunctionRule.php +++ b/src/Rules/SyntaxErrorInQueryFunctionRule.php @@ -71,10 +71,15 @@ public function processNode(Node $node, Scope $scope): array $errors = []; $queryReflection = new QueryReflection(); - $error = $queryReflection->validateQueryString($args[$queryArgPosition]->value, $scope); - if (null !== $error) { - $errors[] = RuleErrorBuilder::message('Query error: '.$error->getMessage().' ('.$error->getCode().').')->line($node->getLine())->build(); - } + $queryString = $queryReflection->resolveQueryString($args[$queryArgPosition]->value, $scope); + if ($queryString === null) { + return $errors; + } + + $error = $queryReflection->validateQueryString($queryString); + if (null !== $error) { + $errors[] = RuleErrorBuilder::message('Query error: '.$error->getMessage().' ('.$error->getCode().').')->line($node->getLine())->build(); + } return $errors; } diff --git a/src/Rules/SyntaxErrorInQueryMethodRule.php b/src/Rules/SyntaxErrorInQueryMethodRule.php index 8921c1dcb..0846159bd 100644 --- a/src/Rules/SyntaxErrorInQueryMethodRule.php +++ b/src/Rules/SyntaxErrorInQueryMethodRule.php @@ -64,10 +64,15 @@ public function processNode(Node $node, Scope $scope): array $errors = []; $queryReflection = new QueryReflection(); - $error = $queryReflection->validateQueryString($args[$queryArgPosition]->value, $scope); - if (null !== $error) { - $errors[] = RuleErrorBuilder::message('Query error: '.$error->getMessage().' ('.$error->getCode().').')->line($node->getLine())->build(); - } + $queryString = $queryReflection->resolveQueryString($args[$queryArgPosition]->value, $scope); + if (null === $queryString) { + return $errors; + } + + $error = $queryReflection->validateQueryString($queryString); + if (null !== $error) { + $errors[] = RuleErrorBuilder::message('Query error: '.$error->getMessage().' ('.$error->getCode().').')->line($node->getLine())->build(); + } return $errors; } From 72f15b1699cfd8f8186a69951a94f924e038ff87 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Tue, 4 Jan 2022 21:08:29 +0100 Subject: [PATCH 2/3] cs --- .../MysqliQueryDynamicReturnTypeExtension.php | 8 ++++---- .../PdoQueryDynamicReturnTypeExtension.php | 8 ++++---- src/Rules/SyntaxErrorInQueryFunctionRule.php | 16 ++++++++-------- src/Rules/SyntaxErrorInQueryMethodRule.php | 12 ++++++------ 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/Extensions/MysqliQueryDynamicReturnTypeExtension.php b/src/Extensions/MysqliQueryDynamicReturnTypeExtension.php index c00edf776..9c1ab3c95 100644 --- a/src/Extensions/MysqliQueryDynamicReturnTypeExtension.php +++ b/src/Extensions/MysqliQueryDynamicReturnTypeExtension.php @@ -47,10 +47,10 @@ public function getTypeFromFunctionCall(FunctionReflection $functionReflection, } $queryReflection = new QueryReflection(); - $queryString = $queryReflection->resolveQueryString($args[1]->value, $scope); - if ($queryString === null) { - return ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType(); - } + $queryString = $queryReflection->resolveQueryString($args[1]->value, $scope); + if (null === $queryString) { + return ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType(); + } $resultType = $queryReflection->getResultType($queryString, QueryReflector::FETCH_TYPE_ASSOC); if ($resultType) { diff --git a/src/Extensions/PdoQueryDynamicReturnTypeExtension.php b/src/Extensions/PdoQueryDynamicReturnTypeExtension.php index 1ed3052b5..838c2e69c 100644 --- a/src/Extensions/PdoQueryDynamicReturnTypeExtension.php +++ b/src/Extensions/PdoQueryDynamicReturnTypeExtension.php @@ -62,10 +62,10 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method } $queryReflection = new QueryReflection(); - $queryString = $queryReflection->resolveQueryString($args[0]->value, $scope); - if ($queryString === null){ - return $defaultReturn; - } + $queryString = $queryReflection->resolveQueryString($args[0]->value, $scope); + if (null === $queryString) { + return $defaultReturn; + } $resultType = $queryReflection->getResultType($queryString, $reflectionFetchType); if ($resultType) { diff --git a/src/Rules/SyntaxErrorInQueryFunctionRule.php b/src/Rules/SyntaxErrorInQueryFunctionRule.php index 474512866..bea82ac9b 100644 --- a/src/Rules/SyntaxErrorInQueryFunctionRule.php +++ b/src/Rules/SyntaxErrorInQueryFunctionRule.php @@ -72,14 +72,14 @@ public function processNode(Node $node, Scope $scope): array $queryReflection = new QueryReflection(); $queryString = $queryReflection->resolveQueryString($args[$queryArgPosition]->value, $scope); - if ($queryString === null) { - return $errors; - } - - $error = $queryReflection->validateQueryString($queryString); - if (null !== $error) { - $errors[] = RuleErrorBuilder::message('Query error: '.$error->getMessage().' ('.$error->getCode().').')->line($node->getLine())->build(); - } + if (null === $queryString) { + return $errors; + } + + $error = $queryReflection->validateQueryString($queryString); + if (null !== $error) { + $errors[] = RuleErrorBuilder::message('Query error: '.$error->getMessage().' ('.$error->getCode().').')->line($node->getLine())->build(); + } return $errors; } diff --git a/src/Rules/SyntaxErrorInQueryMethodRule.php b/src/Rules/SyntaxErrorInQueryMethodRule.php index 0846159bd..a48102084 100644 --- a/src/Rules/SyntaxErrorInQueryMethodRule.php +++ b/src/Rules/SyntaxErrorInQueryMethodRule.php @@ -66,13 +66,13 @@ public function processNode(Node $node, Scope $scope): array $queryReflection = new QueryReflection(); $queryString = $queryReflection->resolveQueryString($args[$queryArgPosition]->value, $scope); if (null === $queryString) { - return $errors; - } + return $errors; + } - $error = $queryReflection->validateQueryString($queryString); - if (null !== $error) { - $errors[] = RuleErrorBuilder::message('Query error: '.$error->getMessage().' ('.$error->getCode().').')->line($node->getLine())->build(); - } + $error = $queryReflection->validateQueryString($queryString); + if (null !== $error) { + $errors[] = RuleErrorBuilder::message('Query error: '.$error->getMessage().' ('.$error->getCode().').')->line($node->getLine())->build(); + } return $errors; } From 743664284406e1be66413d301e39a51dcb68ca4c Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Tue, 4 Jan 2022 21:10:16 +0100 Subject: [PATCH 3/3] fix --- src/Extensions/MysqliQueryDynamicReturnTypeExtension.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Extensions/MysqliQueryDynamicReturnTypeExtension.php b/src/Extensions/MysqliQueryDynamicReturnTypeExtension.php index 9c1ab3c95..66f2e9b7a 100644 --- a/src/Extensions/MysqliQueryDynamicReturnTypeExtension.php +++ b/src/Extensions/MysqliQueryDynamicReturnTypeExtension.php @@ -72,7 +72,12 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method } $queryReflection = new QueryReflection(); - $resultType = $queryReflection->getResultType($args[0]->value, $scope, QueryReflector::FETCH_TYPE_ASSOC); + $queryString = $queryReflection->resolveQueryString($args[0]->value, $scope); + if (null === $queryString) { + return ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType(); + } + + $resultType = $queryReflection->getResultType($queryString, QueryReflector::FETCH_TYPE_ASSOC); if ($resultType) { return TypeCombinator::union( new GenericObjectType(mysqli_result::class, [$resultType]),