[TypeDeclaration] Skip set type by @param doc at TypedPropertyFromAssignsRector (#1822)

Co-authored-by: GitHub Action <action@github.com>
This commit is contained in:
Abdul Malik Ikhsan 2022-02-17 17:34:38 +07:00 committed by GitHub
parent ecce9b3709
commit 6c0a532529
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 38 additions and 1 deletions

View File

@ -0,0 +1,16 @@
<?php
namespace Rector\Tests\TypeDeclaration\Rector\Property\TypedPropertyFromAssignsRector\Fixture;
final class SkipSetTypeByParamDoc
{
private $property;
/**
* @param int $property
*/
public function __construct($property)
{
$this->property = $property;
}
}

View File

@ -13,6 +13,7 @@ use PHPStan\Type\ArrayType;
use PHPStan\Type\MixedType;
use PHPStan\Type\NullType;
use PHPStan\Type\Type;
use Rector\Core\NodeAnalyzer\ExprAnalyzer;
use Rector\NodeTypeResolver\NodeTypeResolver;
use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory;
use Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector;
@ -31,6 +32,7 @@ final class AssignToPropertyTypeInferer
private readonly SimpleCallableNodeTraverser $simpleCallableNodeTraverser,
private readonly TypeFactory $typeFactory,
private readonly NodeTypeResolver $nodeTypeResolver,
private readonly ExprAnalyzer $exprAnalyzer
) {
}
@ -51,6 +53,10 @@ final class AssignToPropertyTypeInferer
return null;
}
if ($this->exprAnalyzer->isNonTypedFromParam($node->expr)) {
return null;
}
$assignedExprTypes[] = $this->resolveExprStaticTypeIncludingDimFetch($node);
return null;

View File

@ -12,14 +12,19 @@ use PhpParser\Node\FunctionLike;
use PhpParser\Node\Scalar;
use PhpParser\Node\Scalar\LNumber;
use PhpParser\Node\Scalar\String_;
use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
use Rector\Core\PhpParser\Comparing\NodeComparator;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\NodeNameResolver\NodeNameResolver;
final class ExprAnalyzer
{
public function __construct(
private readonly NodeComparator $nodeComparator,
private readonly BetterNodeFinder $betterNodeFinder,
private readonly PhpDocInfoFactory $phpDocInfoFactory,
private readonly NodeNameResolver $nodeNameResolver
) {
}
@ -34,13 +39,23 @@ final class ExprAnalyzer
return false;
}
$phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($functionLike);
$params = $functionLike->getParams();
foreach ($params as $param) {
if (! $this->nodeComparator->areNodesEqual($param->var, $expr)) {
continue;
}
return $param->type === null;
$paramName = $this->nodeNameResolver->getName($param->var);
if ($paramName === null) {
continue;
}
$paramTag = $phpDocInfo->getParamTagValueByName($paramName);
return $paramTag instanceof ParamTagValueNode && $param->type === null;
}
return false;