Nette\Loaders\RobotLoader::scanPhp PHP Method

scanPhp() private method

Searches classes, interfaces and traits in PHP file.
private scanPhp ( $code ) : array
return array
    private function scanPhp($code)
    {
        $expected = FALSE;
        $namespace = '';
        $level = $minLevel = 0;
        $classes = [];
        if (preg_match('#//nette' . 'loader=(\\S*)#', $code, $matches)) {
            foreach (explode(',', $matches[1]) as $name) {
                $classes[] = $name;
            }
            return $classes;
        }
        foreach (@token_get_all($code) as $token) {
            // @ can be corrupted or can use newer syntax
            if (is_array($token)) {
                switch ($token[0]) {
                    case T_COMMENT:
                    case T_DOC_COMMENT:
                    case T_WHITESPACE:
                        continue 2;
                    case T_NS_SEPARATOR:
                    case T_STRING:
                        if ($expected) {
                            $name .= $token[1];
                        }
                        continue 2;
                    case T_NAMESPACE:
                    case T_CLASS:
                    case T_INTERFACE:
                    case T_TRAIT:
                        $expected = $token[0];
                        $name = '';
                        continue 2;
                    case T_CURLY_OPEN:
                    case T_DOLLAR_OPEN_CURLY_BRACES:
                        $level++;
                }
            }
            if ($expected) {
                switch ($expected) {
                    case T_CLASS:
                    case T_INTERFACE:
                    case T_TRAIT:
                        if ($name && $level === $minLevel) {
                            $classes[] = $namespace . $name;
                        }
                        break;
                    case T_NAMESPACE:
                        $namespace = $name ? $name . '\\' : '';
                        $minLevel = $token === '{' ? 1 : 0;
                }
                $expected = NULL;
            }
            if ($token === '{') {
                $level++;
            } elseif ($token === '}') {
                $level--;
            }
        }
        return $classes;
    }