Test Failed
Pull Request — master (#27)
by Alexander
01:50
created

UseStatementParser::fromFile()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 18
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 4.0119

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
eloc 10
nc 4
nop 1
dl 0
loc 18
ccs 10
cts 11
cp 0.9091
crap 4.0119
rs 9.9332
c 1
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\VarDumper;
6
7
class UseStatementParser
8
{
9 44
    public function fromFile(string $file): array
10
    {
11 44
        $tokens = token_get_all(file_get_contents($file));
12 44
        array_shift($tokens);
13
14 44
        $uses = [];
15 44
        foreach ($tokens as $i => $token) {
16 44
            if (!isset($token[0])) {
17
                continue;
18
            }
19
20 44
            if ($token[0] === T_USE) {
21 44
                $uses = array_merge($uses, $this->normalizeUse(array_slice($tokens, $i + 1)));
22 44
                continue;
23
            }
24
        }
25
26 44
        return $uses;
27
    }
28
29 44
    private function normalizeUse(array $tokens): array
30
    {
31 44
        $commonNamespace = '\\';
32 44
        $current = '';
33 44
        $alias = null;
34 44
        $uses = [];
35
36 44
        foreach ($tokens as $token) {
37 44
            if (!isset($token[0])) {
38
                continue;
39
            }
40 44
            if ($token[0] === T_STRING || $token[0] === T_NS_SEPARATOR) {
41 44
                $current .= $token[1];
42 44
                continue;
43
            }
44 44
            if ($token === ',' || $token === ';') {
45 44
                if ($current !== '') {
46 44
                    if ($alias === null) {
47 44
                        $uses[] = $commonNamespace . $current;
48
                    } else {
49
                        $uses[$alias] = $commonNamespace . $current;
50
                    }
51 44
                    $current = '';
52
                }
53
            }
54 44
            if ($token === ';') {
55 44
                break;
56
            }
57 44
            if ($token === '{') {
58 1
                $commonNamespace .= $current;
59 1
                $current = '';
60 1
                continue;
61
            }
62 44
            if ($token[0] === T_AS) {
63 41
                $current .= '@';
64
            }
65
        }
66
67 44
        return $this->replaceAliases($uses);
68
    }
69
70 44
    private function replaceAliases(array $uses): array
71
    {
72 44
        $result = [];
73 44
        foreach ($uses as $use) {
74 44
            $delimiterPosition = strpos($use, '@');
75 44
            if ($delimiterPosition !== false) {
76 41
                $alias = mb_substr($use, $delimiterPosition + 1);
77 41
                $result[$alias] = mb_substr($use, 0, $delimiterPosition);
78
            } else {
79 42
                $result[substr(strrchr($use, '\'), 1)] = $use;
80
            }
81
        }
82
83 44
        return $result;
84
    }
85
}
86