diff --git a/phpunit.xml b/phpunit.xml
index 37c4eb12d7f..126fa625414 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -14,7 +14,6 @@
tests
rules-tests
utils/phpstan/tests
- rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Source/SomeAbstractTest.php
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/AddOverrideAttributeToOverriddenMethodsRectorTest.php b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/AddOverrideAttributeToOverriddenMethodsRectorTest.php
deleted file mode 100644
index cb1bb9e537c..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/AddOverrideAttributeToOverriddenMethodsRectorTest.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/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/AddToInterfaceMethodsTest.php b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/AddToInterfaceMethodsTest.php
deleted file mode 100644
index c82b8a9d105..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/AddToInterfaceMethodsTest.php
+++ /dev/null
@@ -1,28 +0,0 @@
-doTestFile($filePath);
- }
-
- public static function provideData(): Iterator
- {
- return self::yieldFilesFromDirectory(__DIR__ . '/FixtureAddToInterfaceMethods');
- }
-
- public function provideConfigFilePath(): string
- {
- return __DIR__ . '/config/add_to_interface_methods_configured_rule.php';
- }
-}
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/apply_attribute_to_overridden_methods.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/apply_attribute_to_overridden_methods.php.inc
deleted file mode 100644
index 40386f76494..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/apply_attribute_to_overridden_methods.php.inc
+++ /dev/null
@@ -1,30 +0,0 @@
-
------
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/apply_attribute_to_overridden_methods_from_grandparent.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/apply_attribute_to_overridden_methods_from_grandparent.php.inc
deleted file mode 100644
index 8a4506ef1d6..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/apply_attribute_to_overridden_methods_from_grandparent.php.inc
+++ /dev/null
@@ -1,30 +0,0 @@
-
------
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/extends_parent_consume_trait.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/extends_parent_consume_trait.php.inc
deleted file mode 100644
index 1b066a10590..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/extends_parent_consume_trait.php.inc
+++ /dev/null
@@ -1,32 +0,0 @@
-
------
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/indirect_override_abstract_method.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/indirect_override_abstract_method.php.inc
deleted file mode 100644
index 9aa0c0b4a0b..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/indirect_override_abstract_method.php.inc
+++ /dev/null
@@ -1,32 +0,0 @@
-
------
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/override_trait_with_extends_non_empty_method.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/override_trait_with_extends_non_empty_method.php.inc
deleted file mode 100644
index 3f90c355fb1..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/override_trait_with_extends_non_empty_method.php.inc
+++ /dev/null
@@ -1,36 +0,0 @@
-
------
-
\ No newline at end of file
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/skip_countable.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/skip_countable.php.inc
deleted file mode 100644
index 1f71f307d3e..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/skip_countable.php.inc
+++ /dev/null
@@ -1,13 +0,0 @@
-
------
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/skip_method_that_is_not_overridden.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/skip_method_that_is_not_overridden.php.inc
deleted file mode 100644
index 0600d2f861f..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/skip_method_that_is_not_overridden.php.inc
+++ /dev/null
@@ -1,14 +0,0 @@
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/skip_on_construct.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/skip_on_construct.php.inc
deleted file mode 100644
index 82a16832531..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/skip_on_construct.php.inc
+++ /dev/null
@@ -1,14 +0,0 @@
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/skip_on_non_inheriting_class.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/skip_on_non_inheriting_class.php.inc
deleted file mode 100644
index 6d0c8a31e42..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/skip_on_non_inheriting_class.php.inc
+++ /dev/null
@@ -1,11 +0,0 @@
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/skip_on_parent_return_null.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/skip_on_parent_return_null.php.inc
deleted file mode 100644
index 23b48279748..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/skip_on_parent_return_null.php.inc
+++ /dev/null
@@ -1,16 +0,0 @@
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/skip_override_only_trait_with_non_empty_method.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/skip_override_only_trait_with_non_empty_method.php.inc
deleted file mode 100644
index 53a9d0debf4..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/skip_override_only_trait_with_non_empty_method.php.inc
+++ /dev/null
@@ -1,14 +0,0 @@
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/skip_setup_override.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/skip_setup_override.php.inc
deleted file mode 100644
index 5e1298a3263..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Fixture/skip_setup_override.php.inc
+++ /dev/null
@@ -1,15 +0,0 @@
-
------
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureAddToInterfaceMethods/implement_built_in.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureAddToInterfaceMethods/implement_built_in.php.inc
deleted file mode 100644
index 63b8e932a2d..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureAddToInterfaceMethods/implement_built_in.php.inc
+++ /dev/null
@@ -1,36 +0,0 @@
-
------
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureAddToInterfaceMethods/indirect_totring_override.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureAddToInterfaceMethods/indirect_totring_override.php.inc
deleted file mode 100644
index 64de191e620..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureAddToInterfaceMethods/indirect_totring_override.php.inc
+++ /dev/null
@@ -1,36 +0,0 @@
-
------
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureAddToInterfaceMethods/interface_implement.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureAddToInterfaceMethods/interface_implement.php.inc
deleted file mode 100644
index 43c06bc50a1..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureAddToInterfaceMethods/interface_implement.php.inc
+++ /dev/null
@@ -1,36 +0,0 @@
-
------
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureAddToInterfaceMethods/interface_implement_multiple.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureAddToInterfaceMethods/interface_implement_multiple.php.inc
deleted file mode 100644
index 0c073882323..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureAddToInterfaceMethods/interface_implement_multiple.php.inc
+++ /dev/null
@@ -1,49 +0,0 @@
-
------
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureAddToInterfaceMethods/normal_extends.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureAddToInterfaceMethods/normal_extends.php.inc
deleted file mode 100644
index 5bcadeeaf4d..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureAddToInterfaceMethods/normal_extends.php.inc
+++ /dev/null
@@ -1,36 +0,0 @@
-
------
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureAddToInterfaceMethods/totring_override.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureAddToInterfaceMethods/totring_override.php.inc
deleted file mode 100644
index e59f9e9ae02..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureAddToInterfaceMethods/totring_override.php.inc
+++ /dev/null
@@ -1,36 +0,0 @@
-
------
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureOverrideEmptyMethod/indirect_totring_override.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureOverrideEmptyMethod/indirect_totring_override.php.inc
deleted file mode 100644
index e1ec98fa4b2..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureOverrideEmptyMethod/indirect_totring_override.php.inc
+++ /dev/null
@@ -1,36 +0,0 @@
-
------
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureOverrideEmptyMethod/override_abstract_from_trait.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureOverrideEmptyMethod/override_abstract_from_trait.php.inc
deleted file mode 100644
index 565b3501b18..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureOverrideEmptyMethod/override_abstract_from_trait.php.inc
+++ /dev/null
@@ -1,42 +0,0 @@
-
------
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureOverrideEmptyMethod/override_parent_from_trait.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureOverrideEmptyMethod/override_parent_from_trait.php.inc
deleted file mode 100644
index b23d82ceedd..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureOverrideEmptyMethod/override_parent_from_trait.php.inc
+++ /dev/null
@@ -1,44 +0,0 @@
-
------
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureOverrideEmptyMethod/setup_override.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureOverrideEmptyMethod/setup_override.php.inc
deleted file mode 100644
index 25e2618fc60..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureOverrideEmptyMethod/setup_override.php.inc
+++ /dev/null
@@ -1,36 +0,0 @@
-
------
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureOverrideEmptyMethod/skip_countable.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureOverrideEmptyMethod/skip_countable.php.inc
deleted file mode 100644
index 3a4449df10c..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureOverrideEmptyMethod/skip_countable.php.inc
+++ /dev/null
@@ -1,14 +0,0 @@
-
------
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureOverrideEmptyMethod/skip_implement_interface.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureOverrideEmptyMethod/skip_implement_interface.php.inc
deleted file mode 100644
index 11e53b749d1..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureOverrideEmptyMethod/skip_implement_interface.php.inc
+++ /dev/null
@@ -1,15 +0,0 @@
-
------
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureOverrideEmptyMethod/totring_override_with_interface.php.inc b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureOverrideEmptyMethod/totring_override_with_interface.php.inc
deleted file mode 100644
index 93c5a143367..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/FixtureOverrideEmptyMethod/totring_override_with_interface.php.inc
+++ /dev/null
@@ -1,48 +0,0 @@
-
------
-
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/OverrideEmptyMethodTest.php b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/OverrideEmptyMethodTest.php
deleted file mode 100644
index 52ceb69ec0f..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/OverrideEmptyMethodTest.php
+++ /dev/null
@@ -1,28 +0,0 @@
-doTestFile($filePath);
- }
-
- public static function provideData(): Iterator
- {
- return self::yieldFilesFromDirectory(__DIR__ . '/FixtureOverrideEmptyMethod');
- }
-
- public function provideConfigFilePath(): string
- {
- return __DIR__ . '/config/override_empty_method_configured_rule.php';
- }
-}
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Source/AbstractParentWithInterface.php b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Source/AbstractParentWithInterface.php
deleted file mode 100644
index b005e14c4d2..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/Source/AbstractParentWithInterface.php
+++ /dev/null
@@ -1,10 +0,0 @@
-ruleWithConfiguration(AddOverrideAttributeToOverriddenMethodsRector::class, [
- AddOverrideAttributeToOverriddenMethodsRector::ADD_TO_INTERFACE_METHODS => true,
- ]);
-
- $rectorConfig->phpVersion(PhpVersion::PHP_83);
-};
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/config/configured_rule.php b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/config/configured_rule.php
deleted file mode 100644
index 2e69c043eb7..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/config/configured_rule.php
+++ /dev/null
@@ -1,13 +0,0 @@
-rule(AddOverrideAttributeToOverriddenMethodsRector::class);
-
- $rectorConfig->phpVersion(PhpVersion::PHP_83);
-};
diff --git a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/config/override_empty_method_configured_rule.php b/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/config/override_empty_method_configured_rule.php
deleted file mode 100644
index b3f70c6bb46..00000000000
--- a/rules-tests/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector/config/override_empty_method_configured_rule.php
+++ /dev/null
@@ -1,15 +0,0 @@
-ruleWithConfiguration(AddOverrideAttributeToOverriddenMethodsRector::class, [
- AddOverrideAttributeToOverriddenMethodsRector::ALLOW_OVERRIDE_EMPTY_METHOD => true,
- ]);
-
- $rectorConfig->phpVersion(PhpVersion::PHP_83);
-};
diff --git a/rules/DeadCode/NodeAnalyzer/ParentClassAnalyzer.php b/rules/DeadCode/NodeAnalyzer/ParentClassAnalyzer.php
deleted file mode 100644
index 88a5f4b3ccd..00000000000
--- a/rules/DeadCode/NodeAnalyzer/ParentClassAnalyzer.php
+++ /dev/null
@@ -1,53 +0,0 @@
-isAbstract()) {
- return false;
- }
-
- if ($classMethod->isPrivate()) {
- return false;
- }
-
- $classMethodName = $classMethod->name->name;
-
- foreach ((array) $classMethod->stmts as $stmt) {
- if (! $stmt instanceof Expression) {
- continue;
- }
-
- $expr = $stmt->expr;
- if (! $expr instanceof StaticCall) {
- continue;
- }
-
- if (! $this->nodeNameResolver->isName($expr->class, 'parent')) {
- continue;
- }
-
- if ($this->nodeNameResolver->isName($expr->name, $classMethodName)) {
- return true;
- }
- }
-
- return false;
- }
-}
diff --git a/rules/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector.php b/rules/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector.php
index 2125e60e3ed..f5b469de949 100644
--- a/rules/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector.php
+++ b/rules/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector.php
@@ -5,75 +5,26 @@
namespace Rector\Php83\Rector\ClassMethod;
use PhpParser\Node;
-use PhpParser\Node\Attribute;
-use PhpParser\Node\AttributeGroup;
-use PhpParser\Node\Expr;
-use PhpParser\Node\Expr\Throw_;
-use PhpParser\Node\Name;
-use PhpParser\Node\Name\FullyQualified;
-use PhpParser\Node\Stmt;
use PhpParser\Node\Stmt\Class_;
-use PhpParser\Node\Stmt\ClassLike;
-use PhpParser\Node\Stmt\ClassMethod;
-use PhpParser\Node\Stmt\Expression;
-use PhpParser\Node\Stmt\Return_;
-use PhpParser\Node\Stmt\Trait_;
-use PHPStan\Reflection\ClassReflection;
-use PHPStan\Reflection\ReflectionProvider;
-use Rector\Contract\Rector\ConfigurableRectorInterface;
-use Rector\DeadCode\NodeAnalyzer\ParentClassAnalyzer;
-use Rector\NodeAnalyzer\ClassAnalyzer;
-use Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer;
-use Rector\PhpParser\AstResolver;
-use Rector\PhpParser\Node\Value\ValueResolver;
+use Rector\Configuration\Deprecation\Contract\DeprecatedInterface;
+use Rector\Exception\ShouldNotHappenException;
use Rector\Rector\AbstractRector;
-use Rector\RuleDoc\CodeSample\ConfiguredCodeSample;
+use Rector\RuleDoc\CodeSample\CodeSample;
use Rector\RuleDoc\RuleDefinition;
-use Rector\ValueObject\MethodName;
use Rector\ValueObject\PhpVersionFeature;
use Rector\VersionBonding\Contract\MinPhpVersionInterface;
/**
- * @see https://wiki.php.net/rfc/marking_overriden_methods
- *
- * @see \Rector\Tests\Php83\Rector\ClassMethod\AddOverrideAttributeToOverriddenMethodsRector\AddOverrideAttributeToOverriddenMethodsRectorTest
+ * @deprecated This rule is deprecated, as never used and not part of any set. Adding the #[\Override] attribute requires careful per-project context, so apply it explicitly on the methods that override, based on your own requirements.
*/
-final class AddOverrideAttributeToOverriddenMethodsRector extends AbstractRector implements MinPhpVersionInterface, ConfigurableRectorInterface
+final class AddOverrideAttributeToOverriddenMethodsRector extends AbstractRector implements MinPhpVersionInterface, DeprecatedInterface
{
- /**
- * @api
- */
- public const string ALLOW_OVERRIDE_EMPTY_METHOD = 'allow_override_empty_method';
-
- /**
- * @api
- */
- public const string ADD_TO_INTERFACE_METHODS = 'add_to_interface_methods';
-
- private const string OVERRIDE_CLASS = 'Override';
-
- private bool $allowOverrideEmptyMethod = false;
-
- private bool $addToInterfaceMethods = false;
-
- private bool $hasChanged = false;
-
- public function __construct(
- private readonly ReflectionProvider $reflectionProvider,
- private readonly ClassAnalyzer $classAnalyzer,
- private readonly PhpAttributeAnalyzer $phpAttributeAnalyzer,
- private readonly AstResolver $astResolver,
- private readonly ValueResolver $valueResolver,
- private readonly ParentClassAnalyzer $parentClassAnalyzer,
- ) {
- }
-
public function getRuleDefinition(): RuleDefinition
{
return new RuleDefinition(
'Add override attribute to overridden methods',
[
- new ConfiguredCodeSample(
+ new CodeSample(
<<<'CODE_SAMPLE'
class ParentClass
{
@@ -110,46 +61,6 @@ public function foo()
}
}
CODE_SAMPLE
- ,
- [
- self::ALLOW_OVERRIDE_EMPTY_METHOD => false,
- ]
- ),
- new ConfiguredCodeSample(
- <<<'CODE_SAMPLE'
-interface ParentInterface
-{
- public function foo();
-}
-
-final class ChildClass implements ParentInterface
-{
- public function foo()
- {
- echo 'implements interface';
- }
-}
-CODE_SAMPLE
- ,
- <<<'CODE_SAMPLE'
-interface ParentInterface
-{
- public function foo();
-}
-
-final class ChildClass implements ParentInterface
-{
- #[\Override]
- public function foo()
- {
- echo 'implements interface';
- }
-}
-CODE_SAMPLE
- ,
- [
- self::ADD_TO_INTERFACE_METHODS => true,
- ]
),
]
);
@@ -163,241 +74,19 @@ public function getNodeTypes(): array
return [Class_::class];
}
- /**
- * @param array $configuration
- */
- public function configure(array $configuration): void
- {
- $this->allowOverrideEmptyMethod = $configuration[self::ALLOW_OVERRIDE_EMPTY_METHOD] ?? false;
- $this->addToInterfaceMethods = $configuration[self::ADD_TO_INTERFACE_METHODS] ?? false;
- }
-
/**
* @param Class_ $node
*/
public function refactor(Node $node): ?Node
{
- $this->hasChanged = false;
-
- if ($this->classAnalyzer->isAnonymousClass($node)) {
- return null;
- }
-
- if ($this->shouldSkipNode($node)) {
- return null;
- }
-
- $className = (string) $this->getName($node);
- if (! $this->reflectionProvider->hasClass($className)) {
- return null;
- }
-
- $classReflection = $this->reflectionProvider->getClass($className);
- $parentClassReflections = $classReflection->getParents();
-
- // interfaces are added for Stringable
- if ($this->addToInterfaceMethods || $this->allowOverrideEmptyMethod) {
- $parentClassReflections = array_merge($parentClassReflections, $classReflection->getInterfaces());
- }
-
- if ($this->allowOverrideEmptyMethod) {
- // place on last to ensure verify method exists on parent early
- // for non abstract method from trait
- $parentClassReflections = array_merge($parentClassReflections, $classReflection->getTraits());
- }
-
- if ($parentClassReflections === []) {
- return null;
- }
-
- foreach ($node->getMethods() as $classMethod) {
- $this->processAddOverrideAttribute($classMethod, $parentClassReflections);
- }
-
- if (! $this->hasChanged) {
- return null;
- }
-
- return $node;
+ throw new ShouldNotHappenException(sprintf(
+ '"%s" rule is deprecated, as never used and not part of any set. Apply the #[\Override] attribute explicitly on the methods that override, based on your own requirements',
+ self::class
+ ));
}
public function provideMinPhpVersion(): int
{
return PhpVersionFeature::OVERRIDE_ATTRIBUTE;
}
-
- /**
- * @param ClassReflection[] $parentClassReflections
- */
- private function processAddOverrideAttribute(ClassMethod $classMethod, array $parentClassReflections): void
- {
- if ($this->shouldSkipClassMethod($classMethod)) {
- return;
- }
-
- /** @var string $classMethodName */
- $classMethodName = $this->getName($classMethod->name);
-
- // Private methods should be ignored
- $shouldAddOverride = false;
- foreach ($parentClassReflections as $parentClassReflection) {
- if (! $parentClassReflection->hasNativeMethod($classMethod->name->toString())) {
- continue;
- }
-
- // ignore if it is a private method on the parent
- if (! $parentClassReflection->hasNativeMethod($classMethodName)) {
- continue;
- }
-
- $parentMethod = $parentClassReflection->getNativeMethod($classMethodName);
- if ($parentMethod->isPrivate()) {
- break;
- }
-
- if ($this->shouldSkipParentClassMethod($parentClassReflection, $classMethod)) {
- continue;
- }
-
- if ($parentClassReflection->isTrait() && ! $parentMethod->isAbstract()) {
- break;
- }
-
- $shouldAddOverride = true;
- break;
- }
-
- if ($shouldAddOverride) {
- $classMethod->attrGroups[] = new AttributeGroup([new Attribute(new FullyQualified(self::OVERRIDE_CLASS))]);
- $this->hasChanged = true;
- }
- }
-
- private function shouldSkipClassMethod(ClassMethod $classMethod): bool
- {
- if ($this->isName($classMethod->name, MethodName::CONSTRUCT)) {
- return true;
- }
-
- // nothing to override
- if ($classMethod->isPrivate()) {
- return true;
- }
-
- // ignore if it already uses the attribute
- if ($this->phpAttributeAnalyzer->hasPhpAttribute($classMethod, self::OVERRIDE_CLASS)) {
- return true;
- }
-
- // skip test setup method override, as rather clutters the code than helps
- return $this->isNames($classMethod, ['setUp', 'tearDown']) && $this->parentClassAnalyzer->hasParentCall(
- $classMethod
- );
- }
-
- private function shouldSkipParentClassMethod(ClassReflection $parentClassReflection, ClassMethod $classMethod): bool
- {
- // special case for Stringable interface
- if ($this->allowOverrideEmptyMethod && $parentClassReflection->getName() === 'Stringable') {
- return false;
- }
-
- // if the method is on interface, skip based on the config flag
- if ($parentClassReflection->isInterface()) {
- return ! $this->addToInterfaceMethods;
- }
-
- // parse parent method, if it has some contents or not
- $parentClass = $this->astResolver->resolveClassFromClassReflection($parentClassReflection);
- if (! $parentClass instanceof ClassLike) {
- return true;
- }
-
- $parentClassMethod = $parentClass->getMethod($classMethod->name->toString());
- if (! $parentClassMethod instanceof ClassMethod) {
- $parentClassMethod = $this->resolveClassMethodFromTraitUse($parentClass, $classMethod->name->toString());
- }
-
- if (! $parentClassMethod instanceof ClassMethod) {
- return true;
- }
-
- if ($this->allowOverrideEmptyMethod) {
- return false;
- }
-
- // just override abstract method also skipped on purpose
- // only grand child of abstract method that parent has content will have
- if ($parentClassMethod->isAbstract()) {
- return true;
- }
-
- // has any stmts?
- if ($parentClassMethod->stmts === null || $parentClassMethod->stmts === []) {
- return true;
- }
-
- if (count($parentClassMethod->stmts) === 1) {
- /** @var Stmt $soleStmt */
- $soleStmt = $parentClassMethod->stmts[0];
- // most likely, return null; is interface to be designed to override
- if ($soleStmt instanceof Return_ && $soleStmt->expr instanceof Expr && $this->valueResolver->isNull(
- $soleStmt->expr
- )) {
- return true;
- }
-
- if ($soleStmt instanceof Expression && $soleStmt->expr instanceof Throw_) {
- return true;
- }
- }
-
- return false;
- }
-
- private function resolveClassMethodFromTraitUse(ClassLike $classLike, string $methodName): ?ClassMethod
- {
- foreach ($classLike->getTraitUses() as $traitUse) {
- foreach ($traitUse->traits as $traitName) {
- $traitClass = $this->astResolver->resolveClassFromName($traitName->__toString());
- if (! $traitClass instanceof Trait_) {
- continue;
- }
-
- $traitClassMethod = $traitClass->getMethod($methodName);
- if ($traitClassMethod instanceof ClassMethod) {
- return $traitClassMethod;
- }
- }
- }
-
- return null;
- }
-
- // early return for the class if it does not extend anything
- private function shouldSkipNode(Class_ $class): bool
- {
- if ($class->extends instanceof Name) {
- return false;
- }
-
- if ($class->getTraitUses() !== []) {
- return false;
- }
-
- if ($this->addToInterfaceMethods && $class->implements !== []) {
- return false;
- }
-
- // add override to Stringable if flag is set
- if ($this->allowOverrideEmptyMethod) {
- foreach ($class->implements as $implement) {
- if ($this->isName($implement, 'Stringable')) {
- return false;
- }
- }
- }
-
- return true;
- }
}