From f05e8eb8fe3d979afa9e627371f4df92ab28fadf Mon Sep 17 00:00:00 2001 From: Ondrej Mirtes Date: Sun, 30 Jan 2022 11:38:20 +0100 Subject: [PATCH] Fix reporting nonexistent offset in isset() --- src/Analyser/NodeScopeResolver.php | 10 ++++++---- .../Rules/Arrays/data/nonexistent-offset.php | 20 +++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/Analyser/NodeScopeResolver.php b/src/Analyser/NodeScopeResolver.php index 10062cab46..08c2de70c6 100644 --- a/src/Analyser/NodeScopeResolver.php +++ b/src/Analyser/NodeScopeResolver.php @@ -1501,7 +1501,9 @@ private function lookForEnterVariableAssign(MutatingScope $scope, Expr $expr): M private function lookForExitVariableAssign(MutatingScope $scope, Expr $expr): MutatingScope { - $scope = $scope->exitExpressionAssign($expr); + if (!$expr instanceof ArrayDimFetch || $expr->dim !== null) { + $scope = $scope->exitExpressionAssign($expr); + } if (!$expr instanceof Variable) { return $this->lookForVariableAssignCallback($scope, $expr, static fn (MutatingScope $scope, Expr $expr): MutatingScope => $scope->exitExpressionAssign($expr)); } @@ -1517,11 +1519,11 @@ private function lookForVariableAssignCallback(MutatingScope $scope, Expr $expr, if ($expr instanceof Variable) { $scope = $callback($scope, $expr); } elseif ($expr instanceof ArrayDimFetch) { - while ($expr instanceof ArrayDimFetch) { - $expr = $expr->var; + if ($expr->dim !== null) { + $scope = $callback($scope, $expr); } - $scope = $this->lookForVariableAssignCallback($scope, $expr, $callback); + $scope = $this->lookForVariableAssignCallback($scope, $expr->var, $callback); } elseif ($expr instanceof PropertyFetch || $expr instanceof Expr\NullsafePropertyFetch) { $scope = $this->lookForVariableAssignCallback($scope, $expr->var, $callback); } elseif ($expr instanceof StaticPropertyFetch) { diff --git a/tests/PHPStan/Rules/Arrays/data/nonexistent-offset.php b/tests/PHPStan/Rules/Arrays/data/nonexistent-offset.php index db4335e930..81ae298ad3 100644 --- a/tests/PHPStan/Rules/Arrays/data/nonexistent-offset.php +++ b/tests/PHPStan/Rules/Arrays/data/nonexistent-offset.php @@ -459,3 +459,23 @@ public function foo(array $array): int return 0; } } + +class MessageDescriptorTest +{ + + public function testDefinitions(): void + { + try { + doFoo(); + } catch (\TypeError $e) { + $trace = $e->getTrace(); + if (isset($trace[1]['args'][0])) { + $class = $trace[1]['args'][0]; + $this->fail(sprintf('Invalid phpDoc in class: %s', $class)); + } + + throw $e; + } + } + +}