Skip to content

Commit f6aa863

Browse files
committed
Move field invariance check from ReflectorMetaSource to MetaResolver
1 parent 6123ad8 commit f6aa863

File tree

6 files changed

+86
-75
lines changed

6 files changed

+86
-75
lines changed

src/Meta/Compile/CompileMeta.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,19 @@ final class CompileMeta
1717
/** @var list<ClassSource|FileSource> */
1818
private array $sources;
1919

20+
private string $sourceName;
21+
2022
/**
2123
* @param list<ClassCompileMeta> $classes
2224
* @param list<non-empty-list<FieldCompileMeta>> $fields
2325
* @param list<ClassSource|FileSource> $sources
2426
*/
25-
public function __construct(array $classes, array $fields, array $sources)
27+
public function __construct(array $classes, array $fields, array $sources, string $sourceName)
2628
{
2729
$this->classes = $classes;
2830
$this->fields = $fields;
2931
$this->sources = $sources;
32+
$this->sourceName = $sourceName;
3033
}
3134

3235
/**
@@ -68,4 +71,9 @@ public function hasAnyMeta(): bool
6871
return false;
6972
}
7073

74+
public function getSourceName(): string
75+
{
76+
return $this->sourceName;
77+
}
78+
7179
}

src/Meta/MetaResolver.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,9 @@ private function checkObjectCanBeInstantiated(ReflectionClass $class, ClassRunti
194194
private function resolveFieldsMeta(ReflectionClass $rootClass, CompileMeta $meta): array
195195
{
196196
$fields = [];
197+
$sourceName = $meta->getSourceName();
197198
foreach ($meta->getFields() as $fieldMetas) {
199+
$this->checkFieldInvariance($rootClass, $fieldMetas, $sourceName);
198200
foreach ($fieldMetas as $fieldMeta) {
199201
$resolved = $this->resolveFieldMeta(
200202
$rootClass,
@@ -210,6 +212,34 @@ private function resolveFieldsMeta(ReflectionClass $rootClass, CompileMeta $meta
210212
return $fields;
211213
}
212214

215+
/**
216+
* @param ReflectionClass<MappedObject> $rootClass
217+
* @param list<FieldCompileMeta> $resolvedGroup
218+
*/
219+
private function checkFieldInvariance(ReflectionClass $rootClass, array $resolvedGroup, string $sourceName): void
220+
{
221+
$previousFieldMeta = null;
222+
foreach ($resolvedGroup as $fieldMeta) {
223+
if ($previousFieldMeta !== null && !$fieldMeta->hasEqualMeta($previousFieldMeta)) {
224+
$name = $this->getRelativePropertyName($fieldMeta->getProperty(), $rootClass);
225+
$previousName = $this->getRelativePropertyName($previousFieldMeta->getProperty(), $rootClass);
226+
227+
$message = Message::create()
228+
->withContext("Resolving metadata of mapped object '{$rootClass->getName()}'.")
229+
->withProblem(
230+
"Definition in $sourceName of property '$name' differs from definition in $sourceName"
231+
. " of property '$previousName'.",
232+
)
233+
->withSolution("Don't override metadata of properties in child classes.");
234+
235+
throw InvalidArgument::create()
236+
->withMessage($message);
237+
}
238+
239+
$previousFieldMeta = $fieldMeta;
240+
}
241+
}
242+
213243
/**
214244
* @return int|string
215245
*/

src/Meta/Source/ReflectorMetaSource.php

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public function load(ReflectionClass $rootClass, StructureGroup $group): Compile
5050
$this->loadClassMeta($rootClass, $group),
5151
$this->loadPropertiesMeta($rootClass, $group),
5252
$sources,
53+
$this->getSourceName(),
5354
);
5455
}
5556

@@ -210,7 +211,6 @@ private function loadPropertiesMeta(ReflectionClass $rootClass, StructureGroup $
210211
continue;
211212
}
212213

213-
$this->checkFieldInvariance($rootClass, $resolvedGroup);
214214
$resolved[] = $resolvedGroup;
215215
}
216216

@@ -243,35 +243,6 @@ private function checkDefinitionType(MetaDefinition $definition): MetaDefinition
243243
return $definition;
244244
}
245245

