Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
46.51% covered (danger)
46.51%
20 / 43
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
Less_Tree_NamespaceValue
46.51% covered (danger)
46.51%
20 / 43
50.00% covered (danger)
50.00%
1 / 2
61.23
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 compile
41.03% covered (danger)
41.03%
16 / 39
0.00% covered (danger)
0.00%
0 / 1
68.51
1<?php
2declare( strict_types = 1 );
3
4/**
5 * @private
6 * @see less-3.13.1.js#NamespaceValue.prototype
7 */
8class Less_Tree_NamespaceValue extends Less_Tree {
9
10    /** @var Less_Tree_Mixin_Call|Less_Tree_VariableCall */
11    public $value;
12    /** @var int|null */
13    public $index;
14    /** @var string[] */
15    public $lookups;
16    /** @var array|null */
17    public $currentFileInfo;
18
19    public function __construct( $ruleCall, $lookups, $index = null, $currentFileInfo = null ) {
20        $this->value = $ruleCall;
21        $this->lookups = $lookups;
22        $this->index = $index;
23        $this->currentFileInfo = $currentFileInfo;
24    }
25
26    public function compile( $env ) {
27        /** @var Less_Tree_Ruleset $rules */
28        $rules = $this->value->compile( $env );
29
30        foreach ( $this->lookups as $name ) {
31            /**
32             * Eval'd DRs return rulesets.
33             * Eval'd mixins return rules, so let's make a ruleset if we need it.
34             * We need to do this because of late parsing of values
35             */
36            if ( is_array( $rules ) ) {
37                $rules = new Less_Tree_Ruleset( [ new Less_Tree_Selector( [] ) ], $rules );
38            }
39            if ( $name === '' ) {
40                $rules = $rules->lastDeclaration();
41            } elseif ( $name[0] === '@' ) {
42                if ( ( $name[1] ?? '' ) === '@' ) {
43                    $variable = ( new Less_Tree_Variable( substr( $name, 1 ) ) )->compile( $env );
44                    $name = "@" . $variable->value;
45                }
46                if ( $rules instanceof Less_Tree_Ruleset ) {
47                    $rules = $rules->variable( $name );
48                }
49
50                if ( !$rules ) {
51                    throw new Less_Exception_Compiler(
52                        "Variable $name not found",
53                        null,
54                        $this->index,
55                        $this->currentFileInfo
56                    );
57                }
58            } else {
59                if ( strncmp( $name, '$@', 2 ) === 0 ) {
60                    $variable = ( new Less_Tree_Variable( substr( $name, 1 ) ) )->compile( $env );
61                    $name = "$" . $variable->value;
62                } else {
63                    $name = $name[0] === '$' ? $name : ( '$' . $name );
64                }
65
66                if ( $rules instanceof Less_Tree_Ruleset ) {
67                    $rules = $rules->property( $name );
68                }
69
70                if ( !$rules ) {
71                    throw new Less_Exception_Compiler(
72                        "Property $name not found",
73                        null,
74                        $this->index,
75                        $this->currentFileInfo
76                    );
77                }
78                // Properties are an array of values, since a ruleset can have multiple props.
79                // We pick the last one (the "cascaded" value)
80                if ( is_array( $rules ) ) { // to satisfy phan checks
81                    $rules = $rules[ count( $rules ) - 1 ];
82                }
83            }
84
85            if ( $rules->value ) {
86                $rules = $rules->compile( $env )->value;
87            }
88            if ( $rules instanceof Less_Tree_DetachedRuleset && $rules->ruleset ) {
89                // @todo - looks like this is never evaluated, investigate later
90                // @see https://github.com/less/less.js/commit/29468bffcd8a9f2f
91                $rules = $rules->ruleset->compile( $env );
92            }
93        }
94
95        return $rules;
96    }
97
98}