From fcc61aa4c0729134f2a5217204025064242d7f72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Tue, 11 Mar 2025 16:21:16 +0100 Subject: [PATCH] fixup! Add Rector Rule to inject normalization methods into export classes --- phpunit.rector.xml | 33 ++++-- ...eAddNormalizationMethodsOnExportRector.php | 33 ++++-- .../add-method-with-already-trait.php.inc | 109 ++++++++++++++++++ 3 files changed, 153 insertions(+), 22 deletions(-) create mode 100644 utils/rector/tests/ChillBundleAddNormalizationMethodsOnExportRector/Fixture/add-method-with-already-trait.php.inc diff --git a/phpunit.rector.xml b/phpunit.rector.xml index 25e0d25aa..73fbee8e5 100644 --- a/phpunit.rector.xml +++ b/phpunit.rector.xml @@ -1,13 +1,24 @@ - - - - utils/rector/tests - - - - - utils/rector/src - - + + + + utils/rector/tests + + + + + utils/rector/src + + diff --git a/utils/rector/src/Rector/ChillBundleAddNormalizationMethodsOnExportRector.php b/utils/rector/src/Rector/ChillBundleAddNormalizationMethodsOnExportRector.php index e5d265ed4..cd660a5ef 100644 --- a/utils/rector/src/Rector/ChillBundleAddNormalizationMethodsOnExportRector.php +++ b/utils/rector/src/Rector/ChillBundleAddNormalizationMethodsOnExportRector.php @@ -78,9 +78,13 @@ class ChillBundleAddNormalizationMethodsOnExportRector extends AbstractRector foreach ($node->stmts as $k => $stmt) { if ($stmt instanceof Node\Stmt\TraitUse) { - if (ExportDataNormalizerTrait::class === $stmt->traits[0]->toString()) { + $trait = $stmt->traits[0]; + + if (str_contains($trait->toString(), ExportDataNormalizerTrait::class)) { $hasTraitHelper = true; } + + continue; } elseif (!$stmt instanceof Node\Stmt\ClassMethod) { continue; } @@ -97,6 +101,10 @@ class ChillBundleAddNormalizationMethodsOnExportRector extends AbstractRector } } + if ($hasDenormalizeMethod && $hasNormalizedMethod && $hasGetVersionMethod) { + return null; + } + $toAddBefore = []; $toAdd = []; @@ -105,17 +113,20 @@ class ChillBundleAddNormalizationMethodsOnExportRector extends AbstractRector $propertiesOnForm = $this->getPropertiesOnForm($buildForm); // if the trait is not present, we add it into the statements - if (!$hasTraitHelper && array_reduce( - $propertiesOnForm, - function (bool $carry, string $item): bool { - if ('entity' === $item || 'date' === $item) { - return true; - } + if ( + !$hasTraitHelper + && (!$hasNormalizedMethod || !$hasDenormalizeMethod) + && array_reduce( + $propertiesOnForm, + function (bool $carry, string $item): bool { + if ('entity' === $item || 'date' === $item) { + return true; + } - return $carry; - }, - false, - )) { + return $carry; + }, + false, + )) { $toAddBefore[] = new Node\Stmt\TraitUse([ new Node\Name('\\'.ExportDataNormalizerTrait::class), ]); diff --git a/utils/rector/tests/ChillBundleAddNormalizationMethodsOnExportRector/Fixture/add-method-with-already-trait.php.inc b/utils/rector/tests/ChillBundleAddNormalizationMethodsOnExportRector/Fixture/add-method-with-already-trait.php.inc new file mode 100644 index 000000000..8911a671d --- /dev/null +++ b/utils/rector/tests/ChillBundleAddNormalizationMethodsOnExportRector/Fixture/add-method-with-already-trait.php.inc @@ -0,0 +1,109 @@ +add('entity', EntityType::class, []); + } + + public function getFormDefaultData(): array + { + return []; + } + + public function describeAction($data, $format = 'string') + { + return []; + } + + public function addRole(): ?string + { + return null; + } + + public function alterQuery(\Doctrine\ORM\QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext) + { + // nothing to add here + } + + public function applyOn() + { + return ['something']; + } +} + +?> +----- +add('entity', EntityType::class, []); + } + public function getNormalizationVersion(): int + { + return 1; + } + public function normalizeFormData(array $formData): array + { + return ['entity' => $this->normalizeDoctrineEntity($formData['entity'])]; + } + public function denormalizeFormData(array $formData, int $fromVersion): array + { + return ['entity' => $this->denormalizeDoctrineEntity($formData['entity'], $this->someRepository)]; + } + + public function getFormDefaultData(): array + { + return []; + } + + public function describeAction($data, $format = 'string') + { + return []; + } + + public function addRole(): ?string + { + return null; + } + + public function alterQuery(\Doctrine\ORM\QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext) + { + // nothing to add here + } + + public function applyOn() + { + return ['something']; + } +} + +?>