Skip to content

Commit 62a7b8c

Browse files
committed
EntityReferenceFormatterBase stub
1 parent 0737691 commit 62a7b8c

8 files changed

+366
-0
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
namespace Drupal\Core\Field;
4+
5+
use Drupal\Core\Entity\EntityInterface;
6+
use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
7+
8+
/**
9+
* @template T of EntityInterface
10+
* @extends FieldItemList<EntityReferenceItem<T>>
11+
* @implements EntityReferenceFieldItemListInterface<T>
12+
*/
13+
class EntityReferenceFieldItemList extends FieldItemList implements EntityReferenceFieldItemListInterface {
14+
15+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
namespace Drupal\Core\Field\Plugin\Field\FieldFormatter;
4+
5+
use Drupal\Core\Entity\EntityInterface;
6+
use Drupal\Core\Field\EntityReferenceFieldItemList;
7+
use Drupal\Core\Field\EntityReferenceFieldItemListInterface;
8+
use Drupal\Core\Field\FormatterBase;
9+
10+
/**
11+
* @template T of EntityInterface
12+
* @extends FormatterBase<EntityReferenceFieldItemList<T>>
13+
*/
14+
abstract class EntityReferenceFormatterBase extends FormatterBase {
15+
16+
/**
17+
* @param array<EntityReferenceFieldItemList<T>> $entities_items
18+
*/
19+
public function prepareView(array $entities_items): void {}
20+
21+
/**
22+
* @param EntityReferenceFieldItemList<T> $items
23+
* @param string|null $langcode
24+
*
25+
* @return array<int|string, mixed>
26+
*/
27+
public function view(FieldItemListInterface $items, $langcode = NULL) {}
28+
29+
/**
30+
* @param EntityReferenceFieldItemList<T> $items
31+
* @param string $langcode
32+
*
33+
* @return array<int, array<int|string, mixed>>
34+
*/
35+
public function viewElements(FieldItemListInterface $items, $langcode) {}
36+
37+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace mglaman\PHPStanDrupal\Tests\Generics;
6+
7+
use mglaman\PHPStanDrupal\Tests\AdditionalConfigFilesTrait;
8+
use PHPStan\Testing\TypeInferenceTestCase;
9+
10+
final class EntityReferenceFieldItemListGenericTest extends TypeInferenceTestCase
11+
{
12+
use AdditionalConfigFilesTrait;
13+
14+
public static function dataFileAsserts(): iterable
15+
{
16+
yield from self::gatherAssertTypes(__DIR__ . '/data/entity-reference-field-item-list.php');
17+
}
18+
19+
/**
20+
* @dataProvider dataFileAsserts
21+
* @param string $assertType
22+
* @param string $file
23+
* @param mixed ...$args
24+
*/
25+
public function testFileAsserts(
26+
string $assertType,
27+
string $file,
28+
...$args
29+
): void
30+
{
31+
$this->assertFileAsserts($assertType, $file, ...$args);
32+
}
33+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace mglaman\PHPStanDrupal\Tests\Generics;
6+
7+
use mglaman\PHPStanDrupal\Tests\AdditionalConfigFilesTrait;
8+
use PHPStan\Testing\TypeInferenceTestCase;
9+
10+
final class EntityReferenceFormatterBaseGenericTest extends TypeInferenceTestCase
11+
{
12+
use AdditionalConfigFilesTrait;
13+
14+
public static function dataFileAsserts(): iterable
15+
{
16+
yield from self::gatherAssertTypes(__DIR__ . '/data/entity-reference-formatter-base.php');
17+
}
18+
19+
/**
20+
* @dataProvider dataFileAsserts
21+
* @param string $assertType
22+
* @param string $file
23+
* @param mixed ...$args
24+
*/
25+
public function testFileAsserts(
26+
string $assertType,
27+
string $file,
28+
...$args
29+
): void
30+
{
31+
$this->assertFileAsserts($assertType, $file, ...$args);
32+
}
33+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace mglaman\PHPStanDrupal\Tests\Generics;
6+
7+
use mglaman\PHPStanDrupal\Tests\AdditionalConfigFilesTrait;
8+
use PHPStan\Testing\TypeInferenceTestCase;
9+
10+
final class EntityReferenceItemGenericTest extends TypeInferenceTestCase
11+
{
12+
use AdditionalConfigFilesTrait;
13+
14+
public static function dataFileAsserts(): iterable
15+
{
16+
yield from self::gatherAssertTypes(__DIR__ . '/data/entity-reference-item.php');
17+
}
18+
19+
/**
20+
* @dataProvider dataFileAsserts
21+
* @param string $assertType
22+
* @param string $file
23+
* @param mixed ...$args
24+
*/
25+
public function testFileAsserts(
26+
string $assertType,
27+
string $file,
28+
...$args
29+
): void
30+
{
31+
$this->assertFileAsserts($assertType, $file, ...$args);
32+
}
33+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
3+
namespace DrupalEntityReferenceFieldItemListGeneric;
4+
5+
use Drupal\Core\Field\EntityReferenceFieldItemList;
6+
use Drupal\node\NodeInterface;
7+
use function PHPStan\Testing\assertType;
8+
9+
function defaultItemList(EntityReferenceFieldItemList $items): void {
10+
assertType('Drupal\Core\Field\EntityReferenceFieldItemList', $items);
11+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\Core\Entity\EntityInterface>|null', $items->first());
12+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\Core\Entity\EntityInterface>|null', $items->get(0));
13+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\Core\Entity\EntityInterface>|null', $items->offsetGet(0));
14+
foreach ($items as $item) {
15+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\Core\Entity\EntityInterface>', $item);
16+
assertType('Drupal\Core\Entity\EntityInterface|null', $item->entity);
17+
assertType('int|string|null', $item->target_id);
18+
}
19+
assertType('array<int, Drupal\Core\Entity\EntityInterface>', $items->referencedEntities());
20+
foreach ($items->referencedEntities() as $entity) {
21+
assertType('Drupal\Core\Entity\EntityInterface', $entity);
22+
}
23+
}
24+
25+
/**
26+
* @param EntityReferenceFieldItemList<NodeInterface> $items
27+
*/
28+
function phpDocOverride(EntityReferenceFieldItemList $items): void {
29+
assertType('Drupal\Core\Field\EntityReferenceFieldItemList<Drupal\node\NodeInterface>', $items);
30+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\node\NodeInterface>|null', $items->first());
31+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\node\NodeInterface>|null', $items->get(0));
32+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\node\NodeInterface>|null', $items->offsetGet(0));
33+
foreach ($items as $item) {
34+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\node\NodeInterface>', $item);
35+
assertType('Drupal\node\NodeInterface|null', $item->entity);
36+
assertType('int|string|null', $item->target_id);
37+
}
38+
assertType('array<int, Drupal\node\NodeInterface>', $items->referencedEntities());
39+
foreach ($items->referencedEntities() as $entity) {
40+
assertType('Drupal\node\NodeInterface', $entity);
41+
}
42+
}
43+
44+
/**
45+
* @extends EntityReferenceFieldItemList<NodeInterface>
46+
*/
47+
class ExtendedEntityReferenceFieldItemList extends EntityReferenceFieldItemList {}
48+
49+
function extendedItemList(ExtendedEntityReferenceFieldItemList $items): void {
50+
assertType('DrupalEntityReferenceFieldItemListGeneric\ExtendedEntityReferenceFieldItemList', $items);
51+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\node\NodeInterface>|null', $items->first());
52+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\node\NodeInterface>|null', $items->get(0));
53+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\node\NodeInterface>|null', $items->offsetGet(0));
54+
foreach ($items as $item) {
55+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\node\NodeInterface>', $item);
56+
assertType('Drupal\node\NodeInterface|null', $item->entity);
57+
assertType('int|string|null', $item->target_id);
58+
}
59+
assertType('array<int, Drupal\node\NodeInterface>', $items->referencedEntities());
60+
foreach ($items->referencedEntities() as $entity) {
61+
assertType('Drupal\node\NodeInterface', $entity);
62+
}
63+
}
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
<?php
2+
3+
namespace DrupalEntityReferenceFormatterBaseGeneric;
4+
5+
use Drupal\Core\Field\FieldItemListInterface;
6+
use Drupal\Core\Field\Plugin\Field\FieldFormatter\EntityReferenceFormatterBase;
7+
use Drupal\node\NodeInterface;
8+
use function PHPStan\Testing\assertType;
9+
10+
class InheritedEntityReferenceFormatterBase extends EntityReferenceFormatterBase {
11+
12+
public function prepareView(array $entities_items): void {
13+
assertType('array<Drupal\Core\Field\EntityReferenceFieldItemList<Drupal\Core\Entity\EntityInterface>>', $entities_items);
14+
$items = $entities_items[0];
15+
assertType('Drupal\Core\Field\EntityReferenceFieldItemList<Drupal\Core\Entity\EntityInterface>', $items);
16+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\Core\Entity\EntityInterface>|null', $items->first());
17+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\Core\Entity\EntityInterface>|null', $items->get(0));
18+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\Core\Entity\EntityInterface>|null', $items->offsetGet(0));
19+
foreach ($items as $item) {
20+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\Core\Entity\EntityInterface>', $item);
21+
assertType('Drupal\Core\Entity\EntityInterface|null', $item->entity);
22+
assertType('int|string|null', $item->target_id);
23+
}
24+
assertType('array<int, Drupal\Core\Entity\EntityInterface>', $items->referencedEntities());
25+
foreach ($items->referencedEntities() as $entity) {
26+
assertType('Drupal\Core\Entity\EntityInterface', $entity);
27+
}
28+
}
29+
30+
public function view(FieldItemListInterface $items, $langcode = NULL) {
31+
assertType('Drupal\Core\Field\EntityReferenceFieldItemList<Drupal\Core\Entity\EntityInterface>', $items);
32+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\Core\Entity\EntityInterface>|null', $items->first());
33+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\Core\Entity\EntityInterface>|null', $items->get(0));
34+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\Core\Entity\EntityInterface>|null', $items->offsetGet(0));
35+
foreach ($items as $item) {
36+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\Core\Entity\EntityInterface>', $item);
37+
assertType('Drupal\Core\Entity\EntityInterface|null', $item->entity);
38+
assertType('int|string|null', $item->target_id);
39+
}
40+
assertType('array<int, Drupal\Core\Entity\EntityInterface>', $items->referencedEntities());
41+
foreach ($items->referencedEntities() as $entity) {
42+
assertType('Drupal\Core\Entity\EntityInterface', $entity);
43+
}
44+
}
45+
46+
public function viewElements(FieldItemListInterface $items, $langcode) {
47+
assertType('Drupal\Core\Field\EntityReferenceFieldItemList<Drupal\Core\Entity\EntityInterface>', $items);
48+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\Core\Entity\EntityInterface>|null', $items->first());
49+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\Core\Entity\EntityInterface>|null', $items->get(0));
50+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\Core\Entity\EntityInterface>|null', $items->offsetGet(0));
51+
foreach ($items as $item) {
52+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\Core\Entity\EntityInterface>', $item);
53+
assertType('Drupal\Core\Entity\EntityInterface|null', $item->entity);
54+
assertType('int|string|null', $item->target_id);
55+
}
56+
assertType('array<int, Drupal\Core\Entity\EntityInterface>', $items->referencedEntities());
57+
foreach ($items->referencedEntities() as $entity) {
58+
assertType('Drupal\Core\Entity\EntityInterface', $entity);
59+
}
60+
}
61+
62+
}
63+
64+
/**
65+
* @extends EntityReferenceFormatterBase<NodeInterface>
66+
*/
67+
class SpecifiedEntityTypeEntityReferenceFormatterBase extends EntityReferenceFormatterBase {
68+
69+
public function prepareView(array $entities_items): void {
70+
assertType('array<Drupal\Core\Field\EntityReferenceFieldItemList<Drupal\node\NodeInterface>>', $entities_items);
71+
$items = $entities_items[0];
72+
assertType('Drupal\Core\Field\EntityReferenceFieldItemList<Drupal\node\NodeInterface>', $items);
73+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\node\NodeInterface>|null', $items->first());
74+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\node\NodeInterface>|null', $items->get(0));
75+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\node\NodeInterface>|null', $items->offsetGet(0));
76+
foreach ($items as $item) {
77+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\node\NodeInterface>', $item);
78+
assertType('Drupal\node\NodeInterface|null', $item->entity);
79+
assertType('int|string|null', $item->target_id);
80+
}
81+
assertType('array<int, Drupal\node\NodeInterface>', $items->referencedEntities());
82+
foreach ($items->referencedEntities() as $entity) {
83+
assertType('Drupal\node\NodeInterface', $entity);
84+
}
85+
}
86+
87+
public function view(FieldItemListInterface $items, $langcode = NULL) {
88+
assertType('Drupal\Core\Field\EntityReferenceFieldItemList<Drupal\node\NodeInterface>', $items);
89+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\node\NodeInterface>|null', $items->first());
90+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\node\NodeInterface>|null', $items->get(0));
91+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\node\NodeInterface>|null', $items->offsetGet(0));
92+
foreach ($items as $item) {
93+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\node\NodeInterface>', $item);
94+
assertType('Drupal\node\NodeInterface|null', $item->entity);
95+
assertType('int|string|null', $item->target_id);
96+
}
97+
assertType('array<int, Drupal\node\NodeInterface>', $items->referencedEntities());
98+
foreach ($items->referencedEntities() as $entity) {
99+
assertType('Drupal\node\NodeInterface', $entity);
100+
}
101+
}
102+
103+
public function viewElements(FieldItemListInterface $items, $langcode) {
104+
assertType('Drupal\Core\Field\EntityReferenceFieldItemList<Drupal\node\NodeInterface>', $items);
105+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\node\NodeInterface>|null', $items->first());
106+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\node\NodeInterface>|null', $items->get(0));
107+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\node\NodeInterface>|null', $items->offsetGet(0));
108+
foreach ($items as $item) {
109+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\node\NodeInterface>', $item);
110+
assertType('Drupal\node\NodeInterface|null', $item->entity);
111+
assertType('int|string|null', $item->target_id);
112+
}
113+
assertType('array<int, Drupal\node\NodeInterface>', $items->referencedEntities());
114+
foreach ($items->referencedEntities() as $entity) {
115+
assertType('Drupal\node\NodeInterface', $entity);
116+
}
117+
}
118+
119+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace DrupalEntityReferenceItemGeneric;
4+
5+
use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
6+
use Drupal\node\NodeInterface;
7+
use function PHPStan\Testing\assertType;
8+
9+
function defaultItem(EntityReferenceItem $item): void {
10+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem', $item);
11+
assertType('Drupal\Core\Entity\EntityInterface|null', $item->entity);
12+
assertType('int|string|null', $item->target_id);
13+
}
14+
15+
/**
16+
* @param EntityReferenceItem<NodeInterface> $item
17+
*/
18+
function phpDocOverride(EntityReferenceItem $item): void {
19+
assertType('Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem<Drupal\node\NodeInterface>', $item);
20+
assertType('Drupal\node\NodeInterface|null', $item->entity);
21+
assertType('int|string|null', $item->target_id);
22+
}
23+
24+
/**
25+
* @extends EntityReferenceItem<NodeInterface>
26+
*/
27+
class ExtendedEntityReferenceItem extends EntityReferenceItem {}
28+
29+
function extendedItem(ExtendedEntityReferenceItem $item): void {
30+
assertType('DrupalEntityReferenceItemGeneric\ExtendedEntityReferenceItem', $item);
31+
assertType('Drupal\node\NodeInterface|null', $item->entity);
32+
assertType('int|string|null', $item->target_id);
33+
}

0 commit comments

Comments
 (0)