diff --git a/rules/CodeQuality/Rector/Empty_/SimplifyEmptyCheckOnEmptyArrayRector.php b/rules/CodeQuality/Rector/Empty_/SimplifyEmptyCheckOnEmptyArrayRector.php index 5c15a09b333..917f4209e89 100644 --- a/rules/CodeQuality/Rector/Empty_/SimplifyEmptyCheckOnEmptyArrayRector.php +++ b/rules/CodeQuality/Rector/Empty_/SimplifyEmptyCheckOnEmptyArrayRector.php @@ -148,7 +148,7 @@ CODE_SAMPLE if (!$property instanceof Property) { return \false; } - $type = $this->allAssignNodePropertyTypeInferer->inferProperty($property, $classReflection); + $type = $this->allAssignNodePropertyTypeInferer->inferProperty($property, $classReflection, $this->file); return $type instanceof ArrayType; } } diff --git a/rules/TypeDeclaration/Rector/Property/TypedPropertyFromAssignsRector.php b/rules/TypeDeclaration/Rector/Property/TypedPropertyFromAssignsRector.php index 69fdb98af40..5558ccad50b 100644 --- a/rules/TypeDeclaration/Rector/Property/TypedPropertyFromAssignsRector.php +++ b/rules/TypeDeclaration/Rector/Property/TypedPropertyFromAssignsRector.php @@ -160,7 +160,7 @@ CODE_SAMPLE if (!$this->makePropertyTypedGuard->isLegal($property, $classReflection, $this->inlinePublic)) { continue; } - $inferredType = $this->allAssignNodePropertyTypeInferer->inferProperty($property, $classReflection); + $inferredType = $this->allAssignNodePropertyTypeInferer->inferProperty($property, $classReflection, $this->file); if (!$inferredType instanceof Type) { continue; } diff --git a/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/AllAssignNodePropertyTypeInferer.php b/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/AllAssignNodePropertyTypeInferer.php index dd0470d316f..44cbe206a85 100644 --- a/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/AllAssignNodePropertyTypeInferer.php +++ b/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/AllAssignNodePropertyTypeInferer.php @@ -3,11 +3,14 @@ declare (strict_types=1); namespace Rector\TypeDeclaration\TypeInferer\PropertyTypeInferer; +use PhpParser\Node; use PhpParser\Node\Stmt\ClassLike; use PhpParser\Node\Stmt\Property; use PHPStan\Reflection\ClassReflection; use PHPStan\Type\Type; use Rector\Core\PhpParser\AstResolver; +use Rector\Core\PhpParser\Node\BetterNodeFinder; +use Rector\Core\ValueObject\Application\File; use Rector\NodeNameResolver\NodeNameResolver; use Rector\TypeDeclaration\TypeInferer\AssignToPropertyTypeInferer; final class AllAssignNodePropertyTypeInferer @@ -27,16 +30,31 @@ final class AllAssignNodePropertyTypeInferer * @var \Rector\Core\PhpParser\AstResolver */ private $astResolver; - public function __construct(AssignToPropertyTypeInferer $assignToPropertyTypeInferer, NodeNameResolver $nodeNameResolver, AstResolver $astResolver) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(AssignToPropertyTypeInferer $assignToPropertyTypeInferer, NodeNameResolver $nodeNameResolver, AstResolver $astResolver, BetterNodeFinder $betterNodeFinder) { $this->assignToPropertyTypeInferer = $assignToPropertyTypeInferer; $this->nodeNameResolver = $nodeNameResolver; $this->astResolver = $astResolver; + $this->betterNodeFinder = $betterNodeFinder; } - public function inferProperty(Property $property, ClassReflection $classReflection) : ?Type + public function inferProperty(Property $property, ClassReflection $classReflection, File $file) : ?Type { - /** @var ClassLike $classLike */ - $classLike = $this->astResolver->resolveClassFromClassReflection($classReflection); + if ($classReflection->getFileName() === $file->getFilePath()) { + $className = $classReflection->getName(); + $classLike = $this->betterNodeFinder->findFirst($file->getNewStmts(), function (Node $node) use($className) : bool { + return $node instanceof ClassLike && $this->nodeNameResolver->isName($node, $className); + }); + } else { + $classLike = $this->astResolver->resolveClassFromClassReflection($classReflection); + } + if (!$classLike instanceof ClassLike) { + return null; + } $propertyName = $this->nodeNameResolver->getName($property); return $this->assignToPropertyTypeInferer->inferPropertyInClassLike($property, $propertyName, $classLike); } diff --git a/src/Application/VersionResolver.php b/src/Application/VersionResolver.php index 5cfcf96e2c3..7c1ed80ab07 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 = '012e8bb2ed77516c792e3fb9c777066c3776abcc'; + public const PACKAGE_VERSION = 'c6ca4f1f5ccdf73d9aa0f8f441267725e07aee67'; /** * @api * @var string */ - public const RELEASE_DATE = '2023-12-24 02:19:52'; + public const RELEASE_DATE = '2023-12-24 10:09:23'; /** * @var int */