Permalink
Browse files

[ClassLoader] Added a class map file generator utility

fixed cs

Small refactoring for Finder support

If class name found, return

Find multiple classes and namespaces in the same file

fixed problems with inheritance and non-php files

Renamed ClassMapDumper to ClassMapGenerator

fixed error with splfileinfo
  • Loading branch information...
1 parent 54a1bdb commit 0245ee6ef14a4a98cba373c48d38747c15cd8106 @sallaigy sallaigy committed Oct 25, 2011
Showing with 135 additions and 0 deletions.
  1. +135 −0 ClassMapGenerator.php
View
@@ -0,0 +1,135 @@
+<?php
+
+/*
+ * This file is part of 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.
+ */
+
+namespace Symfony\Component\ClassLoader;
+
+/**
+ * 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];
+ } else if ($class !== '' && T_WHITESPACE == $t[0]) {
+ break;
+ }
+ }
+
+ if (empty($namespace)) {
+ $classes[] = $class;
+ } else {
+ $classes[] = $namespace . $class;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ return $classes;
+ }
+}

0 comments on commit 0245ee6

Please sign in to comment.