246-
/**
247-
* @param ReflectionClass<covariant MappedObject> $rootClass
248-
* @param list<FieldCompileMeta> $resolvedGroup
249-
*/
250-
private function checkFieldInvariance(ReflectionClass $rootClass, array $resolvedGroup): void
251-
{
252-
$sourceName = $this->getSourceName();
253-
$previousFieldMeta = null;
254-
foreach ($resolvedGroup as $fieldMeta) {
255-
if ($previousFieldMeta !== null && !$fieldMeta->hasEqualMeta($previousFieldMeta)) {
256-
$name = $this->getRelativePropertyName($fieldMeta->getProperty(), $rootClass);
257-
$previousName = $this->getRelativePropertyName($previousFieldMeta->getProperty(), $rootClass);
258-
259-
$message = Message::create()
260-
->withContext("Resolving metadata of mapped object '{$rootClass->getName()}'.")
261-
->withProblem(
262-
"Definition in $sourceName of property '$name' differs from definition in $sourceName"
263-
. " of property '$previousName'.",
264-
)
265-
->withSolution("Don't override metadata of properties in child classes.");
266-
267-
throw InvalidArgument::create()
268-
->withMessage($message);
269-
}
270-
271-
$previousFieldMeta = $fieldMeta;
272-
}
273-
}
274-
275246
/**
276247
* @param ReflectionClass<covariant MappedObject> $rootClass
277248
*/

tests/Unit/Meta/Compile/CompileMetaTest.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,9 @@ public function test(): void
5050
new ClassSource(new ReflectionClass(self::class)),
5151
new FileSource(__FILE__),
5252
];
53+
$sourceName = 'test';
5354

54-
$meta = new CompileMeta($classes, $fields, $sources);
55+
$meta = new CompileMeta($classes, $fields, $sources, $sourceName);
5556

5657
self::assertSame(
5758
$classes,
@@ -65,6 +66,10 @@ public function test(): void
6566
$sources,
6667
$meta->getSources(),
6768
);
69+
self::assertSame(
70+
$sourceName,
71+
$meta->getSourceName(),
72+
);
6873
self::assertTrue($meta->hasAnyMeta());
6974
}
7075

@@ -82,6 +87,7 @@ public function testHasAnyAttributes(): void
8287
],
8388
[],
8489
[],
90+
'test',
8591
);
8692
self::assertFalse($meta->hasAnyMeta());
8793

@@ -98,6 +104,7 @@ public function testHasAnyAttributes(): void
98104
],
99105
[],
100106
[],
107+
'test',
101108
);
102109
self::assertTrue($meta->hasAnyMeta());
103110

@@ -121,6 +128,7 @@ public function testHasAnyAttributes(): void
121128
],
122129
],
123130
[],
131+
'test',
124132
);
125133
self::assertTrue($meta->hasAnyMeta());
126134
}

tests/Unit/Meta/MetaResolverTest.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
use Tests\Orisai\ObjectMapper\Doubles\Invalid\FieldTraitMetaInvalidScopeRootVO;
1818
use Tests\Orisai\ObjectMapper\Doubles\Invalid\MultipleIdenticalFieldNamesVO;
1919
use Tests\Orisai\ObjectMapper\Doubles\Invalid\StaticMappedPropertyVO;
20+
use Tests\Orisai\ObjectMapper\Doubles\Invalid\VariantFieldChildVO;
21+
use Tests\Orisai\ObjectMapper\Doubles\Invalid\VariantFieldVO;
2022
use Tests\Orisai\ObjectMapper\Doubles\Invalid\WrongCallbackArgsTypeVO;
2123
use Tests\Orisai\ObjectMapper\Doubles\Invalid\WrongRuleArgsTypeVO;
2224
use Tests\Orisai\ObjectMapper\Doubles\Rules\WrongArgsTypeRule;
@@ -124,6 +126,41 @@ public function provideMetaOutOfScope(): Generator
124126
];
125127
}
126128

129+
public function testFieldInvarianceRelativeName(): void
130+
{
131+
$this->expectException(InvalidArgument::class);
132+
$this->expectExceptionMessage(
133+
<<<'MSG'
134+
Context: Resolving metadata of mapped object
135+
'Tests\Orisai\ObjectMapper\Doubles\Invalid\VariantFieldVO'.
136+
Problem: Definition in annotation of property '$field' differs from definition
137+
in annotation of property
138+
'Tests\Orisai\ObjectMapper\Doubles\Invalid\VariantFieldParentVO->$field'.
139+
Solution: Don't override metadata of properties in child classes.
140+
MSG,
141+
);
142+
143+
$this->metaLoader->load(VariantFieldVO::class);
144+
}
145+
146+
public function testFieldInvarianceFullName(): void
147+
{
148+
$this->expectException(InvalidArgument::class);
149+
$this->expectExceptionMessage(
150+
<<<'MSG'
151+
Context: Resolving metadata of mapped object
152+
'Tests\Orisai\ObjectMapper\Doubles\Invalid\VariantFieldChildVO'.
153+
Problem: Definition in annotation of property
154+
'Tests\Orisai\ObjectMapper\Doubles\Invalid\VariantFieldVO->$field'
155+
differs from definition in annotation of property
156+
'Tests\Orisai\ObjectMapper\Doubles\Invalid\VariantFieldParentVO->$field'.
157+
Solution: Don't override metadata of properties in child classes.
158+
MSG,
159+
);
160+
161+
$this->metaLoader->load(VariantFieldChildVO::class);
162+
}
163+
127164
public function testMultipleIdenticalFieldNames(): void
128165
{
129166
$this->expectException(InvalidState::class);

tests/Unit/Meta/Source/ReflectorMetaSourceTest.php

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121
use Tests\Orisai\ObjectMapper\Doubles\Invalid\RuleAboveClassVO;
2222
use Tests\Orisai\ObjectMapper\Doubles\Invalid\UnsupportedClassDefinitionVO;
2323
use Tests\Orisai\ObjectMapper\Doubles\Invalid\UnsupportedPropertyDefinitionVO;
24-
use Tests\Orisai\ObjectMapper\Doubles\Invalid\VariantFieldChildVO;
25-
use Tests\Orisai\ObjectMapper\Doubles\Invalid\VariantFieldVO;
2624

2725
final class ReflectorMetaSourceTest extends TestCase
2826
{
@@ -80,47 +78,6 @@ public function provideUnsupportedDefinitionType(): Generator
8078
];
8179
}
8280

83-
public function testFieldInvarianceRelativeName(): void
84-
{
85-
$reflector = new ReflectionClass(VariantFieldVO::class);
86-
$group = $this->createStructureGroup($reflector);
87-
88-
$this->expectException(InvalidArgument::class);
89-
$this->expectExceptionMessage(
90-
<<<'MSG'
91-
Context: Resolving metadata of mapped object
92-
'Tests\Orisai\ObjectMapper\Doubles\Invalid\VariantFieldVO'.
93-
Problem: Definition in annotation of property '$field' differs from definition
94-
in annotation of property
95-
'Tests\Orisai\ObjectMapper\Doubles\Invalid\VariantFieldParentVO->$field'.
96-
Solution: Don't override metadata of properties in child classes.
97-
MSG,
98-
);
99-
100-
$this->source->load($reflector, $group);
101-
}
102-
103-
public function testFieldInvarianceFullName(): void
104-
{
105-
$reflector = new ReflectionClass(VariantFieldChildVO::class);
106-
$group = $this->createStructureGroup($reflector);
107-
108-
$this->expectException(InvalidArgument::class);
109-
$this->expectExceptionMessage(
110-
<<<'MSG'
111-
Context: Resolving metadata of mapped object
112-
'Tests\Orisai\ObjectMapper\Doubles\Invalid\VariantFieldChildVO'.
113-
Problem: Definition in annotation of property
114-
'Tests\Orisai\ObjectMapper\Doubles\Invalid\VariantFieldVO->$field'
115-
differs from definition in annotation of property
116-
'Tests\Orisai\ObjectMapper\Doubles\Invalid\VariantFieldParentVO->$field'.
117-
Solution: Don't override metadata of properties in child classes.
118-
MSG,
119-
);
120-
121-
$this->source->load($reflector, $group);
122-
}
123-
12481
public function testRuleAboveClassRelativeName(): void
12582
{
12683
$reflector = new ReflectionClass(RuleAboveClassVO::class);

0 commit comments

Comments
 (0)