diff --git a/Scanner.php b/Scanner.php index 068c249..5e85fcf 100644 --- a/Scanner.php +++ b/Scanner.php @@ -261,11 +261,10 @@ class Scanner extends Component if ($loadFile) { $before = $this->getDeclaredSymbols(); require_once $path; - $after = $this->getDeclaredSymbols(); - $classes = array_values(array_unique(array_merge( - $classes, - array_diff($after, $before) - ))); + if ($classes === []) { + $after = $this->getDeclaredSymbols(); + $classes = array_values(array_diff($after, $before)); + } } foreach ($classes as $class) { @@ -328,7 +327,7 @@ class Scanner extends Component continue; } - if ($token[0] === T_CLASS && $this->isAnonymousClass($tokens, $i)) { + if ($token[0] === T_CLASS && ($this->isAnonymousClass($tokens, $i) || $this->isClassConstant($tokens, $i))) { continue; } @@ -398,6 +397,19 @@ class Scanner extends Component return false; } + private function isClassConstant(array $tokens, int $offset): bool + { + for ($i = $offset - 1; $i >= 0; $i--) { + $token = $tokens[$i]; + if (is_array($token) && in_array($token[0], [T_WHITESPACE, T_COMMENT, T_DOC_COMMENT], true)) { + continue; + } + + return is_array($token) && $token[0] === T_DOUBLE_COLON; + } + + return false; + } private function getDeclaredSymbols(): array { return array_merge(get_declared_classes(), get_declared_interfaces(), get_declared_traits());