@@ -1087,10 +1087,7 @@ private function specifyTypesForCountFuncCall(
1087
1087
if (
1088
1088
$ sizeType instanceof ConstantIntegerType
1089
1089
&& $ sizeType ->getValue () < ConstantArrayTypeBuilder::ARRAY_COUNT_LIMIT
1090
- && (
1091
- $ isList ->yes ()
1092
- || $ isConstantArray ->yes () && $ arrayType ->getKeyType ()->isSuperTypeOf (IntegerRangeType::fromInterval (0 , $ sizeType ->getValue () - 1 ))->yes ()
1093
- )
1090
+ && $ arrayType ->getKeyType ()->isSuperTypeOf (IntegerRangeType::fromInterval (0 , $ sizeType ->getValue () - 1 ))->yes ()
1094
1091
) {
1095
1092
// turn optional offsets non-optional
1096
1093
$ valueTypesBuilder = ConstantArrayTypeBuilder::createEmpty ();
@@ -1105,21 +1102,23 @@ private function specifyTypesForCountFuncCall(
1105
1102
if (
1106
1103
$ sizeType instanceof IntegerRangeType
1107
1104
&& $ sizeType ->getMin () !== null
1108
- && (
1109
- $ isList ->yes ()
1110
- || $ isConstantArray ->yes () && $ arrayType ->getKeyType ()->isSuperTypeOf (IntegerRangeType::fromInterval (0 , $ sizeType ->getMin () - 1 ))->yes ()
1111
- )
1105
+ && $ sizeType ->getMin () < ConstantArrayTypeBuilder::ARRAY_COUNT_LIMIT
1106
+ && $ arrayType ->getKeyType ()->isSuperTypeOf (IntegerRangeType::fromInterval (0 , ($ sizeType ->getMax () ?? $ sizeType ->getMin ()) - 1 ))->yes ()
1112
1107
) {
1108
+ $ builderData = [];
1113
1109
// turn optional offsets non-optional
1114
- $ valueTypesBuilder = ConstantArrayTypeBuilder::createEmpty ();
1115
1110
for ($ i = 0 ; $ i < $ sizeType ->getMin (); $ i ++) {
1116
1111
$ offsetType = new ConstantIntegerType ($ i );
1117
- $ valueTypesBuilder -> setOffsetValueType ( $ offsetType , $ arrayType ->getOffsetValueType ($ offsetType )) ;
1112
+ $ builderData [] = [ $ offsetType , $ arrayType ->getOffsetValueType ($ offsetType ), false ] ;
1118
1113
}
1119
1114
if ($ sizeType ->getMax () !== null ) {
1115
+ if ($ sizeType ->getMax () - $ sizeType ->getMin () > ConstantArrayTypeBuilder::ARRAY_COUNT_LIMIT ) {
1116
+ $ resultTypes [] = $ arrayType ;
1117
+ continue ;
1118
+ }
1120
1119
for ($ i = $ sizeType ->getMin (); $ i < $ sizeType ->getMax (); $ i ++) {
1121
1120
$ offsetType = new ConstantIntegerType ($ i );
1122
- $ valueTypesBuilder -> setOffsetValueType ( $ offsetType , $ arrayType ->getOffsetValueType ($ offsetType ), true ) ;
1121
+ $ builderData [] = [ $ offsetType , $ arrayType ->getOffsetValueType ($ offsetType ), true ] ;
1123
1122
}
1124
1123
} elseif ($ arrayType ->isConstantArray ()->yes ()) {
1125
1124
for ($ i = $ sizeType ->getMin ();; $ i ++) {
@@ -1128,14 +1127,24 @@ private function specifyTypesForCountFuncCall(
1128
1127
if ($ hasOffset ->no ()) {
1129
1128
break ;
1130
1129
}
1131
- $ valueTypesBuilder -> setOffsetValueType ( $ offsetType , $ arrayType ->getOffsetValueType ($ offsetType ), !$ hasOffset ->yes ()) ;
1130
+ $ builderData [] = [ $ offsetType , $ arrayType ->getOffsetValueType ($ offsetType ), !$ hasOffset ->yes ()] ;
1132
1131
}
1133
1132
} else {
1134
1133
$ resultTypes [] = TypeCombinator::intersect ($ arrayType , new NonEmptyArrayType ());
1135
1134
continue ;
1136
1135
}
1137
1136
1138
- $ resultTypes [] = $ valueTypesBuilder ->getArray ();
1137
+ if (count ($ builderData ) > ConstantArrayTypeBuilder::ARRAY_COUNT_LIMIT ) {
1138
+ $ resultTypes [] = $ arrayType ;
1139
+ continue ;
1140
+ }
1141
+
1142
+ $ builder = ConstantArrayTypeBuilder::createEmpty ();
1143
+ foreach ($ builderData as [$ offsetType , $ valueType , $ optional ]) {
1144
+ $ builder ->setOffsetValueType ($ offsetType , $ valueType , $ optional );
1145
+ }
1146
+
1147
+ $ resultTypes [] = $ builder ->getArray ();
1139
1148
continue ;
1140
1149
}
1141
1150
0 commit comments