Skip to content

Commit

Permalink
[TypeDeclaration] Remove parent lookup on TrustedClassMethodPropertyT…
Browse files Browse the repository at this point in the history
…ypeInferer (#4207)

* [TypeDeclaration] Remove parent lookup on TrustedClassMethodPropertyTypeInferer

* clean up

* Fix

* Fix

* Fix

* increase rector kernel
  • Loading branch information
samsonasik committed Jun 12, 2023
1 parent 0a36378 commit 0adda9c
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ public function refactor(Node $node): ?Node
}

$propertyType = $this->trustedClassMethodPropertyTypeInferer->inferProperty(
$node,
$property,
$constructClassMethod
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ public function refactor(Node $node): ?Node
continue;
}

$propertyType = $this->trustedClassMethodPropertyTypeInferer->inferProperty($property, $setUpClassMethod);
$propertyType = $this->trustedClassMethodPropertyTypeInferer->inferProperty($node, $property, $setUpClassMethod);

$propertyTypeNode = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode(
$propertyType,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
use PhpParser\Node\Name\FullyQualified;
use PhpParser\Node\NullableType;
use PhpParser\Node\Param;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Property;
use PhpParser\NodeTraverser;
Expand All @@ -24,7 +24,6 @@
use PHPStan\Type\UnionType;
use Rector\Core\NodeAnalyzer\ParamAnalyzer;
use Rector\Core\NodeManipulator\ClassMethodPropertyFetchManipulator;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\NodeTypeResolver\NodeTypeResolver;
Expand All @@ -49,26 +48,20 @@ public function __construct(
private readonly TypeFactory $typeFactory,
private readonly StaticTypeMapper $staticTypeMapper,
private readonly NodeTypeResolver $nodeTypeResolver,
private readonly BetterNodeFinder $betterNodeFinder,
private readonly ParamAnalyzer $paramAnalyzer,
private readonly AssignToPropertyTypeInferer $assignToPropertyTypeInferer,
private readonly TypeComparator $typeComparator,
) {
}

public function inferProperty(Property $property, ClassMethod $classMethod): Type
public function inferProperty(Class_ $class, Property $property, ClassMethod $classMethod): Type
{
$classLike = $this->betterNodeFinder->findParentType($property, ClassLike::class);
if (! $classLike instanceof ClassLike) {
return new MixedType();
}

$propertyName = $this->nodeNameResolver->getName($property);

// 1. direct property = param assign
$param = $this->classMethodPropertyFetchManipulator->findParamAssignToPropertyName($classMethod, $propertyName);
if ($param instanceof Param) {
return $this->resolveTypeFromParam($param, $classMethod, $propertyName, $property, $classLike);
return $this->resolveTypeFromParam($param, $classMethod, $propertyName, $property, $class);
}

// 2. different assign
Expand All @@ -91,19 +84,19 @@ public function inferProperty(Property $property, ClassMethod $classMethod): Typ
? $resolvedTypes[0]
: TypeCombinator::union(...$resolvedTypes);

return $this->resolveType($property, $propertyName, $classLike, $resolvedType);
return $this->resolveType($property, $propertyName, $class, $resolvedType);
}

private function resolveType(
Property $property,
string $propertyName,
ClassLike $classLike,
Class_ $class,
Type $resolvedType
): Type {
$exactType = $this->assignToPropertyTypeInferer->inferPropertyInClassLike(
$property,
$propertyName,
$classLike
$class
);

if (! $exactType instanceof UnionType) {
Expand Down Expand Up @@ -244,13 +237,13 @@ private function resolveTypeFromParam(
ClassMethod $classMethod,
string $propertyName,
Property $property,
ClassLike $classLike
Class_ $class
): Type {
if ($param->type === null) {
return new MixedType();
}

$resolvedType = $this->resolveFromParamType($param, $classMethod, $propertyName);
return $this->resolveType($property, $propertyName, $classLike, $resolvedType);
return $this->resolveType($property, $propertyName, $class, $resolvedType);
}
}
2 changes: 1 addition & 1 deletion src/Kernel/RectorKernel.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ final class RectorKernel
/**
* @var string
*/
private const CACHE_KEY = 'v116';
private const CACHE_KEY = 'v118';

private ContainerInterface|null $container = null;

Expand Down

0 comments on commit 0adda9c

Please sign in to comment.