@@ -2023,18 +2023,7 @@ public function enterAnonymousFunctionWithoutReflection(
20232023 $ isNullable = $ this ->isParameterValueNullable ($ parameter );
20242024 $ parameterType = $ this ->getFunctionType ($ parameter ->type , $ isNullable , $ parameter ->variadic );
20252025 if ($ callableParameters !== null ) {
2026- if (isset ($ callableParameters [$ i ])) {
2027- $ parameterType = self ::intersectButNotNever ($ parameterType , $ callableParameters [$ i ]->getType ());
2028- } elseif (count ($ callableParameters ) > 0 ) {
2029- $ lastParameter = array_last ($ callableParameters );
2030- if ($ lastParameter ->isVariadic ()) {
2031- $ parameterType = self ::intersectButNotNever ($ parameterType , $ lastParameter ->getType ());
2032- } else {
2033- $ parameterType = self ::intersectButNotNever ($ parameterType , new MixedType ());
2034- }
2035- } else {
2036- $ parameterType = self ::intersectButNotNever ($ parameterType , new MixedType ());
2037- }
2026+ $ parameterType = self ::intersectButNotNever ($ parameterType , $ this ->getCallableParameterType ($ callableParameters , $ i ));
20382027 }
20392028 $ holder = ExpressionTypeHolder::createYes ($ parameter ->var , $ parameterType );
20402029 $ expressionTypes [$ paramExprString ] = $ holder ;
@@ -2233,20 +2222,8 @@ public function enterArrowFunctionWithoutReflection(Expr\ArrowFunction $arrowFun
22332222 foreach ($ arrowFunction ->params as $ i => $ parameter ) {
22342223 $ isNullable = $ this ->isParameterValueNullable ($ parameter );
22352224 $ parameterType = $ this ->getFunctionType ($ parameter ->type , $ isNullable , $ parameter ->variadic );
2236-
22372225 if ($ callableParameters !== null ) {
2238- if (isset ($ callableParameters [$ i ])) {
2239- $ parameterType = self ::intersectButNotNever ($ parameterType , $ callableParameters [$ i ]->getType ());
2240- } elseif (count ($ callableParameters ) > 0 ) {
2241- $ lastParameter = array_last ($ callableParameters );
2242- if ($ lastParameter ->isVariadic ()) {
2243- $ parameterType = self ::intersectButNotNever ($ parameterType , $ lastParameter ->getType ());
2244- } else {
2245- $ parameterType = self ::intersectButNotNever ($ parameterType , new MixedType ());
2246- }
2247- } else {
2248- $ parameterType = self ::intersectButNotNever ($ parameterType , new MixedType ());
2249- }
2226+ $ parameterType = self ::intersectButNotNever ($ parameterType , $ this ->getCallableParameterType ($ callableParameters , $ i ));
22502227 }
22512228
22522229 if (!$ parameter ->var instanceof Variable || !is_string ($ parameter ->var ->name )) {
@@ -2312,6 +2289,27 @@ public function getFunctionType($type, bool $isNullable, bool $isVariadic): Type
23122289 return $ this ->initializerExprTypeResolver ->getFunctionType ($ type , $ isNullable , false , InitializerExprContext::fromScope ($ this ));
23132290 }
23142291
2292+ /**
2293+ * @param ParameterReflection[] $callableParameters
2294+ */
2295+ private function getCallableParameterType (array $ callableParameters , int $ index ): Type
2296+ {
2297+ if (isset ($ callableParameters [$ index ])) {
2298+ return $ callableParameters [$ index ]->getType ();
2299+ }
2300+
2301+ if (count ($ callableParameters ) === 0 ) {
2302+ return new MixedType ();
2303+ }
2304+
2305+ $ lastParameter = array_last ($ callableParameters );
2306+ if ($ lastParameter ->isVariadic ()) {
2307+ return $ lastParameter ->getType ();
2308+ }
2309+
2310+ return new MixedType ();
2311+ }
2312+
23152313 public static function intersectButNotNever (Type $ nativeType , Type $ inferredType ): Type
23162314 {
23172315 if ($ nativeType ->isSuperTypeOf ($ inferredType )->no ()) {
0 commit comments