From 13b57112a9fe467eeb9df2e351a31c6f790d54b9 Mon Sep 17 00:00:00 2001 From: Jan Brecka Date: Thu, 20 Mar 2014 13:37:05 +0100 Subject: [PATCH 1/6] Throw RuntimeException when ambiguous reference was found. --- src/Composer/Autoload/ClassMapGenerator.php | 4 ++++ .../Test/Autoload/ClassMapGeneratorTest.php | 16 ++++++++++++++++ .../Test/Autoload/Fixtures/Ambiguous/A.php | 6 ++++++ .../Test/Autoload/Fixtures/Ambiguous/other/A.php | 6 ++++++ 4 files changed, 32 insertions(+) create mode 100644 tests/Composer/Test/Autoload/Fixtures/Ambiguous/A.php create mode 100644 tests/Composer/Test/Autoload/Fixtures/Ambiguous/other/A.php diff --git a/src/Composer/Autoload/ClassMapGenerator.php b/src/Composer/Autoload/ClassMapGenerator.php index 73c036a37..d470ca2da 100644 --- a/src/Composer/Autoload/ClassMapGenerator.php +++ b/src/Composer/Autoload/ClassMapGenerator.php @@ -79,6 +79,10 @@ class ClassMapGenerator $classes = self::findClasses($filePath); foreach ($classes as $class) { + if (array_key_exists($class, $map)) { + throw new \RuntimeException('Ambiguous reference to class "'.$class.'" was found.'); + } + $map[$class] = $filePath; } } diff --git a/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php b/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php index ddadc89c5..fe33b1f36 100644 --- a/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php +++ b/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php @@ -104,6 +104,22 @@ class ClassMapGeneratorTest extends \PHPUnit_Framework_TestCase $find->invoke(null, __DIR__.'/no-file'); } + /** + * @expectedException \RuntimeException + * @expectedExceptionMessage Ambiguous reference to class "A" was found. + */ + public function testAmbiguousReference() + { + if (!class_exists('Symfony\\Component\\Finder\\Finder')) { + $this->markTestSkipped('Finder component is not available'); + } + + $finder = new \Symfony\Component\Finder\Finder(); + $finder->files()->in(__DIR__ . '/Fixtures/Ambiguous'); + + ClassMapGenerator::createMap($finder); + } + /** * @expectedException \RuntimeException * @expectedExceptionMessage Could not scan for classes inside diff --git a/tests/Composer/Test/Autoload/Fixtures/Ambiguous/A.php b/tests/Composer/Test/Autoload/Fixtures/Ambiguous/A.php new file mode 100644 index 000000000..ee9325efa --- /dev/null +++ b/tests/Composer/Test/Autoload/Fixtures/Ambiguous/A.php @@ -0,0 +1,6 @@ + Date: Thu, 20 Mar 2014 14:24:42 +0100 Subject: [PATCH 2/6] improve exception message --- src/Composer/Autoload/ClassMapGenerator.php | 2 +- tests/Composer/Test/Autoload/ClassMapGeneratorTest.php | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Composer/Autoload/ClassMapGenerator.php b/src/Composer/Autoload/ClassMapGenerator.php index d470ca2da..77dc08dc9 100644 --- a/src/Composer/Autoload/ClassMapGenerator.php +++ b/src/Composer/Autoload/ClassMapGenerator.php @@ -80,7 +80,7 @@ class ClassMapGenerator foreach ($classes as $class) { if (array_key_exists($class, $map)) { - throw new \RuntimeException('Ambiguous reference to class "'.$class.'" was found.'); + throw new \RuntimeException('Ambiguous class "'.$class.'" resolution; defined in "'.$map[$class].'" and in "'.$filePath.'" file.'); } $map[$class] = $filePath; diff --git a/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php b/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php index fe33b1f36..58e68c0d5 100644 --- a/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php +++ b/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php @@ -106,7 +106,6 @@ class ClassMapGeneratorTest extends \PHPUnit_Framework_TestCase /** * @expectedException \RuntimeException - * @expectedExceptionMessage Ambiguous reference to class "A" was found. */ public function testAmbiguousReference() { From a41370b021615bece3aa5ec3de669712f112dc15 Mon Sep 17 00:00:00 2001 From: Jan Brecka Date: Fri, 21 Mar 2014 14:26:54 +0100 Subject: [PATCH 3/6] fix plural in exception message --- src/Composer/Autoload/ClassMapGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Autoload/ClassMapGenerator.php b/src/Composer/Autoload/ClassMapGenerator.php index 77dc08dc9..5c2859271 100644 --- a/src/Composer/Autoload/ClassMapGenerator.php +++ b/src/Composer/Autoload/ClassMapGenerator.php @@ -80,7 +80,7 @@ class ClassMapGenerator foreach ($classes as $class) { if (array_key_exists($class, $map)) { - throw new \RuntimeException('Ambiguous class "'.$class.'" resolution; defined in "'.$map[$class].'" and in "'.$filePath.'" file.'); + throw new \RuntimeException('Ambiguous class "'.$class.'" resolution; defined in "'.$map[$class].'" and in "'.$filePath.'" files.'); } $map[$class] = $filePath; From 5763685e696ea21836b1703f2dc6b862b2bd89b9 Mon Sep 17 00:00:00 2001 From: Jan Brecka Date: Mon, 24 Mar 2014 10:30:50 +0100 Subject: [PATCH 4/6] use statement --- tests/Composer/Test/Autoload/ClassMapGeneratorTest.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php b/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php index 58e68c0d5..d0dcd2d6b 100644 --- a/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php +++ b/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php @@ -12,6 +12,7 @@ namespace Composer\Test\Autoload; use Composer\Autoload\ClassMapGenerator; +use Symfony\Component\Finder\Finder; class ClassMapGeneratorTest extends \PHPUnit_Framework_TestCase { @@ -82,7 +83,7 @@ class ClassMapGeneratorTest extends \PHPUnit_Framework_TestCase $this->markTestSkipped('Finder component is not available'); } - $finder = new \Symfony\Component\Finder\Finder(); + $finder = new Finder(); $finder->files()->in(__DIR__ . '/Fixtures/beta/NamespaceCollision'); $this->assertEqualsNormalized(array( @@ -113,7 +114,7 @@ class ClassMapGeneratorTest extends \PHPUnit_Framework_TestCase $this->markTestSkipped('Finder component is not available'); } - $finder = new \Symfony\Component\Finder\Finder(); + $finder = new Finder(); $finder->files()->in(__DIR__ . '/Fixtures/Ambiguous'); ClassMapGenerator::createMap($finder); From de09c5e371fc2d0aec551b8ed5a3adb316694fbf Mon Sep 17 00:00:00 2001 From: Jan Brecka Date: Mon, 24 Mar 2014 10:35:44 +0100 Subject: [PATCH 5/6] remove duplicity --- .../Test/Autoload/ClassMapGeneratorTest.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php b/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php index d0dcd2d6b..eff1b86a6 100644 --- a/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php +++ b/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php @@ -79,9 +79,7 @@ class ClassMapGeneratorTest extends \PHPUnit_Framework_TestCase public function testCreateMapFinderSupport() { - if (!class_exists('Symfony\\Component\\Finder\\Finder')) { - $this->markTestSkipped('Finder component is not available'); - } + $this->checkIfFinderIsAvailable(); $finder = new Finder(); $finder->files()->in(__DIR__ . '/Fixtures/beta/NamespaceCollision'); @@ -110,9 +108,7 @@ class ClassMapGeneratorTest extends \PHPUnit_Framework_TestCase */ public function testAmbiguousReference() { - if (!class_exists('Symfony\\Component\\Finder\\Finder')) { - $this->markTestSkipped('Finder component is not available'); - } + $this->checkIfFinderIsAvailable(); $finder = new Finder(); $finder->files()->in(__DIR__ . '/Fixtures/Ambiguous'); @@ -139,4 +135,11 @@ class ClassMapGeneratorTest extends \PHPUnit_Framework_TestCase } $this->assertEquals($expected, $actual, $message); } + + private function checkIfFinderIsAvailable() + { + if (!class_exists('Symfony\\Component\\Finder\\Finder')) { + $this->markTestSkipped('Finder component is not available'); + } + } } From b94838169d17476b24497d3f6d23feaf41196e01 Mon Sep 17 00:00:00 2001 From: Jan Brecka Date: Mon, 24 Mar 2014 14:34:02 +0100 Subject: [PATCH 6/6] show warning only instead of throwing exception --- src/Composer/Autoload/AutoloadGenerator.php | 15 ++++++++++++++- src/Composer/Autoload/ClassMapGenerator.php | 12 +++++++++++- src/Composer/Factory.php | 2 +- .../Test/Autoload/ClassMapGeneratorTest.php | 7 +++---- 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/Composer/Autoload/AutoloadGenerator.php b/src/Composer/Autoload/AutoloadGenerator.php index 3783bd22c..0de53a3bf 100644 --- a/src/Composer/Autoload/AutoloadGenerator.php +++ b/src/Composer/Autoload/AutoloadGenerator.php @@ -15,6 +15,7 @@ namespace Composer\Autoload; use Composer\Config; use Composer\EventDispatcher\EventDispatcher; use Composer\Installer\InstallationManager; +use Composer\IO\IOInterface; use Composer\Package\AliasPackage; use Composer\Package\PackageInterface; use Composer\Repository\InstalledRepositoryInterface; @@ -32,11 +33,17 @@ class AutoloadGenerator */ private $eventDispatcher; + /** + * @var IOInterface + */ + private $io; + private $devMode = false; - public function __construct(EventDispatcher $eventDispatcher) + public function __construct(EventDispatcher $eventDispatcher, IOInterface $io=null) { $this->eventDispatcher = $eventDispatcher; + $this->io = $io; } public function setDevMode($devMode = true) @@ -197,6 +204,12 @@ EOF; } } + if ($this->io && count(ClassMapGenerator::$ambiguousReferences) > 0) { + foreach (ClassMapGenerator::$ambiguousReferences as $ambiguousReference) { + $this->io->write('Warning: Ambiguous class "'.$ambiguousReference['class'].'" resolution; defined in "'.$ambiguousReference[0].'" and in "'.$ambiguousReference[1].'" files.'); + } + } + ksort($classMap); foreach ($classMap as $class => $code) { $classmapFile .= ' '.var_export($class, true).' => '.$code; diff --git a/src/Composer/Autoload/ClassMapGenerator.php b/src/Composer/Autoload/ClassMapGenerator.php index 5c2859271..500669a28 100644 --- a/src/Composer/Autoload/ClassMapGenerator.php +++ b/src/Composer/Autoload/ClassMapGenerator.php @@ -21,6 +21,12 @@ use Symfony\Component\Finder\Finder; */ class ClassMapGenerator { + + /** + * @var array + */ + public static $ambiguousReferences = array(); + /** * Generate a class map file * @@ -80,7 +86,11 @@ class ClassMapGenerator foreach ($classes as $class) { if (array_key_exists($class, $map)) { - throw new \RuntimeException('Ambiguous class "'.$class.'" resolution; defined in "'.$map[$class].'" and in "'.$filePath.'" files.'); + self::$ambiguousReferences[] = array( + 'class' => $class, + '0' => $map[$class], + '1' => $filePath + ); } $map[$class] = $filePath; diff --git a/src/Composer/Factory.php b/src/Composer/Factory.php index d0cd68b79..88fc4132e 100644 --- a/src/Composer/Factory.php +++ b/src/Composer/Factory.php @@ -253,7 +253,7 @@ class Factory $composer->setEventDispatcher($dispatcher); // initialize autoload generator - $generator = new AutoloadGenerator($dispatcher); + $generator = new AutoloadGenerator($dispatcher, $io); $composer->setAutoloadGenerator($generator); // add installers to the manager diff --git a/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php b/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php index eff1b86a6..6b5049830 100644 --- a/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php +++ b/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php @@ -102,10 +102,6 @@ class ClassMapGeneratorTest extends \PHPUnit_Framework_TestCase $find->invoke(null, __DIR__.'/no-file'); } - - /** - * @expectedException \RuntimeException - */ public function testAmbiguousReference() { $this->checkIfFinderIsAvailable(); @@ -114,6 +110,9 @@ class ClassMapGeneratorTest extends \PHPUnit_Framework_TestCase $finder->files()->in(__DIR__ . '/Fixtures/Ambiguous'); ClassMapGenerator::createMap($finder); + + $this->assertEquals(1, count(ClassMapGenerator::$ambiguousReferences)); + $this->assertEquals('A', ClassMapGenerator::$ambiguousReferences[0]['class']); } /**