17
17
use PHPStan \Reflection \ParametersAcceptor ;
18
18
use PHPStan \Reflection \ParametersAcceptorSelector ;
19
19
use PHPStan \Reflection \Php \DummyParameter ;
20
- use PHPStan \Reflection \ReflectionProvider ;
21
20
use PHPStan \ShouldNotHappenException ;
22
21
use PHPStan \TrinaryLogic ;
23
- use PHPStan \Type \Generic \GenericObjectType ;
24
22
use PHPStan \Type \ObjectType ;
25
23
use PHPStan \Type \StaticType ;
26
24
use PHPStan \Type \Type ;
@@ -36,7 +34,7 @@ final class ModelForwardsCallsExtension implements MethodsClassReflectionExtensi
36
34
/** @var array<string, MethodReflection> */
37
35
private array $ cache = [];
38
36
39
- public function __construct (private BuilderHelper $ builderHelper , private ReflectionProvider $ reflectionProvider , private EloquentBuilderForwardsCallsExtension $ eloquentBuilderForwardsCallsExtension )
37
+ public function __construct (private BuilderHelper $ builderHelper , private EloquentBuilderForwardsCallsExtension $ eloquentBuilderForwardsCallsExtension )
40
38
{
41
39
}
42
40
@@ -169,17 +167,21 @@ public function hasSideEffects(): TrinaryLogic
169
167
};
170
168
}
171
169
172
- $ builderReflection = $ this ->reflectionProvider ->getClass ($ builderName )->withTypes ([new ObjectType ($ classReflection ->getName ())]);
173
- $ genericBuilderAndModelType = new GenericObjectType ($ builderName , [new ObjectType ($ classReflection ->getName ())]);
170
+ $ builderType = $ this ->builderHelper ->getBuilderTypeForModels ($ classReflection ->getName ());
171
+ $ builderReflection = $ builderType ->getClassReflection ();
172
+
173
+ if ($ builderReflection === null ) {
174
+ return null ;
175
+ }
174
176
175
177
if ($ builderReflection ->hasNativeMethod ($ methodName )) {
176
178
$ reflection = $ builderReflection ->getNativeMethod ($ methodName );
177
179
178
- $ parametersAcceptor = ParametersAcceptorSelector::selectSingle ($ this ->transformStaticParameters ($ reflection , $ genericBuilderAndModelType ));
180
+ $ parametersAcceptor = ParametersAcceptorSelector::selectSingle ($ this ->transformStaticParameters ($ reflection , $ builderType ));
179
181
180
- $ returnType = TypeTraverser::map ($ parametersAcceptor ->getReturnType (), static function (Type $ type , callable $ traverse ) use ($ genericBuilderAndModelType ) {
182
+ $ returnType = TypeTraverser::map ($ parametersAcceptor ->getReturnType (), static function (Type $ type , callable $ traverse ) use ($ builderType ) {
181
183
if ($ type instanceof TypeWithClassName && $ type ->getClassName () === Builder::class) {
182
- return $ genericBuilderAndModelType ;
184
+ return $ builderType ;
183
185
}
184
186
185
187
return $ traverse ($ type );
@@ -202,7 +204,7 @@ public function hasSideEffects(): TrinaryLogic
202
204
}
203
205
204
206
/** @return ParametersAcceptor[] */
205
- private function transformStaticParameters (MethodReflection $ method , GenericObjectType $ builder ): array
207
+ private function transformStaticParameters (MethodReflection $ method , ObjectType $ builder ): array
206
208
{
207
209
return array_map (function (ParametersAcceptor $ acceptor ) use ($ builder ): ParametersAcceptor {
208
210
return new FunctionVariant ($ acceptor ->getTemplateTypeMap (), $ acceptor ->getResolvedTemplateTypeMap (), array_map (function (
@@ -220,7 +222,7 @@ private function transformStaticParameters(MethodReflection $method, GenericObje
220
222
}, $ method ->getVariants ());
221
223
}
222
224
223
- private function transformStaticType (Type $ type , GenericObjectType $ builder ): Type
225
+ private function transformStaticType (Type $ type , ObjectType $ builder ): Type
224
226
{
225
227
return TypeTraverser::map ($ type , static function (Type $ type , callable $ traverse ) use ($ builder ): Type {
226
228
if ($ type instanceof StaticType) {
0 commit comments