Used::importAnalyzing()   B
last analyzed

Complexity

Conditions 9
Paths 10

Size

Total Lines 40
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 25
c 1
b 0
f 1
dl 0
loc 40
rs 8.0555
cc 9
nc 10
nop 1
1
<?php
2
/**
3
 * Class "use" analyzer
4
 * User: moyo
5
 * Date: 2018/8/16
6
 * Time: 6:12 PM
7
 */
8
9
namespace Carno\Container\Injection;
10
11
use ReflectionClass;
12
13
class Used
14
{
15
    /**
16
     * @var bool[]
17
     */
18
    private $importAnalyzed = [];
19
20
    /**
21
     * @var array
22
     */
23
    private $importAliases = [];
24
25
    /**
26
     * @param ReflectionClass $master
27
     * @param string $alias
28
     * @return string
29
     */
30
    public function getFullClass(ReflectionClass $master, string $alias) : string
31
    {
32
        $this->importAnalyzing($master->getFileName());
33
34
        return
35
            $this->importAliases[$alias] ??
36
            (substr($alias, 0, 1) === '\\'
37
                ? substr($alias, 1)
38
                : sprintf('%s\\%s', $master->getNamespaceName(), $alias))
39
        ;
40
    }
41
42
    /**
43
     * @param string $file
44
     */
45
    private function importAnalyzing(string $file) : void
46
    {
47
        if (isset($this->importAnalyzed[$file])) {
48
            return;
49
        }
50
51
        $tokens = token_get_all(file_get_contents($file));
52
53
        $tUseOpen = false;
54
        $tUseData = '';
55
56
        foreach ($tokens as $token) {
57
            if (is_array($token)) {
58
                list($type, $value) = $token;
59
                switch ($type) {
60
                    case T_USE:
61
                        $tUseOpen = true;
62
                        break;
63
                    default:
64
                        $tUseOpen && $tUseData .= $value;
65
                }
66
            } else {
67
                if ($token === ';') {
68
                    // close tag
69
                    if (strpos($tUseData, ' as ')) {
70
                        list($class, $alias) = explode(' as ', $tUseData);
71
                    } else {
72
                        $class = $tUseData;
73
                        $alias = substr($tUseData, strrpos($tUseData, '\\') + 1);
74
                    }
75
76
                    $alias && $this->importAliases[$alias] = trim($class);
77
78
                    $tUseOpen = false;
79
                    $tUseData = '';
80
                }
81
            }
82
        }
83
84
        $this->importAnalyzed[$file] = true;
85
    }
86
}
87