From 2ee00dc4455cb573a0a328d8b8642d2d7b48faba Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 4 Oct 2025 14:26:57 +0700 Subject: [PATCH 1/3] [CodeQuality] Skip has object inside array on UseIdenticalOverEqualWithSameTypeRector --- .../Fixture/skip_objects_inside_array.php.inc | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 rules-tests/CodeQuality/Rector/Equal/UseIdenticalOverEqualWithSameTypeRector/Fixture/skip_objects_inside_array.php.inc diff --git a/rules-tests/CodeQuality/Rector/Equal/UseIdenticalOverEqualWithSameTypeRector/Fixture/skip_objects_inside_array.php.inc b/rules-tests/CodeQuality/Rector/Equal/UseIdenticalOverEqualWithSameTypeRector/Fixture/skip_objects_inside_array.php.inc new file mode 100644 index 00000000000..22386d7d0c4 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Equal/UseIdenticalOverEqualWithSameTypeRector/Fixture/skip_objects_inside_array.php.inc @@ -0,0 +1,11 @@ + Date: Sat, 4 Oct 2025 14:27:14 +0700 Subject: [PATCH 2/3] [CodeQuality] Skip has object inside array on UseIdenticalOverEqualWithSameTypeRector --- .../Fixture/skip_objects_inside_array.php.inc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rules-tests/CodeQuality/Rector/Equal/UseIdenticalOverEqualWithSameTypeRector/Fixture/skip_objects_inside_array.php.inc b/rules-tests/CodeQuality/Rector/Equal/UseIdenticalOverEqualWithSameTypeRector/Fixture/skip_objects_inside_array.php.inc index 22386d7d0c4..6ba21685646 100644 --- a/rules-tests/CodeQuality/Rector/Equal/UseIdenticalOverEqualWithSameTypeRector/Fixture/skip_objects_inside_array.php.inc +++ b/rules-tests/CodeQuality/Rector/Equal/UseIdenticalOverEqualWithSameTypeRector/Fixture/skip_objects_inside_array.php.inc @@ -2,6 +2,9 @@ namespace Rector\Tests\CodeQuality\Rector\Equal\UseIdenticalOverEqualWithSameTypeRector\Fixture; +/** + * @see https://3v4l.org/qU0Ou + */ class SkipObjectsInsideArray { public function run(\stdClass $firstValue, \stdClass $secondValue) From d9264700bc4bb10816d59232fa541340a46269ac Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 4 Oct 2025 14:33:12 +0700 Subject: [PATCH 3/3] Fix --- ...UseIdenticalOverEqualWithSameTypeRector.php | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/rules/CodeQuality/Rector/Equal/UseIdenticalOverEqualWithSameTypeRector.php b/rules/CodeQuality/Rector/Equal/UseIdenticalOverEqualWithSameTypeRector.php index b5303723a21..a257acd8c5e 100644 --- a/rules/CodeQuality/Rector/Equal/UseIdenticalOverEqualWithSameTypeRector.php +++ b/rules/CodeQuality/Rector/Equal/UseIdenticalOverEqualWithSameTypeRector.php @@ -16,6 +16,7 @@ use PHPStan\Type\MixedType; use PHPStan\Type\StringType; use PHPStan\Type\Type; +use PHPStan\Type\TypeTraverser; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -78,7 +79,7 @@ public function refactor(Node $node): ?Node $rightStaticType = $this->nodeTypeResolver->getNativeType($node->right); // objects can be different by content - if (! $leftStaticType->isObject()->no() || ! $rightStaticType->isObject()->no()) { + if ($this->hasObjectType($leftStaticType) || $this->hasObjectType($rightStaticType)) { return null; } @@ -96,6 +97,21 @@ public function refactor(Node $node): ?Node return $this->processIdenticalOrNotIdentical($node); } + private function hasObjectType(Type $type): bool + { + $hasObjecType = false; + TypeTraverser::map($type, function (Type $type, callable $traverseCallback) use (&$hasObjecType): Type { + // maybe has object type? mark as object type + if (! $type->isObject()->no()) { + $hasObjecType = true; + } + + return $traverseCallback($type); + }); + + return $hasObjecType; + } + private function normalizeScalarType(Type $type): Type { if ($type->isString()->yes()) {