Passed
Push — master ( 633b25...e5131a )
by Alexander
01:44 queued 10s
created

FunctionCall::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 2
c 1
b 0
f 0
nc 1
nop 2
dl 0
loc 4
rs 10
1
<?php
2
3
4
namespace App\Node;
5
6
7
use App\Exception\UnknownFunction;
8
use App\FunctionModel;
9
use App\Functions\FunctionInterface;
10
use App\Token;
11
use App\Visitor;
12
13
class FunctionCall implements Visitable
14
{
15
    /**
16
     * @var Token
17
     */
18
    public $function;
19
    /**
20
     * @var array<Visitable>
21
     */
22
    public $args;
23
24
    /**
25
     * FunctionCall constructor.
26
     * @param Token $function
27
     * @param array<Visitable> $args
28
     */
29
    public function __construct(Token $function, array $args)
30
    {
31
        $this->function = $function;
32
        $this->args     = $args;
33
    }
34
35
    /**
36
     * @param Visitor $visitor
37
     * @return mixed
38
     * @psalm-suppress LessSpecificImplementedReturnType
39
     * @throws UnknownFunction
40
     * @throws \ReflectionException
41
     */
42
    public function accept(Visitor $visitor)
43
    {
44
        /** @var array<int|float> $args */
45
        $args = [];
46
        foreach ($this->args as $arg) {
47
            $args[] = $visitor->visit($arg);
48
        }
49
50
        $invokableFunctionClass = FunctionModel::BUILT_IN_FUNCTIONS[$this->function->value] ?? null;
51
52
        if ($invokableFunctionClass === null) {
53
            throw new UnknownFunction('Function ' . $this->function->value . ' is unknown');
54
        }
55
56
        $rInvokableFunction = new \ReflectionClass($invokableFunctionClass);
57
        /** @var FunctionInterface $invokable */
58
        /** @psalm-suppress MixedArgumentTypeCoercion */
59
        $invokable = $rInvokableFunction->newInstanceArgs($args);
60
61
        return $invokable->__invoke();
62
    }
63
}