mirror of
https://github.com/rectorphp/rector.git
synced 2024-07-31 05:40:22 +00:00
[TypeDeclaration] Skip set type by @param doc at TypedPropertyFromAssignsRector (#1822)
Co-authored-by: GitHub Action <action@github.com>
This commit is contained in:
parent
ecce9b3709
commit
6c0a532529
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user