@@ -2077,23 +2077,50 @@ static function (Node $node, Scope $scope) use ($arrowScope, &$arrowFunctionImpu
20772077 );
20782078 }
20792079
2080- if ($ node instanceof Expr \StaticCall && $ node ->name instanceof Node \Identifier) {
2081- if ($ this ->nativeTypesPromoted ) {
2080+ if ($ node instanceof Expr \StaticCall) {
2081+ if ($ node ->name instanceof Node \Identifier) {
2082+ if ($ this ->nativeTypesPromoted ) {
2083+ $ typeCallback = function () use ($ node ): Type {
2084+ if ($ node ->class instanceof Name) {
2085+ $ staticMethodCalledOnType = $ this ->resolveTypeByNameWithLateStaticBinding ($ node ->class , $ node ->name );
2086+ } else {
2087+ $ staticMethodCalledOnType = $ this ->getNativeType ($ node ->class );
2088+ }
2089+ $ methodReflection = $ this ->getMethodReflection (
2090+ $ staticMethodCalledOnType ,
2091+ $ node ->name ->name ,
2092+ );
2093+ if ($ methodReflection === null ) {
2094+ return new ErrorType ();
2095+ }
2096+
2097+ return ParametersAcceptorSelector::combineAcceptors ($ methodReflection ->getVariants ())->getNativeReturnType ();
2098+ };
2099+
2100+ $ callType = $ typeCallback ();
2101+ if ($ node ->class instanceof Expr) {
2102+ return $ this ->getNullsafeShortCircuitingType ($ node ->class , $ callType );
2103+ }
2104+
2105+ return $ callType ;
2106+ }
2107+
20822108 $ typeCallback = function () use ($ node ): Type {
20832109 if ($ node ->class instanceof Name) {
20842110 $ staticMethodCalledOnType = $ this ->resolveTypeByNameWithLateStaticBinding ($ node ->class , $ node ->name );
20852111 } else {
2086- $ staticMethodCalledOnType = $ this ->getNativeType ($ node ->class );
2112+ $ staticMethodCalledOnType = TypeCombinator:: removeNull ( $ this ->getType ($ node ->class ))-> getObjectTypeOrClassStringObjectType ( );
20872113 }
2088- $ methodReflection = $ this ->getMethodReflection (
2114+
2115+ $ returnType = $ this ->methodCallReturnType (
20892116 $ staticMethodCalledOnType ,
2090- $ node ->name ->name ,
2117+ $ node ->name ->toString (),
2118+ $ node ,
20912119 );
2092- if ($ methodReflection === null ) {
2120+ if ($ returnType === null ) {
20932121 return new ErrorType ();
20942122 }
2095-
2096- return ParametersAcceptorSelector::combineAcceptors ($ methodReflection ->getVariants ())->getNativeReturnType ();
2123+ return $ returnType ;
20972124 };
20982125
20992126 $ callType = $ typeCallback ();
@@ -2104,30 +2131,14 @@ static function (Node $node, Scope $scope) use ($arrowScope, &$arrowFunctionImpu
21042131 return $ callType ;
21052132 }
21062133
2107- $ typeCallback = function () use ($ node ): Type {
2108- if ($ node ->class instanceof Name) {
2109- $ staticMethodCalledOnType = $ this ->resolveTypeByNameWithLateStaticBinding ($ node ->class , $ node ->name );
2110- } else {
2111- $ staticMethodCalledOnType = TypeCombinator::removeNull ($ this ->getType ($ node ->class ))->getObjectTypeOrClassStringObjectType ();
2112- }
2113-
2114- $ returnType = $ this ->methodCallReturnType (
2115- $ staticMethodCalledOnType ,
2116- $ node ->name ->toString (),
2117- $ node ,
2134+ $ nameType = $ this ->getType ($ node ->name );
2135+ if (count ($ nameType ->getConstantStrings ()) > 0 ) {
2136+ return TypeCombinator::union (
2137+ ...array_map (fn ($ constantString ) => $ this
2138+ ->filterByTruthyValue (new BinaryOp \Identical ($ node ->name , new String_ ($ constantString ->getValue ())))
2139+ ->getType (new Expr \StaticCall ($ node ->class , new Identifier ($ constantString ->getValue ()), $ node ->args )), $ nameType ->getConstantStrings ()),
21182140 );
2119- if ($ returnType === null ) {
2120- return new ErrorType ();
2121- }
2122- return $ returnType ;
2123- };
2124-
2125- $ callType = $ typeCallback ();
2126- if ($ node ->class instanceof Expr) {
2127- return $ this ->getNullsafeShortCircuitingType ($ node ->class , $ callType );
21282141 }
2129-
2130- return $ callType ;
21312142 }
21322143
21332144 if ($ node instanceof PropertyFetch) {
0 commit comments