44
55namespace Rector \FamilyTree \NodeAnalyzer ;
66
7- use PhpParser \Node ;
8- use PhpParser \Node \Stmt \ClassLike ;
9- use PhpParser \Node \Stmt \ClassMethod ;
107use PHPStan \Reflection \ClassReflection ;
118use PHPStan \Reflection \ParametersAcceptorSelector ;
129use PHPStan \Reflection \Php \PhpMethodReflection ;
1310use PHPStan \Type \MixedType ;
14- use PHPStan \Type \StringType ;
1511use PHPStan \Type \Type ;
16- use Rector \PhpParser \AstResolver ;
1712
1813final readonly class ClassChildAnalyzer
1914{
20- public function __construct (
21- private AstResolver $ astResolver
22- ) {
23- }
24-
2515 /**
2616 * Look both parent class and interface, yes, all PHP interface methods are abstract
2717 */
@@ -52,14 +42,8 @@ public function resolveParentClassMethodReturnType(ClassReflection $classReflect
5242 }
5343
5444 foreach ($ parentClassMethods as $ parentClassMethod ) {
55- // for downgrade purpose on __toString
56- // @see https://3v4l.org/kdcEh#v7.4.33
57- // @see https://github.com/phpstan/phpstan-src/commit/3854cbc5748a7cb51ee0b86ceffe29bd0564bc98
58- if ($ parentClassMethod ->getDeclaringClass ()->isBuiltIn () || $ methodName !== '__toString ' ) {
59- $ nativeReturnType = $ this ->resolveNativeType ($ parentClassMethod );
60- } else {
61- $ nativeReturnType = $ this ->resolveToStringNativeTypeFromAstResolver ($ parentClassMethod );
62- }
45+ $ parametersAcceptor = ParametersAcceptorSelector::combineAcceptors ($ parentClassMethod ->getVariants ());
46+ $ nativeReturnType = $ parametersAcceptor ->getNativeReturnType ();
6347
6448 if (! $ nativeReturnType instanceof MixedType) {
6549 return $ nativeReturnType ;
@@ -69,27 +53,6 @@ public function resolveParentClassMethodReturnType(ClassReflection $classReflect
6953 return new MixedType ();
7054 }
7155
72- private function resolveNativeType (PhpMethodReflection $ phpMethodReflection ): Type
73- {
74- $ extendedParametersAcceptor = ParametersAcceptorSelector::combineAcceptors ($ phpMethodReflection ->getVariants ());
75- return $ extendedParametersAcceptor ->getNativeReturnType ();
76- }
77-
78- private function resolveToStringNativeTypeFromAstResolver (PhpMethodReflection $ phpMethodReflection ): Type
79- {
80- $ classReflection = $ phpMethodReflection ->getDeclaringClass ();
81- $ class = $ this ->astResolver ->resolveClassFromClassReflection ($ classReflection );
82-
83- if ($ class instanceof ClassLike) {
84- $ classMethod = $ class ->getMethod ($ phpMethodReflection ->getName ());
85- if ($ classMethod instanceof ClassMethod && ! $ classMethod ->returnType instanceof Node) {
86- return new MixedType ();
87- }
88- }
89-
90- return new StringType ();
91- }
92-
9356 /**
9457 * @return PhpMethodReflection[]
9558 */
0 commit comments