Skip to content

Commit 0dbc045

Browse files
committed
Fix default values support for promoted constructor parameters
1 parent 389d85d commit 0dbc045

File tree

3 files changed

+76
-24
lines changed

3 files changed

+76
-24
lines changed

src/Mapping/Reader/ReflectionReader.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
namespace TypeLang\Mapper\Mapping\Reader;
66

77
use TypeLang\Mapper\Mapping\Reader\ReflectionReader\ClassReflectionLoaderInterface;
8-
use TypeLang\Mapper\Mapping\Reader\ReflectionReader\DefaultValueReflectionLoader;
8+
use TypeLang\Mapper\Mapping\Reader\ReflectionReader\DefaultValuePropertyReflectionLoader;
99
use TypeLang\Mapper\Mapping\Reader\ReflectionReader\PropertyReflectionLoaderInterface;
1010
use TypeLang\Mapper\Mapping\Reader\ReflectionReader\TypePropertyReflectionLoader;
1111

@@ -28,7 +28,7 @@ protected function createPropertyLoaders(): array
2828
{
2929
return [
3030
new TypePropertyReflectionLoader(),
31-
new DefaultValueReflectionLoader(),
31+
new DefaultValuePropertyReflectionLoader(),
3232
];
3333
}
3434
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace TypeLang\Mapper\Mapping\Reader\ReflectionReader;
6+
7+
use TypeLang\Mapper\Mapping\Metadata\ClassMetadata\PropertyInfo;
8+
use TypeLang\Mapper\Mapping\Metadata\ClassMetadata\PropertyMetadata\DefaultValueInfo;
9+
10+
final class DefaultValuePropertyReflectionLoader extends PropertyReflectionLoader
11+
{
12+
public function load(PropertyInfo $info, \ReflectionProperty $property): void
13+
{
14+
$this->loadPropertyDefaultValue($info, $property);
15+
$this->loadPromotedPropertyDefaultValue($info, $property);
16+
}
17+
18+
private function loadPromotedPropertyDefaultValue(PropertyInfo $info, \ReflectionProperty $property): void
19+
{
20+
if (!$property->isPromoted()) {
21+
return;
22+
}
23+
24+
$parameter = $this->findParameterByProperty($property);
25+
26+
if ($parameter === null) {
27+
return;
28+
}
29+
30+
if (!$parameter->isDefaultValueAvailable()) {
31+
return;
32+
}
33+
34+
$info->default = new DefaultValueInfo(
35+
value: $parameter->getDefaultValue(),
36+
);
37+
}
38+
39+
private function findParameterByProperty(\ReflectionProperty $property): ?\ReflectionParameter
40+
{
41+
$class = $property->getDeclaringClass();
42+
$constructor = $class->getConstructor();
43+
44+
if ($constructor === null) {
45+
return null;
46+
}
47+
48+
foreach ($constructor->getParameters() as $parameter) {
49+
// Skip non-promoted properties
50+
if (!$parameter->isPromoted()) {
51+
continue;
52+
}
53+
54+
if ($parameter->name === $property->name) {
55+
return $parameter;
56+
}
57+
}
58+
59+
return null;
60+
}
61+
62+
private function loadPropertyDefaultValue(PropertyInfo $info, \ReflectionProperty $property): void
63+
{
64+
if (!$property->hasDefaultValue()) {
65+
$this->loadPromotedPropertyDefaultValue($info, $property);
66+
67+
return;
68+
}
69+
70+
$info->default = new DefaultValueInfo(
71+
value: $property->getDefaultValue(),
72+
);
73+
}
74+
}

src/Mapping/Reader/ReflectionReader/DefaultValueReflectionLoader.php

Lines changed: 0 additions & 22 deletions
This file was deleted.

0 commit comments

Comments
 (0)