Skip to content

Commit 5e96945

Browse files
authored
refactoring (#32)
1 parent 73bb48f commit 5e96945

7 files changed

+43
-19
lines changed

src/DbaException.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22

33
namespace staabm\PHPStanDba;
44

5-
final class DbaException extends \Exception
5+
final class DbaException extends \RuntimeException
66
{
77
}

src/Extensions/DeployerRunMysqlQueryDynamicReturnTypeExtension.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,12 @@ public function getTypeFromFunctionCall(FunctionReflection $functionReflection,
3535
}
3636

3737
$queryReflection = new QueryReflection();
38-
$resultType = $queryReflection->getResultType($args[0]->value, $scope, QueryReflector::FETCH_TYPE_NUMERIC);
38+
$queryString = $queryReflection->resolveQueryString($args[0]->value, $scope);
39+
if (null === $queryString) {
40+
return ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
41+
}
42+
43+
$resultType = $queryReflection->getResultType($queryString, QueryReflector::FETCH_TYPE_NUMERIC);
3944
if ($resultType instanceof ConstantArrayType) {
4045
$builder = ConstantArrayTypeBuilder::createEmpty();
4146
foreach ($resultType->getKeyTypes() as $keyType) {

src/Extensions/MysqliQueryDynamicReturnTypeExtension.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,12 @@ public function getTypeFromFunctionCall(FunctionReflection $functionReflection,
4747
}
4848

4949
$queryReflection = new QueryReflection();
50-
$resultType = $queryReflection->getResultType($args[1]->value, $scope, QueryReflector::FETCH_TYPE_ASSOC);
50+
$queryString = $queryReflection->resolveQueryString($args[1]->value, $scope);
51+
if (null === $queryString) {
52+
return ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
53+
}
54+
55+
$resultType = $queryReflection->getResultType($queryString, QueryReflector::FETCH_TYPE_ASSOC);
5156
if ($resultType) {
5257
return TypeCombinator::union(
5358
new GenericObjectType(mysqli_result::class, [$resultType]),
@@ -67,7 +72,12 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method
6772
}
6873

6974
$queryReflection = new QueryReflection();
70-
$resultType = $queryReflection->getResultType($args[0]->value, $scope, QueryReflector::FETCH_TYPE_ASSOC);
75+
$queryString = $queryReflection->resolveQueryString($args[0]->value, $scope);
76+
if (null === $queryString) {
77+
return ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
78+
}
79+
80+
$resultType = $queryReflection->getResultType($queryString, QueryReflector::FETCH_TYPE_ASSOC);
7181
if ($resultType) {
7282
return TypeCombinator::union(
7383
new GenericObjectType(mysqli_result::class, [$resultType]),

src/Extensions/PdoQueryDynamicReturnTypeExtension.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,12 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method
6262
}
6363

6464
$queryReflection = new QueryReflection();
65-
$resultType = $queryReflection->getResultType($args[0]->value, $scope, $reflectionFetchType);
65+
$queryString = $queryReflection->resolveQueryString($args[0]->value, $scope);
66+
if (null === $queryString) {
67+
return $defaultReturn;
68+
}
69+
70+
$resultType = $queryReflection->getResultType($queryString, $reflectionFetchType);
6671
if ($resultType) {
6772
return new GenericObjectType(PDOStatement::class, [$resultType]);
6873
}

src/QueryReflection/QueryReflection.php

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ public static function setupReflector(QueryReflector $reflector): void
3333
self::$reflector = $reflector;
3434
}
3535

36-
public function validateQueryString(Expr $expr, Scope $scope): ?Error
36+
public function validateQueryString(string $queryString): ?Error
3737
{
38-
$queryString = $this->builtSimulatedQuery($expr, $scope);
38+
$queryString = $this->builtSimulatedQuery($queryString);
3939

4040
if (null === $queryString) {
4141
return null;
@@ -47,9 +47,9 @@ public function validateQueryString(Expr $expr, Scope $scope): ?Error
4747
/**
4848
* @param QueryReflector::FETCH_TYPE* $fetchType
4949
*/
50-
public function getResultType(Expr $expr, Scope $scope, int $fetchType): ?Type
50+
public function getResultType(string $queryString, int $fetchType): ?Type
5151
{
52-
$queryString = $this->builtSimulatedQuery($expr, $scope);
52+
$queryString = $this->builtSimulatedQuery($queryString);
5353

5454
if (null === $queryString) {
5555
return null;
@@ -58,14 +58,8 @@ public function getResultType(Expr $expr, Scope $scope, int $fetchType): ?Type
5858
return self::reflector()->getResultType($queryString, $fetchType);
5959
}
6060

61-
private function builtSimulatedQuery(Expr $expr, Scope $scope): ?string
61+
private function builtSimulatedQuery(string $queryString): ?string
6262
{
63-
$queryString = $this->resolveQueryString($expr, $scope);
64-
65-
if (null === $queryString) {
66-
return null;
67-
}
68-
6963
if ('SELECT' !== $this->getQueryType($queryString)) {
7064
return null;
7165
}
@@ -78,7 +72,7 @@ private function builtSimulatedQuery(Expr $expr, Scope $scope): ?string
7872
return $queryString;
7973
}
8074

81-
private function resolveQueryString(Expr $expr, Scope $scope): ?string
75+
public function resolveQueryString(Expr $expr, Scope $scope): ?string
8276
{
8377
if ($expr instanceof Concat) {
8478
$left = $expr->left;

src/Rules/SyntaxErrorInQueryFunctionRule.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,12 @@ public function processNode(Node $node, Scope $scope): array
7171
$errors = [];
7272

7373
$queryReflection = new QueryReflection();
74-
$error = $queryReflection->validateQueryString($args[$queryArgPosition]->value, $scope);
74+
$queryString = $queryReflection->resolveQueryString($args[$queryArgPosition]->value, $scope);
75+
if (null === $queryString) {
76+
return $errors;
77+
}
78+
79+
$error = $queryReflection->validateQueryString($queryString);
7580
if (null !== $error) {
7681
$errors[] = RuleErrorBuilder::message('Query error: '.$error->getMessage().' ('.$error->getCode().').')->line($node->getLine())->build();
7782
}

src/Rules/SyntaxErrorInQueryMethodRule.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,12 @@ public function processNode(Node $node, Scope $scope): array
6464
$errors = [];
6565

6666
$queryReflection = new QueryReflection();
67-
$error = $queryReflection->validateQueryString($args[$queryArgPosition]->value, $scope);
67+
$queryString = $queryReflection->resolveQueryString($args[$queryArgPosition]->value, $scope);
68+
if (null === $queryString) {
69+
return $errors;
70+
}
71+
72+
$error = $queryReflection->validateQueryString($queryString);
6873
if (null !== $error) {
6974
$errors[] = RuleErrorBuilder::message('Query error: '.$error->getMessage().' ('.$error->getCode().').')->line($node->getLine())->build();
7075
}

0 commit comments

Comments
 (0)