class ClassMapGenerator

ClassMapGenerator

@author Gyula Sallai <salla016@gmail.com>

Hierarchy

Expanded class hierarchy of ClassMapGenerator

1 file declares its use of ClassMapGenerator
ClassMapGeneratorTest.php in drupal/core/vendor/symfony/class-loader/Symfony/Component/ClassLoader/Tests/ClassMapGeneratorTest.php

File

drupal/core/vendor/symfony/class-loader/Symfony/Component/ClassLoader/ClassMapGenerator.php, line 19

Namespace

Symfony\Component\ClassLoader
View source
class ClassMapGenerator {

  /**
   * Generate a class map file
   *
   * @param array|string $dirs Directories or a single path to search in
   * @param string       $file The name of the class map file
   */
  public static function dump($dirs, $file) {
    $dirs = (array) $dirs;
    $maps = array();
    foreach ($dirs as $dir) {
      $maps = array_merge($maps, static::createMap($dir));
    }
    file_put_contents($file, sprintf('<?php return %s;', var_export($maps, true)));
  }

  /**
   * Iterate over all files in the given directory searching for classes
   *
   * @param Iterator|string $dir The directory to search in or an iterator
   *
   * @return array A class map array
   */
  public static function createMap($dir) {
    if (is_string($dir)) {
      $dir = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($dir));
    }
    $map = array();
    foreach ($dir as $file) {
      if (!$file
        ->isFile()) {
        continue;
      }
      $path = $file
        ->getRealPath();
      if (pathinfo($path, PATHINFO_EXTENSION) !== 'php') {
        continue;
      }
      $classes = self::findClasses($path);
      foreach ($classes as $class) {
        $map[$class] = $path;
      }
    }
    return $map;
  }

  /**
   * Extract the classes in the given file
   *
   * @param string $path The file to check
   *
   * @return array The found classes
   */
  private static function findClasses($path) {
    $contents = file_get_contents($path);
    $tokens = token_get_all($contents);
    $T_TRAIT = version_compare(PHP_VERSION, '5.4', '<') ? -1 : T_TRAIT;
    $classes = array();
    $namespace = '';
    for ($i = 0, $max = count($tokens); $i < $max; $i++) {
      $token = $tokens[$i];
      if (is_string($token)) {
        continue;
      }
      $class = '';
      switch ($token[0]) {
        case T_NAMESPACE:
          $namespace = '';

          // If there is a namespace, extract it
          while (($t = $tokens[++$i]) && is_array($t)) {
            if (in_array($t[0], array(
              T_STRING,
              T_NS_SEPARATOR,
            ))) {
              $namespace .= $t[1];
            }
          }
          $namespace .= '\\';
          break;
        case T_CLASS:
        case T_INTERFACE:
        case $T_TRAIT:

          // Find the classname
          while (($t = $tokens[++$i]) && is_array($t)) {
            if (T_STRING === $t[0]) {
              $class .= $t[1];
            }
            elseif ($class !== '' && T_WHITESPACE == $t[0]) {
              break;
            }
          }
          $classes[] = ltrim($namespace . $class, '\\');
          break;
        default:
          break;
      }
    }
    return $classes;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
ClassMapGenerator::createMap public static function Iterate over all files in the given directory searching for classes
ClassMapGenerator::dump public static function Generate a class map file
ClassMapGenerator::findClasses private static function Extract the classes in the given file