diff --git a/src/Generator/ClassGenerator.php b/src/Generator/ClassGenerator.php index 2db218c8..5a968601 100644 --- a/src/Generator/ClassGenerator.php +++ b/src/Generator/ClassGenerator.php @@ -1145,6 +1145,20 @@ private function generateShortOrCompleteClassname($fqnClassName) $classNamespace = implode('\\', $parts); $currentNamespace = (string) $this->getNamespaceName(); + if ($this->hasUseAlias($fqnClassName)) { + return $this->traitUsageGenerator->getUseAlias($fqnClassName); + } + if ($this->hasUseAlias($classNamespace)) { + $namespaceAlias = $this->traitUsageGenerator->getUseAlias($classNamespace); + + return $namespaceAlias . '\\' . $className; + } + if ($this->traitUsageGenerator->isUseAlias($fqnClassName)) { + return $fqnClassName; + } + if ($this->traitUsageGenerator->isUseAlias($classNamespace)) { + return $fqnClassName; + } if ($classNamespace === $currentNamespace || in_array($fqnClassName, $this->getUses())) { return $className; } diff --git a/src/Generator/TraitUsageGenerator.php b/src/Generator/TraitUsageGenerator.php index ddc06661..0f0ae81e 100644 --- a/src/Generator/TraitUsageGenerator.php +++ b/src/Generator/TraitUsageGenerator.php @@ -112,6 +112,40 @@ public function hasUseAlias($use) return false; } + /** + * Returns the alias of the provided FQCN + * + * @param string $use + * @return string|null + */ + public function getUseAlias(string $use): ?string + { + foreach ($this->uses as $key => $value) { + $parts = explode(' as ', $key); + if ($parts[0] === $use && count($parts) == 2) { + return $parts[1]; + } + } + return null; + } + + /** + * Returns true if the alias is defined in the use list + * + * @param string $alias + * @return bool + */ + public function isUseAlias(string $alias): bool + { + foreach ($this->uses as $key => $value) { + $parts = explode(' as ', $key); + if (count($parts) === 2 && $parts[1] === $alias) { + return true; + } + } + return false; + } + /** * @param string $use * @return TraitUsageGenerator diff --git a/test/Generator/ClassGeneratorTest.php b/test/Generator/ClassGeneratorTest.php index 325b3d7e..1363aa58 100644 --- a/test/Generator/ClassGeneratorTest.php +++ b/test/Generator/ClassGeneratorTest.php @@ -1228,6 +1228,50 @@ public function testCorrectExtendNamesFromGlobalNamespace() self::assertContains('class ClassName extends DateTime', $classGenerator->generate()); } + public function testCorrectlyExtendsProvidedAliasIfUseAliasExists() + { + $classGenerator = new ClassGenerator(); + $classGenerator->setName('ClassName'); + $classGenerator->setNamespaceName('SomeNamespace'); + $classGenerator->addUse('Foo\\Bar', 'BarAlias'); + $classGenerator->setExtendedClass('BarAlias'); + $generated = $classGenerator->generate(); + self::assertContains('class ClassName extends BarAlias', $generated); + } + + public function testCorrectlyExtendsProvidedNamespaceAliasIfUseAliasExistsForNamespace() + { + $classGenerator = new ClassGenerator(); + $classGenerator->setName('ClassName'); + $classGenerator->setNamespaceName('SomeNamespace'); + $classGenerator->addUse('Foo\\Bar', 'BarAlias'); + $classGenerator->setExtendedClass('BarAlias\\FooBar'); + $generated = $classGenerator->generate(); + self::assertContains('class ClassName extends BarAlias\\FooBar', $generated); + } + + public function testCorrectlyExtendsAliasOfProvidedFQCNIfUseAliasExists() + { + $classGenerator = new ClassGenerator(); + $classGenerator->setName('ClassName'); + $classGenerator->setNamespaceName('SomeNamespace'); + $classGenerator->addUse('Foo\\Bar', 'BarAlias'); + $classGenerator->setExtendedClass('Foo\\Bar'); + $generated = $classGenerator->generate(); + self::assertContains('class ClassName extends BarAlias', $generated); + } + + public function testCorrectlyExtendsWithNamespaceAliasOfProvidedFQCNIfUseAliasExistsForNamespace() + { + $classGenerator = new ClassGenerator(); + $classGenerator->setName('ClassName'); + $classGenerator->setNamespaceName('SomeNamespace'); + $classGenerator->addUse('Foo\\Bar', 'BarAlias'); + $classGenerator->setExtendedClass('Foo\\Bar\\FooBar'); + $generated = $classGenerator->generate(); + self::assertContains('class ClassName extends BarAlias\\FooBar', $generated); + } + public function testCorrectImplementNames() { $classGenerator = new ClassGenerator();