Completed
Pull Request — master (#221)
by personal
04:09
created

NamespaceResolver::resolve()   B

Complexity

Conditions 7
Paths 6

Size

Total Lines 19
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 7
eloc 12
nc 6
nop 1
dl 0
loc 19
rs 8.2222
c 1
b 0
f 0
1
<?php
2
3
/*
4
 * (c) Jean-François Lépine <https://twitter.com/Halleck45>
5
 *
6
 * For the full copyright and license information, please view the LICENSE
7
 * file that was distributed with this source code.
8
 */
9
10
namespace Hal\Component\Parser\Resolver;
11
12
use Hal\Component\Parser\Exception\IncorrectSyntaxException;
13
use Hal\Component\Token\Token;
14
15
class NamespaceResolver
16
{
17
18
    /**
19
     * @var array
20
     */
21
    private $namespaces;
22
23
    /**
24
     * @var string
25
     */
26
    private $currentNamespace = '\\';
27
28
    /**
29
     * @param $tokens
30
     */
31
    public function __construct($tokens)
32
    {
33
34
        $len = sizeof($tokens);
35
        for ($i = 0; $i < $len; $i++) {
36
37
            // stop when class or function is detected
38
            if (in_array($tokens[$i], array(Token::T_CLASS, Token::T_FUNCTION))) {
39
                break;
40
            }
41
42
            $next = $i + 1;
43
44
            // "namespace" token
45
            if (Token::T_NAMESPACE === $tokens[$i]) {
46
                if (!isset($tokens[$next])) {
47
                    throw new IncorrectSyntaxException;
48
                }
49
                $this->currentNamespace = '\\' . $tokens[$next];
50
                continue;
51
            }
52
53
            // "use" token
54
            if (Token::T_USE === $tokens[$i]) {
55
                $i = $i + 1;
56
                if (!isset($tokens[$next])) {
57
                    throw new IncorrectSyntaxException;
58
                }
59
60
                // name of class
61
                $name = $alias = $tokens[$next];
62
63
                // alias
64
                if (isset($tokens[$next + 1], $tokens[$next + 2])
65
                    && Token::T_AS == $tokens[$next + 1]
66
                ) {
67
                    $i = $i + 2;
68
                    $alias = $tokens[$next + 2];
69
                }
70
71
                $this->namespaces[$alias] = $name;
72
                continue;
73
            }
74
75
        }
76
    }
77
78
    /**
79
     * @return array
80
     */
81
    public function all()
82
    {
83
        return $this->namespaces;
84
    }
85
86
    /**
87
     * @return string
88
     */
89
    public function getCurrentNamespace()
90
    {
91
        return $this->currentNamespace;
92
    }
93
94
    /**
95
     * @param $alias
96
     * @return string
97
     */
98
    public function resolve($alias)
99
    {
100
        if (preg_match('!^(parent|static|self)$!i', $alias)) {
101
            return $alias;
102
        }
103
        if ($this->has($alias) && '\\' == $this->namespaces[$alias][0]) {
104
            return $this->namespaces[$alias];
105
        }
106
        if ('\\' === $alias[0]) {
107
            return $alias;
108
        }
109
        if ($this->has('\\' . $alias)) {
110
            return '\\' . $alias;
111
        }
112
        if ($this->has($alias)) {
113
            return sprintf('%s\\%s', $this->currentNamespace, $this->namespaces[$alias]);
114
        }
115
        return sprintf('%s\\%s', $this->currentNamespace, $alias);
116
    }
117
118
    /**
119
     * @param $alias
120
     * @return bool
121
     */
122
    public function has($alias)
123
    {
124
        return isset($this->namespaces[$alias]);
125
    }
126
}