From f34b541a83760c90ce2a046c62c852c8d47b4f0a Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Tue, 13 Dec 2022 21:09:04 +0100 Subject: [PATCH] Resolve parameter types only when checkArgumentTypes=true --- src/Rules/FunctionCallParametersCheck.php | 71 +++++++++++------------ 1 file changed, 35 insertions(+), 36 deletions(-) diff --git a/src/Rules/FunctionCallParametersCheck.php b/src/Rules/FunctionCallParametersCheck.php index 9785b42205..5c8e1d6e93 100644 --- a/src/Rules/FunctionCallParametersCheck.php +++ b/src/Rules/FunctionCallParametersCheck.php @@ -249,43 +249,42 @@ public function check( continue; } - $parameterType = TypeUtils::resolveLateResolvableTypes($parameter->getType()); - if ( - $this->checkArgumentTypes - && !$parameter->passedByReference()->createsNewVariable() - && !$this->ruleLevelHelper->accepts($parameterType, $argumentValueType, $scope->isDeclareStrictTypes()) - ) { - $verbosityLevel = VerbosityLevel::getRecommendedLevelByType($parameterType, $argumentValueType); - $parameterDescription = sprintf('%s$%s', $parameter->isVariadic() ? '...' : '', $parameter->getName()); - $errors[] = RuleErrorBuilder::message(sprintf( - $messages[6], - $argumentName === null ? sprintf( - '#%d %s', - $i + 1, - $parameterDescription, - ) : $parameterDescription, - $parameterType->describe($verbosityLevel), - $argumentValueType->describe($verbosityLevel), - ))->line($argumentLine)->build(); - } + if ($this->checkArgumentTypes) { + $parameterType = TypeUtils::resolveLateResolvableTypes($parameter->getType()); - if ( - $this->checkArgumentTypes - && $this->checkUnresolvableParameterTypes - && $originalParameter !== null - && !$this->unresolvableTypeHelper->containsUnresolvableType($originalParameter->getType()) - && $this->unresolvableTypeHelper->containsUnresolvableType($parameterType) - && isset($messages[13]) - ) { - $parameterDescription = sprintf('%s$%s', $parameter->isVariadic() ? '...' : '', $parameter->getName()); - $errors[] = RuleErrorBuilder::message(sprintf( - $messages[13], - $argumentName === null ? sprintf( - '#%d %s', - $i + 1, - $parameterDescription, - ) : $parameterDescription, - ))->line($argumentLine)->build(); + if (!$parameter->passedByReference()->createsNewVariable() + && !$this->ruleLevelHelper->accepts($parameterType, $argumentValueType, $scope->isDeclareStrictTypes()) + ) { + $verbosityLevel = VerbosityLevel::getRecommendedLevelByType($parameterType, $argumentValueType); + $parameterDescription = sprintf('%s$%s', $parameter->isVariadic() ? '...' : '', $parameter->getName()); + $errors[] = RuleErrorBuilder::message(sprintf( + $messages[6], + $argumentName === null ? sprintf( + '#%d %s', + $i + 1, + $parameterDescription, + ) : $parameterDescription, + $parameterType->describe($verbosityLevel), + $argumentValueType->describe($verbosityLevel), + ))->line($argumentLine)->build(); + } + + if ($this->checkUnresolvableParameterTypes + && $originalParameter !== null + && isset($messages[13]) + && !$this->unresolvableTypeHelper->containsUnresolvableType($originalParameter->getType()) + && $this->unresolvableTypeHelper->containsUnresolvableType($parameterType) + ) { + $parameterDescription = sprintf('%s$%s', $parameter->isVariadic() ? '...' : '', $parameter->getName()); + $errors[] = RuleErrorBuilder::message(sprintf( + $messages[13], + $argumentName === null ? sprintf( + '#%d %s', + $i + 1, + $parameterDescription, + ) : $parameterDescription, + ))->line($argumentLine)->build(); + } } if (