Browse Source

[ClassMapGenerator] Refine the findClasses method

The code could not throw
Victor Berchet 12 years ago
parent
commit
ff5c428d60

+ 30 - 30
src/Composer/Autoload/ClassMapGenerator.php

@@ -96,38 +96,38 @@ class ClassMapGenerator
 
         try {
             $contents = php_strip_whitespace($path);
-            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);
-
-            preg_match_all('{
-                (?:
-                     \b(?<![\$:>])(?<type>class|interface'.$traits.') \s+ (?<name>\S+)
-                   | \b(?<![\$:>])(?<ns>namespace) (?<nsname>\s+[^\s;{}\\\\]+(?:\s*\\\\\s*[^\s;{}\\\\]+)*)? \s*[\{;]
-                )
-            }ix', $contents, $matches);
-            $classes = array();
-
-            $namespace = '';
-
-            for ($i = 0, $len = count($matches['type']); $i < $len; $i++) {
-                $name = $matches['name'][$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;
         } catch (\Exception $e) {
             throw new \RuntimeException('Could not scan for classes inside '.$path.": \n".$e->getMessage(), 0, $e);
         }
+
+        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);
+
+        preg_match_all('{
+            (?:
+                 \b(?<![\$:>])(?<type>class|interface'.$traits.') \s+ (?<name>\S+)
+               | \b(?<![\$:>])(?<ns>namespace) (?<nsname>\s+[^\s;{}\\\\]+(?:\s*\\\\\s*[^\s;{}\\\\]+)*)? \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;
+
     }
 }

+ 13 - 0
tests/Composer/Test/Autoload/ClassMapGeneratorTest.php

@@ -84,6 +84,19 @@ class ClassMapGeneratorTest extends \PHPUnit_Framework_TestCase
         ), ClassMapGenerator::createMap($finder));
     }
 
+    /**
+     * @expectedException \RuntimeException
+     * @expectedExceptionMessage Could not scan for classes inside
+     */
+    public function testThrowsWhenFileDoesNotExist()
+    {
+        $r = new \ReflectionClass('Composer\\Autoload\\ClassMapGenerator');
+        $find = $r->getMethod('findClasses');
+        $find->setAccessible(true);
+
+        $find->invoke(null, __DIR__.'/no-file');
+    }
+
     protected function assertEqualsNormalized($expected, $actual, $message = null)
     {
         foreach ($expected as $ns => $path) {