Skip to content

Commit 7fd5022

Browse files
authored
TypeCombinator returns non-empty-array for union of isIterableAtLeastOnce()->yes()
1 parent 5df4617 commit 7fd5022

8 files changed

+47
-17
lines changed

src/Type/Php/ArrayFlipFunctionReturnTypeExtension.php

+7-1
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
use PHPStan\Analyser\Scope;
77
use PHPStan\Php\PhpVersion;
88
use PHPStan\Reflection\FunctionReflection;
9+
use PHPStan\Type\Accessory\NonEmptyArrayType;
910
use PHPStan\Type\DynamicFunctionReturnTypeExtension;
1011
use PHPStan\Type\NeverType;
1112
use PHPStan\Type\NullType;
1213
use PHPStan\Type\Type;
14+
use PHPStan\Type\TypeCombinator;
1315
use function count;
1416

1517
final class ArrayFlipFunctionReturnTypeExtension implements DynamicFunctionReturnTypeExtension
@@ -35,7 +37,11 @@ public function getTypeFromFunctionCall(FunctionReflection $functionReflection,
3537
return $this->phpVersion->arrayFunctionsReturnNullWithNonArray() ? new NullType() : new NeverType();
3638
}
3739

38-
return $arrayType->flipArray();
40+
$flipped = $arrayType->flipArray();
41+
if ($arrayType->isIterableAtLeastOnce()->yes()) {
42+
return TypeCombinator::intersect($flipped, new NonEmptyArrayType());
43+
}
44+
return $flipped;
3945
}
4046

4147
}

src/Type/TypeCombinator.php

+8
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace PHPStan\Type;
44

