From 197fc07824daee2ed097cfb38a1fdfd47afaea62 Mon Sep 17 00:00:00 2001 From: Niklan Date: Sat, 29 Mar 2025 13:50:38 +0500 Subject: [PATCH 01/19] Make FormatterInterface stub generic --- stubs/Drupal/Core/Field/FormatterInterface.stub | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/stubs/Drupal/Core/Field/FormatterInterface.stub b/stubs/Drupal/Core/Field/FormatterInterface.stub index b5d4909a..aae68af4 100644 --- a/stubs/Drupal/Core/Field/FormatterInterface.stub +++ b/stubs/Drupal/Core/Field/FormatterInterface.stub @@ -2,14 +2,25 @@ namespace Drupal\Core\Field; +/** + * @template TFieldItemList of \Drupal\Core\Field\FieldItemListInterface + */ interface FormatterInterface { /** - * @param \Drupal\Core\Field\FieldItemListInterface<\Drupal\Core\Field\FieldItemInterface> $items + * @param TFieldItemList $items * @param string $langcode * * @return array> */ public function viewElements(FieldItemListInterface $items, $langcode): array; + /** + * @param TFieldItemList $items + * @param string $langcode + * + * @return array + */ + public function view(FieldItemListInterface $items, $langcode = NULL); + } From eaf48f47336da2e9302f78119bcb9a9b25154f1e Mon Sep 17 00:00:00 2001 From: Niklan Date: Sat, 29 Mar 2025 14:40:10 +0500 Subject: [PATCH 02/19] Add FormatterBase stub/generic --- stubs/Drupal/Core/Field/FormatterBase.stub | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 stubs/Drupal/Core/Field/FormatterBase.stub diff --git a/stubs/Drupal/Core/Field/FormatterBase.stub b/stubs/Drupal/Core/Field/FormatterBase.stub new file mode 100644 index 00000000..9cc69cb0 --- /dev/null +++ b/stubs/Drupal/Core/Field/FormatterBase.stub @@ -0,0 +1,15 @@ + + */ +abstract class FormatterBase extends PluginSettingsBase implements FormatterInterface, ContainerFactoryPluginInterface { + +} From 4788f2066b1f2fcd44a7e6044793d0cf9bbe3bda Mon Sep 17 00:00:00 2001 From: Niklan Date: Sun, 30 Mar 2025 12:28:00 +0500 Subject: [PATCH 03/19] Add required stubs --- .../Component/Plugin/DependentPluginInterface.stub | 7 +++++++ .../Plugin/DerivativeInspectionInterface.stub | 7 +++++++ stubs/Drupal/Component/Plugin/PluginBase.stub | 7 +++++++ stubs/Drupal/Core/Field/PluginSettingsBase.stub | 10 ++++++++++ stubs/Drupal/Core/Field/PluginSettingsInterface.stub | 10 ++++++++++ .../Core/Plugin/ContainerFactoryPluginInterface.stub | 7 +++++++ stubs/Drupal/Core/Plugin/PluginBase.stub | 9 +++++++++ 7 files changed, 57 insertions(+) create mode 100644 stubs/Drupal/Component/Plugin/DependentPluginInterface.stub create mode 100644 stubs/Drupal/Component/Plugin/DerivativeInspectionInterface.stub create mode 100644 stubs/Drupal/Component/Plugin/PluginBase.stub create mode 100644 stubs/Drupal/Core/Field/PluginSettingsBase.stub create mode 100644 stubs/Drupal/Core/Field/PluginSettingsInterface.stub create mode 100644 stubs/Drupal/Core/Plugin/ContainerFactoryPluginInterface.stub create mode 100644 stubs/Drupal/Core/Plugin/PluginBase.stub 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 @@ + Date: Sun, 30 Mar 2025 12:40:08 +0500 Subject: [PATCH 04/19] Remove unused use --- stubs/Drupal/Core/Field/FormatterBase.stub | 2 -- 1 file changed, 2 deletions(-) diff --git a/stubs/Drupal/Core/Field/FormatterBase.stub b/stubs/Drupal/Core/Field/FormatterBase.stub index 9cc69cb0..86ccc987 100644 --- a/stubs/Drupal/Core/Field/FormatterBase.stub +++ b/stubs/Drupal/Core/Field/FormatterBase.stub @@ -3,8 +3,6 @@ namespace Drupal\Core\Field; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; -use Drupal\Core\Field\FormatterInterface; -use Drupal\Core\Field\PluginSettingsBase; /** * @template TFieldItemList of \Drupal\Core\Field\FieldItemListInterface From 3b11f51c15d06170147a138709b8ba0fc7d97c4f Mon Sep 17 00:00:00 2001 From: Matt Glaman Date: Thu, 3 Apr 2025 15:53:46 -0500 Subject: [PATCH 05/19] revise and pass T to FieldItemListInterface --- stubs/Drupal/Core/Field/FormatterBase.stub | 13 - .../Drupal/Core/Field/FormatterInterface.stub | 26 +- tests/src/Type/FormatterInterfaceStubTest.php | 33 +++ tests/src/Type/data/formatter-interface.php | 237 ++++++++++++++++++ 4 files changed, 286 insertions(+), 23 deletions(-) delete mode 100644 stubs/Drupal/Core/Field/FormatterBase.stub create mode 100644 tests/src/Type/FormatterInterfaceStubTest.php create mode 100644 tests/src/Type/data/formatter-interface.php diff --git a/stubs/Drupal/Core/Field/FormatterBase.stub b/stubs/Drupal/Core/Field/FormatterBase.stub deleted file mode 100644 index 86ccc987..00000000 --- a/stubs/Drupal/Core/Field/FormatterBase.stub +++ /dev/null @@ -1,13 +0,0 @@ - - */ -abstract class FormatterBase extends PluginSettingsBase implements FormatterInterface, ContainerFactoryPluginInterface { - -} diff --git a/stubs/Drupal/Core/Field/FormatterInterface.stub b/stubs/Drupal/Core/Field/FormatterInterface.stub index 85a51dd2..d75a309b 100644 --- a/stubs/Drupal/Core/Field/FormatterInterface.stub +++ b/stubs/Drupal/Core/Field/FormatterInterface.stub @@ -1,27 +1,33 @@ - > + * @param array<\Drupal\Core\Field\FieldItemListInterface> $entities_items */ - public function viewElements(FieldItemListInterface $items, $langcode): array; + public function prepareView(array $entities_items): void; /** - * @param TFieldItemList $items - * @param string $langcode + * @param \Drupal\Core\Field\FieldItemListInterface $items + * @param string|null $langcode * * @return array */ public function view(FieldItemListInterface $items, $langcode = NULL); + /** + * @param \Drupal\Core\Field\FieldItemListInterface $items + * @param string $langcode + * + * @return array> + */ + public function viewElements(FieldItemListInterface $items, $langcode); + } diff --git a/tests/src/Type/FormatterInterfaceStubTest.php b/tests/src/Type/FormatterInterfaceStubTest.php new file mode 100644 index 00000000..7dbcfb7c --- /dev/null +++ b/tests/src/Type/FormatterInterfaceStubTest.php @@ -0,0 +1,33 @@ +assertFileAsserts($assertType, $file, ...$args); + } +} \ No newline at end of file diff --git a/tests/src/Type/data/formatter-interface.php b/tests/src/Type/data/formatter-interface.php new file mode 100644 index 00000000..22f4a4c3 --- /dev/null +++ b/tests/src/Type/data/formatter-interface.php @@ -0,0 +1,237 @@ + + */ +class StringFormatter implements FormatterInterface { + + public function settingsForm(array $form, FormStateInterface $form_state) { + return []; + } + + public function settingsSummary() { + return []; + } + + public function prepareView(array $entities_items) { + $first_item = $entities_items[0]->first(); + // Assert that the first item in the list is a StringItem + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $first_item); + } + + public function view(FieldItemListInterface $items, $langcode = NULL) { + assertType('Drupal\Core\Field\FieldItemListInterface', $items); + $first_item = $items->first(); + // Assert that the first item in the list is a StringItem + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $first_item); + return []; + } + + public function viewElements(FieldItemListInterface $items, $langcode) { + $first_item = $items->first(); + // Assert that the first item in the list is a StringItem + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $first_item); + return []; + } + + public static function isApplicable(FieldDefinitionInterface $field_definition) { + return true; + } + + public function getSettings() { + return []; + } + + public function getSetting($key) { + return null; + } + + public function setSetting($key, $value) { + return $this; + } + + public function setSettings(array $settings) { + return $this; + } + + public function getDefaultSettings() { + return []; + } + + public function getPluginId() { + return 'string_formatter'; + } + + public function getPluginDefinition() { + return []; + } + + public function getThirdPartySettings($provider = NULL) { + return []; + } + + public function getThirdPartySetting($provider, $key, $default = NULL) { + return $default; + } + + public function setThirdPartySetting($provider, $key, $value) { + return $this; + } + + public function unsetThirdPartySetting($provider, $key) { + return $this; + } + + public function getThirdPartyProviders() { + return []; + } +} + +/** + * @template T of \Drupal\Core\Field\FieldItemInterface + * @extends \Drupal\Core\Field\FormatterBase + */ +class GenericExtendsFormatterBase extends FormatterBase { + /** + * @param \Drupal\Core\Field\FieldItemListInterface $items + */ + public function viewElements(FieldItemListInterface $items, $langcode) { + $first = $items->first(); + assertType('T of Drupal\Core\Field\FieldItemInterface (class DrupalFormatterInterface\GenericExtendsFormatterBase, argument)|null', $first); + return []; + } + + public static function isApplicable(FieldDefinitionInterface $field_definition) { + return true; + } +} + +/** + * @template T of \Drupal\Core\Field\FieldItemInterface + */ +class GenericFormatter implements FormatterInterface { + public function settingsForm(array $form, FormStateInterface $form_state) { + return []; + } + + public function settingsSummary() { + return []; + } + + public function prepareView(array $entities_items) {} + + /** + * @param \Drupal\Core\Field\FieldItemListInterface $items + */ + public function view(FieldItemListInterface $items, $langcode = NULL) { + $first = $items->first(); + assertType('T of Drupal\Core\Field\FieldItemInterface (class DrupalFormatterInterface\GenericFormatter, argument)|null', $first); + return []; + } + + /** + * @param \Drupal\Core\Field\FieldItemListInterface $items + */ + public function viewElements(FieldItemListInterface $items, $langcode) { + $first = $items->first(); + assertType('T of Drupal\Core\Field\FieldItemInterface (class DrupalFormatterInterface\GenericFormatter, argument)|null', $first); + return []; + } + + public static function isApplicable(FieldDefinitionInterface $field_definition) { + return true; + } + + public function getSettings() { + return []; + } + + public function getSetting($key) { + return null; + } + + public function setSetting($key, $value) { + return $this; + } + + public function setSettings(array $settings) { + return $this; + } + + public function getDefaultSettings() { + return []; + } + + public function getPluginId() { + return 'generic_formatter'; + } + + public function getPluginDefinition() { + return []; + } + + public function getThirdPartySettings($provider = NULL) { + return []; + } + + public function getThirdPartySetting($provider, $key, $default = NULL) { + return $default; + } + + public function setThirdPartySetting($provider, $key, $value) { + return $this; + } + + public function unsetThirdPartySetting($provider, $key) { + return $this; + } + + public function getThirdPartyProviders() { + return []; + } +} + +/** + * Test usage of the formatter through a function. + * + * @param \Drupal\Core\Field\FormatterInterface<\Drupal\Core\Field\Plugin\Field\FieldType\StringItem> $formatter + * @param \Drupal\Core\Field\FieldItemListInterface<\Drupal\Core\Field\Plugin\Field\FieldType\StringItem> $items + */ +function testFormatterWithStringItems(FormatterInterface $formatter, FieldItemListInterface $items): void { + $elements = $formatter->viewElements($items, 'en'); + assertType('array>', $elements); + + // Test with implementation + $stringFormatter = new StringFormatter(); + $elements = $stringFormatter->viewElements($items, 'en'); + assertType('array>', $elements); + + $item = $items->first(); + // The generic type from FormatterInterface should flow to $item + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $item); +} + +/** + * Test that FormatterBase correctly implements FormatterInterface with generics. + * + * @param \Drupal\Core\Field\FormatterBase<\Drupal\Core\Field\Plugin\Field\FieldType\StringItem> $formatter + * @param \Drupal\Core\Field\FieldItemListInterface<\Drupal\Core\Field\Plugin\Field\FieldType\StringItem> $items + */ +function testFormatterBaseWithStringItems(FormatterBase $formatter, FieldItemListInterface $items): void { + $output = $formatter->view($items, 'en'); + assertType('array', $output); + + $item = $items->first(); + // The generic type from FormatterBase should flow to $item + assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $item); +} From 6b3b75bf42d54c38c253814177526de976de645e Mon Sep 17 00:00:00 2001 From: Niklan Date: Sat, 5 Apr 2025 11:26:11 +0500 Subject: [PATCH 06/19] Add initial FormatterInterface generic test --- .../FormatterInterfaceGenericsTest.php | 32 +++++++++ .../src/Generics/data/formatter-interface.php | 72 +++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 tests/src/Generics/FormatterInterfaceGenericsTest.php create mode 100644 tests/src/Generics/data/formatter-interface.php diff --git a/tests/src/Generics/FormatterInterfaceGenericsTest.php b/tests/src/Generics/FormatterInterfaceGenericsTest.php new file mode 100644 index 00000000..4f3113a1 --- /dev/null +++ b/tests/src/Generics/FormatterInterfaceGenericsTest.php @@ -0,0 +1,32 @@ +assertFileAsserts($assertType, $file, ...$args); + } +} diff --git a/tests/src/Generics/data/formatter-interface.php b/tests/src/Generics/data/formatter-interface.php new file mode 100644 index 00000000..09687436 --- /dev/null +++ b/tests/src/Generics/data/formatter-interface.php @@ -0,0 +1,72 @@ +>', $entities_items); + } + + public function view(FieldItemListInterface $items, $langcode = NULL) + { + assertType('Drupal\Core\Field\FieldItemListInterface', $items); + } + + public function viewElements(FieldItemListInterface $items, $langcode) + { + assertType('Drupal\Core\Field\FieldItemListInterface', $items); + } + +} + +/** + * @implements FormatterInterface<\Drupal\Core\Field\Plugin\Field\FieldType\StringItem> + */ +class BarFormatter implements FormatterInterface +{ + + public function prepareView(array $entities_items) + { + assertType('array>', $entities_items); + } + + public function view(FieldItemListInterface $items, $langcode = NULL) + { + assertType('Drupal\Core\Field\FieldItemListInterface', $items); + } + + public function viewElements(FieldItemListInterface $items, $langcode) + { + assertType('Drupal\Core\Field\FieldItemListInterface', $items); + } + +} + +/** + * @implements FormatterInterface + */ +class BazFormatter implements FormatterInterface +{ + + public function prepareView(array $entities_items) + { + assertType('array>', $entities_items); + } + + public function view(FieldItemListInterface $items, $langcode = NULL) + { + assertType('Drupal\file\Plugin\Field\FieldType\FileFieldItemList', $items); + } + + public function viewElements(FieldItemListInterface $items, $langcode) + { + assertType('Drupal\file\Plugin\Field\FieldType\FileFieldItemList', $items); + } + +} From 248dcf7a9abbceaf594bfc0ea5ee5b8f12ad8ee7 Mon Sep 17 00:00:00 2001 From: Niklan Date: Sat, 5 Apr 2025 11:29:33 +0500 Subject: [PATCH 07/19] Add generics test data as excluded dir --- phpstan.neon | 1 + 1 file changed, 1 insertion(+) diff --git a/phpstan.neon b/phpstan.neon index 24f9b845..e03e9d1b 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -15,6 +15,7 @@ parameters: - tests/src/Type/data/*.php - tests/src/Rules/data/*.php - tests/src/DeprecatedScope/data/*.php + - tests/src/Generics/data/*.php dynamicConstantNames: - Drupal::VERSION includes: From 2b5297e2a8e7058629ec6bc85a71c31f0df04bce Mon Sep 17 00:00:00 2001 From: Niklan Date: Mon, 7 Apr 2025 20:42:53 +0500 Subject: [PATCH 08/19] Revert "Add initial FormatterInterface generic test" This reverts commit 6b3b75bf42d54c38c253814177526de976de645e. --- .../FormatterInterfaceGenericsTest.php | 32 --------- .../src/Generics/data/formatter-interface.php | 72 ------------------- 2 files changed, 104 deletions(-) delete mode 100644 tests/src/Generics/FormatterInterfaceGenericsTest.php delete mode 100644 tests/src/Generics/data/formatter-interface.php diff --git a/tests/src/Generics/FormatterInterfaceGenericsTest.php b/tests/src/Generics/FormatterInterfaceGenericsTest.php deleted file mode 100644 index 4f3113a1..00000000 --- a/tests/src/Generics/FormatterInterfaceGenericsTest.php +++ /dev/null @@ -1,32 +0,0 @@ -assertFileAsserts($assertType, $file, ...$args); - } -} diff --git a/tests/src/Generics/data/formatter-interface.php b/tests/src/Generics/data/formatter-interface.php deleted file mode 100644 index 09687436..00000000 --- a/tests/src/Generics/data/formatter-interface.php +++ /dev/null @@ -1,72 +0,0 @@ ->', $entities_items); - } - - public function view(FieldItemListInterface $items, $langcode = NULL) - { - assertType('Drupal\Core\Field\FieldItemListInterface', $items); - } - - public function viewElements(FieldItemListInterface $items, $langcode) - { - assertType('Drupal\Core\Field\FieldItemListInterface', $items); - } - -} - -/** - * @implements FormatterInterface<\Drupal\Core\Field\Plugin\Field\FieldType\StringItem> - */ -class BarFormatter implements FormatterInterface -{ - - public function prepareView(array $entities_items) - { - assertType('array>', $entities_items); - } - - public function view(FieldItemListInterface $items, $langcode = NULL) - { - assertType('Drupal\Core\Field\FieldItemListInterface', $items); - } - - public function viewElements(FieldItemListInterface $items, $langcode) - { - assertType('Drupal\Core\Field\FieldItemListInterface', $items); - } - -} - -/** - * @implements FormatterInterface - */ -class BazFormatter implements FormatterInterface -{ - - public function prepareView(array $entities_items) - { - assertType('array>', $entities_items); - } - - public function view(FieldItemListInterface $items, $langcode = NULL) - { - assertType('Drupal\file\Plugin\Field\FieldType\FileFieldItemList', $items); - } - - public function viewElements(FieldItemListInterface $items, $langcode) - { - assertType('Drupal\file\Plugin\Field\FieldType\FileFieldItemList', $items); - } - -} From ee2c395e1238fc2358f36620bd7956f35fb7cdd8 Mon Sep 17 00:00:00 2001 From: Niklan Date: Mon, 7 Apr 2025 20:42:58 +0500 Subject: [PATCH 09/19] Revert "Add generics test data as excluded dir" This reverts commit 248dcf7a9abbceaf594bfc0ea5ee5b8f12ad8ee7. --- phpstan.neon | 1 - 1 file changed, 1 deletion(-) diff --git a/phpstan.neon b/phpstan.neon index e03e9d1b..24f9b845 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -15,7 +15,6 @@ parameters: - tests/src/Type/data/*.php - tests/src/Rules/data/*.php - tests/src/DeprecatedScope/data/*.php - - tests/src/Generics/data/*.php dynamicConstantNames: - Drupal::VERSION includes: From ed89e133f0213746ba6ffba20b21effca153c8ad Mon Sep 17 00:00:00 2001 From: Niklan Date: Mon, 7 Apr 2025 20:45:48 +0500 Subject: [PATCH 10/19] Revert generic definition to initial approach --- stubs/Drupal/Core/Field/FormatterInterface.stub | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/stubs/Drupal/Core/Field/FormatterInterface.stub b/stubs/Drupal/Core/Field/FormatterInterface.stub index d75a309b..48157181 100644 --- a/stubs/Drupal/Core/Field/FormatterInterface.stub +++ b/stubs/Drupal/Core/Field/FormatterInterface.stub @@ -2,20 +2,18 @@ namespace Drupal\Core\Field; -use Drupal\Core\Form\FormStateInterface; - /** - * @template T of FieldItemInterface + * @template TFieldItemList of \Drupal\Core\Field\FieldItemListInterface */ interface FormatterInterface extends PluginSettingsInterface { /** - * @param array<\Drupal\Core\Field\FieldItemListInterface> $entities_items + * @param array $entities_items */ public function prepareView(array $entities_items): void; /** - * @param \Drupal\Core\Field\FieldItemListInterface $items + * @param TFieldItemList $items * @param string|null $langcode * * @return array @@ -23,7 +21,7 @@ interface FormatterInterface extends PluginSettingsInterface { public function view(FieldItemListInterface $items, $langcode = NULL); /** - * @param \Drupal\Core\Field\FieldItemListInterface $items + * @param TFieldItemList $items * @param string $langcode * * @return array> From 7e017ccc1b4fcfe07488934ceefd91ec3a4d74ea Mon Sep 17 00:00:00 2001 From: Niklan Date: Tue, 8 Apr 2025 22:01:38 +0500 Subject: [PATCH 11/19] Add more tests --- stubs/Drupal/Core/Field/FormatterBase.stub | 13 + tests/src/Type/data/formatter-interface.php | 376 +++++++++++--------- 2 files changed, 226 insertions(+), 163 deletions(-) create mode 100644 stubs/Drupal/Core/Field/FormatterBase.stub diff --git a/stubs/Drupal/Core/Field/FormatterBase.stub b/stubs/Drupal/Core/Field/FormatterBase.stub new file mode 100644 index 00000000..77495d30 --- /dev/null +++ b/stubs/Drupal/Core/Field/FormatterBase.stub @@ -0,0 +1,13 @@ + + */ +abstract class FormatterBase extends PluginSettingsBase implements FormatterInterface, ContainerFactoryPluginInterface { + +} diff --git a/tests/src/Type/data/formatter-interface.php b/tests/src/Type/data/formatter-interface.php index 22f4a4c3..c031a29d 100644 --- a/tests/src/Type/data/formatter-interface.php +++ b/tests/src/Type/data/formatter-interface.php @@ -2,236 +2,286 @@ namespace DrupalFormatterInterface; -use Drupal\Core\Field\FieldDefinitionInterface; +use Drupal\Core\Field\FieldItemList; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Field\FormatterBase; use Drupal\Core\Field\FormatterInterface; +use Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem; use Drupal\Core\Field\Plugin\Field\FieldType\StringItem; -use Drupal\Core\Form\FormStateInterface; use function PHPStan\Testing\assertType; -/** - * @implements \Drupal\Core\Field\FormatterInterface<\Drupal\Core\Field\Plugin\Field\FieldType\StringItem> - */ -class StringFormatter implements FormatterInterface { - - public function settingsForm(array $form, FormStateInterface $form_state) { - return []; - } +class EmptyFormatter implements FormatterInterface { - public function settingsSummary() { - return []; - } - - public function prepareView(array $entities_items) { - $first_item = $entities_items[0]->first(); - // Assert that the first item in the list is a StringItem - assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $first_item); + public function prepareView(array $entities_items): void { + assertType('array', $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); - $first_item = $items->first(); - // Assert that the first item in the list is a StringItem - assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $first_item); - return []; + 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) { - $first_item = $items->first(); - // Assert that the first item in the list is a StringItem - assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $first_item); - return []; + 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 static function isApplicable(FieldDefinitionInterface $field_definition) { - return true; - } +} - public function getSettings() { - return []; - } +/** + * @implements FormatterInterface + */ +class FieldItemListFormatter implements FormatterInterface { - public function getSetting($key) { - return null; + 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 setSetting($key, $value) { - return $this; + 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 setSettings(array $settings) { - return $this; + 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); + } } - public function getDefaultSettings() { - return []; - } +} - public function getPluginId() { - return 'string_formatter'; - } +/** + * @implements FormatterInterface> + */ +class StringItemFormatter implements FormatterInterface { - public function getPluginDefinition() { - return []; + 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 getThirdPartySettings($provider = NULL) { - return []; + 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 getThirdPartySetting($provider, $key, $default = NULL) { - return $default; + 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); + } } - public function setThirdPartySetting($provider, $key, $value) { - return $this; +} + +/** + * @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 unsetThirdPartySetting($provider, $key) { - return $this; + 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 getThirdPartyProviders() { - return []; + 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); + } } + } /** - * @template T of \Drupal\Core\Field\FieldItemInterface - * @extends \Drupal\Core\Field\FormatterBase + * @implements FieldItemListInterface */ -class GenericExtendsFormatterBase extends FormatterBase { - /** - * @param \Drupal\Core\Field\FieldItemListInterface $items - */ - public function viewElements(FieldItemListInterface $items, $langcode) { - $first = $items->first(); - assertType('T of Drupal\Core\Field\FieldItemInterface (class DrupalFormatterInterface\GenericExtendsFormatterBase, argument)|null', $first); - return []; - } - - public static function isApplicable(FieldDefinitionInterface $field_definition) { - return true; - } +class FakeBooleanFieldItemList implements FieldItemListInterface { } /** - * @template T of \Drupal\Core\Field\FieldItemInterface + * @implements FormatterInterface */ -class GenericFormatter implements FormatterInterface { - public function settingsForm(array $form, FormStateInterface $form_state) { - return []; - } +class BooleanItemFormatter implements FormatterInterface { - public function settingsSummary() { - return []; + public function prepareView(array $entities_items): void { + assertType('array', $entities_items); + $items = $entities_items[0]; + assertType('DrupalFormatterInterface\FakeBooleanFieldItemList', $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 prepareView(array $entities_items) {} - - /** - * @param \Drupal\Core\Field\FieldItemListInterface $items - */ public function view(FieldItemListInterface $items, $langcode = NULL) { - $first = $items->first(); - assertType('T of Drupal\Core\Field\FieldItemInterface (class DrupalFormatterInterface\GenericFormatter, argument)|null', $first); - return []; + assertType('DrupalFormatterInterface\FakeBooleanFieldItemList', $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); + } } - /** - * @param \Drupal\Core\Field\FieldItemListInterface $items - */ public function viewElements(FieldItemListInterface $items, $langcode) { - $first = $items->first(); - assertType('T of Drupal\Core\Field\FieldItemInterface (class DrupalFormatterInterface\GenericFormatter, argument)|null', $first); - return []; - } - - public static function isApplicable(FieldDefinitionInterface $field_definition) { - return true; - } - - public function getSettings() { - return []; - } - - public function getSetting($key) { - return null; + assertType('DrupalFormatterInterface\FakeBooleanFieldItemList', $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 setSetting($key, $value) { - return $this; - } +} - public function setSettings(array $settings) { - return $this; - } +/** + * @extends FormatterBase + */ +class ExtendsBooleanItemFormatter extends FormatterBase { - public function getDefaultSettings() { - return []; + public function prepareView(array $entities_items): void { + assertType('array', $entities_items); + $items = $entities_items[0]; + assertType('DrupalFormatterInterface\FakeBooleanFieldItemList', $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 getPluginId() { - return 'generic_formatter'; + public function view(FieldItemListInterface $items, $langcode = NULL) { + assertType('DrupalFormatterInterface\FakeBooleanFieldItemList', $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 getPluginDefinition() { - return []; + public function viewElements(FieldItemListInterface $items, $langcode) { + assertType('DrupalFormatterInterface\FakeBooleanFieldItemList', $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 getThirdPartySettings($provider = NULL) { - return []; - } +} - public function getThirdPartySetting($provider, $key, $default = NULL) { - return $default; - } +/** + * @extends FormatterBase> + */ +class ExtendedDeepFormatter extends FormatterBase { - public function setThirdPartySetting($provider, $key, $value) { - return $this; + 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 unsetThirdPartySetting($provider, $key) { - return $this; + 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 getThirdPartyProviders() { - return []; + 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); + } } -} - -/** - * Test usage of the formatter through a function. - * - * @param \Drupal\Core\Field\FormatterInterface<\Drupal\Core\Field\Plugin\Field\FieldType\StringItem> $formatter - * @param \Drupal\Core\Field\FieldItemListInterface<\Drupal\Core\Field\Plugin\Field\FieldType\StringItem> $items - */ -function testFormatterWithStringItems(FormatterInterface $formatter, FieldItemListInterface $items): void { - $elements = $formatter->viewElements($items, 'en'); - assertType('array>', $elements); - - // Test with implementation - $stringFormatter = new StringFormatter(); - $elements = $stringFormatter->viewElements($items, 'en'); - assertType('array>', $elements); - - $item = $items->first(); - // The generic type from FormatterInterface should flow to $item - assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $item); -} - -/** - * Test that FormatterBase correctly implements FormatterInterface with generics. - * - * @param \Drupal\Core\Field\FormatterBase<\Drupal\Core\Field\Plugin\Field\FieldType\StringItem> $formatter - * @param \Drupal\Core\Field\FieldItemListInterface<\Drupal\Core\Field\Plugin\Field\FieldType\StringItem> $items - */ -function testFormatterBaseWithStringItems(FormatterBase $formatter, FieldItemListInterface $items): void { - $output = $formatter->view($items, 'en'); - assertType('array', $output); - $item = $items->first(); - // The generic type from FormatterBase should flow to $item - assertType('Drupal\Core\Field\Plugin\Field\FieldType\StringItem|null', $item); } From e7f3e9dd69b4e434df993cc1c6ac8e329d663610 Mon Sep 17 00:00:00 2001 From: Niklan Date: Wed, 9 Apr 2025 21:16:20 +0500 Subject: [PATCH 12/19] WIP on tests --- phpstan.neon | 1 + stubs/Drupal/Core/Field/FormatterBase.stub | 4 +- .../Drupal/Core/Field/FormatterInterface.stub | 8 +- .../src/Generics/FormatterBaseGenericTest.php | 33 ++++ .../FormatterInterfaceGenericTest.php} | 6 +- tests/src/Generics/data/formatter-base.php | 85 ++++++++++ .../data/formatter-interface.php | 156 +++++------------- 7 files changed, 173 insertions(+), 120 deletions(-) create mode 100644 tests/src/Generics/FormatterBaseGenericTest.php rename tests/src/{Type/FormatterInterfaceStubTest.php => Generics/FormatterInterfaceGenericTest.php} (84%) create mode 100644 tests/src/Generics/data/formatter-base.php rename tests/src/{Type => Generics}/data/formatter-interface.php (60%) 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/Core/Field/FormatterBase.stub b/stubs/Drupal/Core/Field/FormatterBase.stub index 77495d30..41c3e3c8 100644 --- a/stubs/Drupal/Core/Field/FormatterBase.stub +++ b/stubs/Drupal/Core/Field/FormatterBase.stub @@ -5,8 +5,8 @@ namespace Drupal\Core\Field; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; /** - * @template TFieldItemList of FieldItemListInterface - * @implements FormatterInterface + * @template T of FieldItemListInterface + * @implements FormatterInterface */ abstract class FormatterBase extends PluginSettingsBase implements FormatterInterface, ContainerFactoryPluginInterface { diff --git a/stubs/Drupal/Core/Field/FormatterInterface.stub b/stubs/Drupal/Core/Field/FormatterInterface.stub index 48157181..ae8efa55 100644 --- a/stubs/Drupal/Core/Field/FormatterInterface.stub +++ b/stubs/Drupal/Core/Field/FormatterInterface.stub @@ -3,17 +3,17 @@ namespace Drupal\Core\Field; /** - * @template TFieldItemList of \Drupal\Core\Field\FieldItemListInterface + * @template T of FieldItemListInterface */ interface FormatterInterface extends PluginSettingsInterface { /** - * @param array $entities_items + * @param array $entities_items */ public function prepareView(array $entities_items): void; /** - * @param TFieldItemList $items + * @param T $items * @param string|null $langcode * * @return array @@ -21,7 +21,7 @@ interface FormatterInterface extends PluginSettingsInterface { public function view(FieldItemListInterface $items, $langcode = NULL); /** - * @param TFieldItemList $items + * @param T $items * @param string $langcode * * @return array> 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/Type/FormatterInterfaceStubTest.php b/tests/src/Generics/FormatterInterfaceGenericTest.php similarity index 84% rename from tests/src/Type/FormatterInterfaceStubTest.php rename to tests/src/Generics/FormatterInterfaceGenericTest.php index 7dbcfb7c..2e5dacb6 100644 --- a/tests/src/Type/FormatterInterfaceStubTest.php +++ b/tests/src/Generics/FormatterInterfaceGenericTest.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace mglaman\PHPStanDrupal\Tests\Type; +namespace mglaman\PHPStanDrupal\Tests\Generics; use mglaman\PHPStanDrupal\Tests\AdditionalConfigFilesTrait; use PHPStan\Testing\TypeInferenceTestCase; -final class FormatterInterfaceStubTest extends TypeInferenceTestCase +final class FormatterInterfaceGenericTest extends TypeInferenceTestCase { use AdditionalConfigFilesTrait; @@ -30,4 +30,4 @@ public function testFileAsserts( { $this->assertFileAsserts($assertType, $file, ...$args); } -} \ No newline at end of file +} diff --git a/tests/src/Generics/data/formatter-base.php b/tests/src/Generics/data/formatter-base.php new file mode 100644 index 00000000..bd8047aa --- /dev/null +++ b/tests/src/Generics/data/formatter-base.php @@ -0,0 +1,85 @@ + +// */ +//class ExtendsBooleanItemFormatter extends FormatterBase { +// +// public function prepareView(array $entities_items): void { +// assertType('array', $entities_items); +// $items = $entities_items[0]; +// assertType('DrupalFormatterInterfaceGeneric\FakeBooleanFieldItemList', $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\FakeBooleanFieldItemList', $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\FakeBooleanFieldItemList', $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/Type/data/formatter-interface.php b/tests/src/Generics/data/formatter-interface.php similarity index 60% rename from tests/src/Type/data/formatter-interface.php rename to tests/src/Generics/data/formatter-interface.php index c031a29d..dd825435 100644 --- a/tests/src/Type/data/formatter-interface.php +++ b/tests/src/Generics/data/formatter-interface.php @@ -1,15 +1,17 @@ */ class FieldItemListFormatter implements FormatterInterface { @@ -86,6 +90,10 @@ public function viewElements(FieldItemListInterface $items, $langcode) { } /** + * Tests hierarchical generics. + * + * Provides TFieldItemList data to generic with specifying FieldItemList. + * * @implements FormatterInterface> */ class StringItemFormatter implements FormatterInterface { @@ -125,6 +133,8 @@ public function viewElements(FieldItemListInterface $items, $langcode) { } /** + * Tests providing union types with hierarchical generics. + * * @implements FormatterInterface> */ class UnionTypeFormatter implements FormatterInterface { @@ -164,124 +174,48 @@ public function viewElements(FieldItemListInterface $items, $langcode) { } /** - * @implements FieldItemListInterface + * Provides a custom field item list with concrete FieldItemListInterface. + * + * @extends FieldItemList */ -class FakeBooleanFieldItemList implements FieldItemListInterface { +class BooleanFieldItemList extends FieldItemList { } /** - * @implements FormatterInterface + * @implements FormatterInterface */ class BooleanItemFormatter implements FormatterInterface { public function prepareView(array $entities_items): void { - assertType('array', $entities_items); + assertType('array', $entities_items); $items = $entities_items[0]; - assertType('DrupalFormatterInterface\FakeBooleanFieldItemList', $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('DrupalFormatterInterface\FakeBooleanFieldItemList', $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('DrupalFormatterInterface\FakeBooleanFieldItemList', $items); + 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); - } - } - -} - -/** - * @extends FormatterBase - */ -class ExtendsBooleanItemFormatter extends FormatterBase { - - public function prepareView(array $entities_items): void { - assertType('array', $entities_items); - $items = $entities_items[0]; - assertType('DrupalFormatterInterface\FakeBooleanFieldItemList', $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('DrupalFormatterInterface\FakeBooleanFieldItemList', $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('DrupalFormatterInterface\FakeBooleanFieldItemList', $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); - } - } +// 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\FakeBooleanFieldItemList', $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\FakeBooleanFieldItemList', $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); +// } +// } } From df636fc8f5872e7e38fdd95e9caa8551c6ae7477 Mon Sep 17 00:00:00 2001 From: Niklan Date: Wed, 16 Apr 2025 21:01:46 +0500 Subject: [PATCH 13/19] Fix tests --- composer.json | 3 +- tests/src/Generics/data/formatter-base.php | 162 ++++++++++-------- .../src/Generics/data/formatter-interface.php | 53 +++--- 3 files changed, 114 insertions(+), 104 deletions(-) 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/tests/src/Generics/data/formatter-base.php b/tests/src/Generics/data/formatter-base.php index bd8047aa..fde402cf 100644 --- a/tests/src/Generics/data/formatter-base.php +++ b/tests/src/Generics/data/formatter-base.php @@ -2,84 +2,94 @@ namespace DrupalFormatterBaseGeneric; +use Drupal\Core\Field\FieldItemList; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Field\FormatterBase; +use Drupal\Core\Field\Plugin\Field\FieldType\BooleanItem; +use Drupal\Core\Field\Plugin\Field\FieldType\StringItem; use function PHPStan\Testing\assertType; -///** -// * @extends FormatterBase -// */ -//class ExtendsBooleanItemFormatter extends FormatterBase { -// -// public function prepareView(array $entities_items): void { -// assertType('array', $entities_items); -// $items = $entities_items[0]; -// assertType('DrupalFormatterInterfaceGeneric\FakeBooleanFieldItemList', $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\FakeBooleanFieldItemList', $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\FakeBooleanFieldItemList', $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); -// } -// } -// -//} +/** + * Provides a custom field item list with concrete FieldItemListInterface. + * + * @extends FieldItemList + */ +class BooleanFieldItemList extends FieldItemList {} -///** -// * @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); -// } -// } -// -//} +/** + * @extends FormatterBase + */ +class ExtendsBooleanItemFormatter extends FormatterBase { + + 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); + } + } + +} + +/** + * @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 index dd825435..885a480a 100644 --- a/tests/src/Generics/data/formatter-interface.php +++ b/tests/src/Generics/data/formatter-interface.php @@ -178,8 +178,7 @@ public function viewElements(FieldItemListInterface $items, $langcode) { * * @extends FieldItemList */ -class BooleanFieldItemList extends FieldItemList { -} +class BooleanFieldItemList extends FieldItemList {} /** * @implements FormatterInterface @@ -191,31 +190,31 @@ public function prepareView(array $entities_items): void { $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); -// } + 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); + } } -// -// public function view(FieldItemListInterface $items, $langcode = NULL) { -// assertType('DrupalFormatterInterfaceGeneric\FakeBooleanFieldItemList', $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\FakeBooleanFieldItemList', $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); -// } -// } } From 57d2b147aeffa755dcacf8f66de49c6343801fc3 Mon Sep 17 00:00:00 2001 From: Niklan Date: Wed, 16 Apr 2025 21:11:20 +0500 Subject: [PATCH 14/19] Fix tests --- stubs/Drupal/Core/Field/FormatterBase.stub | 21 +++++++++++++++++++++ tests/src/Generics/data/formatter-base.php | 8 ++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/stubs/Drupal/Core/Field/FormatterBase.stub b/stubs/Drupal/Core/Field/FormatterBase.stub index 41c3e3c8..bf2965db 100644 --- a/stubs/Drupal/Core/Field/FormatterBase.stub +++ b/stubs/Drupal/Core/Field/FormatterBase.stub @@ -10,4 +10,25 @@ use Drupal\Core\Plugin\ContainerFactoryPluginInterface; */ 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/tests/src/Generics/data/formatter-base.php b/tests/src/Generics/data/formatter-base.php index fde402cf..bbae0166 100644 --- a/tests/src/Generics/data/formatter-base.php +++ b/tests/src/Generics/data/formatter-base.php @@ -22,9 +22,9 @@ class BooleanFieldItemList extends FieldItemList {} class ExtendsBooleanItemFormatter extends FormatterBase { public function prepareView(array $entities_items): void { - assertType('array', $entities_items); + assertType('array', $entities_items); $items = $entities_items[0]; - assertType('DrupalFormatterInterfaceGeneric\BooleanFieldItemList', $items); + 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)); @@ -34,7 +34,7 @@ public function prepareView(array $entities_items): void { } public function view(FieldItemListInterface $items, $langcode = NULL) { - assertType('DrupalFormatterInterfaceGeneric\BooleanFieldItemList', $items); + 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)); @@ -44,7 +44,7 @@ public function view(FieldItemListInterface $items, $langcode = NULL) { } public function viewElements(FieldItemListInterface $items, $langcode) { - assertType('DrupalFormatterInterfaceGeneric\BooleanFieldItemList', $items); + 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)); From 57912041a6c0655d82a270768bfad5cdeef64129 Mon Sep 17 00:00:00 2001 From: Niklan Date: Tue, 22 Apr 2025 21:34:10 +0500 Subject: [PATCH 15/19] WIP --- stubs/Drupal/Core/Field/FieldItemList.stub | 7 +++---- stubs/Drupal/Core/TypedData/Plugin/DataType/ItemList.stub | 6 ++++++ tests/src/Generics/data/formatter-base.php | 4 ++-- tests/src/Generics/data/formatter-interface.php | 4 ++-- 4 files changed, 13 insertions(+), 8 deletions(-) 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/TypedData/Plugin/DataType/ItemList.stub b/stubs/Drupal/Core/TypedData/Plugin/DataType/ItemList.stub index 9d98c5c8..a7834ff9 100644 --- a/stubs/Drupal/Core/TypedData/Plugin/DataType/ItemList.stub +++ b/stubs/Drupal/Core/TypedData/Plugin/DataType/ItemList.stub @@ -13,4 +13,10 @@ use Drupal\Core\TypedData\TypedDataInterface; * @implements ListInterface */ class ItemList extends TypedData implements \IteratorAggregate, ListInterface { + + /** + * @return \ArrayIterator + */ + public function getIterator(): \ArrayIterator {} + } diff --git a/tests/src/Generics/data/formatter-base.php b/tests/src/Generics/data/formatter-base.php index bbae0166..f1eb7102 100644 --- a/tests/src/Generics/data/formatter-base.php +++ b/tests/src/Generics/data/formatter-base.php @@ -12,9 +12,9 @@ /** * Provides a custom field item list with concrete FieldItemListInterface. * - * @extends FieldItemList + * @implements FieldItemListInterface */ -class BooleanFieldItemList extends FieldItemList {} +class BooleanFieldItemList implements FieldItemListInterface {} /** * @extends FormatterBase diff --git a/tests/src/Generics/data/formatter-interface.php b/tests/src/Generics/data/formatter-interface.php index 885a480a..086c265b 100644 --- a/tests/src/Generics/data/formatter-interface.php +++ b/tests/src/Generics/data/formatter-interface.php @@ -176,9 +176,9 @@ public function viewElements(FieldItemListInterface $items, $langcode) { /** * Provides a custom field item list with concrete FieldItemListInterface. * - * @extends FieldItemList + * @implements FieldItemListInterface */ -class BooleanFieldItemList extends FieldItemList {} +class BooleanFieldItemList implements FieldItemListInterface {} /** * @implements FormatterInterface From 62a7b8cbeacf4db208eda3c07aba9b87ed03d4c2 Mon Sep 17 00:00:00 2001 From: Niklan Date: Thu, 24 Apr 2025 20:33:24 +0500 Subject: [PATCH 16/19] EntityReferenceFormatterBase stub --- .../Field/EntityReferenceFieldItemList.stub | 15 +++ .../EntityReferenceFormatterBase.stub | 37 ++++++ ...ntityReferenceFieldItemListGenericTest.php | 33 +++++ ...ntityReferenceFormatterBaseGenericTest.php | 33 +++++ .../EntityReferenceItemGenericTest.php | 33 +++++ .../data/entity-reference-field-item-list.php | 63 ++++++++++ .../data/entity-reference-formatter-base.php | 119 ++++++++++++++++++ .../Generics/data/entity-reference-item.php | 33 +++++ 8 files changed, 366 insertions(+) create mode 100644 stubs/Drupal/Core/Field/EntityReferenceFieldItemList.stub create mode 100644 stubs/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceFormatterBase.stub create mode 100644 tests/src/Generics/EntityReferenceFieldItemListGenericTest.php create mode 100644 tests/src/Generics/EntityReferenceFormatterBaseGenericTest.php create mode 100644 tests/src/Generics/EntityReferenceItemGenericTest.php create mode 100644 tests/src/Generics/data/entity-reference-field-item-list.php create mode 100644 tests/src/Generics/data/entity-reference-formatter-base.php create mode 100644 tests/src/Generics/data/entity-reference-item.php diff --git a/stubs/Drupal/Core/Field/EntityReferenceFieldItemList.stub b/stubs/Drupal/Core/Field/EntityReferenceFieldItemList.stub new file mode 100644 index 00000000..70477aae --- /dev/null +++ b/stubs/Drupal/Core/Field/EntityReferenceFieldItemList.stub @@ -0,0 +1,15 @@ +> + * @implements EntityReferenceFieldItemListInterface + */ +class EntityReferenceFieldItemList extends FieldItemList implements EntityReferenceFieldItemListInterface { + +} \ No newline at end of file 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..6bfe010c --- /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/tests/src/Generics/EntityReferenceFieldItemListGenericTest.php b/tests/src/Generics/EntityReferenceFieldItemListGenericTest.php new file mode 100644 index 00000000..b40bf540 --- /dev/null +++ b/tests/src/Generics/EntityReferenceFieldItemListGenericTest.php @@ -0,0 +1,33 @@ +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/data/entity-reference-field-item-list.php b/tests/src/Generics/data/entity-reference-field-item-list.php new file mode 100644 index 00000000..d056bb43 --- /dev/null +++ b/tests/src/Generics/data/entity-reference-field-item-list.php @@ -0,0 +1,63 @@ +|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\Core\Entity\EntityInterface|null', $item->entity); + assertType('int|string|null', $item->target_id); + } + 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('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); + } +} + +/** + * @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..b2890daa --- /dev/null +++ b/tests/src/Generics/data/entity-reference-formatter-base.php @@ -0,0 +1,119 @@ +>', $entities_items); + $items = $entities_items[0]; + 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('Drupal\Core\Entity\EntityInterface|null', $item->entity); + assertType('int|string|null', $item->target_id); + } + assertType('array', $items->referencedEntities()); + foreach ($items->referencedEntities() as $entity) { + assertType('Drupal\Core\Entity\EntityInterface', $entity); + } + } + + public function view(FieldItemListInterface $items, $langcode = NULL) { + 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('Drupal\Core\Entity\EntityInterface|null', $item->entity); + assertType('int|string|null', $item->target_id); + } + assertType('array', $items->referencedEntities()); + foreach ($items->referencedEntities() as $entity) { + assertType('Drupal\Core\Entity\EntityInterface', $entity); + } + } + + public function viewElements(FieldItemListInterface $items, $langcode) { + 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('Drupal\Core\Entity\EntityInterface|null', $item->entity); + assertType('int|string|null', $item->target_id); + } + assertType('array', $items->referencedEntities()); + foreach ($items->referencedEntities() as $entity) { + assertType('Drupal\Core\Entity\EntityInterface', $entity); + } + } + +} + +/** + * @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); + 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); + } + } + + public function view(FieldItemListInterface $items, $langcode = NULL) { + 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('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); + } + } + + public function viewElements(FieldItemListInterface $items, $langcode) { + 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('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-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); +} From 67c233126797164bfec6114a3c8fe366cbdb6cc4 Mon Sep 17 00:00:00 2001 From: Niklan Date: Thu, 24 Apr 2025 20:43:57 +0500 Subject: [PATCH 17/19] EntityReferenceFormatterBase stub --- .../data/entity-reference-formatter-base.php | 72 ------------------- 1 file changed, 72 deletions(-) diff --git a/tests/src/Generics/data/entity-reference-formatter-base.php b/tests/src/Generics/data/entity-reference-formatter-base.php index b2890daa..6068e69f 100644 --- a/tests/src/Generics/data/entity-reference-formatter-base.php +++ b/tests/src/Generics/data/entity-reference-formatter-base.php @@ -13,50 +13,14 @@ public function prepareView(array $entities_items): void { assertType('array>', $entities_items); $items = $entities_items[0]; 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('Drupal\Core\Entity\EntityInterface|null', $item->entity); - assertType('int|string|null', $item->target_id); - } - assertType('array', $items->referencedEntities()); - foreach ($items->referencedEntities() as $entity) { - assertType('Drupal\Core\Entity\EntityInterface', $entity); - } } public function view(FieldItemListInterface $items, $langcode = NULL) { 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('Drupal\Core\Entity\EntityInterface|null', $item->entity); - assertType('int|string|null', $item->target_id); - } - assertType('array', $items->referencedEntities()); - foreach ($items->referencedEntities() as $entity) { - assertType('Drupal\Core\Entity\EntityInterface', $entity); - } } public function viewElements(FieldItemListInterface $items, $langcode) { 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('Drupal\Core\Entity\EntityInterface|null', $item->entity); - assertType('int|string|null', $item->target_id); - } - assertType('array', $items->referencedEntities()); - foreach ($items->referencedEntities() as $entity) { - assertType('Drupal\Core\Entity\EntityInterface', $entity); - } } } @@ -70,50 +34,14 @@ public function prepareView(array $entities_items): void { assertType('array>', $entities_items); $items = $entities_items[0]; 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('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); - } } public function view(FieldItemListInterface $items, $langcode = NULL) { 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('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); - } } public function viewElements(FieldItemListInterface $items, $langcode) { 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('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); - } } } From c3ff6f6e4ca5cfdae67012662eb0655f0346fe9d Mon Sep 17 00:00:00 2001 From: Niklan Date: Thu, 24 Apr 2025 20:45:11 +0500 Subject: [PATCH 18/19] EntityReferenceFormatterBase stub --- tests/src/Generics/data/entity-reference-field-item-list.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/src/Generics/data/entity-reference-field-item-list.php b/tests/src/Generics/data/entity-reference-field-item-list.php index d056bb43..bc3bb0ee 100644 --- a/tests/src/Generics/data/entity-reference-field-item-list.php +++ b/tests/src/Generics/data/entity-reference-field-item-list.php @@ -13,8 +13,6 @@ function defaultItemList(EntityReferenceFieldItemList $items): void { 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\Core\Entity\EntityInterface|null', $item->entity); - assertType('int|string|null', $item->target_id); } assertType('array', $items->referencedEntities()); foreach ($items->referencedEntities() as $entity) { @@ -32,8 +30,6 @@ function phpDocOverride(EntityReferenceFieldItemList $items): void { 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) { From 5382f350c49494ee243c3b43bd2ee365e1d02198 Mon Sep 17 00:00:00 2001 From: Niklan Date: Tue, 29 Apr 2025 19:31:37 +0500 Subject: [PATCH 19/19] Fix test --- .../Field/FieldFormatter/EntityReferenceFormatterBase.stub | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubs/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceFormatterBase.stub b/stubs/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceFormatterBase.stub index 6bfe010c..2c482dad 100644 --- a/stubs/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceFormatterBase.stub +++ b/stubs/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceFormatterBase.stub @@ -4,7 +4,7 @@ namespace Drupal\Core\Field\Plugin\Field\FieldFormatter; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Field\EntityReferenceFieldItemList; -use Drupal\Core\Field\EntityReferenceFieldItemListInterface; +use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Field\FormatterBase; /**