@@ -204,100 +204,101 @@ public static function handleAddition(
204
204
if (($ array_arg_type = $ statements_analyzer ->node_data ->getType ($ array_arg ))
205
205
&& $ array_arg_type ->hasArray ()
206
206
) {
207
- $ array_type = $ array_arg_type ->getArray ();
207
+ $ array_types = $ array_arg_type ->getArrays ();
208
+ $ by_ref_type = new Union ([$ array_types ]);
208
209
209
- $ objectlike_list = null ;
210
+ foreach ($ array_types as $ array_type ) {
211
+ $ objectlike_list = null ;
210
212
211
- if ($ array_type instanceof TKeyedArray) {
212
- if ($ array_type ->is_list ) {
213
- $ objectlike_list = $ array_type ;
213
+ if ($ array_type instanceof TKeyedArray) {
214
+ if ($ array_type ->is_list ) {
215
+ $ objectlike_list = $ array_type ;
216
+ }
214
217
}
215
- }
216
218
217
- $ by_ref_type = new Union ([$ array_type ]);
218
-
219
- foreach ($ args as $ argument_offset => $ arg ) {
220
- if ($ argument_offset === 0 ) {
221
- continue ;
222
- }
219
+ foreach ($ args as $ argument_offset => $ arg ) {
220
+ if ($ argument_offset === 0 ) {
221
+ continue ;
222
+ }
223
223
224
- if (ExpressionAnalyzer::analyze (
225
- $ statements_analyzer ,
226
- $ arg ->value ,
227
- $ context ,
228
- ) === false ) {
229
- return false ;
230
- }
224
+ if (ExpressionAnalyzer::analyze (
225
+ $ statements_analyzer ,
226
+ $ arg ->value ,
227
+ $ context ,
228
+ ) === false ) {
229
+ return false ;
230
+ }
231
231
232
- if ($ method_id === 'array_unshift ' && $ nb_args === 2 && !$ unpacked_args ) {
233
- $ new_offset_type = Type::getInt (false , 0 );
234
- } else {
235
- $ new_offset_type = Type::getInt ();
236
- }
232
+ if ($ method_id === 'array_unshift ' && $ nb_args === 2 && !$ unpacked_args ) {
233
+ $ new_offset_type = Type::getInt (false , 0 );
234
+ } else {
235
+ $ new_offset_type = Type::getInt ();
236
+ }
237
237
238
- if (!($ arg_value_type = $ statements_analyzer ->node_data ->getType ($ arg ->value ))
238
+ if (!($ arg_value_type = $ statements_analyzer ->node_data ->getType ($ arg ->value ))
239
239
|| $ arg_value_type ->hasMixed ()
240
- ) {
241
- $ by_ref_type = Type::combineUnionTypes (
242
- $ by_ref_type ,
243
- new Union ([new TArray ([$ new_offset_type , Type::getMixed ()])]),
244
- );
245
- } elseif ($ arg ->unpack ) {
246
- $ arg_value_type = $ arg_value_type ->getBuilder ();
247
-
248
- foreach ($ arg_value_type ->getAtomicTypes () as $ arg_value_atomic_type ) {
249
- if ($ arg_value_atomic_type instanceof TKeyedArray) {
250
- $ was_list = $ arg_value_atomic_type ->is_list ;
251
-
252
- $ arg_value_atomic_type = $ arg_value_atomic_type ->getGenericArrayType ();
253
-
254
- if ($ was_list ) {
255
- if ($ arg_value_atomic_type instanceof TNonEmptyArray) {
256
- $ arg_value_atomic_type = Type::getNonEmptyListAtomic (
257
- $ arg_value_atomic_type ->type_params [1 ],
258
- );
259
- } else {
260
- $ arg_value_atomic_type = Type::getListAtomic (
261
- $ arg_value_atomic_type ->type_params [1 ],
262
- );
240
+ ) {
241
+ $ by_ref_type = Type::combineUnionTypes (
242
+ $ by_ref_type ,
243
+ new Union ([new TArray ([$ new_offset_type , Type::getMixed ()])]),
244
+ );
245
+ } elseif ($ arg ->unpack ) {
246
+ $ arg_value_type = $ arg_value_type ->getBuilder ();
247
+
248
+ foreach ($ arg_value_type ->getAtomicTypes () as $ arg_value_atomic_type ) {
249
+ if ($ arg_value_atomic_type instanceof TKeyedArray) {
250
+ $ was_list = $ arg_value_atomic_type ->is_list ;
251
+
252
+ $ arg_value_atomic_type = $ arg_value_atomic_type ->getGenericArrayType ();
253
+
254
+ if ($ was_list ) {
255
+ if ($ arg_value_atomic_type instanceof TNonEmptyArray) {
256
+ $ arg_value_atomic_type = Type::getNonEmptyListAtomic (
257
+ $ arg_value_atomic_type ->type_params [1 ],
258
+ );
259
+ } else {
260
+ $ arg_value_atomic_type = Type::getListAtomic (
261
+ $ arg_value_atomic_type ->type_params [1 ],
262
+ );
263
+ }
263
264
}
264
- }
265
265
266
- $ arg_value_type ->addType ($ arg_value_atomic_type );
266
+ $ arg_value_type ->addType ($ arg_value_atomic_type );
267
+ }
267
268
}
268
- }
269
- $ arg_value_type = $ arg_value_type ->freeze ();
269
+ $ arg_value_type = $ arg_value_type ->freeze ();
270
270
271
- $ by_ref_type = Type::combineUnionTypes (
272
- $ by_ref_type ,
273
- $ arg_value_type ,
274
- );
275
- } else {
276
- if ($ objectlike_list ) {
277
- $ properties = $ objectlike_list ->properties ;
278
- array_unshift ($ properties , $ arg_value_type );
279
-
280
- $ by_ref_type = new Union ([$ objectlike_list ->setProperties ($ properties )]);
281
- } elseif ($ array_type instanceof TArray && $ array_type ->isEmpty ()) {
282
- $ by_ref_type = new Union ([new TKeyedArray ([
283
- $ arg_value_type ,
284
- ], null , null , true )]);
285
- } else {
286
271
$ by_ref_type = Type::combineUnionTypes (
287
272
$ by_ref_type ,
288
- new Union (
289
- [
273
+ $ arg_value_type ,
274
+ );
275
+ } else {
276
+ if ($ objectlike_list ) {
277
+ $ properties = $ objectlike_list ->properties ;
278
+ array_unshift ($ properties , $ arg_value_type );
279
+
280
+ $ by_ref_type = new Union ([$ objectlike_list ->setProperties ($ properties )]);
281
+ } elseif ($ array_type instanceof TArray && $ array_type ->isEmpty ()) {
282
+ $ by_ref_type = new Union ([new TKeyedArray ([
283
+ $ arg_value_type ,
284
+ ], null , null , true )]);
285
+ } else {
286
+ $ by_ref_type = Type::combineUnionTypes (
287
+ $ by_ref_type ,
288
+ new Union (
289
+ [
290
290
new TNonEmptyArray (
291
291
[
292
292
$ new_offset_type ,
293
293
$ arg_value_type ,
294
294
],
295
295
),
296
- ],
297
- ),
298
- null ,
299
- true ,
300
- );
296
+ ],
297
+ ),
298
+ null ,
299
+ true ,
300
+ );
301
+ }
301
302
}
302
303
}
303
304
}
0 commit comments