diff --git a/src/Composer/Autoload/ClassMapGenerator.php b/src/Composer/Autoload/ClassMapGenerator.php index 61cfae4a5..cfaa6bb0f 100644 --- a/src/Composer/Autoload/ClassMapGenerator.php +++ b/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(?])(?class|interface'.$traits.') \s+ (?\S+) - | \b(?])(?namespace) (?\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(?])(?class|interface'.$traits.') \s+ (?\S+) + | \b(?])(?namespace) (?\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; + } } diff --git a/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php b/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php index f1394fd44..1196ee5dc 100644 --- a/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php +++ b/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) {