|
@@ -0,0 +1,138 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+/*
|
|
|
+ * This file is copied from the Symfony package.
|
|
|
+ *
|
|
|
+ * (c) Fabien Potencier <fabien@symfony.com>
|
|
|
+ *
|
|
|
+ * For the full copyright and license information, please view the LICENSE
|
|
|
+ * file that was distributed with this source code.
|
|
|
+ *
|
|
|
+ * @license MIT
|
|
|
+ */
|
|
|
+
|
|
|
+namespace Composer\Autoload;
|
|
|
+
|
|
|
+/**
|
|
|
+ * ClassMapGenerator
|
|
|
+ *
|
|
|
+ * @author Gyula Sallai <salla016@gmail.com>
|
|
|
+ */
|
|
|
+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
|
|
|
+ */
|
|
|
+ static public 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
|
|
|
+ */
|
|
|
+ static public 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
|
|
|
+ */
|
|
|
+ static private function findClasses($path)
|
|
|
+ {
|
|
|
+ $contents = file_get_contents($path);
|
|
|
+ $tokens = token_get_all($contents);
|
|
|
+
|
|
|
+ $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:
|
|
|
+ // 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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (empty($namespace)) {
|
|
|
+ $classes[] = $class;
|
|
|
+ } else {
|
|
|
+ $classes[] = $namespace . $class;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return $classes;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|