@@ -265,6 +265,7 @@ public function processExpr(NodeScopeResolver $nodeScopeResolver, Stmt $stmt, Ex
265265 }
266266 }
267267
268+ $ scopeBeforeArgs = $ scope ;
268269 $ argsResult = $ nodeScopeResolver ->processArgs ($ stmt , $ functionReflection , null , $ parametersAcceptor , $ normalizedExpr , $ scope , $ storage , $ nodeCallbackForArgs , $ context );
269270 $ scope = $ argsResult ->getScope ();
270271 $ hasYield = $ argsResult ->hasYield ();
@@ -395,8 +396,8 @@ public function processExpr(NodeScopeResolver $nodeScopeResolver, Stmt $stmt, Ex
395396 $ stmt ,
396397 $ arrayArg ,
397398 new NativeTypeExpr (
398- $ this ->getArrayFunctionAppendingType ($ functionReflection , $ scope , $ normalizedExpr ),
399- $ this ->getArrayFunctionAppendingType ($ functionReflection , $ scope ->doNotTreatPhpDocTypesAsCertain (), $ normalizedExpr ),
399+ $ this ->getArrayFunctionAppendingType ($ functionReflection , $ scopeBeforeArgs , $ normalizedExpr ),
400+ $ this ->getArrayFunctionAppendingType ($ functionReflection , $ scopeBeforeArgs ->doNotTreatPhpDocTypesAsCertain (), $ normalizedExpr ),
400401 ),
401402 $ nodeCallback ,
402403 )->getScope ();
@@ -434,9 +435,22 @@ public function processExpr(NodeScopeResolver $nodeScopeResolver, Stmt $stmt, Ex
434435 $ arrayArgType = $ scope ->getType ($ arrayArg );
435436 $ arrayArgNativeType = $ scope ->getNativeType ($ arrayArg );
436437
437- $ offsetType = $ scope ->getType ($ normalizedExpr ->getArgs ()[1 ]->value );
438- $ lengthType = isset ($ normalizedExpr ->getArgs ()[2 ]) ? $ scope ->getType ($ normalizedExpr ->getArgs ()[2 ]->value ) : new NullType ();
439- $ replacementType = isset ($ normalizedExpr ->getArgs ()[3 ]) ? $ scope ->getType ($ normalizedExpr ->getArgs ()[3 ]->value ) : new ConstantArrayType ([], []);
438+ $ offsetType = $ scopeBeforeArgs ->getType ($ normalizedExpr ->getArgs ()[1 ]->value );
439+
440+ if (isset ($ normalizedExpr ->getArgs ()[2 ])) {
441+ $ lengthType = $ scopeBeforeArgs ->getType ($ normalizedExpr ->getArgs ()[2 ]->value );
442+ } else {
443+ $ lengthType = new NullType ();
444+ }
445+
446+ if (isset ($ normalizedExpr ->getArgs ()[3 ])) {
447+ $ replacementArg = $ normalizedExpr ->getArgs ()[3 ]->value ;
448+ $ replacementType = $ scopeBeforeArgs ->getType ($ replacementArg );
449+ $ replacementNativeType = $ scopeBeforeArgs ->getNativeType ($ replacementArg );
450+ } else {
451+ $ replacementType = new ConstantArrayType ([], []);
452+ $ replacementNativeType = new ConstantArrayType ([], []);
453+ }
440454
441455 $ scope = $ nodeScopeResolver ->processVirtualAssign (
442456 $ scope ,
@@ -445,7 +459,7 @@ public function processExpr(NodeScopeResolver $nodeScopeResolver, Stmt $stmt, Ex
445459 $ arrayArg ,
446460 new NativeTypeExpr (
447461 $ arrayArgType ->spliceArray ($ offsetType , $ lengthType , $ replacementType ),
448- $ arrayArgNativeType ->spliceArray ($ offsetType , $ lengthType , $ replacementType ),
462+ $ arrayArgNativeType ->spliceArray ($ offsetType , $ lengthType , $ replacementNativeType ),
449463 ),
450464 $ nodeCallback ,
451465 )->getScope ();
0 commit comments