diff --git a/composer.json b/composer.json index dc21a469..f92f4431 100644 --- a/composer.json +++ b/composer.json @@ -47,7 +47,8 @@ }, "classmap": [ "tests/src/Type/data", - "tests/src/Rules/data" + "tests/src/Rules/data", + "tests/src/Generics/data" ] }, "extra": { diff --git a/phpstan.neon b/phpstan.neon index 24f9b845..4230bd42 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -12,6 +12,7 @@ parameters: - tests/src excludePaths: - tests/src/data/*.php + - tests/src/Generics/data/*.php - tests/src/Type/data/*.php - tests/src/Rules/data/*.php - tests/src/DeprecatedScope/data/*.php diff --git a/stubs/Drupal/Component/Plugin/DependentPluginInterface.stub b/stubs/Drupal/Component/Plugin/DependentPluginInterface.stub new file mode 100644 index 00000000..b8ef9160 --- /dev/null +++ b/stubs/Drupal/Component/Plugin/DependentPluginInterface.stub @@ -0,0 +1,7 @@ +> + * @implements EntityReferenceFieldItemListInterface + */ +class EntityReferenceFieldItemList extends FieldItemList implements EntityReferenceFieldItemListInterface { + +} \ No newline at end of file diff --git a/stubs/Drupal/Core/Field/FieldItemList.stub b/stubs/Drupal/Core/Field/FieldItemList.stub index 8545f092..be75341c 100644 --- a/stubs/Drupal/Core/Field/FieldItemList.stub +++ b/stubs/Drupal/Core/Field/FieldItemList.stub @@ -5,16 +5,15 @@ namespace Drupal\Core\Field; use Drupal\Core\TypedData\Plugin\DataType\ItemList; /** - * @template T of \Drupal\Core\Field\FieldItemInterface + * @template T of FieldItemInterface * @extends ItemList * @implements FieldItemListInterface */ class FieldItemList extends ItemList implements FieldItemListInterface { /** - * @return \Drupal\Core\Field\FieldItemInterface + * @return T */ - protected function createItem(int $offset = 0, ?mixed $value = NULL): \Drupal\Core\Field\FieldItemInterface { - } + protected function createItem(int $offset = 0, mixed $value = NULL): FieldItemInterface {} } diff --git a/stubs/Drupal/Core/Field/FormatterBase.stub b/stubs/Drupal/Core/Field/FormatterBase.stub new file mode 100644 index 00000000..bf2965db --- /dev/null +++ b/stubs/Drupal/Core/Field/FormatterBase.stub @@ -0,0 +1,34 @@ + + */ +abstract class FormatterBase extends PluginSettingsBase implements FormatterInterface, ContainerFactoryPluginInterface { + + /** + * @param array $entities_items + */ + public function prepareView(array $entities_items): void {} + + /** + * @param T $items + * @param string|null $langcode + * + * @return array + */ + public function view(FieldItemListInterface $items, $langcode = NULL) {} + + /** + * @param T $items + * @param string $langcode + * + * @return array> + */ + public function viewElements(FieldItemListInterface $items, $langcode) {} + +} diff --git a/stubs/Drupal/Core/Field/FormatterInterface.stub b/stubs/Drupal/Core/Field/FormatterInterface.stub new file mode 100644 index 00000000..ae8efa55 --- /dev/null +++ b/stubs/Drupal/Core/Field/FormatterInterface.stub @@ -0,0 +1,31 @@ + $entities_items + */ + public function prepareView(array $entities_items): void; + + /** + * @param T $items + * @param string|null $langcode + * + * @return array + */ + public function view(FieldItemListInterface $items, $langcode = NULL); + + /** + * @param T $items + * @param string $langcode + * + * @return array> + */ + public function viewElements(FieldItemListInterface $items, $langcode); + +} diff --git a/stubs/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceFormatterBase.stub b/stubs/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceFormatterBase.stub new file mode 100644 index 00000000..2c482dad --- /dev/null +++ b/stubs/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceFormatterBase.stub @@ -0,0 +1,37 @@ +> + */ +abstract class EntityReferenceFormatterBase extends FormatterBase { + + /** + * @param array> $entities_items + */ + public function prepareView(array $entities_items): void {} + + /** + * @param EntityReferenceFieldItemList $items + * @param string|null $langcode + * + * @return array + */ + public function view(FieldItemListInterface $items, $langcode = NULL) {} + + /** + * @param EntityReferenceFieldItemList $items + * @param string $langcode + * + * @return array> + */ + public function viewElements(FieldItemListInterface $items, $langcode) {} + +} \ No newline at end of file diff --git a/stubs/Drupal/Core/Field/PluginSettingsBase.stub b/stubs/Drupal/Core/Field/PluginSettingsBase.stub new file mode 100644 index 00000000..e3d3d778 --- /dev/null +++ b/stubs/Drupal/Core/Field/PluginSettingsBase.stub @@ -0,0 +1,10 @@ +assertFileAsserts($assertType, $file, ...$args); + } +} diff --git a/tests/src/Generics/EntityReferenceFormatterBaseGenericTest.php b/tests/src/Generics/EntityReferenceFormatterBaseGenericTest.php new file mode 100644 index 00000000..d39aba3f --- /dev/null +++ b/tests/src/Generics/EntityReferenceFormatterBaseGenericTest.php @@ -0,0 +1,33 @@ +assertFileAsserts($assertType, $file, ...$args); + } +} diff --git a/tests/src/Generics/EntityReferenceItemGenericTest.php b/tests/src/Generics/EntityReferenceItemGenericTest.php new file mode 100644 index 00000000..964a5b99 --- /dev/null +++ b/tests/src/Generics/EntityReferenceItemGenericTest.php @@ -0,0 +1,33 @@ +assertFileAsserts($assertType, $file, ...$args); + } +} diff --git a/tests/src/Generics/FormatterBaseGenericTest.php b/tests/src/Generics/FormatterBaseGenericTest.php new file mode 100644 index 00000000..1536bf9f --- /dev/null +++ b/tests/src/Generics/FormatterBaseGenericTest.php @@ -0,0 +1,33 @@ +assertFileAsserts($assertType, $file, ...$args); + } +} diff --git a/tests/src/Generics/FormatterInterfaceGenericTest.php b/tests/src/Generics/FormatterInterfaceGenericTest.php new file mode 100644 index 00000000..2e5dacb6 --- /dev/null +++ b/tests/src/Generics/FormatterInterfaceGenericTest.php @@ -0,0 +1,33 @@ +assertFileAsserts($assertType, $file, ...$args); + } +} diff --git a/tests/src/Generics/data/entity-reference-field-item-list.php b/tests/src/Generics/data/entity-reference-field-item-list.php new file mode 100644 index 00000000..bc3bb0ee --- /dev/null +++ b/tests/src/Generics/data/entity-reference-field-item-list.php @@ -0,0 +1,59 @@ +|null', $items->first()); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem|null', $items->get(0)); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem', $item); + } + assertType('array', $items->referencedEntities()); + foreach ($items->referencedEntities() as $entity) { + assertType('Drupal\Core\Entity\EntityInterface', $entity); + } +} + +/** + * @param EntityReferenceFieldItemList $items + */ +function phpDocOverride(EntityReferenceFieldItemList $items): void { + assertType('Drupal\Core\Field\EntityReferenceFieldItemList', $items); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem|null', $items->first()); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem|null', $items->get(0)); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem', $item); + } + assertType('array', $items->referencedEntities()); + foreach ($items->referencedEntities() as $entity) { + assertType('Drupal\node\NodeInterface', $entity); + } +} + +/** + * @extends EntityReferenceFieldItemList + */ +class ExtendedEntityReferenceFieldItemList extends EntityReferenceFieldItemList {} + +function extendedItemList(ExtendedEntityReferenceFieldItemList $items): void { + assertType('DrupalEntityReferenceFieldItemListGeneric\ExtendedEntityReferenceFieldItemList', $items); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem|null', $items->first()); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem|null', $items->get(0)); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem', $item); + assertType('Drupal\node\NodeInterface|null', $item->entity); + assertType('int|string|null', $item->target_id); + } + assertType('array', $items->referencedEntities()); + foreach ($items->referencedEntities() as $entity) { + assertType('Drupal\node\NodeInterface', $entity); + } +} diff --git a/tests/src/Generics/data/entity-reference-formatter-base.php b/tests/src/Generics/data/entity-reference-formatter-base.php new file mode 100644 index 00000000..6068e69f --- /dev/null +++ b/tests/src/Generics/data/entity-reference-formatter-base.php @@ -0,0 +1,47 @@ +>', $entities_items); + $items = $entities_items[0]; + assertType('Drupal\Core\Field\EntityReferenceFieldItemList', $items); + } + + public function view(FieldItemListInterface $items, $langcode = NULL) { + assertType('Drupal\Core\Field\EntityReferenceFieldItemList', $items); + } + + public function viewElements(FieldItemListInterface $items, $langcode) { + assertType('Drupal\Core\Field\EntityReferenceFieldItemList', $items); + } + +} + +/** + * @extends EntityReferenceFormatterBase + */ +class SpecifiedEntityTypeEntityReferenceFormatterBase extends EntityReferenceFormatterBase { + + public function prepareView(array $entities_items): void { + assertType('array>', $entities_items); + $items = $entities_items[0]; + assertType('Drupal\Core\Field\EntityReferenceFieldItemList', $items); + } + + public function view(FieldItemListInterface $items, $langcode = NULL) { + assertType('Drupal\Core\Field\EntityReferenceFieldItemList', $items); + } + + public function viewElements(FieldItemListInterface $items, $langcode) { + assertType('Drupal\Core\Field\EntityReferenceFieldItemList', $items); + } + +} diff --git a/tests/src/Generics/data/entity-reference-item.php b/tests/src/Generics/data/entity-reference-item.php new file mode 100644 index 00000000..b3f49dff --- /dev/null +++ b/tests/src/Generics/data/entity-reference-item.php @@ -0,0 +1,33 @@ +entity); + assertType('int|string|null', $item->target_id); +} + +/** + * @param EntityReferenceItem $item + */ +function phpDocOverride(EntityReferenceItem $item): void { + assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem', $item); + assertType('Drupal\node\NodeInterface|null', $item->entity); + assertType('int|string|null', $item->target_id); +} + +/** + * @extends EntityReferenceItem + */ +class ExtendedEntityReferenceItem extends EntityReferenceItem {} + +function extendedItem(ExtendedEntityReferenceItem $item): void { + assertType('DrupalEntityReferenceItemGeneric\ExtendedEntityReferenceItem', $item); + assertType('Drupal\node\NodeInterface|null', $item->entity); + assertType('int|string|null', $item->target_id); +} diff --git a/tests/src/Generics/data/formatter-base.php b/tests/src/Generics/data/formatter-base.php new file mode 100644 index 00000000..f1eb7102 --- /dev/null +++ b/tests/src/Generics/data/formatter-base.php @@ -0,0 +1,95 @@ +. + * + * @implements FieldItemListInterface + */ +class BooleanFieldItemList implements FieldItemListInterface {} + +/** + * @extends FormatterBase + */ +class ExtendsBooleanItemFormatter extends FormatterBase { + + public function prepareView(array $entities_items): void { + assertType('array', $entities_items); + $items = $entities_items[0]; + assertType('DrupalFormatterBaseGeneric\BooleanFieldItemList', $items); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|null', $items->first()); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|null', $items->get(0)); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem', $item); + } + } + + public function view(FieldItemListInterface $items, $langcode = NULL) { + assertType('DrupalFormatterBaseGeneric\BooleanFieldItemList', $items); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|null', $items->first()); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|null', $items->get(0)); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem', $item); + } + } + + public function viewElements(FieldItemListInterface $items, $langcode) { + assertType('DrupalFormatterBaseGeneric\BooleanFieldItemList', $items); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|null', $items->first()); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|null', $items->get(0)); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem', $item); + } + } + +} + +/** + * @extends FormatterBase> + */ +class ExtendedDeepFormatter extends FormatterBase { + + public function prepareView(array $entities_items): void { + assertType('array>', $entities_items); + $items = $entities_items[0]; + assertType('Drupal\Core\Field\FieldItemList', $items); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->first()); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->get(0)); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem', $item); + } + } + + public function view(FieldItemListInterface $items, $langcode = NULL) { + assertType('Drupal\Core\Field\FieldItemList', $items); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->first()); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->get(0)); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem', $item); + } + } + + public function viewElements(FieldItemListInterface $items, $langcode) { + assertType('Drupal\Core\Field\FieldItemList', $items); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->first()); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->get(0)); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem', $item); + } + } + +} diff --git a/tests/src/Generics/data/formatter-interface.php b/tests/src/Generics/data/formatter-interface.php new file mode 100644 index 00000000..086c265b --- /dev/null +++ b/tests/src/Generics/data/formatter-interface.php @@ -0,0 +1,220 @@ +', $entities_items); + $items = $entities_items[0]; + assertType('Drupal\Core\Field\FieldItemListInterface', $items); + assertType('Drupal\Core\TypedData\TypedDataInterface|null', $items->first()); + assertType('Drupal\Core\TypedData\TypedDataInterface|null', $items->get(0)); + assertType('Drupal\Core\TypedData\TypedDataInterface|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('mixed', $item); + } + } + + public function view(FieldItemListInterface $items, $langcode = NULL) { + assertType('Drupal\Core\Field\FieldItemListInterface', $items); + assertType('Drupal\Core\TypedData\TypedDataInterface|null', $items->first()); + assertType('Drupal\Core\TypedData\TypedDataInterface|null', $items->get(0)); + assertType('Drupal\Core\TypedData\TypedDataInterface|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('mixed', $item); + } + } + + public function viewElements(FieldItemListInterface $items, $langcode) { + assertType('Drupal\Core\Field\FieldItemListInterface', $items); + assertType('Drupal\Core\TypedData\TypedDataInterface|null', $items->first()); + assertType('Drupal\Core\TypedData\TypedDataInterface|null', $items->get(0)); + assertType('Drupal\Core\TypedData\TypedDataInterface|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('mixed', $item); + } + } + +} + +/** + * Tests the class which provides TFieldItemList data to generic. + * + * @implements FormatterInterface + */ +class FieldItemListFormatter implements FormatterInterface { + + public function prepareView(array $entities_items): void { + assertType('array', $entities_items); + $items = $entities_items[0]; + assertType('Drupal\Core\Field\FieldItemList', $items); + assertType('Drupal\Core\Field\FieldItemInterface|null', $items->first()); + assertType('Drupal\Core\Field\FieldItemInterface|null', $items->get(0)); + assertType('Drupal\Core\Field\FieldItemInterface|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('Drupal\Core\Field\FieldItemInterface', $item); + } + } + + public function view(FieldItemListInterface $items, $langcode = NULL) { + assertType('Drupal\Core\Field\FieldItemList', $items); + assertType('Drupal\Core\Field\FieldItemInterface|null', $items->first()); + assertType('Drupal\Core\Field\FieldItemInterface|null', $items->get(0)); + assertType('Drupal\Core\Field\FieldItemInterface|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('Drupal\Core\Field\FieldItemInterface', $item); + } + } + + public function viewElements(FieldItemListInterface $items, $langcode) { + assertType('Drupal\Core\Field\FieldItemList', $items); + assertType('Drupal\Core\Field\FieldItemInterface|null', $items->first()); + assertType('Drupal\Core\Field\FieldItemInterface|null', $items->get(0)); + assertType('Drupal\Core\Field\FieldItemInterface|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('Drupal\Core\Field\FieldItemInterface', $item); + } + } + +} + +/** + * Tests hierarchical generics. + * + * Provides TFieldItemList data to generic with specifying FieldItemList. + * + * @implements FormatterInterface> + */ +class StringItemFormatter implements FormatterInterface { + + public function prepareView(array $entities_items): void { + assertType('array>', $entities_items); + $items = $entities_items[0]; + assertType('Drupal\Core\Field\FieldItemList', $items); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->first()); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->get(0)); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem', $item); + } + } + + public function view(FieldItemListInterface $items, $langcode = NULL) { + assertType('Drupal\Core\Field\FieldItemList', $items); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->first()); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->get(0)); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem', $item); + } + } + + public function viewElements(FieldItemListInterface $items, $langcode) { + assertType('Drupal\Core\Field\FieldItemList', $items); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->first()); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->get(0)); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem', $item); + } + } + +} + +/** + * Tests providing union types with hierarchical generics. + * + * @implements FormatterInterface> + */ +class UnionTypeFormatter implements FormatterInterface { + + public function prepareView(array $entities_items): void { + assertType('array>', $entities_items); + $items = $entities_items[0]; + assertType('Drupal\Core\Field\FieldItemList', $items); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->first()); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->get(0)); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|Drupal\Core\Field\Plugin\Field\FieldType\StringItem', $item); + } + } + + public function view(FieldItemListInterface $items, $langcode = NULL) { + assertType('Drupal\Core\Field\FieldItemList', $items); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->first()); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->get(0)); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|Drupal\Core\Field\Plugin\Field\FieldType\StringItem', $item); + } + } + + public function viewElements(FieldItemListInterface $items, $langcode) { + assertType('Drupal\Core\Field\FieldItemList', $items); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->first()); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->get(0)); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|Drupal\Core\Field\Plugin\Field\FieldType\StringItem', $item); + } + } + +} + +/** + * Provides a custom field item list with concrete FieldItemListInterface. + * + * @implements FieldItemListInterface + */ +class BooleanFieldItemList implements FieldItemListInterface {} + +/** + * @implements FormatterInterface + */ +class BooleanItemFormatter implements FormatterInterface { + + public function prepareView(array $entities_items): void { + assertType('array', $entities_items); + $items = $entities_items[0]; + assertType('DrupalFormatterInterfaceGeneric\BooleanFieldItemList', $items); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|null', $items->first()); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|null', $items->get(0)); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem', $item); + } + } + + public function view(FieldItemListInterface $items, $langcode = NULL) { + assertType('DrupalFormatterInterfaceGeneric\BooleanFieldItemList', $items); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|null', $items->first()); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|null', $items->get(0)); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem', $item); + } + } + + public function viewElements(FieldItemListInterface $items, $langcode) { + assertType('DrupalFormatterInterfaceGeneric\BooleanFieldItemList', $items); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|null', $items->first()); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|null', $items->get(0)); + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem|null', $items->offsetGet(0)); + foreach ($items as $item) { + assertType('Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem', $item); + } + } + +}