From cf63dcaf61e3c1741ae096fe5caecd0a83c582d7 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sun, 4 Jan 2026 11:09:37 +0100 Subject: [PATCH] NodeScopeResolver: Move condition out of loop --- src/Analyser/NodeScopeResolver.php | 135 ++++++++++++++--------------- 1 file changed, 67 insertions(+), 68 deletions(-) diff --git a/src/Analyser/NodeScopeResolver.php b/src/Analyser/NodeScopeResolver.php index 65e055f30f..09726ef369 100644 --- a/src/Analyser/NodeScopeResolver.php +++ b/src/Analyser/NodeScopeResolver.php @@ -5767,85 +5767,84 @@ private function processArgs( $scope = $scope->restoreOriginalScopeAfterClosureBind($originalScope); } - foreach ($args as $i => $arg) { - if (!isset($parameters) || $parametersAcceptor === null) { - continue; - } - - $byRefType = new MixedType(); - $assignByReference = false; - $currentParameter = null; - if (isset($parameters[$i])) { - $currentParameter = $parameters[$i]; - } elseif (count($parameters) > 0 && $parametersAcceptor->isVariadic()) { - $currentParameter = array_last($parameters); - } - if ($currentParameter !== null) { - $assignByReference = $currentParameter->passedByReference()->createsNewVariable(); - if ($assignByReference) { - if ($currentParameter instanceof ExtendedParameterReflection && $currentParameter->getOutType() !== null) { - $byRefType = $currentParameter->getOutType(); - } elseif ( - $calleeReflection instanceof MethodReflection - && !$calleeReflection->getDeclaringClass()->isBuiltin() - ) { - $byRefType = $currentParameter->getType(); - } elseif ( - $calleeReflection instanceof FunctionReflection - && !$calleeReflection->isBuiltin() - ) { - $byRefType = $currentParameter->getType(); - } + if (isset($parameters) && $parametersAcceptor !== null) { + foreach ($args as $i => $arg) { + $byRefType = new MixedType(); + $assignByReference = false; + $currentParameter = null; + if (isset($parameters[$i])) { + $currentParameter = $parameters[$i]; + } elseif (count($parameters) > 0 && $parametersAcceptor->isVariadic()) { + $currentParameter = array_last($parameters); } - } - if ($assignByReference) { - if ($currentParameter === null) { - throw new ShouldNotHappenException(); + if ($currentParameter !== null) { + $assignByReference = $currentParameter->passedByReference()->createsNewVariable(); + if ($assignByReference) { + if ($currentParameter instanceof ExtendedParameterReflection && $currentParameter->getOutType() !== null) { + $byRefType = $currentParameter->getOutType(); + } elseif ( + $calleeReflection instanceof MethodReflection + && !$calleeReflection->getDeclaringClass()->isBuiltin() + ) { + $byRefType = $currentParameter->getType(); + } elseif ( + $calleeReflection instanceof FunctionReflection + && !$calleeReflection->isBuiltin() + ) { + $byRefType = $currentParameter->getType(); + } + } } - $argValue = $arg->value; - if (!$argValue instanceof Variable || $argValue->name !== 'this') { - $paramOutType = $this->getParameterOutExtensionsType($callLike, $calleeReflection, $currentParameter, $scope); - if ($paramOutType !== null) { - $byRefType = $paramOutType; + if ($assignByReference) { + if ($currentParameter === null) { + throw new ShouldNotHappenException(); } - $scope = $this->processVirtualAssign( - $scope, - $storage, - $stmt, - $argValue, - new TypeExpr($byRefType), - $nodeCallback, - )->getScope(); - $scope = $this->lookForUnsetAllowedUndefinedExpressions($scope, $argValue); - } - } elseif ($calleeReflection !== null && $calleeReflection->hasSideEffects()->yes()) { - $argType = $scope->getType($arg->value); - if (!$argType->isObject()->no()) { - $nakedReturnType = null; - if ($nakedMethodReflection !== null) { - $nakedParametersAcceptor = ParametersAcceptorSelector::selectFromArgs( + $argValue = $arg->value; + if (!$argValue instanceof Variable || $argValue->name !== 'this') { + $paramOutType = $this->getParameterOutExtensionsType($callLike, $calleeReflection, $currentParameter, $scope); + if ($paramOutType !== null) { + $byRefType = $paramOutType; + } + + $scope = $this->processVirtualAssign( $scope, - $args, - $nakedMethodReflection->getVariants(), - $nakedMethodReflection->getNamedArgumentsVariants(), - ); - $nakedReturnType = $nakedParametersAcceptor->getReturnType(); - } - if ( - $nakedReturnType === null - || !(new ThisType($nakedMethodReflection->getDeclaringClass()))->isSuperTypeOf($nakedReturnType)->yes() - || $nakedMethodReflection->isPure()->no() - ) { + $storage, + $stmt, + $argValue, + new TypeExpr($byRefType), + $nodeCallback, + )->getScope(); + $scope = $this->lookForUnsetAllowedUndefinedExpressions($scope, $argValue); + } + } elseif ($calleeReflection !== null && $calleeReflection->hasSideEffects()->yes()) { + $argType = $scope->getType($arg->value); + if (!$argType->isObject()->no()) { + $nakedReturnType = null; + if ($nakedMethodReflection !== null) { + $nakedParametersAcceptor = ParametersAcceptorSelector::selectFromArgs( + $scope, + $args, + $nakedMethodReflection->getVariants(), + $nakedMethodReflection->getNamedArgumentsVariants(), + ); + $nakedReturnType = $nakedParametersAcceptor->getReturnType(); + } + if ( + $nakedReturnType === null + || !(new ThisType($nakedMethodReflection->getDeclaringClass()))->isSuperTypeOf($nakedReturnType)->yes() + || $nakedMethodReflection->isPure()->no() + ) { + $this->callNodeCallback($nodeCallback, new InvalidateExprNode($arg->value), $scope, $storage); + $scope = $scope->invalidateExpression($arg->value, true); + } + } elseif (!(new ResourceType())->isSuperTypeOf($argType)->no()) { $this->callNodeCallback($nodeCallback, new InvalidateExprNode($arg->value), $scope, $storage); $scope = $scope->invalidateExpression($arg->value, true); } - } elseif (!(new ResourceType())->isSuperTypeOf($argType)->no()) { - $this->callNodeCallback($nodeCallback, new InvalidateExprNode($arg->value), $scope, $storage); - $scope = $scope->invalidateExpression($arg->value, true); } } }