/**
  * @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);
     }
 }