From 085ce520403b7cf61a58bf8d963f659ba2633312 Mon Sep 17 00:00:00 2001 From: jerodev Date: Wed, 17 May 2023 12:58:54 +0200 Subject: [PATCH 1/2] Create test --- tests/MapperTest.php | 17 +++++++++++++++++ tests/_Mocks/Constructor.php | 14 ++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 tests/_Mocks/Constructor.php diff --git a/tests/MapperTest.php b/tests/MapperTest.php index 35bd09f..6250a88 100644 --- a/tests/MapperTest.php +++ b/tests/MapperTest.php @@ -7,6 +7,7 @@ use Jerodev\DataMapper\Mapper; use Jerodev\DataMapper\MapperConfig; use Jerodev\DataMapper\Tests\_Mocks\Aliases; +use Jerodev\DataMapper\Tests\_Mocks\Constructor; use Jerodev\DataMapper\Tests\_Mocks\SelfMapped; use Jerodev\DataMapper\Tests\_Mocks\SuitEnum; use Jerodev\DataMapper\Tests\_Mocks\SuperUserDto; @@ -158,5 +159,21 @@ public static function objectValuesDataProvider(): Generator [], $dto, ]; + + // Array in constructor + $dto = new Constructor([ + new UserDto('Jerodev'), + ]); + yield [ + Constructor::class, + [ + 'users' => [ + [ + 'name' => 'Jerodev', + ], + ], + ], + $dto, + ]; } } diff --git a/tests/_Mocks/Constructor.php b/tests/_Mocks/Constructor.php new file mode 100644 index 0000000..16d0247 --- /dev/null +++ b/tests/_Mocks/Constructor.php @@ -0,0 +1,14 @@ + Date: Wed, 17 May 2023 13:13:36 +0200 Subject: [PATCH 2/2] Find class in same namespace as caller --- src/Objects/ClassBluePrinter.php | 5 ++++- src/Objects/ClassResolver.php | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/Objects/ClassBluePrinter.php b/src/Objects/ClassBluePrinter.php index c97488c..b1c03a4 100644 --- a/src/Objects/ClassBluePrinter.php +++ b/src/Objects/ClassBluePrinter.php @@ -53,7 +53,10 @@ private function printConstructor(ReflectionClass $reflection, ClassBluePrint $b $arg = [ 'name' => $param->getName(), - 'type' => $this->resolveType($this->dataTypeFactory->fromString($type), $reflection->getName()), + 'type' => $this->resolveType( + $this->dataTypeFactory->fromString($type), + $reflection->getName(), + ), ]; if ($param->isDefaultValueAvailable()) { $arg['default'] = $param->getDefaultValue(); diff --git a/src/Objects/ClassResolver.php b/src/Objects/ClassResolver.php index 338e0d0..3f9d3bb 100644 --- a/src/Objects/ClassResolver.php +++ b/src/Objects/ClassResolver.php @@ -71,6 +71,20 @@ private function findClassNameInFile(string $name, string $sourceFile): string continue; } + // Find the class in the same namespace as the caller + if ($newline && $char === 'n' && \substr($file, $i, 10) === 'namespace ') { + $i += 10; + $namespace = ''; + while (($char = $file[$i++]) !== ';') { + $namespace .= $char; + } + + $classInNamespace = $namespace . '\\' . $lastPart; + if (\class_exists($classInNamespace)) { + return $classInNamespace; + } + } + // If we are after a newline and find a use statement, parse it! if ($newline && $char === 'u' && \substr($file, $i, 4) === 'use ') { $i += 4;