Skip to content

Commit 8ef80f5

Browse files
committed
Fix for ParameterBag class not present
1 parent 261955f commit 8ef80f5

File tree

1 file changed

+38
-16
lines changed

1 file changed

+38
-16
lines changed

src/Type/Symfony/ServiceDynamicReturnTypeExtension.php

+38-16
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use PHPStan\Type\ObjectType;
1717
use PHPStan\Type\Type;
1818
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
19+
use function class_exists;
1920
use function in_array;
2021

2122
final 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

Comments
 (0)