/** * Resolves a parameter two times and if a different result is obtained will resolve the parameter again until two * successive resolution give the same result. * * {@inheritdoc} * * @param Parameter $parameter * * @throws RecursionLimitReachedException */ public function resolve(Parameter $parameter, ParameterBag $unresolvedParameters, ParameterBag $resolvedParameters, ResolvingContext $context = null, ParameterBag $previousResult = null, int $counter = 1) : ParameterBag { if (null === $previousResult) { $result = $this->resolver->resolve($parameter, $unresolvedParameters, $resolvedParameters, $context); return $this->resolve($parameter, $unresolvedParameters, $resolvedParameters, $context, $result); } $parameterKey = $parameter->getKey(); $previousParameterValue = $previousResult->get($parameterKey); $counter = $this->incrementCounter($counter, $this->limit, $parameterKey); $newResult = $this->resolver->resolve($parameter->withValue($previousParameterValue), $unresolvedParameters, $resolvedParameters, $context); $newParameterValue = $newResult->get($parameterKey); $result = $this->mergeResults($previousResult, $newResult); if ($previousParameterValue === $newParameterValue) { return $result; } return $this->resolve($parameter, $unresolvedParameters, $resolvedParameters, $context, $result, $counter); }