Completed
Push — master ( e41123...37a2ca )
by Maarten
01:18
created

ClassReader::isClass()   A

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::isNameSpace($tokenArray, $token);
46
            self::isClass($tokenArray, $token);
47
            self::setClassName($tokenArray, $token);
48
49
            if (self::$class) {
50
                break;
51
            }
52
        }
53
54
        return self::$namespace ? self::$namespace . '\\' . self::$class : self::$class;
55
    }
56
57
    /**
58
     * @param bool $tokenArray
59
     * @param $token
60
     * @return bool
61
     */
62
    private static function isClass(bool $tokenArray, $token)
63
    {
64
        self::$hasClass = self::$hasClass || ($tokenArray && $token[0] === T_CLASS);
65
    }
66
67
    /**
68
     * @param bool $tokenArray
69
     * @param $token
70
     * @return bool
71
     */
72
    private static function isNameSpace(bool $tokenArray, $token)
73
    {
74
        self::$hasNamespace = self::$hasNamespace || ($tokenArray && $token[0] === T_NAMESPACE);
75
    }
76
77
    /**
78
     * @param bool $tokenArray
79
     * @param $token
80
     * @return mixed
81
     */
82
    private static function setClassName(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
        if (self::$hasClass && $tokenArray && $token[0] === T_STRING) {
93
            self::$class = $token[1];
94
        }
95
    }
96
97
    /**
98
     * @param string $className
99
     * @return Collection
100
     * @throws ReflectionException
101
     */
102
    public static function getMethods(string $className): Collection
103
    {
104
        $class = new ReflectionClass($className);
105
106
        return Collection::make($class->getMethods(ReflectionMethod::IS_PUBLIC))
107
            ->merge(Collection::make($class->getTraits())
108
                ->map(static function (ReflectionClass $trait) {
109
                    return Collection::make(
110
                        $trait->getMethods(ReflectionMethod::IS_PUBLIC)
111
                    );
112
                })->flatten()
113
            )
114
            ->reject(static function (ReflectionMethod $method) use ($className) {
115
                return $method->class !== $className || $method->getNumberOfParameters() > 0;
116
            });
117
    }
118
}
119