| 1 | efrain | 1 | <?php declare(strict_types=1);
 | 
        
           |  |  | 2 |   | 
        
           |  |  | 3 | namespace Invoker\ParameterResolver;
 | 
        
           |  |  | 4 |   | 
        
           |  |  | 5 | use ReflectionException;
 | 
        
           |  |  | 6 | use ReflectionFunctionAbstract;
 | 
        
           |  |  | 7 |   | 
        
           |  |  | 8 | /**
 | 
        
           |  |  | 9 |  * Finds the default value for a parameter, *if it exists*.
 | 
        
           |  |  | 10 |  */
 | 
        
           |  |  | 11 | class DefaultValueResolver implements ParameterResolver
 | 
        
           |  |  | 12 | {
 | 
        
           |  |  | 13 |     public function getParameters(
 | 
        
           |  |  | 14 |         ReflectionFunctionAbstract $reflection,
 | 
        
           |  |  | 15 |         array $providedParameters,
 | 
        
           |  |  | 16 |         array $resolvedParameters
 | 
        
           |  |  | 17 |     ): array {
 | 
        
           |  |  | 18 |         $parameters = $reflection->getParameters();
 | 
        
           |  |  | 19 |   | 
        
           |  |  | 20 |         // Skip parameters already resolved
 | 
        
           |  |  | 21 |         if (! empty($resolvedParameters)) {
 | 
        
           |  |  | 22 |             $parameters = array_diff_key($parameters, $resolvedParameters);
 | 
        
           |  |  | 23 |         }
 | 
        
           |  |  | 24 |   | 
        
           |  |  | 25 |         foreach ($parameters as $index => $parameter) {
 | 
        
           |  |  | 26 |             \assert($parameter instanceof \ReflectionParameter);
 | 
        
           |  |  | 27 |             if ($parameter->isDefaultValueAvailable()) {
 | 
        
           |  |  | 28 |                 try {
 | 
        
           |  |  | 29 |                     $resolvedParameters[$index] = $parameter->getDefaultValue();
 | 
        
           |  |  | 30 |                 } catch (ReflectionException $e) {
 | 
        
           |  |  | 31 |                     // Can't get default values from PHP internal classes and functions
 | 
        
           |  |  | 32 |                 }
 | 
        
           |  |  | 33 |             } else {
 | 
        
           |  |  | 34 |                 $parameterType = $parameter->getType();
 | 
        
           |  |  | 35 |                 if ($parameterType && $parameterType->allowsNull()) {
 | 
        
           |  |  | 36 |                     $resolvedParameters[$index] = null;
 | 
        
           |  |  | 37 |                 }
 | 
        
           |  |  | 38 |             }
 | 
        
           |  |  | 39 |         }
 | 
        
           |  |  | 40 |   | 
        
           |  |  | 41 |         return $resolvedParameters;
 | 
        
           |  |  | 42 |     }
 | 
        
           |  |  | 43 | }
 |