@@ -1863,7 +1863,7 @@ function (MutatingScope $scope) use ($expr, $nodeCallback, $context): Expression
18631863
18641864 $ arrayArg = $ expr ->getArgs ()[0 ]->value ;
18651865 $ originalArrayType = $ scope ->getType ($ arrayArg );
1866- $ constantArrays = TypeUtils::getConstantArrays ($ originalArrayType );
1866+ $ constantArrays = TypeUtils::getOldConstantArrays ($ originalArrayType );
18671867 if (
18681868 $ functionReflection ->getName () === 'array_push '
18691869 || ($ originalArrayType ->isArray ()->yes () && count ($ constantArrays ) === 0 )
@@ -1881,24 +1881,36 @@ function (MutatingScope $scope) use ($expr, $nodeCallback, $context): Expression
18811881 }
18821882
18831883 $ defaultArrayType = $ defaultArrayBuilder ->getArray ();
1884+ if (!$ defaultArrayType instanceof ConstantArrayType) {
1885+ $ arrayType = $ originalArrayType ;
1886+ foreach ($ argumentTypes as $ argType ) {
1887+ $ arrayType = $ arrayType ->setOffsetValueType (null , $ argType );
1888+ }
18841889
1885- $ arrayTypes = [];
1886- foreach ($ constantArrays as $ constantArray ) {
1887- $ arrayType = $ defaultArrayType ;
1888- foreach ($ constantArray ->getKeyTypes () as $ i => $ keyType ) {
1889- $ valueType = $ constantArray ->getValueTypes ()[$ i ];
1890- if ($ keyType instanceof ConstantIntegerType) {
1891- $ keyType = null ;
1890+ $ scope = $ scope ->invalidateExpression ($ arrayArg )->specifyExpressionType ($ arrayArg , TypeCombinator::intersect ($ arrayType , new NonEmptyArrayType ()));
1891+ } else {
1892+ $ arrayTypes = [];
1893+ foreach ($ constantArrays as $ constantArray ) {
1894+ $ arrayTypeBuilder = ConstantArrayTypeBuilder::createFromConstantArray ($ defaultArrayType );
1895+ foreach ($ constantArray ->getKeyTypes () as $ i => $ keyType ) {
1896+ $ valueType = $ constantArray ->getValueTypes ()[$ i ];
1897+ if ($ keyType instanceof ConstantIntegerType) {
1898+ $ keyType = null ;
1899+ }
1900+ $ arrayTypeBuilder ->setOffsetValueType (
1901+ $ keyType ,
1902+ $ valueType ,
1903+ $ constantArray ->isOptionalKey ($ i ),
1904+ );
18921905 }
1893- $ arrayType = $ arrayType -> setOffsetValueType ( $ keyType , $ valueType );
1906+ $ arrayTypes [] = $ arrayTypeBuilder -> getArray ( );
18941907 }
1895- $ arrayTypes [] = $ arrayType ;
1896- }
18971908
1898- $ scope = $ scope ->invalidateExpression ($ arrayArg )->specifyExpressionType (
1899- $ arrayArg ,
1900- TypeCombinator::union (...$ arrayTypes ),
1901- );
1909+ $ scope = $ scope ->invalidateExpression ($ arrayArg )->specifyExpressionType (
1910+ $ arrayArg ,
1911+ TypeCombinator::union (...$ arrayTypes ),
1912+ );
1913+ }
19021914 }
19031915 }
19041916
0 commit comments