ClassReader::isClass()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 3
nc 3
nop 2
1
<?php
2
3
namespace Mtolhuys\LaravelSchematics\Services;
4
5
use Illuminate\Support\Collection;
6
use ReflectionException;
7
use ReflectionMethod;
8
use ReflectionClass;
9
10
class ClassReader
11
{
12
    /**
13
     * @var bool
14
     */
15
    private static $hasNamespace;
16
17
    /**
18
     * @var bool
19
     */
20
    private static $hasClass;
21
22
    /**
23
     * @var string
24
     */
25
    private static $namespace;
26
27
    /**
28
     * @var string
29
     */
30
    private static $class;
31
32
33
    /**
34
     * @param string $path
35
     * @return string
36
     */
37
    public static function getClassName(string $path): string
38
    {
39
        self::$namespace = self::$class = '';
40
        self::$hasNamespace = self::$hasClass = false;
41
42
        foreach (token_get_all(file_get_contents($path)) as $token) {
43
            $tokenArray = is_array($token);
44
45
            self::isClass($tokenArray, $token);
46
            self::isNameSpace($tokenArray, $token);
47
            self::setNamespace($tokenArray, $token);
48
            self::setClassName($tokenArray, $token);
49
50
            if (self::$class) {
51
                break;
52
            }
53
        }
54
55
        return self::$namespace
56
            ? self::$namespace . '\\' . self::$class
57
            : self::$class;
58
    }
59
60
    /**
61
     * @param bool $tokenArray
62
     * @param $token
63
     */
64
    private static function isClass(bool $tokenArray, $token)
65
    {
66
        self::$hasClass = self::$hasClass || ($tokenArray && $token[0] === T_CLASS);
67
    }
68
69
    /**
70
     * @param bool $tokenArray
71
     * @param $token
72
     */
73
    private static function isNameSpace(bool $tokenArray, $token)
74
    {
75
        self::$hasNamespace = self::$hasNamespace || ($tokenArray && $token[0] === T_NAMESPACE);
76
    }
77
78
    /**
79
     * @param bool $tokenArray
80
     * @param $token
81
     */
82
    private static function setNamespace(bool $tokenArray, $token)
83
    {
84
        if (self::$hasNamespace) {
85
            if ($tokenArray && in_array($token[0], [T_STRING, T_NS_SEPARATOR], true)) {
86
                self::$namespace .= $token[1];
87
            } else if ($token === ';') {
88
                self::$hasNamespace = false;
89
            }
90
        }
91
    }
92
93
    /**
94
     * @param bool $tokenArray
95
     * @param $token
96
     */
97
    private static function setClassName(bool $tokenArray, $token)
98
    {
99
        if (self::$hasClass && $tokenArray && $token[0] === T_STRING) {
100
            self::$class = $token[1];
101
        }
102
    }
103
104
    /**
105
     * @param string $className
106
     * @return Collection
107
     * @throws ReflectionException
108
     */
109
    public static function getMethods(string $className): Collection
110
    {
111
        $class = new ReflectionClass($className);
112
113
        return Collection::make($class->getMethods(ReflectionMethod::IS_PUBLIC))
114
            ->merge(Collection::make($class->getTraits())
115
                ->map(static function (ReflectionClass $trait) {
116
                    return Collection::make(
117
                        $trait->getMethods(ReflectionMethod::IS_PUBLIC)
118
                    );
119
                })->flatten()
120
            )
121
            ->reject(static function (ReflectionMethod $method) use ($className) {
122
                return $method->class !== $className || $method->getNumberOfParameters() > 0;
123
            });
124
    }
125
}
126