@@ -2021,18 +2021,7 @@ public function enterAnonymousFunctionWithoutReflection(
20212021 $ isNullable = $ this ->isParameterValueNullable ($ parameter );
20222022 $ parameterType = $ this ->getFunctionType ($ parameter ->type , $ isNullable , $ parameter ->variadic );
20232023 if ($ callableParameters !== null ) {
2024- if (isset ($ callableParameters [$ i ])) {
2025- $ parameterType = self ::intersectButNotNever ($ parameterType , $ callableParameters [$ i ]->getType ());
2026- } elseif (count ($ callableParameters ) > 0 ) {
2027- $ lastParameter = array_last ($ callableParameters );
2028- if ($ lastParameter ->isVariadic ()) {
2029- $ parameterType = self ::intersectButNotNever ($ parameterType , $ lastParameter ->getType ());
2030- } else {
2031- $ parameterType = self ::intersectButNotNever ($ parameterType , new MixedType ());
2032- }
2033- } else {
2034- $ parameterType = self ::intersectButNotNever ($ parameterType , new MixedType ());
2035- }
2024+ $ parameterType = self ::intersectButNotNever ($ parameterType , $ this ->getCallableParameterType ($ callableParameters , $ i ));
20362025 }
20372026 $ holder = ExpressionTypeHolder::createYes ($ parameter ->var , $ parameterType );
20382027 $ expressionTypes [$ paramExprString ] = $ holder ;
@@ -2231,20 +2220,8 @@ public function enterArrowFunctionWithoutReflection(Expr\ArrowFunction $arrowFun
22312220 foreach ($ arrowFunction ->params as $ i => $ parameter ) {
22322221 $ isNullable = $ this ->isParameterValueNullable ($ parameter );
22332222 $ parameterType = $ this ->getFunctionType ($ parameter ->type , $ isNullable , $ parameter ->variadic );
2234-
22352223 if ($ callableParameters !== null ) {
2236- if (isset ($ callableParameters [$ i ])) {
2237- $ parameterType = self ::intersectButNotNever ($ parameterType , $ callableParameters [$ i ]->getType ());
2238- } elseif (count ($ callableParameters ) > 0 ) {
2239- $ lastParameter = array_last ($ callableParameters );
2240- if ($ lastParameter ->isVariadic ()) {
2241- $ parameterType = self ::intersectButNotNever ($ parameterType , $ lastParameter ->getType ());
2242- } else {
2243- $ parameterType = self ::intersectButNotNever ($ parameterType , new MixedType ());
2244- }
2245- } else {
2246- $ parameterType = self ::intersectButNotNever ($ parameterType , new MixedType ());
2247- }
2224+ $ parameterType = self ::intersectButNotNever ($ parameterType , $ this ->getCallableParameterType ($ callableParameters , $ i ));
22482225 }
22492226
22502227 if (!$ parameter ->var instanceof Variable || !is_string ($ parameter ->var ->name )) {
@@ -2310,6 +2287,27 @@ public function getFunctionType($type, bool $isNullable, bool $isVariadic): Type
23102287 return $ this ->initializerExprTypeResolver ->getFunctionType ($ type , $ isNullable , false , InitializerExprContext::fromScope ($ this ));
23112288 }
23122289
2290+ /**
2291+ * @param ParameterReflection[] $callableParameters
2292+ */
2293+ private function getCallableParameterType (array $ callableParameters , int $ index ): Type
2294+ {
2295+ if (isset ($ callableParameters [$ index ])) {
2296+ return $ callableParameters [$ index ]->getType ();
2297+ }
2298+
2299+ if (count ($ callableParameters ) === 0 ) {
2300+ return new MixedType ();
2301+ }
2302+
2303+ $ lastParameter = array_last ($ callableParameters );
2304+ if ($ lastParameter ->isVariadic ()) {
2305+ return $ lastParameter ->getType ();
2306+ }
2307+
2308+ return new MixedType ();
2309+ }
2310+
23132311 public static function intersectButNotNever (Type $ nativeType , Type $ inferredType ): Type
23142312 {
23152313 if ($ nativeType ->isSuperTypeOf ($ inferredType )->no ()) {
0 commit comments