Skip to content

Commit

Permalink
add remover metadata & fix remover
Browse files Browse the repository at this point in the history
  • Loading branch information
priyadi committed May 1, 2024
1 parent 82d34a5 commit a9768d6
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 7 deletions.
14 changes: 8 additions & 6 deletions src/Transformer/Model/AdderRemoverProxy.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public function __construct(
/**
* @return \ArrayAccess<TKey,TValue>|array<TKey,TValue>
*/
private function getValue(): mixed
private function getCollection(): mixed
{
if ($this->getterMethodName === null) {
throw new LogicException('Getter method is not available');
Expand All @@ -58,7 +58,7 @@ private function getValue(): mixed

public function getIterator(): \Traversable
{
$value = $this->getValue();
$value = $this->getCollection();

if ($value instanceof \Traversable) {
return $value;
Expand All @@ -71,13 +71,13 @@ public function getIterator(): \Traversable

public function offsetExists(mixed $offset): bool
{
return isset($this->getValue()[$offset]);
return isset($this->getCollection()[$offset]);
}

/** @psalm-suppress MixedInferredReturnType */
public function offsetGet(mixed $offset): mixed
{
return $this->getValue()[$offset];
return $this->getCollection()[$offset];
}

public function offsetSet(mixed $offset, mixed $value): void
Expand All @@ -96,13 +96,15 @@ public function offsetUnset(mixed $offset): void
throw new LogicException('Remover method is not available');
}

$value = $this->getCollection()[$offset];

/** @psalm-suppress MixedMethodCall */
$this->hostObject->{$this->removerMethodName}($offset);
$this->hostObject->{$this->removerMethodName}($value);
}

public function count(): int
{
$value = $this->getValue();
$value = $this->getCollection();

if ($value instanceof \Countable) {
return $value->count();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -254,19 +254,29 @@ public function createObjectToObjectMetadata(

// process target setter write mode

$targetRemoverWriteName = null;
$targetRemoverWriteVisibility = Visibility::None;

if ($targetSetterWriteInfo === null) {
$targetSetterWriteMode = WriteMode::None;
$targetSetterWriteName = null;
$targetSetterWriteVisibility = Visibility::None;
} elseif ($targetSetterWriteInfo->getType() === PropertyWriteInfo::TYPE_ADDER_AND_REMOVER) {
$targetSetterWriteMode = WriteMode::AdderRemover;
$targetSetterWriteName = $targetSetterWriteInfo->getAdderInfo()->getName();
$targetRemoverWriteName = $targetSetterWriteInfo->getRemoverInfo()->getName();
$targetSetterWriteVisibility = match ($targetSetterWriteInfo->getAdderInfo()->getVisibility()) {
PropertyWriteInfo::VISIBILITY_PUBLIC => Visibility::Public,
PropertyWriteInfo::VISIBILITY_PROTECTED => Visibility::Protected,
PropertyWriteInfo::VISIBILITY_PRIVATE => Visibility::Private,
default => Visibility::None,
};
$targetRemoverWriteVisibility = match ($targetSetterWriteInfo->getRemoverInfo()->getVisibility()) {
PropertyWriteInfo::VISIBILITY_PUBLIC => Visibility::Public,
PropertyWriteInfo::VISIBILITY_PROTECTED => Visibility::Protected,
PropertyWriteInfo::VISIBILITY_PRIVATE => Visibility::Private,
default => Visibility::None,
};
} else {
$targetSetterWriteMode = match ($targetSetterWriteInfo->getType()) {
PropertyWriteInfo::TYPE_METHOD => WriteMode::Method,
Expand Down Expand Up @@ -376,7 +386,9 @@ public function createObjectToObjectMetadata(
targetReadVisibility: $targetReadVisibility,
targetSetterWriteMode: $targetSetterWriteMode,
targetSetterWriteName: $targetSetterWriteName,
targetRemoverWriteName: $targetRemoverWriteName,
targetSetterWriteVisibility: $targetSetterWriteVisibility,
targetRemoverWriteVisibility: $targetRemoverWriteVisibility,
targetConstructorWriteMode: $targetConstructorWriteMode,
targetConstructorWriteName: $targetConstructorWriteName,
targetScalarType: $targetPropertyScalarType,
Expand Down
12 changes: 12 additions & 0 deletions src/Transformer/ObjectToObjectMetadata/PropertyMapping.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,9 @@ public function __construct(
private Visibility $targetReadVisibility,
private WriteMode $targetSetterWriteMode,
private ?string $targetSetterWriteName,
private ?string $targetRemoverWriteName,
private Visibility $targetSetterWriteVisibility,
private Visibility $targetRemoverWriteVisibility,
private WriteMode $targetConstructorWriteMode,
private ?string $targetConstructorWriteName,
private ?string $targetScalarType,
Expand Down Expand Up @@ -186,4 +188,14 @@ public function targetAllowsDelete(): bool
{
return $this->targetAllowsDelete;
}

public function getTargetRemoverWriteName(): ?string
{
return $this->targetRemoverWriteName;
}

public function getTargetRemoverWriteVisibility(): Visibility
{
return $this->targetRemoverWriteVisibility;
}
}
9 changes: 8 additions & 1 deletion src/Transformer/Util/ReaderWriter.php
Original file line number Diff line number Diff line change
Expand Up @@ -100,11 +100,18 @@ public function readTargetProperty(
$propertyMapping->getTargetSetterWriteMode() === WriteMode::AdderRemover
&& $propertyMapping->getTargetSetterWriteVisibility() === Visibility::Public
) {
if ($propertyMapping->getTargetRemoverWriteVisibility() === Visibility::Public
) {
$removerMethodName = $propertyMapping->getTargetRemoverWriteName();
} else {
$removerMethodName = null;
}

return new AdderRemoverProxy(
hostObject: $target,
getterMethodName: $propertyMapping->getTargetReadName(),
adderMethodName: $propertyMapping->getTargetSetterWriteName(),
removerMethodName: null
removerMethodName: $removerMethodName,
);
}

Expand Down

0 comments on commit a9768d6

Please sign in to comment.