diff --git a/rules-tests/DeadCode/Rector/Property/RemoveDefaultValueFromAssignedPropertyRector/Fixture/non_null_default.php.inc b/rules-tests/DeadCode/Rector/Property/RemoveDefaultValueFromAssignedPropertyRector/Fixture/non_null_default.php.inc new file mode 100644 index 00000000000..41c775b21ba --- /dev/null +++ b/rules-tests/DeadCode/Rector/Property/RemoveDefaultValueFromAssignedPropertyRector/Fixture/non_null_default.php.inc @@ -0,0 +1,31 @@ +value = $value; + } +} + +?> +----- +value = $value; + } +} + +?> diff --git a/rules-tests/DeadCode/Rector/Property/RemoveDefaultValueFromAssignedPropertyRector/Fixture/nullable_typed_property.php.inc b/rules-tests/DeadCode/Rector/Property/RemoveDefaultValueFromAssignedPropertyRector/Fixture/nullable_typed_property.php.inc new file mode 100644 index 00000000000..331e1fe391b --- /dev/null +++ b/rules-tests/DeadCode/Rector/Property/RemoveDefaultValueFromAssignedPropertyRector/Fixture/nullable_typed_property.php.inc @@ -0,0 +1,35 @@ +value = $value; + } +} + +?> +----- +value = $value; + } +} + +?> diff --git a/rules-tests/DeadCode/Rector/Property/RemoveDefaultValueFromAssignedPropertyRector/Fixture/skip_conditionally_assigned.php.inc b/rules-tests/DeadCode/Rector/Property/RemoveDefaultValueFromAssignedPropertyRector/Fixture/skip_conditionally_assigned.php.inc new file mode 100644 index 00000000000..674f4ca803b --- /dev/null +++ b/rules-tests/DeadCode/Rector/Property/RemoveDefaultValueFromAssignedPropertyRector/Fixture/skip_conditionally_assigned.php.inc @@ -0,0 +1,17 @@ +value = $value; + } + } +} diff --git a/rules-tests/DeadCode/Rector/Property/RemoveDefaultValueFromAssignedPropertyRector/Fixture/skip_no_constructor.php.inc b/rules-tests/DeadCode/Rector/Property/RemoveDefaultValueFromAssignedPropertyRector/Fixture/skip_no_constructor.php.inc new file mode 100644 index 00000000000..6df27aafd9a --- /dev/null +++ b/rules-tests/DeadCode/Rector/Property/RemoveDefaultValueFromAssignedPropertyRector/Fixture/skip_no_constructor.php.inc @@ -0,0 +1,10 @@ +value = $value; + } +} diff --git a/rules-tests/DeadCode/Rector/Property/RemoveDefaultValueFromAssignedPropertyRector/RemoveDefaultValueFromAssignedPropertyRectorTest.php b/rules-tests/DeadCode/Rector/Property/RemoveDefaultValueFromAssignedPropertyRector/RemoveDefaultValueFromAssignedPropertyRectorTest.php new file mode 100644 index 00000000000..1e58b515184 --- /dev/null +++ b/rules-tests/DeadCode/Rector/Property/RemoveDefaultValueFromAssignedPropertyRector/RemoveDefaultValueFromAssignedPropertyRectorTest.php @@ -0,0 +1,28 @@ +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/DeadCode/Rector/Property/RemoveDefaultValueFromAssignedPropertyRector/config/configured_rule.php b/rules-tests/DeadCode/Rector/Property/RemoveDefaultValueFromAssignedPropertyRector/config/configured_rule.php new file mode 100644 index 00000000000..96b64ff3cf0 --- /dev/null +++ b/rules-tests/DeadCode/Rector/Property/RemoveDefaultValueFromAssignedPropertyRector/config/configured_rule.php @@ -0,0 +1,9 @@ +withRules([RemoveDefaultValueFromAssignedPropertyRector::class]); diff --git a/rules/DeadCode/Rector/ConstFetch/RemovePhpVersionIdCheckRector.php b/rules/DeadCode/Rector/ConstFetch/RemovePhpVersionIdCheckRector.php index f6cb9f44dbe..4821373442b 100644 --- a/rules/DeadCode/Rector/ConstFetch/RemovePhpVersionIdCheckRector.php +++ b/rules/DeadCode/Rector/ConstFetch/RemovePhpVersionIdCheckRector.php @@ -28,7 +28,7 @@ final class RemovePhpVersionIdCheckRector extends AbstractRector /** * @var PhpVersion::*|null */ - private int|null $phpVersion = null; + private int|null $phpVersion; public function __construct( private readonly PhpVersionProvider $phpVersionProvider, diff --git a/rules/DeadCode/Rector/Property/RemoveDefaultValueFromAssignedPropertyRector.php b/rules/DeadCode/Rector/Property/RemoveDefaultValueFromAssignedPropertyRector.php new file mode 100644 index 00000000000..f4e8d355550 --- /dev/null +++ b/rules/DeadCode/Rector/Property/RemoveDefaultValueFromAssignedPropertyRector.php @@ -0,0 +1,111 @@ +someType = $someType; + } +} +CODE_SAMPLE + , + <<<'CODE_SAMPLE' +class SomeClass +{ + private ?SomeType $someType; + + public function __construct(SomeType $someType) + { + $this->someType = $someType; + } +} +CODE_SAMPLE + ), + ] + ); + } + + /** + * @return array> + */ + public function getNodeTypes(): array + { + return [Class_::class]; + } + + /** + * @param Class_ $node + */ + public function refactor(Node $node): ?Node + { + if (! $node->getMethod(MethodName::CONSTRUCT) instanceof ClassMethod) { + return null; + } + + $hasChanged = false; + + foreach ($node->getProperties() as $property) { + // untyped properties are handled by RemoveNullPropertyInitializationRector + if (! $property->type instanceof Node) { + continue; + } + + if ($property->hooks !== []) { + continue; + } + + foreach ($property->props as $propertyProperty) { + if (! $propertyProperty->default instanceof Expr) { + continue; + } + + $propertyName = $this->getName($propertyProperty); + if (! $this->constructorAssignDetector->isPropertyAssigned($node, $propertyName)) { + continue; + } + + $propertyProperty->default = null; + $hasChanged = true; + } + } + + if ($hasChanged) { + return $node; + } + + return null; + } +} diff --git a/rules/Php80/Rector/Identical/StrStartsWithRector.php b/rules/Php80/Rector/Identical/StrStartsWithRector.php index 4fe11c5d166..7cb235339e0 100644 --- a/rules/Php80/Rector/Identical/StrStartsWithRector.php +++ b/rules/Php80/Rector/Identical/StrStartsWithRector.php @@ -30,7 +30,7 @@ final class StrStartsWithRector extends AbstractRector implements MinPhpVersionI /** * @var StrStartWithMatchAndRefactorInterface[] */ - private array $strStartWithMatchAndRefactors = []; + private readonly array $strStartWithMatchAndRefactors; public function __construct( StrncmpMatchAndRefactor $strncmpMatchAndRefactor, diff --git a/rules/Php80/ValueObject/NestedAnnotationToAttribute.php b/rules/Php80/ValueObject/NestedAnnotationToAttribute.php index 7ab86e4112c..1435f0781f8 100644 --- a/rules/Php80/ValueObject/NestedAnnotationToAttribute.php +++ b/rules/Php80/ValueObject/NestedAnnotationToAttribute.php @@ -12,7 +12,7 @@ final class NestedAnnotationToAttribute implements AnnotationToAttributeInterfac /** * @var AnnotationPropertyToAttributeClass[] */ - private array $annotationPropertiesToAttributeClasses = []; + private array $annotationPropertiesToAttributeClasses; /** * @param array|string[]|AnnotationPropertyToAttributeClass[] $annotationPropertiesToAttributeClasses diff --git a/src/Config/Level/DeadCodeLevel.php b/src/Config/Level/DeadCodeLevel.php index 0c689290a8c..f1cf313c774 100644 --- a/src/Config/Level/DeadCodeLevel.php +++ b/src/Config/Level/DeadCodeLevel.php @@ -57,6 +57,7 @@ use Rector\DeadCode\Rector\MethodCall\RemoveNullNamedArgOnNullDefaultParamRector; use Rector\DeadCode\Rector\Node\RemoveNonExistingVarAnnotationRector; use Rector\DeadCode\Rector\Plus\RemoveDeadZeroAndOneOperationRector; +use Rector\DeadCode\Rector\Property\RemoveDefaultValueFromAssignedPropertyRector; use Rector\DeadCode\Rector\Property\RemoveUnusedPrivatePropertyRector; use Rector\DeadCode\Rector\Property\RemoveUselessReadOnlyTagRector; use Rector\DeadCode\Rector\Property\RemoveUselessVarTagRector; @@ -102,6 +103,7 @@ final class DeadCodeLevel RemoveDeadContinueRector::class, RemoveUnusedNonEmptyArrayBeforeForeachRector::class, RemoveNullPropertyInitializationRector::class, + RemoveDefaultValueFromAssignedPropertyRector::class, RemoveUselessReturnExprInConstructRector::class, ReplaceBlockToItsStmtsRector::class, RemoveFilterVarOnExactTypeRector::class, diff --git a/src/PhpParser/Node/AssignAndBinaryMap.php b/src/PhpParser/Node/AssignAndBinaryMap.php index 4da7e629619..69e98bd89d5 100644 --- a/src/PhpParser/Node/AssignAndBinaryMap.php +++ b/src/PhpParser/Node/AssignAndBinaryMap.php @@ -81,7 +81,7 @@ final class AssignAndBinaryMap /** * @var array, class-string> */ - private array $binaryOpToAssignClasses = []; + private array $binaryOpToAssignClasses; public function __construct( private readonly NodeTypeResolver $nodeTypeResolver