Completed
Push — master ( 8dd34a...406ca1 )
by Marco
23:46 queued 44s
created

RemoteObjectMethod::getDefaultValuesForMethod()   A

Complexity

Conditions 5
Paths 4

Size

Total Lines 19

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 0
Metric Value
dl 0
loc 19
ccs 0
cts 0
cp 0
rs 9.3222
c 0
b 0
f 0
cc 5
nc 4
nop 1
crap 30
1
<?php
2
3
declare(strict_types=1);
4
5
namespace ProxyManager\ProxyGenerator\RemoteObject\MethodGenerator;
6
7
use Laminas\Code\Generator\PropertyGenerator;
8
use Laminas\Code\Reflection\MethodReflection;
9
use ProxyManager\Generator\MethodGenerator;
10
use ProxyManager\Generator\Util\ProxiedMethodReturnExpression;
11
use ReflectionClass;
12
use function count;
13
use function strtr;
14
use function var_export;
15
16
/**
17
 * Method decorator for remote objects
18
 */
19
class RemoteObjectMethod extends MethodGenerator
20 3
{
21
    private const TEMPLATE
22
        = <<<'PHP'
23
$defaultValues = #DEFAULT_VALUES#;
24
$declaredParameterCount = #PARAMETER_COUNT#;
25
26 3
$args = \func_get_args() + $defaultValues;
27
28 3
#PROXIED_RETURN#
29 3
PHP;
30 3
31 3
    /** @return self|static */
32 3
    public static function generateMethod(
33
        MethodReflection $originalMethod,
34
        PropertyGenerator $adapterProperty,
35 3
        ReflectionClass $originalClass
36
    ) : self {
37
        /** @var self $method */
38
        $method        = static::fromReflectionWithoutBodyAndDocBlock($originalMethod);
39
        $proxiedReturn = '$return = $this->' . $adapterProperty->getName()
40
            . '->call(' . var_export($originalClass->getName(), true)
41
            . ', ' . var_export($originalMethod->getName(), true) . ', $args);' . "\n\n"
42
            . ProxiedMethodReturnExpression::generate('$return', $originalMethod);
43
44
        $defaultValues          = self::getDefaultValuesForMethod($originalMethod);
45
        $declaredParameterCount = count($originalMethod->getParameters());
46
47
        $method->setBody(
48
            strtr(
49
                self::TEMPLATE,
50
                [
51
                    '#PROXIED_RETURN#' => $proxiedReturn,
52
                    '#DEFAULT_VALUES#' => var_export($defaultValues, true),
53
                    '#PARAMETER_COUNT#' => var_export($declaredParameterCount, true),
54
                ]
55
            )
56
        );
57
58
        return $method;
59
    }
60
61
    /**
62
     * @return array
63
     */
64
    private static function getDefaultValuesForMethod(MethodReflection $originalMethod) : array
65
    {
66
        $defaultValues = [];
67
        foreach ($originalMethod->getParameters() as $parameter) {
68
            if ($parameter->isOptional() && $parameter->isDefaultValueAvailable()) {
69
                /** @psalm-var int|float|bool|array|string|null */
70
                $defaultValues[] = $parameter->getDefaultValue();
71
                continue;
72
            }
73
74
            if ($parameter->isVariadic()) {
0 ignored issues
show
Bug introduced by
The method isVariadic() does not seem to exist on object<Laminas\Code\Refl...on\ParameterReflection>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
75
                continue;
76
            }
77
78
            $defaultValues[] = null;
79
        }
80
81
        return $defaultValues;
82
    }
83
}
84