103103use PHPStan \Type \GeneralizePrecision ;
104104use PHPStan \Type \Generic \GenericClassStringType ;
105105use PHPStan \Type \Generic \GenericObjectType ;
106+ use PHPStan \Type \Generic \GenericStaticType ;
106107use PHPStan \Type \Generic \TemplateType ;
107108use PHPStan \Type \Generic \TemplateTypeHelper ;
108109use PHPStan \Type \Generic \TemplateTypeMap ;
@@ -5547,8 +5548,17 @@ public function debug(): array
55475548 private function exactInstantiation (New_ $ node , string $ className ): ?Type
55485549 {
55495550 $ resolvedClassName = $ this ->resolveExactName (new Name ($ className ));
5551+ $ isStatic = false ;
55505552 if ($ resolvedClassName === null ) {
5551- return null ;
5553+ if (strtolower ($ className ) !== 'static ' ) {
5554+ return null ;
5555+ }
5556+
5557+ if (!$ this ->isInClass ()) {
5558+ return null ;
5559+ }
5560+ $ resolvedClassName = $ this ->getClassReflection ()->getName ();
5561+ $ isStatic = true ;
55525562 }
55535563
55545564 if (!$ this ->reflectionProvider ->hasClass ($ resolvedClassName )) {
@@ -5605,7 +5615,7 @@ private function exactInstantiation(New_ $node, string $className): ?Type
56055615 return $ methodResult ;
56065616 }
56075617
5608- $ objectType = new ObjectType ($ resolvedClassName );
5618+ $ objectType = $ isStatic ? new StaticType ( $ classReflection ) : new ObjectType ($ resolvedClassName );
56095619 if (!$ classReflection ->isGeneric ()) {
56105620 return $ objectType ;
56115621 }
@@ -5638,6 +5648,14 @@ private function exactInstantiation(New_ $node, string $className): ?Type
56385648 }
56395649
56405650 if ($ constructorMethod instanceof DummyConstructorReflection) {
5651+ if ($ isStatic ) {
5652+ return new GenericStaticType (
5653+ $ classReflection ,
5654+ $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
5655+ null ,
5656+ [],
5657+ );
5658+ }
56415659 return new GenericObjectType (
56425660 $ resolvedClassName ,
56435661 $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
@@ -5646,6 +5664,15 @@ private function exactInstantiation(New_ $node, string $className): ?Type
56465664
56475665 if ($ constructorMethod ->getDeclaringClass ()->getName () !== $ classReflection ->getName ()) {
56485666 if (!$ constructorMethod ->getDeclaringClass ()->isGeneric ()) {
5667+ if ($ isStatic ) {
5668+ return new GenericStaticType (
5669+ $ classReflection ,
5670+ $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
5671+ null ,
5672+ [],
5673+ );
5674+ }
5675+
56495676 return new GenericObjectType (
56505677 $ resolvedClassName ,
56515678 $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
@@ -5654,13 +5681,31 @@ private function exactInstantiation(New_ $node, string $className): ?Type
56545681 $ newType = new GenericObjectType ($ resolvedClassName , $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()));
56555682 $ ancestorType = $ newType ->getAncestorWithClassName ($ constructorMethod ->getDeclaringClass ()->getName ());
56565683 if ($ ancestorType === null ) {
5684+ if ($ isStatic ) {
5685+ return new GenericStaticType (
5686+ $ classReflection ,
5687+ $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
5688+ null ,
5689+ [],
5690+ );
5691+ }
5692+
56575693 return new GenericObjectType (
56585694 $ resolvedClassName ,
56595695 $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
56605696 );
56615697 }
56625698 $ ancestorClassReflections = $ ancestorType ->getObjectClassReflections ();
56635699 if (count ($ ancestorClassReflections ) !== 1 ) {
5700+ if ($ isStatic ) {
5701+ return new GenericStaticType (
5702+ $ classReflection ,
5703+ $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
5704+ null ,
5705+ [],
5706+ );
5707+ }
5708+
56645709 return new GenericObjectType (
56655710 $ resolvedClassName ,
56665711 $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
@@ -5671,6 +5716,15 @@ private function exactInstantiation(New_ $node, string $className): ?Type
56715716 $ newParentType = $ this ->getType ($ newParentNode );
56725717 $ newParentTypeClassReflections = $ newParentType ->getObjectClassReflections ();
56735718 if (count ($ newParentTypeClassReflections ) !== 1 ) {
5719+ if ($ isStatic ) {
5720+ return new GenericStaticType (
5721+ $ classReflection ,
5722+ $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
5723+ null ,
5724+ [],
5725+ );
5726+ }
5727+
56745728 return new GenericObjectType (
56755729 $ resolvedClassName ,
56765730 $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
@@ -5707,6 +5761,15 @@ private function exactInstantiation(New_ $node, string $className): ?Type
57075761 $ resolvedTypeMap [$ ancestorType ->getName ()] = TypeCombinator::union ($ resolvedTypeMap [$ ancestorType ->getName ()], $ type );
57085762 }
57095763
5764+ if ($ isStatic ) {
5765+ return new GenericStaticType (
5766+ $ classReflection ,
5767+ $ classReflection ->typeMapToList (new TemplateTypeMap ($ resolvedTypeMap )),
5768+ null ,
5769+ [],
5770+ );
5771+ }
5772+
57105773 return new GenericObjectType (
57115774 $ resolvedClassName ,
57125775 $ classReflection ->typeMapToList (new TemplateTypeMap ($ resolvedTypeMap )),
@@ -5721,10 +5784,19 @@ private function exactInstantiation(New_ $node, string $className): ?Type
57215784 );
57225785
57235786 $ resolvedTemplateTypeMap = $ parametersAcceptor ->getResolvedTemplateTypeMap ();
5724- return TypeTraverser:: map ( new GenericObjectType (
5787+ $ newGenericType = new GenericObjectType (
57255788 $ resolvedClassName ,
57265789 $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()),
5727- ), static function (Type $ type , callable $ traverse ) use ($ resolvedTemplateTypeMap ): Type {
5790+ );
5791+ if ($ isStatic ) {
5792+ $ newGenericType = new GenericStaticType (
5793+ $ classReflection ,
5794+ $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()),
5795+ null ,
5796+ [],
5797+ );
5798+ }
5799+ return TypeTraverser::map ($ newGenericType , static function (Type $ type , callable $ traverse ) use ($ resolvedTemplateTypeMap ): Type {
57285800 if ($ type instanceof TemplateType && !$ type ->isArgument ()) {
57295801 $ newType = $ resolvedTemplateTypeMap ->getType ($ type ->getName ());
57305802 if ($ newType === null || $ newType instanceof ErrorType) {
0 commit comments