I have a use case where used traits are being incorrectly detected as namespace imports.
Looking at ContextFactory->createForNamespace, it seems that the check is simply looking for all T_USE tokens, and not checking whether they are within the context of a T_CLASS token.
For example, given this PHP code:
<?php
namespace Foo;
trait FooTrait {}
class FooClass {
use FooTrait;
}
... when creating context for this, the namespace aliases should be simply empty array [] as there ARE no namespace aliases. However, ContextFactory currently picks up the use FooTrait; and thinks it is a namespace alias.
I have provided a failing test case that can be added to tests/unit/Types/ContextFactoryTest.php:
public function testTraitUseIsNotDetectedAsNamespaceUse()
{
$fixture = new ContextFactory();
$php = "<?php
namespace Foo;
trait FooTrait {}
class FooClass {
use FooTrait;
}
";
$fixture = new ContextFactory();
$context = $fixture->createForNamespace('Foo', $php);
$this->assertSame([], $context->getNamespaceAliases());
}
I have a use case where used traits are being incorrectly detected as namespace imports.
Looking at
ContextFactory->createForNamespace, it seems that the check is simply looking for allT_USEtokens, and not checking whether they are within the context of aT_CLASStoken.For example, given this PHP code:
... when creating context for this, the namespace aliases should be simply empty array
[]as there ARE no namespace aliases. However,ContextFactorycurrently picks up theuse FooTrait;and thinks it is a namespace alias.I have provided a failing test case that can be added to
tests/unit/Types/ContextFactoryTest.php: