Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions baseline.xml
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,6 @@
<code><![CDATA[$rawData]]></code>
</MixedAssignment>
</file>
<file src="src/Metadata/AttributeMetadataFactory.php">
<PossiblyNullReference>
<code><![CDATA[guess]]></code>
</PossiblyNullReference>
</file>
<file src="src/Metadata/ClassMetadata.php">
<InvalidPropertyAssignmentValue>
<code><![CDATA[new ReflectionClass($data['className'])]]></code>
Expand All @@ -48,6 +43,12 @@
<InvalidOperand>
<code><![CDATA[$guessers]]></code>
</InvalidOperand>
<InvalidReturnStatement>
<code><![CDATA[$this->classMetadata[$class]]]></code>
</InvalidReturnStatement>
<InvalidReturnType>
<code><![CDATA[ClassMetadata<T>]]></code>
</InvalidReturnType>
<MixedReturnStatement>
<code><![CDATA[(new ReflectionClass($class))->newLazyProxy(
function () use ($metadata, $data): object {
Expand Down
23 changes: 1 addition & 22 deletions src/Metadata/AttributeMetadataFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,9 @@

final class AttributeMetadataFactory implements MetadataFactory
{
/** @var array<class-string, ClassMetadata> */
private array $classMetadata = [];

private readonly TypeResolver $typeResolver;

private readonly Guesser|null $guesser;
private readonly Guesser $guesser;

public function __construct(
TypeResolver|null $typeResolver = null,
Expand All @@ -60,13 +57,6 @@
*/
public function metadata(string $class): ClassMetadata
{
if (array_key_exists($class, $this->classMetadata)) {
/** @var ClassMetadata<T> $classMetadata */
$classMetadata = $this->classMetadata[$class];

return $classMetadata;
}

try {
$reflectionClass = new ReflectionClass($class);
} catch (ReflectionException) {
Expand All @@ -89,15 +79,6 @@
*/
private function getClassMetadata(ReflectionClass $reflectionClass): ClassMetadata
{
$class = $reflectionClass->getName();

if (array_key_exists($class, $this->classMetadata)) {
/** @var ClassMetadata<T> $classMetadata */
$classMetadata = $this->classMetadata[$class];

return $classMetadata;
}

$metadata = new ClassMetadata(
$reflectionClass,
$this->getPropertyMetadataList($reflectionClass),
Expand All @@ -115,8 +96,6 @@
);
}

$this->classMetadata[$class] = $metadata;

return $metadata;
}

Expand All @@ -131,11 +110,11 @@

foreach ($reflectionClass->getProperties() as $reflectionProperty) {
if ($reflectionProperty->isStatic()) {
continue;

Check warning on line 113 in src/Metadata/AttributeMetadataFactory.php

View workflow job for this annotation

GitHub Actions / Mutation tests (locked, 8.4, ubuntu-latest)

Escaped Mutant for Mutator "Continue_": @@ @@ $properties = []; foreach ($reflectionClass->getProperties() as $reflectionProperty) { if ($reflectionProperty->isStatic()) { - continue; + break; } if ($this->hasIgnore($reflectionProperty)) { continue;
}

if ($this->hasIgnore($reflectionProperty)) {
continue;

Check warning on line 117 in src/Metadata/AttributeMetadataFactory.php

View workflow job for this annotation

GitHub Actions / Mutation tests (locked, 8.4, ubuntu-latest)

Escaped Mutant for Mutator "Continue_": @@ @@ continue; } if ($this->hasIgnore($reflectionProperty)) { - continue; + break; } if ($reflectionProperty->getDeclaringClass()->getName() !== $reflectionClass->getName()) { continue;
}

if ($reflectionProperty->getDeclaringClass()->getName() !== $reflectionClass->getName()) {
Expand Down
41 changes: 31 additions & 10 deletions src/MetadataHydrator.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ final class MetadataHydrator implements Hydrator
/** @var array<int, class-string> */
private array $stack = [];

/** @var array<class-string, ClassMetadata> */
private array $classMetadata = [];

public function __construct(
private readonly MetadataFactory $metadataFactory = new AttributeMetadataFactory(),
PayloadCryptographer|null $cryptographer = null,
Expand Down Expand Up @@ -65,7 +68,7 @@ public function __construct(
public function hydrate(string $class, array $data): object
{
try {
$metadata = $this->metadataFactory->metadata($class);
$metadata = $this->metadata($class);
} catch (ClassNotFound $e) {
throw new ClassNotSupported($class, $e);
}
Expand Down Expand Up @@ -132,10 +135,6 @@ private function doHydrate(ClassMetadata $metadata, array $data): object
$normalizer = $propertyMetadata->normalizer;

if ($normalizer) {
if ($normalizer instanceof HydratorAwareNormalizer) {
$normalizer->setHydrator($this);
}

try {
/** @psalm-suppress MixedAssignment */
$value = $normalizer->denormalize($value);
Expand Down Expand Up @@ -182,7 +181,7 @@ public function extract(object $object): array
$this->stack[$objectId] = $object::class;

try {
$metadata = $this->metadataFactory->metadata($object::class);
$metadata = $this->metadata($object::class);

foreach ($metadata->preExtractCallbacks as $callback) {
$callback->invoke($object);
Expand All @@ -197,10 +196,6 @@ public function extract(object $object): array
$normalizer = $propertyMetadata->normalizer;

if ($normalizer) {
if ($normalizer instanceof HydratorAwareNormalizer) {
$normalizer->setHydrator($this);
}

try {
/** @psalm-suppress MixedAssignment */
$value = $normalizer->normalize($value);
Expand Down Expand Up @@ -261,6 +256,32 @@ private function promotedConstructorParametersWithDefaultValue(ClassMetadata $me
return $result;
}

/**
* @param class-string<T> $class
*
* @return ClassMetadata<T>
*
* @template T of object
*/
private function metadata(string $class): ClassMetadata
{
if (array_key_exists($class, $this->classMetadata)) {
return $this->classMetadata[$class];
}

$this->classMetadata[$class] = $metadata = $this->metadataFactory->metadata($class);

foreach ($metadata->properties as $property) {
if (!($property->normalizer instanceof HydratorAwareNormalizer)) {
continue;
}

$property->normalizer->setHydrator($this);
}

return $metadata;
}

/** @param iterable<Guesser> $guessers */
public static function create(
iterable $guessers = [],
Expand Down
10 changes: 0 additions & 10 deletions tests/Unit/Metadata/AttributeMetadataFactoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,16 +52,6 @@ public function testEmptyObject(): void
self::assertCount(0, $metadata->postHydrateCallbacks);
}

public function testSameMetadata(): void
{
$object = new class {
};

$metadataFactory = new AttributeMetadataFactory();

self::assertSame($metadataFactory->metadata($object::class), $metadataFactory->metadata($object::class));
}

public function testNotFoundProperty(): void
{
$this->expectException(PropertyMetadataNotFound::class);
Expand Down
Loading