1616use PHPStan \Type \ObjectType ;
1717use PHPStan \Type \Type ;
1818use Symfony \Component \DependencyInjection \ParameterBag \ParameterBag ;
19+ use function class_exists ;
1920use function in_array ;
2021
2122final class ServiceDynamicReturnTypeExtension implements DynamicMethodReturnTypeExtension
@@ -30,7 +31,10 @@ final class ServiceDynamicReturnTypeExtension implements DynamicMethodReturnType
3031 /** @var ServiceMap */
3132 private $ serviceMap ;
3233
33- /** @var ParameterBag */
34+ /** @var ParameterMap */
35+ private $ parameterMap ;
36+ 37+ /** @var ParameterBag|null */
3438 private $ parameterBag ;
3539
3640 public function __construct (
@@ -43,7 +47,7 @@ public function __construct(
4347 $ this ->className = $ className ;
4448 $ this ->constantHassers = $ configuration ->hasConstantHassers ();
4549 $ this ->serviceMap = $ symfonyServiceMap ;
46- $ this ->parameterBag = $ this -> createParameterBag ( $ symfonyParameterMap) ;
50+ $ this ->parameterMap = $ symfonyParameterMap ;
4751 }
4852
4953 public function getClass (): string
@@ -78,17 +82,46 @@ private function getGetTypeFromMethodCall(
7882 return $ returnType ;
7983 }
8084
85+ $ parameterBag = $ this ->tryGetParameterBag ();
86+ if ($ parameterBag === null ) {
87+ return $ returnType ;
88+ }
89+ 8190 $ serviceId = $ this ->serviceMap ::getServiceIdFromNode ($ methodCall ->getArgs ()[0 ]->value , $ scope );
8291 if ($ serviceId !== null ) {
8392 $ service = $ this ->serviceMap ->getService ($ serviceId );
8493 if ($ service !== null && (!$ service ->isSynthetic () || $ service ->getClass () !== null )) {
85- return new ObjectType ($ this ->determineServiceClass ($ service ) ?? $ serviceId );
94+ return new ObjectType ($ this ->determineServiceClass ($ parameterBag , $ service ) ?? $ serviceId );
8695 }
8796 }
8897
8998 return $ returnType ;
9099 }
91100
101+ private function tryGetParameterBag (): ?ParameterBag
102+ {
103+ if ($ this ->parameterBag !== null ) {
104+ return $ this ->parameterBag ;
105+ }
106+ 107+ return $ this ->parameterBag = $ this ->tryCreateParameterBag ();
108+ }
109+ 110+ private function tryCreateParameterBag (): ?ParameterBag
111+ {
112+ if (!class_exists (ParameterBag::class)) {
113+ return null ;
114+ }
115+ 116+ $ parameters = [];
117+ 118+ foreach ($ this ->parameterMap ->getParameters () as $ parameterDefinition ) {
119+ $ parameters [$ parameterDefinition ->getKey ()] = $ parameterDefinition ->getValue ();
120+ }
121+ 122+ return new ParameterBag ($ parameters );
123+ }
124+ 92125 private function getHasTypeFromMethodCall (
93126 MethodReflection $ methodReflection ,
94127 MethodCall $ methodCall ,
@@ -109,20 +142,9 @@ private function getHasTypeFromMethodCall(
109142 return $ returnType ;
110143 }
111144
112- private function determineServiceClass (ServiceDefinition $ service ): ?string
113- {
114- return $ this ->parameterBag ->resolveValue ($ service ->getClass ());
115- }
116- 117- private function createParameterBag (ParameterMap $ symfonyParameterMap ): ParameterBag
145+ private function determineServiceClass (ParameterBag $ parameterBag , ServiceDefinition $ service ): ?string
118146 {
119- $ parameters = [];
120- 121- foreach ($ symfonyParameterMap ->getParameters () as $ parameterDefinition ) {
122- $ parameters [$ parameterDefinition ->getKey ()] = $ parameterDefinition ->getValue ();
123- }
124- 125- return new ParameterBag ($ parameters );
147+ return $ parameterBag ->resolveValue ($ service ->getClass ());
126148 }
127149
128150}
0 commit comments