|
13 | 13 | use PHPStan\Rules\RuleError;
|
14 | 14 | use PHPStan\Rules\RuleErrorBuilder;
|
15 | 15 | use staabm\PHPStanDba\PdoReflection\PdoStatementReflection;
|
| 16 | +use staabm\PHPStanDba\QueryReflection\PlaceholderValidation; |
16 | 17 | use staabm\PHPStanDba\QueryReflection\QueryReflection;
|
17 | 18 |
|
18 | 19 | /**
|
@@ -67,72 +68,10 @@ private function checkErrors(MethodReflection $methodReflection, MethodCall $met
|
67 | 68 | return [];
|
68 | 69 | }
|
69 | 70 |
|
70 |
| - $args = $methodCall->getArgs(); |
71 |
| - $placeholderCount = $queryReflection->countPlaceholders($queryString); |
72 |
| - |
73 |
| - if (0 === \count($args)) { |
74 |
| - if (0 === $placeholderCount) { |
75 |
| - return []; |
76 |
| - } |
77 |
| - |
78 |
| - $placeholderExpectation = sprintf('Query expects %s placeholder', $placeholderCount); |
79 |
| - if ($placeholderCount > 1) { |
80 |
| - $placeholderExpectation = sprintf('Query expects %s placeholders', $placeholderCount); |
81 |
| - } |
82 |
| - |
83 |
| - return [ |
84 |
| - RuleErrorBuilder::message(sprintf($placeholderExpectation.', but no values are given to execute().', $placeholderCount))->line($methodCall->getLine())->build(), |
85 |
| - ]; |
86 |
| - } |
87 |
| - |
88 |
| - return $this->checkParameterValues($methodCall, $scope, $queryString, $placeholderCount); |
89 |
| - } |
90 |
| - |
91 |
| - /** |
92 |
| - * @return RuleError[] |
93 |
| - */ |
94 |
| - private function checkParameterValues(MethodCall $methodCall, Scope $scope, string $queryString, int $placeholderCount): array |
95 |
| - { |
96 |
| - $queryReflection = new QueryReflection(); |
97 |
| - $args = $methodCall->getArgs(); |
98 |
| - |
99 |
| - $parameterTypes = $scope->getType($args[0]->value); |
100 |
| - $parameters = $queryReflection->resolveParameters($parameterTypes); |
101 |
| - if (null === $parameters) { |
102 |
| - return []; |
103 |
| - } |
104 |
| - $parameterCount = \count($parameters); |
105 |
| - |
106 |
| - if ($parameterCount !== $placeholderCount) { |
107 |
| - $placeholderExpectation = sprintf('Query expects %s placeholder', $placeholderCount); |
108 |
| - if ($placeholderCount > 1) { |
109 |
| - $placeholderExpectation = sprintf('Query expects %s placeholders', $placeholderCount); |
110 |
| - } |
111 |
| - |
112 |
| - $parameterActual = sprintf('but %s value is given to execute()', $parameterCount); |
113 |
| - if ($parameterCount > 1) { |
114 |
| - $parameterActual = sprintf('but %s values are given to execute()', $parameterCount); |
115 |
| - } |
116 |
| - |
117 |
| - return [ |
118 |
| - RuleErrorBuilder::message($placeholderExpectation.', '.$parameterActual.'.')->line($methodCall->getLine())->build(), |
119 |
| - ]; |
120 |
| - } |
121 |
| - |
| 71 | + $placeholderReflection = new PlaceholderValidation(); |
122 | 72 | $errors = [];
|
123 |
| - $namedPlaceholders = $queryReflection->extractNamedPlaceholders($queryString); |
124 |
| - if (\count($namedPlaceholders) > 0) { |
125 |
| - foreach ($namedPlaceholders as $namedPlaceholder) { |
126 |
| - if (!\array_key_exists($namedPlaceholder, $parameters)) { |
127 |
| - $errors[] = RuleErrorBuilder::message(sprintf('Query expects placeholder %s, but it is missing from values given to execute().', $namedPlaceholder))->line($methodCall->getLine())->build(); |
128 |
| - } |
129 |
| - } |
130 |
| - |
131 |
| - foreach ($parameters as $placeholderKey => $value) { |
132 |
| - if (!\in_array($placeholderKey, $namedPlaceholders)) { |
133 |
| - $errors[] = RuleErrorBuilder::message(sprintf('Value %s is given to execute(), but the query does not contain this placeholder.', $placeholderKey))->line($methodCall->getLine())->build(); |
134 |
| - } |
135 |
| - } |
| 73 | + foreach ($placeholderReflection->checkErrors($queryString, $methodCall, $scope) as $error) { |
| 74 | + $errors[] = RuleErrorBuilder::message($error)->line($methodCall->getLine())->build(); |
136 | 75 | }
|
137 | 76 |
|
138 | 77 | return $errors;
|
|
0 commit comments