From cc03af5c9f94337fedcef552ab5d1232051f44f6 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 4 Dec 2021 23:43:43 +0700 Subject: [PATCH 1/6] [TypeDeclaration] Skip implements method return type on ReturnNeverTypeRector --- .../TypeMapper/HasOffsetTypeMapper.php | 3 ++- .../skip_implements_interface_method.php.inc | 14 ++++++++++++++ .../Source/RunnableInterface.php | 12 ++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 rules-tests/TypeDeclaration/Rector/ClassMethod/ReturnNeverTypeRector/Fixture/skip_implements_interface_method.php.inc create mode 100644 rules-tests/TypeDeclaration/Rector/ClassMethod/ReturnNeverTypeRector/Source/RunnableInterface.php diff --git a/packages/PHPStanStaticTypeMapper/TypeMapper/HasOffsetTypeMapper.php b/packages/PHPStanStaticTypeMapper/TypeMapper/HasOffsetTypeMapper.php index acee2b2ad3f..ccd6e73be6c 100644 --- a/packages/PHPStanStaticTypeMapper/TypeMapper/HasOffsetTypeMapper.php +++ b/packages/PHPStanStaticTypeMapper/TypeMapper/HasOffsetTypeMapper.php @@ -4,6 +4,7 @@ namespace Rector\PHPStanStaticTypeMapper\TypeMapper; +use PhpParser\Node; use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; @@ -37,7 +38,7 @@ public function mapToPHPStanPhpDocTypeNode(Type $type, TypeKind $typeKind): Type /** * @param HasOffsetType $type */ - public function mapToPhpParserNode(Type $type, TypeKind $typeKind): never + public function mapToPhpParserNode(Type $type, TypeKind $typeKind): ?Node { throw new ShouldNotHappenException(); } diff --git a/rules-tests/TypeDeclaration/Rector/ClassMethod/ReturnNeverTypeRector/Fixture/skip_implements_interface_method.php.inc b/rules-tests/TypeDeclaration/Rector/ClassMethod/ReturnNeverTypeRector/Fixture/skip_implements_interface_method.php.inc new file mode 100644 index 00000000000..63a40e8cd01 --- /dev/null +++ b/rules-tests/TypeDeclaration/Rector/ClassMethod/ReturnNeverTypeRector/Fixture/skip_implements_interface_method.php.inc @@ -0,0 +1,14 @@ + Date: Sun, 5 Dec 2021 00:01:33 +0700 Subject: [PATCH 2/6] Fixed :tada: --- .../ParentClassMethodTypeOverrideGuard.php | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php b/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php index 8efbf047098..01e40efc4a8 100644 --- a/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php +++ b/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php @@ -14,6 +14,7 @@ use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\TypeDeclaration\TypeInferer\ParamTypeInferer; use Symplify\SmartFileSystem\Normalizer\PathNormalizer; +use PHPStan\Type\MixedType; final class ParentClassMethodTypeOverrideGuard { @@ -35,6 +36,13 @@ public function isReturnTypeChangeAllowed(ClassMethod $classMethod): bool return true; } + $variants = $parentClassMethodReflection->getVariants(); + foreach ($variants as $variant) { + if (! $variant->getNativeReturnType() instanceof MixedType) { + return false; + } + } + $classReflection = $parentClassMethodReflection->getDeclaringClass(); $fileName = $classReflection->getFileName(); @@ -95,11 +103,8 @@ private function getParentClassMethod(ClassMethod $classMethod): ?MethodReflecti return null; } - foreach ($classReflection->getAncestors() as $parentClassReflection) { - if ($classReflection === $parentClassReflection) { - continue; - } - + $parentClassReflections = array_merge($classReflection->getParents(), $classReflection->getInterfaces()); + foreach ($parentClassReflections as $parentClassReflection) { if (! $parentClassReflection->hasNativeMethod($methodName)) { continue; } From ddc691cb8e8cf7ff3f6456e4bb74568e97c10088 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sun, 5 Dec 2021 00:07:50 +0700 Subject: [PATCH 3/6] phpstan --- .../VendorLocker/ParentClassMethodTypeOverrideGuard.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php b/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php index 01e40efc4a8..189c3af0674 100644 --- a/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php +++ b/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php @@ -15,6 +15,8 @@ use Rector\TypeDeclaration\TypeInferer\ParamTypeInferer; use Symplify\SmartFileSystem\Normalizer\PathNormalizer; use PHPStan\Type\MixedType; +use PHPStan\Reflection\ParametersAcceptorSelector; +use PHPStan\Reflection\FunctionVariantWithPhpDocs; final class ParentClassMethodTypeOverrideGuard { @@ -37,10 +39,9 @@ public function isReturnTypeChangeAllowed(ClassMethod $classMethod): bool } $variants = $parentClassMethodReflection->getVariants(); - foreach ($variants as $variant) { - if (! $variant->getNativeReturnType() instanceof MixedType) { - return false; - } + $parametersAcceptor = ParametersAcceptorSelector::selectSingle($parentClassMethodReflection->getVariants()); + if ($parametersAcceptor instanceof FunctionVariantWithPhpDocs && ! $parametersAcceptor->getNativeReturnType() instanceof MixedType) { + return false; } $classReflection = $parentClassMethodReflection->getDeclaringClass(); From b90daa843834b007e56dac06a081f547973f5905 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Sat, 4 Dec 2021 17:09:44 +0000 Subject: [PATCH 4/6] [ci-review] Rector Rectify --- .../VendorLocker/ParentClassMethodTypeOverrideGuard.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php b/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php index 189c3af0674..b47e51f7411 100644 --- a/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php +++ b/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php @@ -7,16 +7,16 @@ use PhpParser\Node\Stmt\ClassMethod; use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; +use PHPStan\Reflection\FunctionVariantWithPhpDocs; use PHPStan\Reflection\MethodReflection; +use PHPStan\Reflection\ParametersAcceptorSelector; +use PHPStan\Type\MixedType; use PHPStan\Type\Type; use Rector\Core\PhpParser\AstResolver; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\TypeDeclaration\TypeInferer\ParamTypeInferer; use Symplify\SmartFileSystem\Normalizer\PathNormalizer; -use PHPStan\Type\MixedType; -use PHPStan\Reflection\ParametersAcceptorSelector; -use PHPStan\Reflection\FunctionVariantWithPhpDocs; final class ParentClassMethodTypeOverrideGuard { From 03238320f2928eb0e8e65abf6c5be90b7013ad31 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Sat, 4 Dec 2021 17:13:38 +0000 Subject: [PATCH 5/6] [ci-review] Rector Rectify --- packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php b/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php index b47e51f7411..bc851a1c841 100644 --- a/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php +++ b/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php @@ -38,7 +38,7 @@ public function isReturnTypeChangeAllowed(ClassMethod $classMethod): bool return true; } - $variants = $parentClassMethodReflection->getVariants(); + $parentClassMethodReflection->getVariants(); $parametersAcceptor = ParametersAcceptorSelector::selectSingle($parentClassMethodReflection->getVariants()); if ($parametersAcceptor instanceof FunctionVariantWithPhpDocs && ! $parametersAcceptor->getNativeReturnType() instanceof MixedType) { return false; From 2d7769659c5ca42b35623e687822ffc653272aff Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sun, 5 Dec 2021 00:14:12 +0700 Subject: [PATCH 6/6] final touch: clean up --- packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php b/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php index bc851a1c841..604a74c222c 100644 --- a/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php +++ b/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php @@ -38,7 +38,6 @@ public function isReturnTypeChangeAllowed(ClassMethod $classMethod): bool return true; } - $parentClassMethodReflection->getVariants(); $parametersAcceptor = ParametersAcceptorSelector::selectSingle($parentClassMethodReflection->getVariants()); if ($parametersAcceptor instanceof FunctionVariantWithPhpDocs && ! $parametersAcceptor->getNativeReturnType() instanceof MixedType) { return false;