/** * @param string $file_path * @return \Generator */ public static function parseClassInfosFromFile($file_path) { $tokens = token_get_all(file_get_contents($file_path)); $num_tokens = count($tokens); /** @var $last_class self */ $last_class = null; $namespace = ''; for ($i = 0; $i < $num_tokens; $i++) { if (is_string($tokens[$i])) { continue; } $token = $tokens[$i][0]; $line = $tokens[$i][2]; switch ($token) { case T_NAMESPACE: $namespace = self::getNamespaceName($tokens, $i); break; case T_CLASS: if ($last_class) { (yield $last_class); } $class_name = self::getClassName($namespace, $tokens, $i); $last_class = new self($file_path, $class_name); break; case T_FUNCTION: $function_name = null; if (is_array($tokens[$i + 2]) && $tokens[$i + 2][0] == T_STRING) { $function_name = $tokens[$i + 2][1]; } else { if ($tokens[$i + 2] == '&' && is_array($tokens[$i + 3]) && $tokens[$i + 3][0] == T_STRING) { $function_name = $tokens[$i + 3][1]; } } if ($function_name && $last_class) { $last_class->pushMethod($function_name, $line); } } } if ($last_class) { (yield $last_class); } }