diff --git a/src/CodeGenerator.php b/src/CodeGenerator.php index 0090f84..de90d6e 100644 --- a/src/CodeGenerator.php +++ b/src/CodeGenerator.php @@ -186,9 +186,9 @@ public function importEnum(UnitEnum $enum) : string } /** - * Imports a class or function and returns the alias to use in the generated code + * Imports a class, namespace, or function and returns the alias to use in the generated code */ - public function import(FullyQualified | FunctionName | string $fqcnOrEnum) : string + public function import(FullyQualified | FunctionName | NamespaceName | string $fqcnOrEnum) : string { if ($fqcnOrEnum instanceof FunctionName) { $alias = $this->findAvailableAlias($fqcnOrEnum, $fqcnOrEnum->shortName); @@ -197,6 +197,13 @@ public function import(FullyQualified | FunctionName | string $fqcnOrEnum) : str return $alias; } + if ($fqcnOrEnum instanceof NamespaceName) { + $alias = $this->findAvailableAlias($fqcnOrEnum, $fqcnOrEnum->lastPart); + $this->imports[$alias] = $fqcnOrEnum; + + return $alias; + } + $fqcn = FullyQualified::maybeFromString($fqcnOrEnum); $alias = $this->findAvailableAlias($fqcn, $fqcn->className->name); $this->imports[$alias] = $fqcn; @@ -204,6 +211,30 @@ public function import(FullyQualified | FunctionName | string $fqcnOrEnum) : str return $alias; } + /** + * Imports a class by importing its parent namespace and returning the relative path + */ + public function importByParent(FullyQualified | string $name) : string + { + $fqcn = FullyQualified::maybeFromString($name); + + // If there's no namespace, just return the class name + if ($fqcn->namespace === null) { + return (string) $fqcn->className; + } + + // Check if the full target namespace is the same as the current namespace + if ($this->namespace?->equals($fqcn->namespace) === true) { + return (string) $fqcn->className; + } + + // Import the namespace and return the alias with class name + return (string) new FullyQualified( + $this->import($fqcn->namespace), + (string) $fqcn->className, + ); + } + /** * Generates a PHP attribute string for the given fully qualified class name */ diff --git a/tests/CodeGeneratorTest.php b/tests/CodeGeneratorTest.php index 1127ea2..0ef9c9a 100644 --- a/tests/CodeGeneratorTest.php +++ b/tests/CodeGeneratorTest.php @@ -246,6 +246,107 @@ public function testImportSameNamespace() : void ); } + public function testImportByParentWithString() : void + { + $alias = $this->generator->importByParent('App\\Models\\User'); + + self::assertSame('Models\\User', $alias); + + $this->assertDumpFile( + <<<'PHP' + generator->importByParent($fqcn); + + self::assertSame('Services\\UserService', $alias); + + $this->assertDumpFile( + <<<'PHP' + generator->importByParent('App\\Models\\User'); + $alias2 = $this->generator->importByParent('App\\Entities\\User'); + + self::assertSame('Models\\User', $alias1); + self::assertSame('Entities\\User', $alias2); + + $this->assertDumpFile( + <<<'PHP' + generator = new CodeGenerator('App\\Models'); + + $alias = $this->generator->importByParent('App\\Models\\User'); + + self::assertSame('User', $alias); + + $this->assertDumpFile( + <<<'PHP' + generator->importByParent('App\\Services\\Database\\Connection'); + + self::assertSame('Database\\Connection', $alias); + + $this->assertDumpFile( + <<<'PHP' +