Skip to content

Commit 2385494

Browse files
author
Laytan Laats
committed
extend class-string service id support
1 parent 55628e3 commit 2385494

File tree

3 files changed

+26
-4
lines changed

3 files changed

+26
-4
lines changed

src/Type/ContainerDynamicReturnTypeExtension.php

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44

55
use mglaman\PHPStanDrupal\Drupal\DrupalServiceDefinition;
66
use mglaman\PHPStanDrupal\Drupal\ServiceMap;
7+
use PhpParser\Node;
8+
use PhpParser\Node\Expr\ClassConstFetch;
79
use PhpParser\Node\Expr\MethodCall;
10+
use PhpParser\Node\Name\FullyQualified;
811
use PhpParser\Node\Scalar\String_;
912
use PhpParser\Node\VariadicPlaceholder;
1013
use PHPStan\Analyser\Scope;
@@ -52,13 +55,12 @@ public function getTypeFromMethodCall(
5255
throw new ShouldNotHappenException();
5356
}
5457
$arg1 = $arg1->value;
55-
if (!$arg1 instanceof String_) {
56-
// @todo determine what these types are.
58+
59+
$serviceId = $this->getServiceId($arg1);
60+
if ($serviceId === null) {
5761
return $returnType;
5862
}
5963

60-
$serviceId = $arg1->value;
61-
6264
if ($methodReflection->getName() === 'get') {
6365
$service = $this->serviceMap->getService($serviceId);
6466
if ($service instanceof DrupalServiceDefinition) {
@@ -73,4 +75,18 @@ public function getTypeFromMethodCall(
7375

7476
throw new ShouldNotHappenException();
7577
}
78+
79+
protected function getServiceId(Node $arg1): ?string
80+
{
81+
if ($arg1 instanceof String_) {
82+
// @todo determine what these types are.
83+
return $arg1->value;
84+
}
85+
86+
if ($arg1 instanceof ClassConstFetch && $arg1->class instanceof FullyQualified) {
87+
return (string) $arg1->class;
88+
}
89+
90+
return null;
91+
}
7692
}

tests/src/Type/data/container.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,5 @@ function test(): void {
1818
assertType(MyService::class, $container->get('service_map.concrete_service_with_a_parent_which_has_a_parent'));
1919
assertType(Override::class, $container->get('service_map.concrete_service_overriding_definition_of_its_parent'));
2020
assertType(Concrete::class, $container->get('service_map.concrete_overriding_its_parent_which_has_a_parent'));
21+
assertType(MyService::class, $container->get(MyService::class));
2122
}

tests/src/Type/data/drupal-class-resolver.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,9 @@ function test(): void {
1717
assertType(MyService::class, \Drupal::service('class_resolver')->getInstanceFromDefinition('service_map.my_service'));
1818
assertType(MyService::class, \Drupal::classResolver()->getInstanceFromDefinition('service_map.my_service'));
1919
assertType(MyService::class, \Drupal::classResolver('service_map.my_service'));
20+
21+
assertType(MyService::class, (new ClassResolver())->getInstanceFromDefinition(MyService::class));
22+
assertType(MyService::class, \Drupal::service('class_resolver')->getInstanceFromDefinition(MyService::class));
23+
assertType(MyService::class, \Drupal::classResolver()->getInstanceFromDefinition(MyService::class));
24+
assertType(MyService::class, \Drupal::classResolver(MyService::class));
2025
}

0 commit comments

Comments
 (0)