14
14
use PhpParser \Node \Stmt \Class_ ;
15
15
use PhpParser \Node \Stmt \ClassMethod ;
16
16
use PhpParser \Node \Stmt \Interface_ ;
17
+ use PhpParser \Node \Stmt \Trait_ ;
17
18
use PHPStan \Analyser \Scope ;
18
19
use PHPStan \Reflection \ClassReflection ;
19
20
use PHPStan \Reflection \ReflectionProvider ;
@@ -70,16 +71,16 @@ public function getRuleDefinition(): RuleDefinition
70
71
*/
71
72
public function getNodeTypes (): array
72
73
{
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];
74
75
}
75
76
76
77
/**
77
- * @param MethodCall|NullsafeMethodCall|StaticCall|Class_|Interface_ $node
78
+ * @param MethodCall|NullsafeMethodCall|StaticCall|Class_|Interface_|Trait_ $node
78
79
*/
79
80
public function refactor (Node $ node ): ?Node
80
81
{
81
82
$ scope = ScopeFetcher::fetch ($ node );
82
- if ($ node instanceof Class_ || $ node instanceof Interface_) {
83
+ if ($ node instanceof Class_ || $ node instanceof Trait_ || $ node instanceof Interface_) {
83
84
return $ this ->refactorClass ($ node , $ scope );
84
85
}
85
86
@@ -124,7 +125,7 @@ private function shouldSkipClassMethod(
124
125
}
125
126
126
127
private function hasClassNewClassMethod (
127
- Class_ |Interface_ $ classOrInterface ,
128
+ Class_ |Trait_ | Interface_ $ classOrInterface ,
128
129
MethodCallRenameInterface $ methodCallRename
129
130
): bool {
130
131
return (bool ) $ classOrInterface ->getMethod ($ methodCallRename ->getNewMethod ());
@@ -149,12 +150,8 @@ private function shouldKeepForParentInterface(
149
150
);
150
151
}
151
152
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
153
154
{
154
- if (! $ scope ->isInClass ()) {
155
- return null ;
156
- }
157
-
158
155
$ classReflection = $ scope ->getClassReflection ();
159
156
160
157
$ hasChanged = false ;
@@ -194,13 +191,17 @@ private function shouldSkipRename(
194
191
string $ methodName ,
195
192
ClassMethod $ classMethod ,
196
193
MethodCallRenameInterface $ methodCallRename ,
197
- Class_ |Interface_ $ classOrInterface ,
194
+ Class_ |Trait_ | Interface_ $ classOrInterface ,
198
195
?ClassReflection $ classReflection
199
196
): bool {
200
197
if (! $ this ->nodeNameResolver ->isStringName ($ methodName , $ methodCallRename ->getOldMethod ())) {
201
198
return true ;
202
199
}
203
200
201
+ if (!$ classReflection instanceof ClassReflection && $ classOrInterface instanceof Trait_) {
202
+ return $ this ->hasClassNewClassMethod ($ classOrInterface , $ methodCallRename );
203
+ }
204
+
204
205
if (! $ this ->nodeTypeResolver ->isMethodStaticCallOrClassMethodObjectType (
205
206
$ classMethod ,
206
207
$ methodCallRename ->getObjectType ()
0 commit comments