Skip to content

Commit 43d02c6

Browse files
authored
[Next] Resolve classes in same namespace as caller (#14)
1 parent 5491496 commit 43d02c6

File tree

4 files changed

+49
-1
lines changed

4 files changed

+49
-1
lines changed

src/Objects/ClassBluePrinter.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,10 @@ private function printConstructor(ReflectionClass $reflection, ClassBluePrint $b
5353

5454
$arg = [
5555
'name' => $param->getName(),
56-
'type' => $this->resolveType($this->dataTypeFactory->fromString($type), $reflection->getName()),
56+
'type' => $this->resolveType(
57+
$this->dataTypeFactory->fromString($type),
58+
$reflection->getName(),
59+
),
5760
];
5861
if ($param->isDefaultValueAvailable()) {
5962
$arg['default'] = $param->getDefaultValue();

src/Objects/ClassResolver.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,20 @@ private function findClassNameInFile(string $name, string $sourceFile): string
7171
continue;
7272
}
7373

74+
// Find the class in the same namespace as the caller
75+
if ($newline && $char === 'n' && \substr($file, $i, 10) === 'namespace ') {
76+
$i += 10;
77+
$namespace = '';
78+
while (($char = $file[$i++]) !== ';') {
79+
$namespace .= $char;
80+
}
81+
82+
$classInNamespace = $namespace . '\\' . $lastPart;
83+
if (\class_exists($classInNamespace)) {
84+
return $classInNamespace;
85+
}
86+
}
87+
7488
// If we are after a newline and find a use statement, parse it!
7589
if ($newline && $char === 'u' && \substr($file, $i, 4) === 'use ') {
7690
$i += 4;

tests/MapperTest.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Jerodev\DataMapper\Mapper;
88
use Jerodev\DataMapper\MapperConfig;
99
use Jerodev\DataMapper\Tests\_Mocks\Aliases;
10+
use Jerodev\DataMapper\Tests\_Mocks\Constructor;
1011
use Jerodev\DataMapper\Tests\_Mocks\SelfMapped;
1112
use Jerodev\DataMapper\Tests\_Mocks\SuitEnum;
1213
use Jerodev\DataMapper\Tests\_Mocks\SuperUserDto;
@@ -158,5 +159,21 @@ public static function objectValuesDataProvider(): Generator
158159
[],
159160
$dto,
160161
];
162+
163+
// Array in constructor
164+
$dto = new Constructor([
165+
new UserDto('Jerodev'),
166+
]);
167+
yield [
168+
Constructor::class,
169+
[
170+
'users' => [
171+
[
172+
'name' => 'Jerodev',
173+
],
174+
],
175+
],
176+
$dto,
177+
];
161178
}
162179
}

tests/_Mocks/Constructor.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Jerodev\DataMapper\Tests\_Mocks;
4+
5+
final class Constructor
6+
{
7+
/**
8+
* @param UserDto[] $users
9+
*/
10+
public function __construct(
11+
public readonly array $users,
12+
) {
13+
}
14+
}

0 commit comments

Comments
 (0)