diff --git a/src/Type/DrupalClassResolverReturnType.php b/src/Type/DrupalClassResolverReturnType.php index 258b1c76..f3574bf9 100644 --- a/src/Type/DrupalClassResolverReturnType.php +++ b/src/Type/DrupalClassResolverReturnType.php @@ -25,6 +25,12 @@ public static function getType( ): Type { $arg1 = $scope->getType($methodCall->getArgs()[0]->value); if (count($arg1->getConstantStrings()) === 0) { + // Handle class-string typed variables + $classStringObjectType = $arg1->getClassStringObjectType(); + if (count($classStringObjectType->getObjectClassNames()) > 0) { + return $classStringObjectType; + } + return ParametersAcceptorSelector::selectFromArgs( $scope, $methodCall->getArgs(), diff --git a/tests/src/Type/data/drupal-class-resolver.php b/tests/src/Type/data/drupal-class-resolver.php index a85ba2f2..289bb2c0 100644 --- a/tests/src/Type/data/drupal-class-resolver.php +++ b/tests/src/Type/data/drupal-class-resolver.php @@ -8,6 +8,22 @@ class Foo {} +function test_class_string_vars(): void { + /** @var class-string $fooClass */ + $fooClass = Foo::class; + assertType(Foo::class, (new ClassResolver())->getInstanceFromDefinition($fooClass)); + assertType(Foo::class, \Drupal::service('class_resolver')->getInstanceFromDefinition($fooClass)); + assertType(Foo::class, \Drupal::classResolver()->getInstanceFromDefinition($fooClass)); + assertType(Foo::class, \Drupal::classResolver($fooClass)); + + /** @var class-string $serviceClass */ + $serviceClass = MyService::class; + assertType(MyService::class, (new ClassResolver())->getInstanceFromDefinition($serviceClass)); + assertType(MyService::class, \Drupal::service('class_resolver')->getInstanceFromDefinition($serviceClass)); + assertType(MyService::class, \Drupal::classResolver()->getInstanceFromDefinition($serviceClass)); + assertType(MyService::class, \Drupal::classResolver($serviceClass)); +} + function test(): void { assertType(Foo::class, (new ClassResolver())->getInstanceFromDefinition(Foo::class)); assertType(Foo::class, \Drupal::service('class_resolver')->getInstanceFromDefinition(Foo::class));