16
16
use PHPStan \Reflection \ParameterReflection ;
17
17
use PHPStan \Reflection \ParametersAcceptor ;
18
18
use PHPStan \Reflection \Php \DummyParameter ;
19
- use PHPStan \Reflection \ReflectionProvider ;
20
19
use PHPStan \ShouldNotHappenException ;
21
20
use PHPStan \TrinaryLogic ;
22
- use PHPStan \Type \Generic \GenericObjectType ;
23
21
use PHPStan \Type \ObjectType ;
24
22
use PHPStan \Type \StaticType ;
25
23
use PHPStan \Type \Type ;
@@ -35,7 +33,7 @@ final class ModelForwardsCallsExtension implements MethodsClassReflectionExtensi
35
33
/** @var array<string, MethodReflection> */
36
34
private array $ cache = [];
37
35
38
- public function __construct (private BuilderHelper $ builderHelper , private ReflectionProvider $ reflectionProvider , private EloquentBuilderForwardsCallsExtension $ eloquentBuilderForwardsCallsExtension )
36
+ public function __construct (private BuilderHelper $ builderHelper , private EloquentBuilderForwardsCallsExtension $ eloquentBuilderForwardsCallsExtension )
39
37
{
40
38
}
41
39
@@ -80,8 +78,7 @@ private function findMethod(ClassReflection $classReflection, string $methodName
80
78
if (in_array ($ methodName , ['increment ' , 'decrement ' ], true )) {
81
79
$ methodReflection = $ classReflection ->getNativeMethod ($ methodName );
82
80
83
- return new class ($ classReflection , $ methodName , $ methodReflection ) implements MethodReflection
84
- {
81
+ return new class ($ classReflection , $ methodName , $ methodReflection ) implements MethodReflection {
85
82
private ClassReflection $ classReflection ;
86
83
87
84
private string $ methodName ;
@@ -168,17 +165,21 @@ public function hasSideEffects(): TrinaryLogic
168
165
};
169
166
}
170
167
171
- $ builderReflection = $ this ->reflectionProvider ->getClass ($ builderName )->withTypes ([new ObjectType ($ classReflection ->getName ())]);
172
- $ genericBuilderAndModelType = new GenericObjectType ($ builderName , [new ObjectType ($ classReflection ->getName ())]);
168
+ $ builderType = $ this ->builderHelper ->getBuilderTypeForModels ($ classReflection ->getName ());
169
+ $ builderReflection = $ builderType ->getClassReflection ();
170
+
171
+ if ($ builderReflection === null ) {
172
+ return null ;
173
+ }
173
174
174
175
if ($ builderReflection ->hasNativeMethod ($ methodName )) {
175
176
$ reflection = $ builderReflection ->getNativeMethod ($ methodName );
176
177
177
- $ parametersAcceptor = $ this ->transformStaticParameters ($ reflection , $ genericBuilderAndModelType );
178
+ $ parametersAcceptor = $ this ->transformStaticParameters ($ reflection , $ builderType );
178
179
179
- $ returnType = TypeTraverser::map ($ parametersAcceptor ->getReturnType (), static function (Type $ type , callable $ traverse ) use ($ genericBuilderAndModelType ) {
180
+ $ returnType = TypeTraverser::map ($ parametersAcceptor ->getReturnType (), static function (Type $ type , callable $ traverse ) use ($ builderType ) {
180
181
if ($ type instanceof TypeWithClassName && $ type ->getClassName () === Builder::class) {
181
- return $ genericBuilderAndModelType ;
182
+ return $ builderType ;
182
183
}
183
184
184
185
return $ traverse ($ type );
@@ -200,7 +201,7 @@ public function hasSideEffects(): TrinaryLogic
200
201
return null ;
201
202
}
202
203
203
- private function transformStaticParameters (MethodReflection $ method , GenericObjectType $ builder ): ParametersAcceptor
204
+ private function transformStaticParameters (MethodReflection $ method , ObjectType $ builder ): ParametersAcceptor
204
205
{
205
206
$ acceptor = $ method ->getVariants ()[0 ];
206
207
@@ -218,7 +219,7 @@ private function transformStaticParameters(MethodReflection $method, GenericObje
218
219
}, $ acceptor ->getParameters ()), $ acceptor ->isVariadic (), $ this ->transformStaticType ($ acceptor ->getReturnType (), $ builder ));
219
220
}
220
221
221
- private function transformStaticType (Type $ type , GenericObjectType $ builder ): Type
222
+ private function transformStaticType (Type $ type , ObjectType $ builder ): Type
222
223
{
223
224
return TypeTraverser::map ($ type , static function (Type $ type , callable $ traverse ) use ($ builder ): Type {
224
225
if ($ type instanceof StaticType) {
0 commit comments