From 75789fe48953a7675d7a06b9a337b8ebcac52446 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 25 Aug 2025 21:48:59 +0700 Subject: [PATCH] [DowngradePhp81] Handle version_compare() in ternary on DowngradeHashAlgorithmXxHashRector --- ...skip_check_version_compare_ternary.php.inc | 13 +++++++ ...kip_check_version_compare_ternary2.php.inc | 13 +++++++ .../DowngradeHashAlgorithmXxHashRector.php | 38 +++++++++++++++++-- 3 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 rules-tests/DowngradePhp81/Rector/FuncCall/DowngradeHashAlgorithmXxHash/Fixture/skip_check_version_compare_ternary.php.inc create mode 100644 rules-tests/DowngradePhp81/Rector/FuncCall/DowngradeHashAlgorithmXxHash/Fixture/skip_check_version_compare_ternary2.php.inc diff --git a/rules-tests/DowngradePhp81/Rector/FuncCall/DowngradeHashAlgorithmXxHash/Fixture/skip_check_version_compare_ternary.php.inc b/rules-tests/DowngradePhp81/Rector/FuncCall/DowngradeHashAlgorithmXxHash/Fixture/skip_check_version_compare_ternary.php.inc new file mode 100644 index 00000000..3d665ea4 --- /dev/null +++ b/rules-tests/DowngradePhp81/Rector/FuncCall/DowngradeHashAlgorithmXxHash/Fixture/skip_check_version_compare_ternary.php.inc @@ -0,0 +1,13 @@ +=') + ? hash( 'xxh128', $value ) + : hash( 'md4', $value ); + } +} diff --git a/rules-tests/DowngradePhp81/Rector/FuncCall/DowngradeHashAlgorithmXxHash/Fixture/skip_check_version_compare_ternary2.php.inc b/rules-tests/DowngradePhp81/Rector/FuncCall/DowngradeHashAlgorithmXxHash/Fixture/skip_check_version_compare_ternary2.php.inc new file mode 100644 index 00000000..692024df --- /dev/null +++ b/rules-tests/DowngradePhp81/Rector/FuncCall/DowngradeHashAlgorithmXxHash/Fixture/skip_check_version_compare_ternary2.php.inc @@ -0,0 +1,13 @@ +isVersionCompareTernary($node)) { + return NodeVisitor::DONT_TRAVERSE_CHILDREN; + } + + return null; + } + if ($this->shouldSkip($node)) { return null; } @@ -104,6 +118,24 @@ public function refactor(Node $node): ?Node return $node; } + private function isVersionCompareTernary(Ternary $ternary): bool + { + if ($ternary->if instanceof Expr && $ternary->cond instanceof FuncCall) { + $versionCompare = $this->conditionResolver->resolveFromExpr($ternary->cond); + if ($versionCompare instanceof VersionCompareCondition && $versionCompare->getSecondVersion() === 80100) { + if ($versionCompare->getCompareSign() === '>=') { + return $ternary->if instanceof FuncCall && $this->isName($ternary->if, 'hash'); + } + + if ($versionCompare->getCompareSign() === '<') { + return $ternary->else instanceof FuncCall && $this->isName($ternary->else, 'hash'); + } + } + } + + return false; + } + private function shouldSkip(FuncCall $funcCall): bool { if ($funcCall->isFirstClassCallable()) {