From afd984fc4ecd5d21b914ca2005b8289a6aa8bbb8 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Wed, 31 Aug 2022 09:31:19 +0000 Subject: [PATCH] Updated Rector to commit b8c70125cda3a0fbdff216dfccaf065d8fe1aa2b https://github.com/rectorphp/rector-src/commit/b8c70125cda3a0fbdff216dfccaf065d8fe1aa2b [phpstan] Resolve duplicated methods (#2869) --- .../NodeTypeResolver/NodeTypeResolver.php | 3 -- packages/PhpDocParser/PhpDocInfoAnalyzer.php | 20 ++++++++++ .../PHPUnit/AbstractRectorTestCase.php | 10 ++--- .../PhpDoc/DeadParamTagValueNodeAnalyzer.php | 22 +++++------ .../NodeAnalyzer/ParamAnalyzer.php | 35 +++++++++++++++++ .../NodeAnalyzer/ReturnAnalyzer.php | 37 ++++++++++++++++++ .../AlwaysStrictReturnAnalyzer.php | 38 +++++-------------- ...StrictNativeFunctionReturnTypeAnalyzer.php | 38 +++++-------------- .../StrictReturnNewAnalyzer.php | 38 +++++-------------- ...ParamAnnotationIncorrectNullableRector.php | 25 +++++------- .../PropertyTypeDeclarationRector.php | 22 +++++------ .../VarAnnotationIncorrectNullableRector.php | 23 +++++------ src/Application/VersionResolver.php | 4 +- vendor/autoload.php | 2 +- vendor/composer/autoload_classmap.php | 3 ++ vendor/composer/autoload_real.php | 14 +++---- vendor/composer/autoload_static.php | 11 ++++-- 17 files changed, 181 insertions(+), 164 deletions(-) create mode 100644 packages/PhpDocParser/PhpDocInfoAnalyzer.php create mode 100644 rules/TypeDeclaration/NodeAnalyzer/ParamAnalyzer.php create mode 100644 rules/TypeDeclaration/NodeAnalyzer/ReturnAnalyzer.php diff --git a/packages/NodeTypeResolver/NodeTypeResolver.php b/packages/NodeTypeResolver/NodeTypeResolver.php index 1857ad0e9ac..2af0a357eab 100644 --- a/packages/NodeTypeResolver/NodeTypeResolver.php +++ b/packages/NodeTypeResolver/NodeTypeResolver.php @@ -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) { diff --git a/packages/PhpDocParser/PhpDocInfoAnalyzer.php b/packages/PhpDocParser/PhpDocInfoAnalyzer.php new file mode 100644 index 00000000000..6a13a916b3c --- /dev/null +++ b/packages/PhpDocParser/PhpDocInfoAnalyzer.php @@ -0,0 +1,20 @@ +getVarType($tagName); + if (!$varType instanceof MixedType) { + return \true; + } + } + return \false; + } +} diff --git a/packages/Testing/PHPUnit/AbstractRectorTestCase.php b/packages/Testing/PHPUnit/AbstractRectorTestCase.php index 35ed051702a..de42a5e01f1 100644 --- a/packages/Testing/PHPUnit/AbstractRectorTestCase.php +++ b/packages/Testing/PHPUnit/AbstractRectorTestCase.php @@ -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) diff --git a/rules/DeadCode/PhpDoc/DeadParamTagValueNodeAnalyzer.php b/rules/DeadCode/PhpDoc/DeadParamTagValueNodeAnalyzer.php index d0310173d4f..380ddd0c268 100644 --- a/rules/DeadCode/PhpDoc/DeadParamTagValueNodeAnalyzer.php +++ b/rules/DeadCode/PhpDoc/DeadParamTagValueNodeAnalyzer.php @@ -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; - } } diff --git a/rules/TypeDeclaration/NodeAnalyzer/ParamAnalyzer.php b/rules/TypeDeclaration/NodeAnalyzer/ParamAnalyzer.php new file mode 100644 index 00000000000..894203dfc7c --- /dev/null +++ b/rules/TypeDeclaration/NodeAnalyzer/ParamAnalyzer.php @@ -0,0 +1,35 @@ +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; + } +} diff --git a/rules/TypeDeclaration/NodeAnalyzer/ReturnAnalyzer.php b/rules/TypeDeclaration/NodeAnalyzer/ReturnAnalyzer.php new file mode 100644 index 00000000000..a43c64a57cd --- /dev/null +++ b/rules/TypeDeclaration/NodeAnalyzer/ReturnAnalyzer.php @@ -0,0 +1,37 @@ +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; + } +} diff --git a/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/AlwaysStrictReturnAnalyzer.php b/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/AlwaysStrictReturnAnalyzer.php index b4c91e040a3..aea93fc525d 100644 --- a/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/AlwaysStrictReturnAnalyzer.php +++ b/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/AlwaysStrictReturnAnalyzer.php @@ -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; - } } diff --git a/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictNativeFunctionReturnTypeAnalyzer.php b/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictNativeFunctionReturnTypeAnalyzer.php index 7d54d53647f..8510c56daed 100644 --- a/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictNativeFunctionReturnTypeAnalyzer.php +++ b/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictNativeFunctionReturnTypeAnalyzer.php @@ -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; - } } diff --git a/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictReturnNewAnalyzer.php b/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictReturnNewAnalyzer.php index 714b8b2d2d5..ff08cee932c 100644 --- a/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictReturnNewAnalyzer.php +++ b/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictReturnNewAnalyzer.php @@ -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 * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Function_|\PhpParser\Node\Expr\Closure $functionLike diff --git a/rules/TypeDeclaration/Rector/ClassMethod/ParamAnnotationIncorrectNullableRector.php b/rules/TypeDeclaration/Rector/ClassMethod/ParamAnnotationIncorrectNullableRector.php index 523a278fb4e..c3b73e37098 100644 --- a/rules/TypeDeclaration/Rector/ClassMethod/ParamAnnotationIncorrectNullableRector.php +++ b/rules/TypeDeclaration/Rector/ClassMethod/ParamAnnotationIncorrectNullableRector.php @@ -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; } diff --git a/rules/TypeDeclaration/Rector/Property/PropertyTypeDeclarationRector.php b/rules/TypeDeclaration/Rector/Property/PropertyTypeDeclarationRector.php index ff30df4293c..776fff2ad6f 100644 --- a/rules/TypeDeclaration/Rector/Property/PropertyTypeDeclarationRector.php +++ b/rules/TypeDeclaration/Rector/Property/PropertyTypeDeclarationRector.php @@ -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); diff --git a/rules/TypeDeclaration/Rector/Property/VarAnnotationIncorrectNullableRector.php b/rules/TypeDeclaration/Rector/Property/VarAnnotationIncorrectNullableRector.php index fe6565b9e67..7dff622db57 100644 --- a/rules/TypeDeclaration/Rector/Property/VarAnnotationIncorrectNullableRector.php +++ b/rules/TypeDeclaration/Rector/Property/VarAnnotationIncorrectNullableRector.php @@ -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; - } } diff --git a/src/Application/VersionResolver.php b/src/Application/VersionResolver.php index 67ef818b279..8e6ef4f6702 100644 --- a/src/Application/VersionResolver.php +++ b/src/Application/VersionResolver.php @@ -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 */ diff --git a/vendor/autoload.php b/vendor/autoload.php index 26115a10073..d8a144052cb 100644 --- a/vendor/autoload.php +++ b/vendor/autoload.php @@ -9,4 +9,4 @@ if (PHP_VERSION_ID < 50600) { require_once __DIR__ . '/composer/autoload_real.php'; -return ComposerAutoloaderInitf3134b9ed12cab2fbd4484930fa12946::getLoader(); +return ComposerAutoloaderInit3595c7d5f829a41f3682c309e93459b6::getLoader(); diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index 1169fa32909..4fedb66109f 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -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', diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index 8b663626b19..5aac2d20ac8 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -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; diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index e68d69eeaae..b4ec9f7ba72 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -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); }