Completed
Pull Request — master (#237)
by
unknown
03:20
created

ResolveExpressionTrait::resolveFunctionName()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 15
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 8.1239

Importance

Changes 0
Metric Value
cc 4
eloc 9
nc 3
nop 2
dl 0
loc 15
ccs 4
cts 11
cp 0.3636
crap 8.1239
rs 9.2
c 0
b 0
f 0
1
<?php
2
/**
3
 * @author Patsura Dmitry https://github.com/ovr <[email protected]>
4
 */
5
6
namespace PHPSA\Analyzer\Helper;
7
8
use PhpParser\Node;
9
use PhpParser\Node\Expr\FuncCall;
10
use PhpParser\Node\Stmt\Return_;
11
use PHPSA\Context;
12
13
trait ResolveExpressionTrait
14
{
15
    /**
16
     * @param FuncCall $funcCall
17
     * @param Context $context
18
     * @return string|bool
19
     */
20 10
    public function resolveFunctionName(FuncCall $funcCall, Context $context)
21
    {
22 10
        $funcNameCompiledExpression = $context->getExpressionCompiler()->compile($funcCall->name);
0 ignored issues
show
Comprehensibility Naming introduced by
The variable name $funcNameCompiledExpression exceeds the maximum configured length of 20.

Very long variable names usually make code harder to read. It is therefore recommended not to make variable names too verbose.

Loading history...
23
24 10
        if ($funcNameCompiledExpression->isString() && $funcNameCompiledExpression->isCorrectValue()) {
25 10
            return $funcNameCompiledExpression->getValue();
26
        } else if (!$funcNameCompiledExpression->isCallable()) {
27
            $context->debug(
28
                'Unexpected function name type ' . $funcNameCompiledExpression->getTypeName(),
29
                $funcCall->name
30
            );
31
        }
32
33
        return false;
34
    }
35
36
    /**
37
     * Finds statements of the given class name.
38
     *
39
     * @param \PhpParser\Node[] $nodes
40
     * @param string $stmtClass
41
     * @return \PhpParser\Node\Stmt
42
     */
43 40
    protected function findStatement(array $nodes, $stmtClass)
44
    {
45 40
        foreach ($this->traverseArray($nodes) as $node) {
46 40
            if ($node instanceof $stmtClass) {
47 31
                yield $node;
48 1
            }
49 40
        }
50 40
    }
51
52
    /**
53
     * @param \PhpParser\Node[] $nodes
54
     * @return \PhpParser\Node\Stmt\Return_
55
     */
56 40
    protected function findReturnStatement(array $nodes)
57
    {
58 40
        return $this->findStatement($nodes, Return_::class);
59
    }
60
61
    /**
62
     * For the code above
63
     * Я атеист, но когда я начинал это писать, только Бог и я понимали, что я делаю
64
     * Сейчас остался только Бог
65
     */
66
67
    /**
68
     * @param Node $node
69
     * @return \Generator
70
     */
71 40
    protected function traverseNode(Node $node)
72
    {
73 40
        foreach ($node->getSubNodeNames() as $name) {
74 40
            $subNode = &$node->$name;
75
76 40
            if (is_array($subNode)) {
77 40
                foreach ($this->traverseArray($subNode) as $rNode) {
78 40
                    yield $rNode;
79 40
                }
80 40
            } elseif ($subNode instanceof Node) {
81 40
                yield $node;
82
83 40
                foreach ($this->traverseNode($subNode) as $rNode) {
84 27
                    yield $rNode;
85 40
                }
86 40
            }
87 40
        }
88 40
    }
89
90
    /**
91
     * @param array $nodes
92
     * @return \Generator
93
     */
94 40
    protected function traverseArray(array $nodes)
95
    {
96 40
        foreach ($nodes as $node) {
97 40
            if (is_array($node)) {
98
                foreach ($this->traverseArray($node) as $rNode) {
99
                    yield $rNode;
100
                }
101 40
            } elseif ($node instanceof Node) {
102 40
                foreach ($this->traverseNode($node) as $rNode) {
103 40
                    yield $rNode;
104 40
                }
105 40
            }
106 40
        }
107 40
    }
108
}
109