diff --git a/rules/TypeDeclaration/AlreadyAssignDetector/ConstructorAssignDetector.php b/rules/TypeDeclaration/AlreadyAssignDetector/ConstructorAssignDetector.php index e8f61edbf41..cbc13347761 100644 --- a/rules/TypeDeclaration/AlreadyAssignDetector/ConstructorAssignDetector.php +++ b/rules/TypeDeclaration/AlreadyAssignDetector/ConstructorAssignDetector.php @@ -20,6 +20,7 @@ use PHPStan\Type\ObjectType; use Rector\NodeAnalyzer\PropertyFetchAnalyzer; use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; +use Rector\PhpParser\Comparing\NodeComparator; use Rector\TypeDeclaration\Matcher\PropertyAssignMatcher; use Rector\TypeDeclaration\NodeAnalyzer\AutowiredClassMethodOrPropertyAnalyzer; use Rector\ValueObject\MethodName; @@ -50,17 +51,23 @@ final class ConstructorAssignDetector * @var \Rector\NodeAnalyzer\PropertyFetchAnalyzer */ private $propertyFetchAnalyzer; + /** + * @readonly + * @var \Rector\PhpParser\Comparing\NodeComparator + */ + private $nodeComparator; /** * @var string */ private const IS_FIRST_LEVEL_STATEMENT = 'first_level_stmt'; - public function __construct(NodeTypeResolver $nodeTypeResolver, PropertyAssignMatcher $propertyAssignMatcher, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, AutowiredClassMethodOrPropertyAnalyzer $autowiredClassMethodOrPropertyAnalyzer, PropertyFetchAnalyzer $propertyFetchAnalyzer) + public function __construct(NodeTypeResolver $nodeTypeResolver, PropertyAssignMatcher $propertyAssignMatcher, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, AutowiredClassMethodOrPropertyAnalyzer $autowiredClassMethodOrPropertyAnalyzer, PropertyFetchAnalyzer $propertyFetchAnalyzer, NodeComparator $nodeComparator) { $this->nodeTypeResolver = $nodeTypeResolver; $this->propertyAssignMatcher = $propertyAssignMatcher; $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; $this->autowiredClassMethodOrPropertyAnalyzer = $autowiredClassMethodOrPropertyAnalyzer; $this->propertyFetchAnalyzer = $propertyFetchAnalyzer; + $this->nodeComparator = $nodeComparator; } public function isPropertyAssigned(ClassLike $classLike, string $propertyName) : bool { @@ -179,14 +186,18 @@ final class ConstructorAssignDetector private function isPropertyUsedInAssign(Assign $assign, string $propertyName) : bool { $nodeFinder = new NodeFinder(); - return (bool) $nodeFinder->findFirst($assign->expr, static function (Node $node) use($propertyName) : ?bool { + $var = $assign->var; + return (bool) $nodeFinder->findFirst($assign->expr, function (Node $node) use($propertyName, $var) : ?bool { if (!$node instanceof PropertyFetch) { return null; } if (!$node->name instanceof Identifier) { return null; } - return $node->name->toString() === $propertyName; + if ($node->name->toString() !== $propertyName) { + return null; + } + return $this->nodeComparator->areNodesEqual($node, $var); }); } } diff --git a/src/Application/VersionResolver.php b/src/Application/VersionResolver.php index 150719a8aaa..7c6f567c6c0 100644 --- a/src/Application/VersionResolver.php +++ b/src/Application/VersionResolver.php @@ -19,12 +19,12 @@ final class VersionResolver * @api * @var string */ - public const PACKAGE_VERSION = '0.19.6'; + public const PACKAGE_VERSION = '2dd395167cdc146a1b566bae9c5c2f2885e55c16'; /** * @api * @var string */ - public const RELEASE_DATE = '2024-02-04 13:42:24'; + public const RELEASE_DATE = '2024-02-05 03:44:33'; /** * @var int */