From 9dd48d35f6b6a15fe1cdd2a3abfde42bfc997d07 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Mon, 3 Aug 2026 00:00:01 +0200 Subject: [PATCH] [CodingStyle] Deprecate NullableCompareToNullRector --- .../Fixture/fixture.php.inc | 27 ---------- .../Fixture/fixture3.php.inc | 49 ----------------- .../Fixture/keep_nullable_bool.php.inc | 13 ----- .../Fixture/skip_fixture2.php.inc | 6 --- .../Fixture/skip_mixed.php.inc | 18 ------- .../Fixture/skip_nullable_scalars.php.inc | 42 --------------- .../Fixture/skip_phpdoc.php.inc | 11 ---- .../NullableCompareToNullRectorTest.php | 28 ---------- .../config/configured_rule.php | 9 ---- .../If_/NullableCompareToNullRector.php | 54 +++---------------- src/Config/Level/CodingStyleLevel.php | 2 - 11 files changed, 8 insertions(+), 251 deletions(-) delete mode 100644 rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/Fixture/fixture.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/Fixture/fixture3.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/Fixture/keep_nullable_bool.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/Fixture/skip_fixture2.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/Fixture/skip_mixed.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/Fixture/skip_nullable_scalars.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/Fixture/skip_phpdoc.php.inc delete mode 100644 rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/NullableCompareToNullRectorTest.php delete mode 100644 rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/config/configured_rule.php diff --git a/rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/Fixture/fixture.php.inc b/rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/Fixture/fixture.php.inc deleted file mode 100644 index cec254913f9..00000000000 --- a/rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/Fixture/fixture.php.inc +++ /dev/null @@ -1,27 +0,0 @@ - ------ - diff --git a/rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/Fixture/fixture3.php.inc b/rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/Fixture/fixture3.php.inc deleted file mode 100644 index 1ff1847afe0..00000000000 --- a/rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/Fixture/fixture3.php.inc +++ /dev/null @@ -1,49 +0,0 @@ -getNullOrObject()) { - return true; - } - - return false; - } - - private function getNullOrObject(): ?stdClass - { - return null; - } -} - -?> ------ -getNullOrObject() !== null) { - return true; - } - - return false; - } - - private function getNullOrObject(): ?stdClass - { - return null; - } -} - -?> diff --git a/rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/Fixture/keep_nullable_bool.php.inc b/rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/Fixture/keep_nullable_bool.php.inc deleted file mode 100644 index 6f6fa5b5630..00000000000 --- a/rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/Fixture/keep_nullable_bool.php.inc +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/NullableCompareToNullRectorTest.php b/rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/NullableCompareToNullRectorTest.php deleted file mode 100644 index c1ae38972d7..00000000000 --- a/rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/NullableCompareToNullRectorTest.php +++ /dev/null @@ -1,28 +0,0 @@ -doTestFile($filePath); - } - - public static function provideData(): Iterator - { - return self::yieldFilesFromDirectory(__DIR__ . '/Fixture'); - } - - public function provideConfigFilePath(): string - { - return __DIR__ . '/config/configured_rule.php'; - } -} diff --git a/rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/config/configured_rule.php b/rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/config/configured_rule.php deleted file mode 100644 index b009ae86232..00000000000 --- a/rules-tests/CodingStyle/Rector/If_/NullableCompareToNullRector/config/configured_rule.php +++ /dev/null @@ -1,9 +0,0 @@ -withRules([NullableCompareToNullRector::class]); diff --git a/rules/CodingStyle/Rector/If_/NullableCompareToNullRector.php b/rules/CodingStyle/Rector/If_/NullableCompareToNullRector.php index 028d5420b91..a34c11b5373 100644 --- a/rules/CodingStyle/Rector/If_/NullableCompareToNullRector.php +++ b/rules/CodingStyle/Rector/If_/NullableCompareToNullRector.php @@ -5,21 +5,17 @@ namespace Rector\CodingStyle\Rector\If_; use PhpParser\Node; -use PhpParser\Node\Expr; -use PhpParser\Node\Expr\BinaryOp\Identical; -use PhpParser\Node\Expr\BinaryOp\NotIdentical; -use PhpParser\Node\Expr\BooleanNot; use PhpParser\Node\Stmt\If_; -use PHPStan\Type\TypeCombinator; -use PHPStan\Type\UnionType; +use Rector\Configuration\Deprecation\Contract\DeprecatedInterface; +use Rector\Exception\ShouldNotHappenException; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** - * @see \Rector\Tests\CodingStyle\Rector\If_\NullableCompareToNullRector\NullableCompareToNullRectorTest + * @deprecated This rule is deprecated, as comparing a nullable object to null is ambiguous and weak. Use an "instanceof" check instead, e.g. the instanceof rule set. */ -final class NullableCompareToNullRector extends AbstractRector +final class NullableCompareToNullRector extends AbstractRector implements DeprecatedInterface { public function getRuleDefinition(): RuleDefinition { @@ -62,43 +58,9 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - if ($node->cond instanceof BooleanNot && $this->isNullableNonScalarType($node->cond->expr)) { - $node->cond = new Identical($node->cond->expr, $this->nodeFactory->createNull()); - - return $node; - } - - if ($this->isNullableNonScalarType($node->cond)) { - $node->cond = new NotIdentical($node->cond, $this->nodeFactory->createNull()); - - return $node; - } - - return null; - } - - private function isNullableNonScalarType(Expr $expr): bool - { - $nativeType = $this->nodeTypeResolver->getNativeType($expr); - - // is non-nullable? - if (! TypeCombinator::containsNull($nativeType)) { - return false; - } - - if (! $nativeType instanceof UnionType) { - return false; - } - - // is array? - foreach ($nativeType->getTypes() as $subType) { - if ($subType->isArray()->yes()) { - return false; - } - } - - $nativeType = TypeCombinator::removeNull($nativeType); - return ! $nativeType->isScalar() - ->yes(); + throw new ShouldNotHappenException(sprintf( + '"%s" is deprecated, as null compare is ambiguous and weak; use an "instanceof" check instead', + self::class + )); } } diff --git a/src/Config/Level/CodingStyleLevel.php b/src/Config/Level/CodingStyleLevel.php index f0c9d7b983c..b778af5e4ec 100644 --- a/src/Config/Level/CodingStyleLevel.php +++ b/src/Config/Level/CodingStyleLevel.php @@ -20,7 +20,6 @@ use Rector\CodingStyle\Rector\FuncCall\StrictArraySearchRector; use Rector\CodingStyle\Rector\FuncCall\StrictInArrayRector; use Rector\CodingStyle\Rector\FuncCall\VersionCompareFuncCallToConstantRector; -use Rector\CodingStyle\Rector\If_\NullableCompareToNullRector; use Rector\CodingStyle\Rector\Property\SplitGroupedPropertiesRector; use Rector\CodingStyle\Rector\Stmt\NewlineAfterStatementRector; use Rector\CodingStyle\Rector\Stmt\RemoveUselessAliasInUseStatementRector; @@ -55,7 +54,6 @@ final class CodingStyleLevel SeparateMultiUseImportsRector::class, NewlineBetweenClassLikeStmtsRector::class, NewlineAfterStatementRector::class, - NullableCompareToNullRector::class, ConsistentImplodeRector::class, SimplifyQuoteEscapeRector::class, StringClassNameToClassConstantRector::class,