|
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