Updated Rector to commit b8c70125cda3a0fbdff216dfccaf065d8fe1aa2b

b8c70125cd [phpstan] Resolve duplicated methods (#2869)
This commit is contained in:
Tomas Votruba 2022-08-31 09:31:19 +00:00
parent 7b90cd54eb
commit afd984fc4e
17 changed files with 181 additions and 164 deletions

View File

@ -258,9 +258,6 @@ final class NodeTypeResolver
$bareType = TypeCombinator::removeNull($nodeType);
return \is_a($bareType, $desiredType, \true);
}
/**
* @return class-string
*/
public function getFullyQualifiedClassName(TypeWithClassName $typeWithClassName) : string
{
if ($typeWithClassName instanceof ShortenedObjectType) {

View File

@ -0,0 +1,20 @@
<?php
declare (strict_types=1);
namespace Rector\PhpDocParser;
use PHPStan\Type\MixedType;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
final class PhpDocInfoAnalyzer
{
public function isVarDocAlreadySet(PhpDocInfo $phpDocInfo) : bool
{
foreach (['@var', '@phpstan-var', '@psalm-var'] as $tagName) {
$varType = $phpDocInfo->getVarType($tagName);
if (!$varType instanceof MixedType) {
return \true;
}
}
return \false;
}
}

View File

@ -89,7 +89,7 @@ abstract class AbstractRectorTestCase extends \Rector\Testing\PHPUnit\AbstractTe
{
return \strncasecmp(\PHP_OS, 'WIN', 3) === 0;
}
protected function doTestFileInfo(SmartFileInfo $fixtureFileInfo)
protected function doTestFileInfo(SmartFileInfo $fixtureFileInfo) : void
{
if (Strings::match($fixtureFileInfo->getContents(), FixtureSplitter::SPLIT_LINE_REGEX)) {
// changed content
@ -104,7 +104,6 @@ abstract class AbstractRectorTestCase extends \Rector\Testing\PHPUnit\AbstractTe
$expectedFileInfo = FixtureTempFileDumper::dump($expectedFileContents, $fileSuffix);
$this->originalTempFileInfo = $inputFileInfo;
$this->doTestFileMatchesExpectedContent($inputFileInfo, $expectedFileInfo, $fixtureFileInfo);
//, $allowMatches);
}
protected function getFixtureTempDirectory() : string
{
@ -135,7 +134,7 @@ abstract class AbstractRectorTestCase extends \Rector\Testing\PHPUnit\AbstractTe
require_once __DIR__ . '/../../../vendor/scoper-autoload.php';
}
}
private function doTestFileMatchesExpectedContent(SmartFileInfo $originalFileInfo, SmartFileInfo $expectedFileInfo, SmartFileInfo $fixtureFileInfo, bool $allowMatches = \true) : void
private function doTestFileMatchesExpectedContent(SmartFileInfo $originalFileInfo, SmartFileInfo $expectedFileInfo, SmartFileInfo $fixtureFileInfo) : void
{
$this->parameterProvider->changeParameter(Option::SOURCE, [$originalFileInfo->getRealPath()]);
$changedContent = $this->processFileInfo($originalFileInfo);
@ -145,10 +144,7 @@ abstract class AbstractRectorTestCase extends \Rector\Testing\PHPUnit\AbstractTe
}
try {
$this->assertStringEqualsFile($expectedFileInfo->getRealPath(), $changedContent);
} catch (ExpectationFailedException $expectationFailedException) {
if (!$allowMatches) {
throw $expectationFailedException;
}
} catch (ExpectationFailedException $exception) {
FixtureFileUpdater::updateFixtureContent($originalFileInfo, $changedContent, $fixtureFileInfo);
$contents = $expectedFileInfo->getContents();
// make sure we don't get a diff in which every line is different (because of differences in EOL)

View File

@ -21,6 +21,7 @@ use Rector\DeadCode\TypeNodeAnalyzer\GenericTypeNodeAnalyzer;
use Rector\DeadCode\TypeNodeAnalyzer\MixedArrayTypeNodeAnalyzer;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\NodeTypeResolver\TypeComparator\TypeComparator;
use Rector\TypeDeclaration\NodeAnalyzer\ParamAnalyzer;
final class DeadParamTagValueNodeAnalyzer
{
/**
@ -43,16 +44,22 @@ final class DeadParamTagValueNodeAnalyzer
* @var \Rector\DeadCode\TypeNodeAnalyzer\MixedArrayTypeNodeAnalyzer
*/
private $mixedArrayTypeNodeAnalyzer;
public function __construct(NodeNameResolver $nodeNameResolver, TypeComparator $typeComparator, GenericTypeNodeAnalyzer $genericTypeNodeAnalyzer, MixedArrayTypeNodeAnalyzer $mixedArrayTypeNodeAnalyzer)
/**
* @readonly
* @var \Rector\TypeDeclaration\NodeAnalyzer\ParamAnalyzer
*/
private $paramAnalyzer;
public function __construct(NodeNameResolver $nodeNameResolver, TypeComparator $typeComparator, GenericTypeNodeAnalyzer $genericTypeNodeAnalyzer, MixedArrayTypeNodeAnalyzer $mixedArrayTypeNodeAnalyzer, ParamAnalyzer $paramAnalyzer)
{
$this->nodeNameResolver = $nodeNameResolver;
$this->typeComparator = $typeComparator;
$this->genericTypeNodeAnalyzer = $genericTypeNodeAnalyzer;
$this->mixedArrayTypeNodeAnalyzer = $mixedArrayTypeNodeAnalyzer;
$this->paramAnalyzer = $paramAnalyzer;
}
public function isDead(ParamTagValueNode $paramTagValueNode, FunctionLike $functionLike) : bool
{
$param = $this->matchParamByName($paramTagValueNode->parameterName, $functionLike);
$param = $this->paramAnalyzer->getParamByName($paramTagValueNode->parameterName, $functionLike);
if (!$param instanceof Param) {
return \false;
}
@ -129,15 +136,4 @@ final class DeadParamTagValueNodeAnalyzer
}
return \true;
}
private function matchParamByName(string $desiredParamName, FunctionLike $functionLike) : ?Param
{
foreach ($functionLike->getParams() as $param) {
$paramName = $this->nodeNameResolver->getName($param);
if ('$' . $paramName !== $desiredParamName) {
continue;
}
return $param;
}
return null;
}
}

View File

@ -0,0 +1,35 @@
<?php
declare (strict_types=1);
namespace Rector\TypeDeclaration\NodeAnalyzer;
use PhpParser\Node\Param;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Function_;
use Rector\NodeNameResolver\NodeNameResolver;
final class ParamAnalyzer
{
/**
* @readonly
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
public function __construct(NodeNameResolver $nodeNameResolver)
{
$this->nodeNameResolver = $nodeNameResolver;
}
/**
* @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Function_ $functionLike
*/
public function getParamByName(string $desiredParamName, $functionLike) : ?Param
{
foreach ($functionLike->getParams() as $param) {
$paramName = $this->nodeNameResolver->getName($param);
if ('$' . $paramName !== $desiredParamName) {
continue;
}
return $param;
}
return null;
}
}

View File

@ -0,0 +1,37 @@
<?php
declare (strict_types=1);
namespace Rector\TypeDeclaration\NodeAnalyzer;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\Closure;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Function_;
use PhpParser\Node\Stmt\Return_;
final class ReturnAnalyzer
{
/**
* @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Function_|\PhpParser\Node\Expr\Closure $functionLike
*/
public function hasClassMethodRootReturn($functionLike) : bool
{
foreach ((array) $functionLike->stmts as $stmt) {
if ($stmt instanceof Return_) {
return \true;
}
}
return \false;
}
/**
* @param Return_[] $returns
*/
public function areExclusiveExprReturns(array $returns) : bool
{
foreach ($returns as $return) {
if (!$return->expr instanceof Expr) {
return \false;
}
}
return \true;
}
}

View File

@ -3,13 +3,13 @@
declare (strict_types=1);
namespace Rector\TypeDeclaration\NodeAnalyzer\ReturnTypeAnalyzer;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\Closure;
use PhpParser\Node\Expr\Yield_;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Function_;
use PhpParser\Node\Stmt\Return_;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer;
final class AlwaysStrictReturnAnalyzer
{
/**
@ -17,9 +17,15 @@ final class AlwaysStrictReturnAnalyzer
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
*/
private $betterNodeFinder;
public function __construct(BetterNodeFinder $betterNodeFinder)
/**
* @readonly
* @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer
*/
private $returnAnalyzer;
public function __construct(BetterNodeFinder $betterNodeFinder, ReturnAnalyzer $returnAnalyzer)
{
$this->betterNodeFinder = $betterNodeFinder;
$this->returnAnalyzer = $returnAnalyzer;
}
/**
* @return Return_[]|null
@ -39,37 +45,13 @@ final class AlwaysStrictReturnAnalyzer
return null;
}
// is one statement depth 3?
if (!$this->areExclusiveExprReturns($returns)) {
if (!$this->returnAnalyzer->areExclusiveExprReturns($returns)) {
return null;
}
// has root return?
if (!$this->hasClassMethodRootReturn($functionLike)) {
if (!$this->returnAnalyzer->hasClassMethodRootReturn($functionLike)) {
return null;
}
return $returns;
}
/**
* @param Return_[] $returns
*/
private function areExclusiveExprReturns(array $returns) : bool
{
foreach ($returns as $return) {
if (!$return->expr instanceof Expr) {
return \false;
}
}
return \true;
}
/**
* @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Function_|\PhpParser\Node\Expr\Closure $functionLike
*/
private function hasClassMethodRootReturn($functionLike) : bool
{
foreach ((array) $functionLike->stmts as $stmt) {
if ($stmt instanceof Return_) {
return \true;
}
}
return \false;
}
}

View File

@ -3,7 +3,6 @@
declare (strict_types=1);
namespace Rector\TypeDeclaration\NodeAnalyzer\ReturnTypeAnalyzer;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\CallLike;
use PhpParser\Node\Expr\Closure;
use PhpParser\Node\Expr\Yield_;
@ -11,6 +10,7 @@ use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Function_;
use PhpParser\Node\Stmt\Return_;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer;
use Rector\TypeDeclaration\NodeAnalyzer\ReturnFilter\ExclusiveNativeCallLikeReturnMatcher;
final class StrictNativeFunctionReturnTypeAnalyzer
{
@ -24,10 +24,16 @@ final class StrictNativeFunctionReturnTypeAnalyzer
* @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnFilter\ExclusiveNativeCallLikeReturnMatcher
*/
private $exclusiveNativeCallLikeReturnMatcher;
public function __construct(BetterNodeFinder $betterNodeFinder, ExclusiveNativeCallLikeReturnMatcher $exclusiveNativeCallLikeReturnMatcher)
/**
* @readonly
* @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer
*/
private $returnAnalyzer;
public function __construct(BetterNodeFinder $betterNodeFinder, ExclusiveNativeCallLikeReturnMatcher $exclusiveNativeCallLikeReturnMatcher, ReturnAnalyzer $returnAnalyzer)
{
$this->betterNodeFinder = $betterNodeFinder;
$this->exclusiveNativeCallLikeReturnMatcher = $exclusiveNativeCallLikeReturnMatcher;
$this->returnAnalyzer = $returnAnalyzer;
}
/**
* @return CallLike[]|null
@ -47,37 +53,13 @@ final class StrictNativeFunctionReturnTypeAnalyzer
return null;
}
// is one statement depth 3?
if (!$this->areExclusiveExprReturns($returns)) {
if (!$this->returnAnalyzer->areExclusiveExprReturns($returns)) {
return null;
}
// has root return?
if (!$this->hasClassMethodRootReturn($functionLike)) {
if (!$this->returnAnalyzer->hasClassMethodRootReturn($functionLike)) {
return null;
}
return $this->exclusiveNativeCallLikeReturnMatcher->match($returns);
}
/**
* @param Return_[] $returns
*/
private function areExclusiveExprReturns(array $returns) : bool
{
foreach ($returns as $return) {
if (!$return->expr instanceof Expr) {
return \false;
}
}
return \true;
}
/**
* @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Function_|\PhpParser\Node\Expr\Closure $functionLike
*/
private function hasClassMethodRootReturn($functionLike) : bool
{
foreach ((array) $functionLike->stmts as $stmt) {
if ($stmt instanceof Return_) {
return \true;
}
}
return \false;
}
}

View File

@ -3,7 +3,6 @@
declare (strict_types=1);
namespace Rector\TypeDeclaration\NodeAnalyzer\ReturnTypeAnalyzer;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\Expr\Closure;
use PhpParser\Node\Expr\New_;
@ -18,6 +17,7 @@ use PHPStan\Type\ObjectType;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\NodeTypeResolver\NodeTypeResolver;
use Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer;
use Rector\TypeDeclaration\ValueObject\AssignToVariable;
final class StrictReturnNewAnalyzer
{
@ -36,11 +36,17 @@ final class StrictReturnNewAnalyzer
* @var \Rector\NodeTypeResolver\NodeTypeResolver
*/
private $nodeTypeResolver;
public function __construct(BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver, NodeTypeResolver $nodeTypeResolver)
/**
* @readonly
* @var \Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer
*/
private $returnAnalyzer;
public function __construct(BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver, NodeTypeResolver $nodeTypeResolver, ReturnAnalyzer $returnAnalyzer)
{
$this->betterNodeFinder = $betterNodeFinder;
$this->nodeNameResolver = $nodeNameResolver;
$this->nodeTypeResolver = $nodeTypeResolver;
$this->returnAnalyzer = $returnAnalyzer;
}
/**
* @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Expr\Closure|\PhpParser\Node\Stmt\Function_ $functionLike
@ -59,11 +65,11 @@ final class StrictReturnNewAnalyzer
return null;
}
// is one statement depth 3?
if (!$this->areExclusiveExprReturns($returns)) {
if (!$this->returnAnalyzer->areExclusiveExprReturns($returns)) {
return null;
}
// has root return?
if (!$this->hasClassMethodRootReturn($functionLike)) {
if (!$this->returnAnalyzer->hasClassMethodRootReturn($functionLike)) {
return null;
}
if (\count($returns) !== 1) {
@ -89,30 +95,6 @@ final class StrictReturnNewAnalyzer
}
return null;
}
/**
* @param Return_[] $returns
*/
private function areExclusiveExprReturns(array $returns) : bool
{
foreach ($returns as $return) {
if (!$return->expr instanceof Expr) {
return \false;
}
}
return \true;
}
/**
* @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Function_|\PhpParser\Node\Expr\Closure $functionLike
*/
private function hasClassMethodRootReturn($functionLike) : bool
{
foreach ((array) $functionLike->stmts as $stmt) {
if ($stmt instanceof Return_) {
return \true;
}
}
return \false;
}
/**
* @return array<string, string>
* @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Function_|\PhpParser\Node\Expr\Closure $functionLike

View File

@ -17,6 +17,7 @@ use Rector\NodeTypeResolver\TypeComparator\TypeComparator;
use Rector\PHPStanStaticTypeMapper\Enum\TypeKind;
use Rector\TypeDeclaration\Guard\PhpDocNestedAnnotationGuard;
use Rector\TypeDeclaration\Helper\PhpDocNullableTypeHelper;
use Rector\TypeDeclaration\NodeAnalyzer\ParamAnalyzer;
use Rector\TypeDeclaration\PhpDocParser\ParamPhpDocNodeFactory;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
@ -50,13 +51,19 @@ final class ParamAnnotationIncorrectNullableRector extends AbstractRector
* @var \Rector\Core\Php\PhpVersionProvider
*/
private $phpVersionProvider;
public function __construct(TypeComparator $typeComparator, PhpDocNullableTypeHelper $phpDocNullableTypeHelper, PhpDocNestedAnnotationGuard $phpDocNestedAnnotationGuard, ParamPhpDocNodeFactory $paramPhpDocNodeFactory, PhpVersionProvider $phpVersionProvider)
/**
* @readonly
* @var \Rector\TypeDeclaration\NodeAnalyzer\ParamAnalyzer
*/
private $paramAnalyzer;
public function __construct(TypeComparator $typeComparator, PhpDocNullableTypeHelper $phpDocNullableTypeHelper, PhpDocNestedAnnotationGuard $phpDocNestedAnnotationGuard, ParamPhpDocNodeFactory $paramPhpDocNodeFactory, PhpVersionProvider $phpVersionProvider, ParamAnalyzer $paramAnalyzer)
{
$this->typeComparator = $typeComparator;
$this->phpDocNullableTypeHelper = $phpDocNullableTypeHelper;
$this->phpDocNestedAnnotationGuard = $phpDocNestedAnnotationGuard;
$this->paramPhpDocNodeFactory = $paramPhpDocNodeFactory;
$this->phpVersionProvider = $phpVersionProvider;
$this->paramAnalyzer = $paramAnalyzer;
}
public function getRuleDefinition() : RuleDefinition
{
@ -115,20 +122,6 @@ CODE_SAMPLE
$phpDocNode = $phpDocInfo->getPhpDocNode();
return $this->updateParamTagsIfRequired($phpDocNode, $node, $phpDocInfo);
}
/**
* @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Function_ $node
*/
private function matchParamByName(string $desiredParamName, $node) : ?Param
{
foreach ($node->getParams() as $param) {
$paramName = $this->nodeNameResolver->getName($param);
if ('$' . $paramName !== $desiredParamName) {
continue;
}
return $param;
}
return null;
}
private function wasUpdateOfParamTypeRequired(PhpDocInfo $phpDocInfo, Type $newType, Param $param, string $paramName) : bool
{
// better skip, could crash hard
@ -163,7 +156,7 @@ CODE_SAMPLE
if ($paramTagValueNode->type === null) {
continue;
}
$param = $this->matchParamByName($paramTagValueNode->parameterName, $node);
$param = $this->paramAnalyzer->getParamByName($paramTagValueNode->parameterName, $node);
if (!$param instanceof Param) {
continue;
}

View File

@ -9,11 +9,11 @@ use PhpParser\Node\UnionType;
use PHPStan\Type\MixedType;
use PHPStan\Type\NullType;
use PHPStan\Type\Type;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger;
use Rector\Core\Php\PhpVersionProvider;
use Rector\Core\Rector\AbstractRector;
use Rector\Core\ValueObject\PhpVersionFeature;
use Rector\PhpDocParser\PhpDocInfoAnalyzer;
use Rector\PHPStanStaticTypeMapper\Enum\TypeKind;
use Rector\TypeDeclaration\Guard\PropertyTypeOverrideGuard;
use Rector\TypeDeclaration\TypeInferer\VarDocPropertyTypeInferer;
@ -44,12 +44,18 @@ final class PropertyTypeDeclarationRector extends AbstractRector
* @var \Rector\Core\Php\PhpVersionProvider
*/
private $phpVersionProvider;
public function __construct(VarDocPropertyTypeInferer $varDocPropertyTypeInferer, PhpDocTypeChanger $phpDocTypeChanger, PropertyTypeOverrideGuard $propertyTypeOverrideGuard, PhpVersionProvider $phpVersionProvider)
/**
* @readonly
* @var \Rector\PhpDocParser\PhpDocInfoAnalyzer
*/
private $phpDocInfoAnalyzer;
public function __construct(VarDocPropertyTypeInferer $varDocPropertyTypeInferer, PhpDocTypeChanger $phpDocTypeChanger, PropertyTypeOverrideGuard $propertyTypeOverrideGuard, PhpVersionProvider $phpVersionProvider, PhpDocInfoAnalyzer $phpDocInfoAnalyzer)
{
$this->varDocPropertyTypeInferer = $varDocPropertyTypeInferer;
$this->phpDocTypeChanger = $phpDocTypeChanger;
$this->propertyTypeOverrideGuard = $propertyTypeOverrideGuard;
$this->phpVersionProvider = $phpVersionProvider;
$this->phpDocInfoAnalyzer = $phpDocInfoAnalyzer;
}
public function getRuleDefinition() : RuleDefinition
{
@ -102,7 +108,7 @@ CODE_SAMPLE
if ($phpDocInfo->hasInheritDoc() && !$node->isPrivate()) {
return null;
}
if ($this->isVarDocAlreadySet($phpDocInfo)) {
if ($this->phpDocInfoAnalyzer->isVarDocAlreadySet($phpDocInfo)) {
return null;
}
$type = $this->varDocPropertyTypeInferer->inferProperty($node);
@ -119,16 +125,6 @@ CODE_SAMPLE
$this->phpDocTypeChanger->changeVarType($phpDocInfo, $type);
return $node;
}
private function isVarDocAlreadySet(PhpDocInfo $phpDocInfo) : bool
{
foreach (['@var', '@phpstan-var', '@psalm-var'] as $tagName) {
$varType = $phpDocInfo->getVarType($tagName);
if (!$varType instanceof MixedType) {
return \true;
}
}
return \false;
}
private function completeTypedProperty(Type $type, Property $property) : void
{
$propertyTypeNode = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($type, TypeKind::PROPERTY);

View File

@ -6,13 +6,12 @@ namespace Rector\TypeDeclaration\Rector\Property;
use PhpParser\Node;
use PhpParser\Node\Stmt\Property;
use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger;
use Rector\Core\Php\PhpVersionProvider;
use Rector\Core\Rector\AbstractRector;
use Rector\Core\ValueObject\PhpVersionFeature;
use Rector\PhpDocParser\PhpDocInfoAnalyzer;
use Rector\TypeDeclaration\Guard\PhpDocNestedAnnotationGuard;
use Rector\TypeDeclaration\Helper\PhpDocNullableTypeHelper;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
@ -42,12 +41,18 @@ final class VarAnnotationIncorrectNullableRector extends AbstractRector
* @var \Rector\Core\Php\PhpVersionProvider
*/
private $phpVersionProvider;
public function __construct(PhpDocTypeChanger $phpDocTypeChanger, PhpDocNullableTypeHelper $phpDocNullableTypeHelper, PhpDocNestedAnnotationGuard $phpDocNestedAnnotationGuard, PhpVersionProvider $phpVersionProvider)
/**
* @readonly
* @var \Rector\PhpDocParser\PhpDocInfoAnalyzer
*/
private $phpDocInfoAnalyzer;
public function __construct(PhpDocTypeChanger $phpDocTypeChanger, PhpDocNullableTypeHelper $phpDocNullableTypeHelper, PhpDocNestedAnnotationGuard $phpDocNestedAnnotationGuard, PhpVersionProvider $phpVersionProvider, PhpDocInfoAnalyzer $phpDocInfoAnalyzer)
{
$this->phpDocTypeChanger = $phpDocTypeChanger;
$this->phpDocNullableTypeHelper = $phpDocNullableTypeHelper;
$this->phpDocNestedAnnotationGuard = $phpDocNestedAnnotationGuard;
$this->phpVersionProvider = $phpVersionProvider;
$this->phpDocInfoAnalyzer = $phpDocInfoAnalyzer;
}
public function getRuleDefinition() : RuleDefinition
{
@ -93,7 +98,7 @@ CODE_SAMPLE
return null;
}
$phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node);
if (!$this->isVarDocAlreadySet($phpDocInfo)) {
if (!$this->phpDocInfoAnalyzer->isVarDocAlreadySet($phpDocInfo)) {
return null;
}
if ($node->type === null) {
@ -118,14 +123,4 @@ CODE_SAMPLE
}
return $node;
}
private function isVarDocAlreadySet(PhpDocInfo $phpDocInfo) : bool
{
foreach (['@var', '@phpstan-var', '@psalm-var'] as $tagName) {
$varType = $phpDocInfo->getVarType($tagName);
if (!$varType instanceof MixedType) {
return \true;
}
}
return \false;
}
}

View File

@ -17,12 +17,12 @@ final class VersionResolver
* @api
* @var string
*/
public const PACKAGE_VERSION = '08ccd5a1a4f8757ff8f392c0e823a02bc95c14c1';
public const PACKAGE_VERSION = 'b8c70125cda3a0fbdff216dfccaf065d8fe1aa2b';
/**
* @api
* @var string
*/
public const RELEASE_DATE = '2022-08-31 08:58:15';
public const RELEASE_DATE = '2022-08-31 09:27:23';
/**
* @var int
*/

2
vendor/autoload.php vendored
View File

@ -9,4 +9,4 @@ if (PHP_VERSION_ID < 50600) {
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInitf3134b9ed12cab2fbd4484930fa12946::getLoader();
return ComposerAutoloaderInit3595c7d5f829a41f3682c309e93459b6::getLoader();

View File

@ -2371,6 +2371,7 @@ return array(
'Rector\\PhpDocParser\\NodeValue\\NodeValueResolver\\FuncCallValueResolver' => $baseDir . '/packages/PhpDocParser/NodeValue/NodeValueResolver/FuncCallValueResolver.php',
'Rector\\PhpDocParser\\NodeValue\\NodeValueResolver\\MagicConstValueResolver' => $baseDir . '/packages/PhpDocParser/NodeValue/NodeValueResolver/MagicConstValueResolver.php',
'Rector\\PhpDocParser\\NodeVisitor\\CallableNodeVisitor' => $baseDir . '/packages/PhpDocParser/NodeVisitor/CallableNodeVisitor.php',
'Rector\\PhpDocParser\\PhpDocInfoAnalyzer' => $baseDir . '/packages/PhpDocParser/PhpDocInfoAnalyzer.php',
'Rector\\PhpDocParser\\PhpDocParser\\Contract\\PhpDocNodeVisitorInterface' => $baseDir . '/packages/PhpDocParser/PhpDocParser/Contract/PhpDocNodeVisitorInterface.php',
'Rector\\PhpDocParser\\PhpDocParser\\Exception\\InvalidTraverseException' => $baseDir . '/packages/PhpDocParser/PhpDocParser/Exception/InvalidTraverseException.php',
'Rector\\PhpDocParser\\PhpDocParser\\PhpDocNodeTraverser' => $baseDir . '/packages/PhpDocParser/PhpDocParser/PhpDocNodeTraverser.php',
@ -2765,6 +2766,8 @@ return array(
'Rector\\TypeDeclaration\\NodeAnalyzer\\ClassMethodParamTypeCompleter' => $baseDir . '/rules/TypeDeclaration/NodeAnalyzer/ClassMethodParamTypeCompleter.php',
'Rector\\TypeDeclaration\\NodeAnalyzer\\ControllerRenderMethodAnalyzer' => $baseDir . '/rules/TypeDeclaration/NodeAnalyzer/ControllerRenderMethodAnalyzer.php',
'Rector\\TypeDeclaration\\NodeAnalyzer\\PHPUnitDataProviderResolver' => $baseDir . '/rules/TypeDeclaration/NodeAnalyzer/PHPUnitDataProviderResolver.php',
'Rector\\TypeDeclaration\\NodeAnalyzer\\ParamAnalyzer' => $baseDir . '/rules/TypeDeclaration/NodeAnalyzer/ParamAnalyzer.php',
'Rector\\TypeDeclaration\\NodeAnalyzer\\ReturnAnalyzer' => $baseDir . '/rules/TypeDeclaration/NodeAnalyzer/ReturnAnalyzer.php',
'Rector\\TypeDeclaration\\NodeAnalyzer\\ReturnFilter\\ExclusiveNativeCallLikeReturnMatcher' => $baseDir . '/rules/TypeDeclaration/NodeAnalyzer/ReturnFilter/ExclusiveNativeCallLikeReturnMatcher.php',
'Rector\\TypeDeclaration\\NodeAnalyzer\\ReturnTypeAnalyzer\\AlwaysStrictReturnAnalyzer' => $baseDir . '/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/AlwaysStrictReturnAnalyzer.php',
'Rector\\TypeDeclaration\\NodeAnalyzer\\ReturnTypeAnalyzer\\StrictBoolReturnTypeAnalyzer' => $baseDir . '/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictBoolReturnTypeAnalyzer.php',

View File

@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
class ComposerAutoloaderInitf3134b9ed12cab2fbd4484930fa12946
class ComposerAutoloaderInit3595c7d5f829a41f3682c309e93459b6
{
private static $loader;
@ -22,19 +22,19 @@ class ComposerAutoloaderInitf3134b9ed12cab2fbd4484930fa12946
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInitf3134b9ed12cab2fbd4484930fa12946', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInit3595c7d5f829a41f3682c309e93459b6', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
spl_autoload_unregister(array('ComposerAutoloaderInitf3134b9ed12cab2fbd4484930fa12946', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInit3595c7d5f829a41f3682c309e93459b6', 'loadClassLoader'));
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInitf3134b9ed12cab2fbd4484930fa12946::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInit3595c7d5f829a41f3682c309e93459b6::getInitializer($loader));
$loader->setClassMapAuthoritative(true);
$loader->register(true);
$includeFiles = \Composer\Autoload\ComposerStaticInitf3134b9ed12cab2fbd4484930fa12946::$files;
$includeFiles = \Composer\Autoload\ComposerStaticInit3595c7d5f829a41f3682c309e93459b6::$files;
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequiref3134b9ed12cab2fbd4484930fa12946($fileIdentifier, $file);
composerRequire3595c7d5f829a41f3682c309e93459b6($fileIdentifier, $file);
}
return $loader;
@ -46,7 +46,7 @@ class ComposerAutoloaderInitf3134b9ed12cab2fbd4484930fa12946
* @param string $file
* @return void
*/
function composerRequiref3134b9ed12cab2fbd4484930fa12946($fileIdentifier, $file)
function composerRequire3595c7d5f829a41f3682c309e93459b6($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;

View File

@ -4,7 +4,7 @@
namespace Composer\Autoload;
class ComposerStaticInitf3134b9ed12cab2fbd4484930fa12946
class ComposerStaticInit3595c7d5f829a41f3682c309e93459b6
{
public static $files = array (
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
@ -2651,6 +2651,7 @@ class ComposerStaticInitf3134b9ed12cab2fbd4484930fa12946
'Rector\\PhpDocParser\\NodeValue\\NodeValueResolver\\FuncCallValueResolver' => __DIR__ . '/../..' . '/packages/PhpDocParser/NodeValue/NodeValueResolver/FuncCallValueResolver.php',
'Rector\\PhpDocParser\\NodeValue\\NodeValueResolver\\MagicConstValueResolver' => __DIR__ . '/../..' . '/packages/PhpDocParser/NodeValue/NodeValueResolver/MagicConstValueResolver.php',
'Rector\\PhpDocParser\\NodeVisitor\\CallableNodeVisitor' => __DIR__ . '/../..' . '/packages/PhpDocParser/NodeVisitor/CallableNodeVisitor.php',
'Rector\\PhpDocParser\\PhpDocInfoAnalyzer' => __DIR__ . '/../..' . '/packages/PhpDocParser/PhpDocInfoAnalyzer.php',
'Rector\\PhpDocParser\\PhpDocParser\\Contract\\PhpDocNodeVisitorInterface' => __DIR__ . '/../..' . '/packages/PhpDocParser/PhpDocParser/Contract/PhpDocNodeVisitorInterface.php',
'Rector\\PhpDocParser\\PhpDocParser\\Exception\\InvalidTraverseException' => __DIR__ . '/../..' . '/packages/PhpDocParser/PhpDocParser/Exception/InvalidTraverseException.php',
'Rector\\PhpDocParser\\PhpDocParser\\PhpDocNodeTraverser' => __DIR__ . '/../..' . '/packages/PhpDocParser/PhpDocParser/PhpDocNodeTraverser.php',
@ -3045,6 +3046,8 @@ class ComposerStaticInitf3134b9ed12cab2fbd4484930fa12946
'Rector\\TypeDeclaration\\NodeAnalyzer\\ClassMethodParamTypeCompleter' => __DIR__ . '/../..' . '/rules/TypeDeclaration/NodeAnalyzer/ClassMethodParamTypeCompleter.php',
'Rector\\TypeDeclaration\\NodeAnalyzer\\ControllerRenderMethodAnalyzer' => __DIR__ . '/../..' . '/rules/TypeDeclaration/NodeAnalyzer/ControllerRenderMethodAnalyzer.php',
'Rector\\TypeDeclaration\\NodeAnalyzer\\PHPUnitDataProviderResolver' => __DIR__ . '/../..' . '/rules/TypeDeclaration/NodeAnalyzer/PHPUnitDataProviderResolver.php',
'Rector\\TypeDeclaration\\NodeAnalyzer\\ParamAnalyzer' => __DIR__ . '/../..' . '/rules/TypeDeclaration/NodeAnalyzer/ParamAnalyzer.php',
'Rector\\TypeDeclaration\\NodeAnalyzer\\ReturnAnalyzer' => __DIR__ . '/../..' . '/rules/TypeDeclaration/NodeAnalyzer/ReturnAnalyzer.php',
'Rector\\TypeDeclaration\\NodeAnalyzer\\ReturnFilter\\ExclusiveNativeCallLikeReturnMatcher' => __DIR__ . '/../..' . '/rules/TypeDeclaration/NodeAnalyzer/ReturnFilter/ExclusiveNativeCallLikeReturnMatcher.php',
'Rector\\TypeDeclaration\\NodeAnalyzer\\ReturnTypeAnalyzer\\AlwaysStrictReturnAnalyzer' => __DIR__ . '/../..' . '/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/AlwaysStrictReturnAnalyzer.php',
'Rector\\TypeDeclaration\\NodeAnalyzer\\ReturnTypeAnalyzer\\StrictBoolReturnTypeAnalyzer' => __DIR__ . '/../..' . '/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictBoolReturnTypeAnalyzer.php',
@ -3158,9 +3161,9 @@ class ComposerStaticInitf3134b9ed12cab2fbd4484930fa12946
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInitf3134b9ed12cab2fbd4484930fa12946::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitf3134b9ed12cab2fbd4484930fa12946::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInitf3134b9ed12cab2fbd4484930fa12946::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInit3595c7d5f829a41f3682c309e93459b6::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit3595c7d5f829a41f3682c309e93459b6::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInit3595c7d5f829a41f3682c309e93459b6::$classMap;
}, null, ClassLoader::class);
}