Skip to content

Commit b7039ae

Browse files
authored
Use TypeCombinator::union() to combine decorated service classes. (#620)
* Can not Union a UnionType. * Refactor tests to only validate decorators are present. * Use array unpacking notation.
1 parent 0c7e48a commit b7039ae

File tree

2 files changed

+15
-11
lines changed

2 files changed

+15
-11
lines changed

src/Drupal/DrupalServiceDefinition.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use PHPStan\Type\ObjectType;
66
use PHPStan\Type\StringType;
77
use PHPStan\Type\Type;
8-
use PHPStan\Type\UnionType;
8+
use PHPStan\Type\TypeCombinator;
99

1010
class DrupalServiceDefinition
1111
{
@@ -122,7 +122,7 @@ public function getType(): Type
122122
foreach ($decorating_services as $service_id => $service_definition) {
123123
$combined_services[] = $service_definition->getType();
124124
}
125-
return new UnionType($combined_services);
125+
return TypeCombinator::union(...$combined_services);
126126
}
127127
return new ObjectType($this->getClass() ?? $this->id);
128128
}

tests/src/ServiceMapFactoryTest.php

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
use Drupal\Core\Logger\LoggerChannel;
66
use mglaman\PHPStanDrupal\Drupal\DrupalServiceDefinition;
77
use mglaman\PHPStanDrupal\Drupal\ServiceMap;
8-
use PHPStan\Type\ObjectType;
9-
use PHPStan\Type\UnionType;
108
use PHPUnit\Framework\TestCase;
119

1210
final class ServiceMapFactoryTest extends TestCase
@@ -16,7 +14,9 @@ final class ServiceMapFactoryTest extends TestCase
1614
* @dataProvider getServiceProvider
1715
*
1816
* @covers \mglaman\PHPStanDrupal\Drupal\DrupalServiceDefinition::__construct
17+
* @covers \mglaman\PHPStanDrupal\Drupal\DrupalServiceDefinition::addDecorator
1918
* @covers \mglaman\PHPStanDrupal\Drupal\DrupalServiceDefinition::getClass
19+
* @covers \mglaman\PHPStanDrupal\Drupal\DrupalServiceDefinition::getDecorators
2020
* @covers \mglaman\PHPStanDrupal\Drupal\DrupalServiceDefinition::isPublic
2121
* @covers \mglaman\PHPStanDrupal\Drupal\DrupalServiceDefinition::getAlias
2222
* @covers \mglaman\PHPStanDrupal\Drupal\DrupalServiceDefinition::getId
@@ -103,7 +103,11 @@ public function testFactory(string $id, callable $validator): void
103103
'service_map.deocrating_base' => [
104104
'decorates' => 'service_map.base_to_be_decorated',
105105
'class' => 'Drupal\service_map\SecondBase',
106-
]
106+
],
107+
'service_map.decorates_decorating_base' => [
108+
'decorates' => 'service_map.deocrating_base',
109+
'class' => 'Drupal\service_map\Override',
110+
],
107111
]);
108112
$validator($service->getService($id));
109113
}
@@ -225,12 +229,12 @@ function (DrupalServiceDefinition $service): void {
225229
yield [
226230
'service_map.base_to_be_decorated',
227231
function (DrupalServiceDefinition $service): void {
228-
$combined_class = [
229-
new ObjectType('Drupal\service_map\Base'),
230-
new ObjectType('Drupal\service_map\SecondBase')
231-
];
232-
$expected_class = new UnionType($combined_class);
233-
self::assertEquals($expected_class, $service->getType());
232+
$decorators = $service->getDecorators();
233+
self::assertCount(1, $decorators);
234+
self::assertArrayHasKey('service_map.deocrating_base', $decorators);
235+
$child_decorators = $decorators['service_map.deocrating_base']->getDecorators();
236+
self::assertCount(1, $child_decorators);
237+
self::assertArrayHasKey('service_map.decorates_decorating_base', $child_decorators);
234238
}
235239
];
236240
}

0 commit comments

Comments
 (0)