44namespace Rector \TypeDeclaration \Rector \ClassMethod ;
55
66use PhpParser \Node ;
7- use PhpParser \Node \Name ;
87use PhpParser \Node \Stmt \Class_ ;
98use PhpParser \Node \Stmt \ClassMethod ;
9+ use PHPStan \Reflection \ClassReflection ;
1010use PHPStan \Type \ArrayType ;
1111use PHPStan \Type \MixedType ;
1212use PHPStan \Type \ObjectType ;
13+ use PHPStan \Type \StaticType ;
1314use PHPStan \Type \Type ;
1415use Rector \Contract \Rector \ConfigurableRectorInterface ;
1516use Rector \Php \PhpVersionProvider ;
1617use Rector \PHPStanStaticTypeMapper \Enum \TypeKind ;
1718use Rector \Rector \AbstractRector ;
19+ use Rector \Reflection \ReflectionResolver ;
1820use Rector \StaticTypeMapper \StaticTypeMapper ;
1921use Rector \StaticTypeMapper \ValueObject \Type \SimpleStaticType ;
2022use Rector \TypeDeclaration \ValueObject \AddReturnTypeDeclaration ;
@@ -40,16 +42,21 @@ final class AddReturnTypeDeclarationRector extends AbstractRector implements Con
4042 * @readonly
4143 */
4244 private StaticTypeMapper $ staticTypeMapper ;
45+ /**
46+ * @readonly
47+ */
48+ private ReflectionResolver $ reflectionResolver ;
4349 /**
4450 * @var AddReturnTypeDeclaration[]
4551 */
4652 private array $ methodReturnTypes = [];
4753 private bool $ hasChanged = \false;
48- public function __construct (PhpVersionProvider $ phpVersionProvider , ParentClassMethodTypeOverrideGuard $ parentClassMethodTypeOverrideGuard , StaticTypeMapper $ staticTypeMapper )
54+ public function __construct (PhpVersionProvider $ phpVersionProvider , ParentClassMethodTypeOverrideGuard $ parentClassMethodTypeOverrideGuard , StaticTypeMapper $ staticTypeMapper, ReflectionResolver $ reflectionResolver )
4955 {
5056 $ this ->phpVersionProvider = $ phpVersionProvider ;
5157 $ this ->parentClassMethodTypeOverrideGuard = $ parentClassMethodTypeOverrideGuard ;
5258 $ this ->staticTypeMapper = $ staticTypeMapper ;
59+ $ this ->reflectionResolver = $ reflectionResolver ;
5360 }
5461 public function getRuleDefinition () : RuleDefinition
5562 {
@@ -123,8 +130,12 @@ private function processClassMethodNodeWithTypehints(ClassMethod $classMethod, C
123130 $ classMethod ->returnType = null ;
124131 return ;
125132 }
126- if ($ newType instanceof SimpleStaticType && $ classMethod ->returnType instanceof Name && $ this ->isName ($ classMethod ->returnType , 'static ' )) {
127- return ;
133+ $ classReflection = $ this ->reflectionResolver ->resolveClassReflection ($ classMethod );
134+ if ($ classMethod ->returnType instanceof Node && $ newType instanceof SimpleStaticType) {
135+ if (!$ classReflection instanceof ClassReflection) {
136+ return ;
137+ }
138+ $ newType = new StaticType ($ classReflection );
128139 }
129140 // already set and sub type or equal → no change
130141 if ($ this ->parentClassMethodTypeOverrideGuard ->shouldSkipReturnTypeChange ($ classMethod , $ newType )) {
0 commit comments