NamespaceResolver   A
last analyzed

Complexity

Total Complexity 16

Size/Duplication

Total Lines 53
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 16
eloc 33
c 0
b 0
f 0
dl 0
loc 53
ccs 28
cts 28
cp 1
rs 10

1 Method

Rating   Name   Duplication   Size   Complexity  
C resolve() 0 44 16
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Fabiang\ExceptionGenerator\Resolver;
6
7
use Fabiang\ExceptionGenerator\Exception\RuntimeException;
8
9
use function array_reverse;
10
use function count;
11
use function file_get_contents;
12
use function implode;
13
use function is_array;
14
use function is_readable;
15
use function ltrim;
16
use function token_get_all;
17
use function trim;
18
19
use const T_NAME_FULLY_QUALIFIED;
20
use const T_NAME_QUALIFIED;
21
use const T_NAMESPACE;
22
use const T_NS_SEPARATOR;
23
use const T_STRING;
24
use const T_WHITESPACE;
25
26
class NamespaceResolver implements ResolverInterface
27
{
28
    private const T_WHITESPACE           = T_WHITESPACE;
29
    private const T_NAMESPACE            = T_NAMESPACE;
30
    private const T_NS_SEPARATOR         = T_NS_SEPARATOR;
31
    private const T_STRING               = T_STRING;
32
    private const T_NAME_FULLY_QUALIFIED = T_NAME_FULLY_QUALIFIED;
33
    private const T_NAME_QUALIFIED       = T_NAME_QUALIFIED;
34
35 17
    public function resolve(string $path, array $loopedDirectories): string|false
36
    {
37 17
        if (! is_readable($path)) {
38 2
            throw new RuntimeException('PHP file "' . $path . '" isn\'t readable');
39
        }
40
41 15
        $namespace = false;
42 15
        $tokens    = token_get_all(file_get_contents($path));
43 15
        $type      = null;
44
45 15
        foreach ($tokens as $token) {
46 14
            if (is_array($token)) {
47 14
                $type = $token[0];
48 11
            } elseif ($namespace && $token === ';') {
49 9
                $namespace = ltrim(trim($namespace), '\\');
50
51
                // adding looped folders to namespace
52 9
                if (count($loopedDirectories) > 0) {
53 1
                    $namespace .= '\\' . implode('\\', array_reverse($loopedDirectories));
54
                }
55
56 9
                break;
57
            }
58
59 14
            if (self::T_NAMESPACE === $type) {
60 12
                $namespace = '';
61 12
                continue;
62
            }
63
64 14
            $lookForToken = false !== $namespace && $type !== self::T_WHITESPACE;
65 14
            $validToken   = $type === self::T_STRING ||
66 14
                $type === self::T_NS_SEPARATOR ||
67 14
                $type === self::T_NAME_FULLY_QUALIFIED || /* PHP8 */
68 14
                $type === self::T_NAME_QUALIFIED; /* PHP8 */
69
70 14
            if ($lookForToken && $validToken) {
71 11
                $namespace .= $token[1];
72 14
            } elseif ($lookForToken && ! $validToken) {
73 2
                $namespace = false;
74 2
                break;
75
            }
76
        }
77
78 15
        return $namespace;
79
    }
80
}
81