5+
use PHPStan\TrinaryLogic;
56
use PHPStan\Type\Accessory\AccessoryArrayListType;
67
use PHPStan\Type\Accessory\AccessoryLowercaseStringType;
78
use PHPStan\Type\Accessory\AccessoryNonEmptyStringType;
@@ -639,8 +640,11 @@ private static function intersectWithSubtractedType(
639640
*/
640641
private static function processArrayAccessoryTypes(array $arrayTypes): array
641642
{
643+
$isIterableAtLeastOnce = [];
642644
$accessoryTypes = [];
643645
foreach ($arrayTypes as $i => $arrayType) {
646+
$isIterableAtLeastOnce[] = $arrayType->isIterableAtLeastOnce();
647+
644648
if ($arrayType instanceof IntersectionType) {
645649
foreach ($arrayType->getTypes() as $innerType) {
646650
if ($innerType instanceof TemplateType) {
@@ -703,6 +707,10 @@ private static function processArrayAccessoryTypes(array $arrayTypes): array
703707
$commonAccessoryTypes[] = $accessoryType[0];
704708
}
705709

710+
if (TrinaryLogic::createYes()->and(...$isIterableAtLeastOnce)->yes()) {
711+
$commonAccessoryTypes[] = new NonEmptyArrayType();
712+
}
713+
706714
return $commonAccessoryTypes;
707715
}
708716

tests/PHPStan/Analyser/TypeSpecifierTest.php

+4-4
Original file line numberDiff line numberDiff line change
@@ -1034,7 +1034,7 @@ public function dataCondition(): iterable
10341034
]),
10351035
),
10361036
[
1037-
'$array' => 'array',
1037+
'$array' => 'non-empty-array',
10381038
],
10391039
[
10401040
'$array' => '~hasOffset(\'bar\')|hasOffset(\'foo\')',
@@ -1055,7 +1055,7 @@ public function dataCondition(): iterable
10551055
'$array' => '~hasOffset(\'bar\')|hasOffset(\'foo\')',
10561056
],
10571057
[
1058-
'$array' => 'array',
1058+
'$array' => 'non-empty-array',
10591059
],
10601060
],
10611061
[
@@ -1082,7 +1082,7 @@ public function dataCondition(): iterable
10821082
]),
10831083
),
10841084
[
1085-
'$array' => 'array',
1085+
'$array' => 'non-empty-array',
10861086
],
10871087
[
10881088
'$array' => '~hasOffset(\'bar\')|hasOffset(\'foo\')',
@@ -1103,7 +1103,7 @@ public function dataCondition(): iterable
11031103
'$array' => '~hasOffset(\'bar\')|hasOffset(\'foo\')',
11041104
],
11051105
[
1106-
'$array' => 'array',
1106+
'$array' => 'non-empty-array',
11071107
],
11081108
],
11091109
[

tests/PHPStan/Analyser/nsrt/array-flip.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,12 @@ function foo10(array $array)
7272
{
7373
if (array_key_exists('foo', $array)) {
7474
assertType('non-empty-array<string, int>&hasOffset(\'foo\')', $array);
75-
assertType('array<int, string>', array_flip($array));
75+
assertType('non-empty-array<int, string>', array_flip($array));
7676
}
7777

7878
if (array_key_exists('foo', $array) && is_int($array['foo'])) {
7979
assertType("non-empty-array<string, int>&hasOffsetValue('foo', int)", $array);
80-
assertType('array<int, string>', array_flip($array));
80+
assertType('non-empty-array<int, string>', array_flip($array));
8181
}
8282

8383
if (array_key_exists('foo', $array) && $array['foo'] === 17) {

tests/PHPStan/Analyser/nsrt/bug-4565.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ function test(array $variables) {
1414
unset($attributes['href']);
1515
assertType("non-empty-array<mixed~'href', mixed>&hasOffsetValue('type', 'button')", $attributes);
1616
}
17-
assertType('array', $attributes);
17+
assertType('non-empty-array', $attributes);
1818
return $attributes;
1919
}

tests/PHPStan/Analyser/nsrt/conditional-vars.php

+8-6
Original file line numberDiff line numberDiff line change
@@ -10,27 +10,29 @@ class HelloWorld
1010
public function conditionalVarInTernary(array $innerHits): void
1111
{
1212
if (array_key_exists('nearest_premise', $innerHits) || array_key_exists('matching_premises', $innerHits)) {
13-
assertType('array', $innerHits);
13+
assertType('non-empty-array', $innerHits);
1414
$x = array_key_exists('nearest_premise', $innerHits)
1515
? assertType("non-empty-array&hasOffset('nearest_premise')", $innerHits)
16-
: assertType('array', $innerHits);
16+
: assertType('non-empty-array', $innerHits);
1717

18-
assertType('array', $innerHits);
18+
assertType('non-empty-array', $innerHits);
1919
}
20+
assertType('array', $innerHits);
2021
}
2122

2223
/** @param array<mixed> $innerHits */
2324
public function conditionalVarInIf(array $innerHits): void
2425
{
2526
if (array_key_exists('nearest_premise', $innerHits) || array_key_exists('matching_premises', $innerHits)) {
26-
assertType('array', $innerHits);
27+
assertType('non-empty-array', $innerHits);
2728
if (array_key_exists('nearest_premise', $innerHits)) {
2829
assertType("non-empty-array&hasOffset('nearest_premise')", $innerHits);
2930
} else {
30-
assertType('array', $innerHits);
31+
assertType('non-empty-array', $innerHits);
3132
}
3233

33-
assertType('array', $innerHits);
34+
assertType('non-empty-array', $innerHits);
3435
}
36+
assertType('array', $innerHits);
3537
}
3638
}

tests/PHPStan/Rules/Methods/ReturnTypeRuleTest.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -870,7 +870,7 @@ public function testBug8146bErrors(): void
870870
$this->checkBenevolentUnionTypes = true;
871871
$this->analyse([__DIR__ . '/data/bug-8146b-errors.php'], [
872872
[
873-
"Method Bug8146bError\LocationFixtures::getData() should return array<non-empty-string, array<non-empty-string, array{constituencies: non-empty-list<non-empty-string>, coordinates: array{lat: float, lng: float}}>> but returns array{Bács-Kiskun: array{Ágasegyháza: array{constituencies: array{'Bács-Kiskun 4.', true, false, Bug8146bError\X, null}, coordinates: array{lat: 46.8386043, lng: 19.4502899}}, Akasztó: array{constituencies: array{'Bács-Kiskun 3.'}, coordinates: array{lat: 46.6898175, lng: 19.205086}}, Apostag: array{constituencies: array{'Bács-Kiskun 3.'}, coordinates: array{lat: 46.8812652, lng: 18.9648478}}, Bácsalmás: array{constituencies: array{'Bács-Kiskun 5.'}, coordinates: array{lat: 46.1250396, lng: 19.3357509}}, Bácsbokod: array{constituencies: array{'Bács-Kiskun 6.'}, coordinates: array{lat: 46.1234737, lng: 19.155708}}, Bácsborsód: array{constituencies: array{'Bács-Kiskun 6.'}, coordinates: array{lat: 46.0989373, lng: 19.1566725}}, Bácsszentgyörgy: array{constituencies: array{'Bács-Kiskun 6.'}, coordinates: array{lat: 45.9746039, lng: 19.0398066}}, Bácsszőlős: array{constituencies: array{'Bács-Kiskun 5.'}, coordinates: array{lat: 46.1352003, lng: 19.4215997}}, ...}, Baranya: non-empty-array<literal-string&non-falsy-string, non-empty-array<literal-string&non-falsy-string, array<int<0, max>|(literal-string&non-falsy-string), float|(literal-string&non-falsy-string)>>>, Békés: array{Almáskamarás: array{constituencies: array{'Békés 4.'}, coordinates: array{lat: 46.4617785, lng: 21.092448}}, Battonya: array{constituencies: array{'Békés 4.'}, coordinates: array{lat: 46.2902462, lng: 21.0199215}}, Békés: array{constituencies: array{'Békés 2.'}, coordinates: array{lat: 46.6704899, lng: 21.0434996}}, Békéscsaba: array{constituencies: array{'Békés 1.'}, coordinates: array{lat: 46.6735939, lng: 21.0877309}}, Békéssámson: array{constituencies: array{'Békés 4.'}, coordinates: array{lat: 46.4208677, lng: 20.6176498}}, Békésszentandrás: array{constituencies: array{'Békés 2.'}, coordinates: array{lat: 46.8715996, lng: 20.48336}}, Bélmegyer: array{constituencies: array{'Békés 3.'}, coordinates: array{lat: 46.8726019, lng: 21.1832832}}, Biharugra: array{constituencies: array{'Békés 3.'}, coordinates: array{lat: 46.9691009, lng: 21.5987651}}, ...}, Borsod-Abaúj-Zemplén: non-empty-array<literal-string&non-falsy-string, non-empty-array<literal-string&non-falsy-string, array<int<0, max>|(literal-string&non-falsy-string), float|(literal-string&non-falsy-string)>>>, Budapest: array{Budapest I. ker.: array{constituencies: array{'Budapest 01.'}, coordinates: array{lat: 47.4968219, lng: 19.037458}}, Budapest II. ker.: array{constituencies: array{'Budapest 03.', 'Budapest 04.'}, coordinates: array{lat: 47.5393329, lng: 18.986934}}, Budapest III. ker.: array{constituencies: array{'Budapest 04.', 'Budapest 10.'}, coordinates: array{lat: 47.5671768, lng: 19.0368517}}, Budapest IV. ker.: array{constituencies: array{'Budapest 11.', 'Budapest 12.'}, coordinates: array{lat: 47.5648915, lng: 19.0913149}}, Budapest V. ker.: array{constituencies: array{'Budapest 01.'}, coordinates: array{lat: 47.5002319, lng: 19.0520181}}, Budapest VI. ker.: array{constituencies: array{'Budapest 05.'}, coordinates: array{lat: 47.509863, lng: 19.0625813}}, Budapest VII. ker.: array{constituencies: array{'Budapest 05.'}, coordinates: array{lat: 47.5027289, lng: 19.073376}}, Budapest VIII. ker.: array{constituencies: array{'Budapest 01.', 'Budapest 06.'}, coordinates: array{lat: 47.4894184, lng: 19.070668}}, ...}, Csongrád-Csanád: array{Algyő: array{constituencies: array{'Csongrád-Csanád 4.'}, coordinates: array{lat: 46.3329625, lng: 20.207889}}, Ambrózfalva: array{constituencies: array{'Csongrád-Csanád 4.'}, coordinates: array{lat: 46.3501417, lng: 20.7313995}}, Apátfalva: array{constituencies: array{'Csongrád-Csanád 4.'}, coordinates: array{lat: 46.173317, lng: 20.5800472}}, Árpádhalom: array{constituencies: array{'Csongrád-Csanád 3.'}, coordinates: array{lat: 46.6158286, lng: 20.547733}}, Ásotthalom: array{constituencies: array{'Csongrád-Csanád 2.'}, coordinates: array{lat: 46.1995983, lng: 19.7833756}}, Baks: array{constituencies: array{'Csongrád-Csanád 3.'}, coordinates: array{lat: 46.5518708, lng: 20.1064166}}, Balástya: array{constituencies: array{'Csongrád-Csanád 3.'}, coordinates: array{lat: 46.4261828, lng: 20.004933}}, Bordány: array{constituencies: array{'Csongrád-Csanád 2.'}, coordinates: array{lat: 46.3194213, lng: 19.9227063}}, ...}, Fejér: array{Aba: array{constituencies: array{'Fejér 5.'}, coordinates: array{lat: 47.0328193, lng: 18.522359}}, Adony: array{constituencies: array{'Fejér 4.'}, coordinates: array{lat: 47.119831, lng: 18.8612469}}, Alap: array{constituencies: array{'Fejér 5.'}, coordinates: array{lat: 46.8075763, lng: 18.684028}}, Alcsútdoboz: array{constituencies: array{'Fejér 3.'}, coordinates: array{lat: 47.4277067, lng: 18.6030325}}, Alsószentiván: array{constituencies: array{'Fejér 5.'}, coordinates: array{lat: 46.7910573, lng: 18.732161}}, Bakonycsernye: array{constituencies: array{'Fejér 2.'}, coordinates: array{lat: 47.321719, lng: 18.0907379}}, Bakonykúti: array{constituencies: array{'Fejér 2.'}, coordinates: array{lat: 47.2458464, lng: 18.195769}}, Balinka: array{constituencies: array{'Fejér 2.'}, coordinates: array{lat: 47.3135736, lng: 18.1907168}}, ...}, Győr-Moson-Sopron: array{Abda: array{constituencies: array{'Győr-Moson-Sopron 5.'}, coordinates: array{lat: 47.6962149, lng: 17.5445786}}, Acsalag: array{constituencies: array{'Győr-Moson-Sopron 3.'}, coordinates: array{lat: 47.676095, lng: 17.1977771}}, Ágfalva: array{constituencies: array{'Győr-Moson-Sopron 4.'}, coordinates: array{lat: 47.688862, lng: 16.5110233}}, Agyagosszergény: array{constituencies: array{'Győr-Moson-Sopron 3.'}, coordinates: array{lat: 47.608545, lng: 16.9409912}}, Árpás: array{constituencies: array{'Győr-Moson-Sopron 3.'}, coordinates: array{lat: 47.5134127, lng: 17.3931579}}, Ásványráró: array{constituencies: array{'Győr-Moson-Sopron 5.'}, coordinates: array{lat: 47.8287695, lng: 17.499195}}, Babót: array{constituencies: array{'Győr-Moson-Sopron 3.'}, coordinates: array{lat: 47.5752269, lng: 17.0758604}}, Bágyogszovát: array{constituencies: array{'Győr-Moson-Sopron 3.'}, coordinates: array{lat: 47.5866036, lng: 17.3617273}}, ...}, ...}.",
873+
"Method Bug8146bError\LocationFixtures::getData() should return array<non-empty-string, array<non-empty-string, array{constituencies: non-empty-list<non-empty-string>, coordinates: array{lat: float, lng: float}}>> but returns array{Bács-Kiskun: array{Ágasegyháza: array{constituencies: array{'Bács-Kiskun 4.', true, false, Bug8146bError\X, null}, coordinates: array{lat: 46.8386043, lng: 19.4502899}}, Akasztó: array{constituencies: array{'Bács-Kiskun 3.'}, coordinates: array{lat: 46.6898175, lng: 19.205086}}, Apostag: array{constituencies: array{'Bács-Kiskun 3.'}, coordinates: array{lat: 46.8812652, lng: 18.9648478}}, Bácsalmás: array{constituencies: array{'Bács-Kiskun 5.'}, coordinates: array{lat: 46.1250396, lng: 19.3357509}}, Bácsbokod: array{constituencies: array{'Bács-Kiskun 6.'}, coordinates: array{lat: 46.1234737, lng: 19.155708}}, Bácsborsód: array{constituencies: array{'Bács-Kiskun 6.'}, coordinates: array{lat: 46.0989373, lng: 19.1566725}}, Bácsszentgyörgy: array{constituencies: array{'Bács-Kiskun 6.'}, coordinates: array{lat: 45.9746039, lng: 19.0398066}}, Bácsszőlős: array{constituencies: array{'Bács-Kiskun 5.'}, coordinates: array{lat: 46.1352003, lng: 19.4215997}}, ...}, Baranya: non-empty-array<literal-string&non-falsy-string, non-empty-array<literal-string&non-falsy-string, non-empty-array<int<0, max>|(literal-string&non-falsy-string), float|(literal-string&non-falsy-string)>>>, Békés: array{Almáskamarás: array{constituencies: array{'Békés 4.'}, coordinates: array{lat: 46.4617785, lng: 21.092448}}, Battonya: array{constituencies: array{'Békés 4.'}, coordinates: array{lat: 46.2902462, lng: 21.0199215}}, Békés: array{constituencies: array{'Békés 2.'}, coordinates: array{lat: 46.6704899, lng: 21.0434996}}, Békéscsaba: array{constituencies: array{'Békés 1.'}, coordinates: array{lat: 46.6735939, lng: 21.0877309}}, Békéssámson: array{constituencies: array{'Békés 4.'}, coordinates: array{lat: 46.4208677, lng: 20.6176498}}, Békésszentandrás: array{constituencies: array{'Békés 2.'}, coordinates: array{lat: 46.8715996, lng: 20.48336}}, Bélmegyer: array{constituencies: array{'Békés 3.'}, coordinates: array{lat: 46.8726019, lng: 21.1832832}}, Biharugra: array{constituencies: array{'Békés 3.'}, coordinates: array{lat: 46.9691009, lng: 21.5987651}}, ...}, Borsod-Abaúj-Zemplén: non-empty-array<literal-string&non-falsy-string, non-empty-array<literal-string&non-falsy-string, non-empty-array<int<0, max>|(literal-string&non-falsy-string), float|(literal-string&non-falsy-string)>>>, Budapest: array{Budapest I. ker.: array{constituencies: array{'Budapest 01.'}, coordinates: array{lat: 47.4968219, lng: 19.037458}}, Budapest II. ker.: array{constituencies: array{'Budapest 03.', 'Budapest 04.'}, coordinates: array{lat: 47.5393329, lng: 18.986934}}, Budapest III. ker.: array{constituencies: array{'Budapest 04.', 'Budapest 10.'}, coordinates: array{lat: 47.5671768, lng: 19.0368517}}, Budapest IV. ker.: array{constituencies: array{'Budapest 11.', 'Budapest 12.'}, coordinates: array{lat: 47.5648915, lng: 19.0913149}}, Budapest V. ker.: array{constituencies: array{'Budapest 01.'}, coordinates: array{lat: 47.5002319, lng: 19.0520181}}, Budapest VI. ker.: array{constituencies: array{'Budapest 05.'}, coordinates: array{lat: 47.509863, lng: 19.0625813}}, Budapest VII. ker.: array{constituencies: array{'Budapest 05.'}, coordinates: array{lat: 47.5027289, lng: 19.073376}}, Budapest VIII. ker.: array{constituencies: array{'Budapest 01.', 'Budapest 06.'}, coordinates: array{lat: 47.4894184, lng: 19.070668}}, ...}, Csongrád-Csanád: array{Algyő: array{constituencies: array{'Csongrád-Csanád 4.'}, coordinates: array{lat: 46.3329625, lng: 20.207889}}, Ambrózfalva: array{constituencies: array{'Csongrád-Csanád 4.'}, coordinates: array{lat: 46.3501417, lng: 20.7313995}}, Apátfalva: array{constituencies: array{'Csongrád-Csanád 4.'}, coordinates: array{lat: 46.173317, lng: 20.5800472}}, Árpádhalom: array{constituencies: array{'Csongrád-Csanád 3.'}, coordinates: array{lat: 46.6158286, lng: 20.547733}}, Ásotthalom: array{constituencies: array{'Csongrád-Csanád 2.'}, coordinates: array{lat: 46.1995983, lng: 19.7833756}}, Baks: array{constituencies: array{'Csongrád-Csanád 3.'}, coordinates: array{lat: 46.5518708, lng: 20.1064166}}, Balástya: array{constituencies: array{'Csongrád-Csanád 3.'}, coordinates: array{lat: 46.4261828, lng: 20.004933}}, Bordány: array{constituencies: array{'Csongrád-Csanád 2.'}, coordinates: array{lat: 46.3194213, lng: 19.9227063}}, ...}, Fejér: array{Aba: array{constituencies: array{'Fejér 5.'}, coordinates: array{lat: 47.0328193, lng: 18.522359}}, Adony: array{constituencies: array{'Fejér 4.'}, coordinates: array{lat: 47.119831, lng: 18.8612469}}, Alap: array{constituencies: array{'Fejér 5.'}, coordinates: array{lat: 46.8075763, lng: 18.684028}}, Alcsútdoboz: array{constituencies: array{'Fejér 3.'}, coordinates: array{lat: 47.4277067, lng: 18.6030325}}, Alsószentiván: array{constituencies: array{'Fejér 5.'}, coordinates: array{lat: 46.7910573, lng: 18.732161}}, Bakonycsernye: array{constituencies: array{'Fejér 2.'}, coordinates: array{lat: 47.321719, lng: 18.0907379}}, Bakonykúti: array{constituencies: array{'Fejér 2.'}, coordinates: array{lat: 47.2458464, lng: 18.195769}}, Balinka: array{constituencies: array{'Fejér 2.'}, coordinates: array{lat: 47.3135736, lng: 18.1907168}}, ...}, Győr-Moson-Sopron: array{Abda: array{constituencies: array{'Győr-Moson-Sopron 5.'}, coordinates: array{lat: 47.6962149, lng: 17.5445786}}, Acsalag: array{constituencies: array{'Győr-Moson-Sopron 3.'}, coordinates: array{lat: 47.676095, lng: 17.1977771}}, Ágfalva: array{constituencies: array{'Győr-Moson-Sopron 4.'}, coordinates: array{lat: 47.688862, lng: 16.5110233}}, Agyagosszergény: array{constituencies: array{'Győr-Moson-Sopron 3.'}, coordinates: array{lat: 47.608545, lng: 16.9409912}}, Árpás: array{constituencies: array{'Győr-Moson-Sopron 3.'}, coordinates: array{lat: 47.5134127, lng: 17.3931579}}, Ásványráró: array{constituencies: array{'Győr-Moson-Sopron 5.'}, coordinates: array{lat: 47.8287695, lng: 17.499195}}, Babót: array{constituencies: array{'Győr-Moson-Sopron 3.'}, coordinates: array{lat: 47.5752269, lng: 17.0758604}}, Bágyogszovát: array{constituencies: array{'Győr-Moson-Sopron 3.'}, coordinates: array{lat: 47.5866036, lng: 17.3617273}}, ...}, ...}.",
874874
12,
875875
"Offset 'constituencies' (non-empty-list<non-empty-string>) does not accept type array{'Bács-Kiskun 4.', true, false, Bug8146bError\X, null}.",
876876
],

tests/PHPStan/Type/TypeCombinatorTest.php

+16-2
Original file line numberDiff line numberDiff line change
@@ -953,8 +953,8 @@ public function dataUnion(): iterable
953953
new HasOffsetType(new ConstantStringType('bar')),
954954
]),
955955
],
956-
ArrayType::class,
957-
'array',
956+
IntersectionType::class,
957+
'non-empty-array',
958958
],
959959
[
960960
[
@@ -971,6 +971,20 @@ public function dataUnion(): iterable
971971
IntersectionType::class,
972972
'non-empty-array&hasOffsetValue(\'foo\', mixed)',
973973
],
974+
[
975+
[
976+
new IntersectionType([
977+
new ArrayType(new MixedType(), new MixedType()),
978+
new HasOffsetType(new ConstantStringType('foo')),
979+
]),
980+
new IntersectionType([
981+
new ArrayType(new MixedType(), new MixedType()),
982+
new HasOffsetValueType(new ConstantIntegerType(2), new ConstantStringType('foo')),
983+
]),
984+
],
985+
IntersectionType::class,
986+
'non-empty-array',
987+
],
974988
[
975989
[
976990
new BenevolentUnionType([new IntegerType(), new StringType()]),

0 commit comments

Comments
 (0)