mirror of https://github.com/rectorphp/rector.git
Updated Rector to commit b8c70125cda3a0fbdff216dfccaf065d8fe1aa2b
b8c70125cd
[phpstan] Resolve duplicated methods (#2869)
This commit is contained in:
parent
7b90cd54eb
commit
afd984fc4e
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -9,4 +9,4 @@ if (PHP_VERSION_ID < 50600) {
|
|||
|
||||
require_once __DIR__ . '/composer/autoload_real.php';
|
||||
|
||||
return ComposerAutoloaderInitf3134b9ed12cab2fbd4484930fa12946::getLoader();
|
||||
return ComposerAutoloaderInit3595c7d5f829a41f3682c309e93459b6::getLoader();
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue