From ac2596a171aee5d3cf2d750aab05b2d31a3befb4 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sun, 2 Oct 2022 20:45:50 +0200 Subject: [PATCH] support `@phpstandba-inference-placeholder` on calls via variable (#434) --- src/QueryReflection/QueryReflection.php | 13 ++++++++++++- tests/default/data/inference-placeholder.php | 8 ++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/QueryReflection/QueryReflection.php b/src/QueryReflection/QueryReflection.php index 0a323b316..5347005bc 100644 --- a/src/QueryReflection/QueryReflection.php +++ b/src/QueryReflection/QueryReflection.php @@ -188,8 +188,19 @@ private function resolveQueryExpr(Expr $queryExpr, Scope $scope): ?string /** * @throws UnresolvableQueryException */ - private function resolveQueryStringExpr(Expr $queryExpr, Scope $scope): ?string + private function resolveQueryStringExpr(Expr $queryExpr, Scope $scope, bool $resolveVariables = true): ?string { + if (true === $resolveVariables && $queryExpr instanceof Expr\Variable) { + $finder = new ExpressionFinder(); + $assignExpr = $finder->findQueryStringExpression($queryExpr); + + if (null !== $assignExpr) { + return $this->resolveQueryStringExpr($assignExpr, $scope); + } + + return $this->resolveQueryStringExpr($queryExpr, $scope, false); + } + if ($queryExpr instanceof Expr\CallLike) { $methodReflection = null; if ($queryExpr instanceof Expr\StaticCall) { diff --git a/tests/default/data/inference-placeholder.php b/tests/default/data/inference-placeholder.php index 91ca60892..d0b2eafa8 100644 --- a/tests/default/data/inference-placeholder.php +++ b/tests/default/data/inference-placeholder.php @@ -18,6 +18,14 @@ public function fetchOneWithDynamicQueryPart(Connection $conn, string $email) assertType('string|false', $fetchResult); } + public function fetchOneWithDynamicQueryPartViaVariable(Connection $conn, string $email) + { + $dynamicPart = self::dynamicWhere(rand(0, 100)); + $query = 'SELECT email, adaid FROM ada WHERE email = :email AND '.$dynamicPart; + $fetchResult = $conn->fetchOne($query, ['email' => $email]); + assertType('string|false', $fetchResult); + } + /** * simulating a dynamic where part, not relevant for the query overall result. *