[ClassLoader] Fix undefined index in ClassCollectionLoader

This commit is contained in:
Szijarto Tamas 2014-12-04 22:06:34 +01:00
parent 15551f2e85
commit cfdb925c47
4 changed files with 57 additions and 6 deletions

View File

@ -353,14 +353,17 @@ class ClassCollectionLoader
$unresolved = new \ArrayObject(); $unresolved = new \ArrayObject();
} }
$nodeName = $node->getName(); $nodeName = $node->getName();
$unresolved[$nodeName] = $node;
foreach ($tree[$nodeName] as $dependency) { if (isset($tree[$nodeName])) {
if (!$resolved->offsetExists($dependency->getName())) { $unresolved[$nodeName] = $node;
self::resolveDependencies($tree, $dependency, $resolved, $unresolved); foreach ($tree[$nodeName] as $dependency) {
if (!$resolved->offsetExists($dependency->getName())) {
self::resolveDependencies($tree, $dependency, $resolved, $unresolved);
}
} }
$resolved[$nodeName] = $node;
unset($unresolved[$nodeName]);
} }
$resolved[$nodeName] = $node;
unset($unresolved[$nodeName]);
return $resolved; return $resolved;
} }

View File

@ -146,6 +146,38 @@ class ClassCollectionLoaderTest extends \PHPUnit_Framework_TestCase
); );
} }
public function testFixClassWithTraitsOrdering()
{
if (PHP_VERSION_ID < 50400) {
$this->markTestSkipped('Requires PHP > 5.4');
return;
}
require_once __DIR__.'/Fixtures/ClassesWithParents/CTrait.php';
require_once __DIR__.'/Fixtures/ClassesWithParents/F.php';
require_once __DIR__.'/Fixtures/ClassesWithParents/G.php';
$classes = array(
'ClassesWithParents\\F',
'ClassesWithParents\\G',
);
$expected = array(
'ClassesWithParents\\CTrait',
'ClassesWithParents\\F',
'ClassesWithParents\\G',
);
$r = new \ReflectionClass('Symfony\Component\ClassLoader\ClassCollectionLoader');
$m = $r->getMethod('getOrderedClasses');
$m->setAccessible(true);
$ordered = $m->invoke('Symfony\Component\ClassLoader\ClassCollectionLoader', $classes);
$this->assertEquals($expected, array_map(function ($class) { return $class->getName(); }, $ordered));
}
/** /**
* @dataProvider getFixNamespaceDeclarationsData * @dataProvider getFixNamespaceDeclarationsData
*/ */

View File

@ -0,0 +1,8 @@
<?php
namespace ClassesWithParents;
class F
{
use CTrait;
}

View File

@ -0,0 +1,8 @@
<?php
namespace ClassesWithParents;
class G
{
use CTrait;
}