@@ -786,7 +786,7 @@ private function handleAllNot(
786
786
): SpecifiedTypes
787
787
{
788
788
if ($ methodName === 'allNotNull ' ) {
789
- return $ this ->arrayOrIterable (
789
+ return $ this ->allArrayOrIterable (
790
790
$ scope ,
791
791
$ node ->getArgs ()[0 ]->value ,
792
792
static function (Type $ type ): Type {
@@ -806,7 +806,7 @@ static function (Type $type): Type {
806
806
return new SpecifiedTypes ([], []);
807
807
}
808
808
809
- return $ this ->arrayOrIterable (
809
+ return $ this ->allArrayOrIterable (
810
810
$ scope ,
811
811
$ node ->getArgs ()[0 ]->value ,
812
812
static function (Type $ type ) use ($ objectType ): Type {
@@ -817,7 +817,7 @@ static function (Type $type) use ($objectType): Type {
817
817
818
818
if ($ methodName === 'allNotSame ' ) {
819
819
$ valueType = $ scope ->getType ($ node ->getArgs ()[1 ]->value );
820
- return $ this ->arrayOrIterable (
820
+ return $ this ->allArrayOrIterable (
821
821
$ scope ,
822
822
$ node ->getArgs ()[0 ]->value ,
823
823
static function (Type $ type ) use ($ valueType ): Type {
@@ -864,7 +864,7 @@ private function handleAll(
864
864
$ type = $ typeModifier ($ type );
865
865
}
866
866
867
- return $ this ->arrayOrIterable (
867
+ return $ this ->allArrayOrIterable (
868
868
$ scope ,
869
869
$ node ->getArgs ()[0 ]->value ,
870
870
static function () use ($ type ): Type {
@@ -877,7 +877,7 @@ static function () use ($type): Type {
877
877
return $ specifiedTypes ;
878
878
}
879
879
880
- private function arrayOrIterable (
880
+ private function allArrayOrIterable (
881
881
Scope $ scope ,
882
882
Expr $ expr ,
883
883
Closure $ typeCallback ,
@@ -892,18 +892,30 @@ private function arrayOrIterable(
892
892
if ($ arrayType instanceof ConstantArrayType) {
893
893
$ builder = ConstantArrayTypeBuilder::createEmpty ();
894
894
foreach ($ arrayType ->getKeyTypes () as $ i => $ keyType ) {
895
- $ valueType = $ arrayType ->getValueTypes ()[$ i ];
896
- $ builder ->setOffsetValueType ($ keyType , $ typeCallback ($ valueType ), $ arrayType ->isOptionalKey ($ i ));
895
+ $ valueType = $ typeCallback ($ arrayType ->getValueTypes ()[$ i ]);
896
+ if ($ valueType instanceof NeverType) {
897
+ continue 2 ;
898
+ }
899
+ $ builder ->setOffsetValueType ($ keyType , $ valueType , $ arrayType ->isOptionalKey ($ i ));
897
900
}
898
901
$ newArrayTypes [] = $ builder ->getArray ();
899
902
} else {
900
- $ newArrayTypes [] = new ArrayType ($ arrayType ->getKeyType (), $ typeCallback ($ arrayType ->getItemType ()));
903
+ $ itemType = $ typeCallback ($ arrayType ->getItemType ());
904
+ if ($ itemType instanceof NeverType) {
905
+ continue ;
906
+ }
907
+ $ newArrayTypes [] = new ArrayType ($ arrayType ->getKeyType (), $ itemType );
901
908
}
902
909
}
903
910
904
911
$ specifiedType = TypeCombinator::union (...$ newArrayTypes );
905
912
} elseif ((new IterableType (new MixedType (), new MixedType ()))->isSuperTypeOf ($ currentType )->yes ()) {
906
- $ specifiedType = new IterableType ($ currentType ->getIterableKeyType (), $ typeCallback ($ currentType ->getIterableValueType ()));
913
+ $ itemType = $ typeCallback ($ currentType ->getIterableValueType ());
914
+ if ($ itemType instanceof NeverType) {
915
+ $ specifiedType = $ itemType ;
916
+ } else {
917
+ $ specifiedType = new IterableType ($ currentType ->getIterableKeyType (), $ itemType );
918
+ }
907
919
} else {
908
920
return new SpecifiedTypes ([], []);
909
921
}
0 commit comments