@@ -35,20 +35,21 @@ private function find(callable $predicate): array
35
35
$ classes = [];
36
36
37
37
foreach ($ this ->findPhpFiles () as $ phpFile ) {
38
- $ classes [] = $ this ->findClassesInFile ( $ predicate , $ phpFile );
38
+ $ classes [] = $ this ->findClassInFile ( $ phpFile );
39
39
}
40
40
41
- $ classes = \array_merge ([], ...$ classes );
41
+ $ classes = \array_filter ($ classes , function (?string $ class ) use ($ predicate ) {
42
+ return !empty ($ class ) && $ predicate ($ class );
43
+ });
42
44
43
45
\sort ($ classes );
44
46
45
47
return $ classes ;
46
48
}
47
49
48
- private function findClassesInFile ( callable $ predicate , \SplFileInfo $ phpFile ): array
50
+ private function findClassInFile ( \SplFileInfo $ phpFile ): ? string
49
51
{
50
52
// @see https://stackoverflow.com/a/27440555/330267
51
- $ classes = [];
52
53
$ tokens = \token_get_all (\file_get_contents ($ phpFile ->getRealPath ()));
53
54
$ namespace = '' ;
54
55
@@ -57,33 +58,36 @@ private function findClassesInFile(callable $predicate, \SplFileInfo $phpFile):
57
58
continue ;
58
59
}
59
60
if ($ this ->isNamespaceToken ($ tokens , $ index )) {
60
- $ index += 2 ; // Skip namespace keyword and whitespace
61
- while (isset ($ tokens [$ index ]) && \is_array ($ tokens [$ index ]) && T_WHITESPACE !== $ tokens [$ index ][0 ]) {
61
+ while ($ this ->isNotWhitespaceToken ($ tokens , $ index )) {
62
62
$ namespace .= $ tokens [$ index ++][1 ];
63
63
}
64
64
}
65
- if ($ this ->isClassDefinitionToken ($ tokens , $ index )) {
66
- $ index += 2 ; // Skip class keyword and whitespace
67
- $ class = $ namespace . '\\' . $ tokens [$ index ][1 ];
68
- if ($ predicate ($ class )) {
69
- $ classes [] = $ class ;
70
- }
71
-
72
- break ;
65
+ if ($ this ->isClassNameToken ($ tokens , $ index )) {
66
+ return $ namespace . '\\' . $ tokens [$ index ][1 ];
73
67
}
74
68
}
75
69
76
- return $ classes ;
70
+ return null ;
77
71
}
78
72
79
73
private function isNamespaceToken ($ tokens , int $ index ): bool
80
74
{
81
- return T_NAMESPACE === $ tokens [$ index ][0 ];
75
+ return $ this ->extractTokens ($ tokens , $ index - 2 , 3 ) === [T_NAMESPACE , T_WHITESPACE , T_STRING ];
76
+ }
77
+
78
+ private function isClassNameToken ($ tokens , int $ index ): bool
79
+ {
80
+ return $ this ->extractTokens ($ tokens , $ index - 2 , 3 ) === [T_CLASS , T_WHITESPACE , T_STRING ];
81
+ }
82
+
83
+ private function extractTokens ($ tokens , int $ startIndex , int $ count ): array
84
+ {
85
+ return \array_column (\array_slice ($ tokens , $ startIndex , $ count ), 0 );
82
86
}
83
87
84
- private function isClassDefinitionToken ($ tokens , int $ index ): bool
88
+ private function isNotWhitespaceToken ($ tokens , int $ index ): bool
85
89
{
86
- return T_CLASS === $ tokens [$ index ][ 0 ] && T_WHITESPACE === $ tokens [$ index + 1 ][ 0 ] && T_STRING === $ tokens [$ index + 2 ][0 ];
90
+ return isset ( $ tokens [$ index ]) && \is_array ( $ tokens [$ index]) && T_WHITESPACE !== $ tokens [$ index ][0 ];
87
91
}
88
92
89
93
/**
0 commit comments