From 3207a2f2cf4807afbe1310a6da1bb3de4674ed45 Mon Sep 17 00:00:00 2001 From: "Barry vd. Heuvel" Date: Mon, 29 Apr 2013 10:27:27 +0200 Subject: [PATCH] Use Symfony classloader Instead of copying it. (Same as the Composer autoloader) --- composer.json | 3 +- .../LaravelIdeHelper/ModelsCommand.php | 119 +----------------- 2 files changed, 4 insertions(+), 118 deletions(-) diff --git a/composer.json b/composer.json index e610e69..356fb80 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,8 @@ "illuminate/support": "4.0.x", "illuminate/console": "4.0.x", "illuminate/filesystem": "4.0.x", - "dannykopping/docblock": "dev-master" + "dannykopping/docblock": "dev-master", + "symfony/class-loader": "2.3.*" }, "autoload": { "psr-0": { diff --git a/src/Barryvdh/LaravelIdeHelper/ModelsCommand.php b/src/Barryvdh/LaravelIdeHelper/ModelsCommand.php index 2bea27e..0a8a12e 100644 --- a/src/Barryvdh/LaravelIdeHelper/ModelsCommand.php +++ b/src/Barryvdh/LaravelIdeHelper/ModelsCommand.php @@ -2,6 +2,7 @@ use Illuminate\Console\Command; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\ClassLoader\ClassMapGenerator; /** * A command to generate autocomplete information for your IDE * @@ -115,7 +116,7 @@ class ModelsCommand extends Command { protected function loadModels(){ $models = array(); - foreach(self::createMap(app_path().'/models') as $model=> $path){ + foreach(ClassMapGenerator::createMap(app_path().'/models') as $model=> $path){ $models[] = $model; } return $models; @@ -228,120 +229,4 @@ class ModelsCommand extends Command { return $output; } - - /** - * Copy from Composer\Autoload\ClassMapGenerator - * @author Gyula Sallai - * - * Iterate over all files in the given directory searching for classes - * - * @param Iterator|string $path The path to search in or an iterator - * @param string $whitelist Regex that matches against the file path - * - * @return array A class map array - * - * @throws \RuntimeException When the path is neither an existing file nor directory - */ - public static function createMap($path, $whitelist = null) - { - if (is_string($path)) { - if (is_file($path)) { - $path = array(new \SplFileInfo($path)); - } elseif (is_dir($path)) { - $path = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path)); - } else { - throw new \RuntimeException( - 'Could not scan for classes inside "'.$path. - '" which does not appear to be a file nor a folder' - ); - } - } - - $map = array(); - - foreach ($path as $file) { - if (!$file->isFile()) { - continue; - } - - $filePath = $file->getRealPath(); - - if (!in_array(pathinfo($filePath, PATHINFO_EXTENSION), array('php', 'inc'))) { - continue; - } - - if ($whitelist && !preg_match($whitelist, strtr($filePath, '\\', '/'))) { - continue; - } - - $classes = self::findClasses($filePath); - - foreach ($classes as $class) { - $map[$class] = $filePath; - } - - } - - 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) - { - $traits = version_compare(PHP_VERSION, '5.4', '<') ? '' : '|trait'; - - try { - $contents = php_strip_whitespace($path); - } catch (\Exception $e) { - throw new \RuntimeException('Could not scan for classes inside '.$path.": \n".$e->getMessage(), 0, $e); - } - - // return early if there is no chance of matching anything in this file - if (!preg_match('{\b(?:class|interface'.$traits.')\b}i', $contents)) { - return array(); - } - - // strip heredocs/nowdocs - $contents = preg_replace('{<<<\'?(\w+)\'?(?:\r\n|\n|\r)(?:.*?)(?:\r\n|\n|\r)\\1(?=\r\n|\n|\r|;)}s', 'null', $contents); - // strip strings - $contents = preg_replace('{"[^"\\\\]*(\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(\\\\.[^\'\\\\]*)*\'}', 'null', $contents); - // strip leading non-php code if needed - if (substr($contents, 0, 2) !== '.+<\?}s', '?>'); - if (false !== $pos && false === strpos(substr($contents, $pos), '])(?Pclass|interface'.$traits.') \s+ (?P[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*) - | \b(?])(?Pnamespace) (?P\s+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?:\s*\\\\\s*[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*)? \s*[\{;] - ) - }ix', $contents, $matches); - - $classes = array(); - $namespace = ''; - - for ($i = 0, $len = count($matches['type']); $i < $len; $i++) { - if (!empty($matches['ns'][$i])) { - $namespace = str_replace(array(' ', "\t", "\r", "\n"), '', $matches['nsname'][$i]) . '\\'; - } else { - $classes[] = ltrim($namespace . $matches['name'][$i], '\\'); - } - } - - return $classes; - } - }