From 76adea55709a6275686e030e03f753abe6d8c0f4 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Sun, 18 Oct 2026 16:17:16 +0200 Subject: [PATCH 1/2] Retarget RemoveNullFromNullableCollectionTypeRector to single Class_ node --- ...veNullFromNullableCollectionTypeRector.php | 51 ++++++++++--------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/rules/TypedCollections/Rector/ClassMethod/RemoveNullFromNullableCollectionTypeRector.php b/rules/TypedCollections/Rector/ClassMethod/RemoveNullFromNullableCollectionTypeRector.php index 825e3497..a97ff716 100644 --- a/rules/TypedCollections/Rector/ClassMethod/RemoveNullFromNullableCollectionTypeRector.php +++ b/rules/TypedCollections/Rector/ClassMethod/RemoveNullFromNullableCollectionTypeRector.php @@ -7,6 +7,7 @@ use PhpParser\Node; use PhpParser\Node\Name; use PhpParser\Node\NullableType; +use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Property; use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; @@ -49,12 +50,7 @@ public function getRuleDefinition(): RuleDefinition final class SomeClass { - private $items; - - public function setItems(?Collection $items): void - { - $this->items = $items; - } + private ?Collection $items = null; } CODE_SAMPLE , @@ -63,12 +59,7 @@ public function setItems(?Collection $items): void final class SomeClass { - private $items; - - public function setItems(Collection $items): void - { - $this->items = $items; - } + private Collection $items; } CODE_SAMPLE ), @@ -79,19 +70,38 @@ public function setItems(Collection $items): void public function getNodeTypes(): array { - return [ClassMethod::class, Property::class]; + return [Class_::class]; } /** - * @param ClassMethod|Property $node + * @param Class_ $node */ - public function refactor(Node $node): ClassMethod|Property|null + public function refactor(Node $node): ?Class_ { - if ($node instanceof Property) { - return $this->refactorProperty($node); + // nullable might be on purpose, e.g. via data provider + if ($this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } + + $hasChanged = false; + + foreach ($node->getMethods() as $classMethod) { + if ($this->refactorClassMethod($classMethod) instanceof ClassMethod) { + $hasChanged = true; + } + } + + foreach ($node->getProperties() as $property) { + if ($this->refactorProperty($property) instanceof Property) { + $hasChanged = true; + } + } + + if ($hasChanged) { + return $node; } - return $this->refactorClassMethod($node); + return null; } private function refactorClassMethod(ClassMethod $classMethod): null|ClassMethod @@ -100,11 +110,6 @@ private function refactorClassMethod(ClassMethod $classMethod): null|ClassMethod return null; } - // nullable might be on purpose, e.g. via data provider - if ($this->testsNodeAnalyzer->isInTestClass($classMethod)) { - return null; - } - $hasChanged = false; foreach ($classMethod->params as $param) { From 1737156b18944ac213eacd30218514a1416bada6 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Sun, 18 Oct 2026 16:41:37 +0200 Subject: [PATCH 2/2] More verbose code sample: show property and class method --- .../RemoveNullFromNullableCollectionTypeRector.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/rules/TypedCollections/Rector/ClassMethod/RemoveNullFromNullableCollectionTypeRector.php b/rules/TypedCollections/Rector/ClassMethod/RemoveNullFromNullableCollectionTypeRector.php index a97ff716..fe9fb827 100644 --- a/rules/TypedCollections/Rector/ClassMethod/RemoveNullFromNullableCollectionTypeRector.php +++ b/rules/TypedCollections/Rector/ClassMethod/RemoveNullFromNullableCollectionTypeRector.php @@ -51,6 +51,11 @@ public function getRuleDefinition(): RuleDefinition final class SomeClass { private ?Collection $items = null; + + public function setItems(?Collection $items): void + { + $this->items = $items; + } } CODE_SAMPLE , @@ -60,6 +65,11 @@ final class SomeClass final class SomeClass { private Collection $items; + + public function setItems(Collection $items): void + { + $this->items = $items; + } } CODE_SAMPLE ),