1414use PhpParser \Node \Stmt \Class_ ;
1515use PhpParser \Node \Stmt \ClassMethod ;
1616use PhpParser \Node \Stmt \Interface_ ;
17+ use PhpParser \Node \Stmt \Trait_ ;
1718use PHPStan \Analyser \Scope ;
1819use PHPStan \Reflection \ClassReflection ;
1920use PHPStan \Reflection \ReflectionProvider ;
@@ -70,16 +71,16 @@ public function getRuleDefinition(): RuleDefinition
7071 */
7172 public function getNodeTypes (): array
7273 {
73- return [MethodCall::class, NullsafeMethodCall::class, StaticCall::class, Class_::class, Interface_::class];
74+ return [MethodCall::class, NullsafeMethodCall::class, StaticCall::class, Class_::class, Trait_::class, Interface_::class];
7475 }
7576
7677 /**
77- * @param MethodCall|NullsafeMethodCall|StaticCall|Class_|Interface_ $node
78+ * @param MethodCall|NullsafeMethodCall|StaticCall|Class_|Interface_|Trait_ $node
7879 */
7980 public function refactor (Node $ node ): ?Node
8081 {
8182 $ scope = ScopeFetcher::fetch ($ node );
82- if ($ node instanceof Class_ || $ node instanceof Interface_) {
83+ if ($ node instanceof Class_ || $ node instanceof Trait_ || $ node instanceof Interface_) {
8384 return $ this ->refactorClass ($ node , $ scope );
8485 }
8586
@@ -124,7 +125,7 @@ private function shouldSkipClassMethod(
124125 }
125126
126127 private function hasClassNewClassMethod (
127- Class_ |Interface_ $ classOrInterface ,
128+ Class_ |Trait_ | Interface_ $ classOrInterface ,
128129 MethodCallRenameInterface $ methodCallRename
129130 ): bool {
130131 return (bool ) $ classOrInterface ->getMethod ($ methodCallRename ->getNewMethod ());
@@ -149,12 +150,8 @@ private function shouldKeepForParentInterface(
149150 );
150151 }
151152
152- private function refactorClass (Class_ |Interface_ $ classOrInterface , Scope $ scope ): Class_ |Interface_ |null
153+ private function refactorClass (Class_ |Trait_ | Interface_ $ classOrInterface , Scope $ scope ): Class_ | Trait_ |Interface_ |null
153154 {
154- if (! $ scope ->isInClass ()) {
155- return null ;
156- }
157-
158155 $ classReflection = $ scope ->getClassReflection ();
159156
160157 $ hasChanged = false ;
@@ -194,13 +191,17 @@ private function shouldSkipRename(
194191 string $ methodName ,
195192 ClassMethod $ classMethod ,
196193 MethodCallRenameInterface $ methodCallRename ,
197- Class_ |Interface_ $ classOrInterface ,
194+ Class_ |Trait_ | Interface_ $ classOrInterface ,
198195 ?ClassReflection $ classReflection
199196 ): bool {
200197 if (! $ this ->nodeNameResolver ->isStringName ($ methodName , $ methodCallRename ->getOldMethod ())) {
201198 return true ;
202199 }
203200
201+ if (!$ classReflection instanceof ClassReflection && $ classOrInterface instanceof Trait_) {
202+ return $ this ->hasClassNewClassMethod ($ classOrInterface , $ methodCallRename );
203+ }
204+
204205 if (! $ this ->nodeTypeResolver ->isMethodStaticCallOrClassMethodObjectType (
205206 $ classMethod ,
206207 $ methodCallRename ->getObjectType ()
0 commit comments