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/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php b/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php index 8efbf047098..604a74c222c 100644 --- a/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php +++ b/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php @@ -7,7 +7,10 @@ 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; @@ -35,6 +38,11 @@ public function isReturnTypeChangeAllowed(ClassMethod $classMethod): bool return true; } + $parametersAcceptor = ParametersAcceptorSelector::selectSingle($parentClassMethodReflection->getVariants()); + if ($parametersAcceptor instanceof FunctionVariantWithPhpDocs && ! $parametersAcceptor->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; } 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 @@ +