Completed
Pull Request — master (#149)
by Enrico
04:04
created

Coalesce::compile()   B

Complexity

Conditions 5
Paths 7

Size

Total Lines 23
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 16
CRAP Score 5

Importance

Changes 0
Metric Value
cc 5
eloc 13
nc 7
nop 2
dl 0
loc 23
ccs 16
cts 16
cp 1
crap 5
rs 8.5906
c 0
b 0
f 0
1
<?php
2
3
namespace PHPSA\Compiler\Expression\BinaryOp;
4
5
use PHPSA\CompiledExpression;
6
use PHPSA\Context;
7
use PHPSA\Compiler\Expression;
8
use PHPSA\Compiler\Expression\AbstractExpressionCompiler;
9
use PhpParser\Node\Expr\Variable;
10
use PhpParser\Node\Name;
11
12
class Coalesce extends AbstractExpressionCompiler
13
{
14
    protected $name = 'PhpParser\Node\Expr\BinaryOp\Coalesce';
15
16
    /**
17
     * {expr} ?? {expr}
18
     *
19
     * @param \PhpParser\Node\Expr\BinaryOp\Coalesce $expr
20
     * @param Context $context
21
     * @return CompiledExpression
22
     */
23 3
    protected function compile($expr, Context $context)
24
    {
25 3
        if ($expr->left instanceof Variable) {
26 3
            $varName = $expr->left->name;
27
28 3
            if ($varName instanceof Name) {
29 2
                $varName = $varName->parts[0];
30 2
            }
31
32 3
            $variable = $context->getSymbol($varName);
33
34 3
            if ($variable) {
35 2
                $variable->incUse();
36
37 2
                if ($variable->getValue() !== null) {
38 1
                    $leftCompiled = $context->getExpressionCompiler()->compile($expr->left);
39 1
                    return CompiledExpression::fromZvalValue($leftCompiled->getValue());
40
                }
41 1
            }
42 2
        }
43 2
        $rightCompiled = $context->getExpressionCompiler()->compile($expr->right);
44 2
        return CompiledExpression::fromZvalValue($rightCompiled->getValue());
45
    }
46
}
47