102102use PHPStan \Type \GeneralizePrecision ;
103103use PHPStan \Type \Generic \GenericClassStringType ;
104104use PHPStan \Type \Generic \GenericObjectType ;
105+ use PHPStan \Type \Generic \GenericStaticType ;
105106use PHPStan \Type \Generic \TemplateType ;
106107use PHPStan \Type \Generic \TemplateTypeHelper ;
107108use PHPStan \Type \Generic \TemplateTypeMap ;
@@ -5437,8 +5438,17 @@ public function debug(): array
54375438 private function exactInstantiation (New_ $ node , string $ className ): ?Type
54385439 {
54395440 $ resolvedClassName = $ this ->resolveExactName (new Name ($ className ));
5441+ $ isStatic = false ;
54405442 if ($ resolvedClassName === null ) {
5441- return null ;
5443+ if (strtolower ($ className ) !== 'static ' ) {
5444+ return null ;
5445+ }
5446+
5447+ if (!$ this ->isInClass ()) {
5448+ return null ;
5449+ }
5450+ $ resolvedClassName = $ this ->getClassReflection ()->getName ();
5451+ $ isStatic = true ;
54425452 }
54435453
54445454 if (!$ this ->reflectionProvider ->hasClass ($ resolvedClassName )) {
@@ -5495,7 +5505,7 @@ private function exactInstantiation(New_ $node, string $className): ?Type
54955505 return $ methodResult ;
54965506 }
54975507
5498- $ objectType = new ObjectType ($ resolvedClassName );
5508+ $ objectType = $ isStatic ? new StaticType ( $ classReflection ) : new ObjectType ($ resolvedClassName );
54995509 if (!$ classReflection ->isGeneric ()) {
55005510 return $ objectType ;
55015511 }
@@ -5528,6 +5538,14 @@ private function exactInstantiation(New_ $node, string $className): ?Type
55285538 }
55295539
55305540 if ($ constructorMethod instanceof DummyConstructorReflection) {
5541+ if ($ isStatic ) {
5542+ return new GenericStaticType (
5543+ $ classReflection ,
5544+ $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
5545+ null ,
5546+ [],
5547+ );
5548+ }
55315549 return new GenericObjectType (
55325550 $ resolvedClassName ,
55335551 $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
@@ -5536,6 +5554,15 @@ private function exactInstantiation(New_ $node, string $className): ?Type
55365554
55375555 if ($ constructorMethod ->getDeclaringClass ()->getName () !== $ classReflection ->getName ()) {
55385556 if (!$ constructorMethod ->getDeclaringClass ()->isGeneric ()) {
5557+ if ($ isStatic ) {
5558+ return new GenericStaticType (
5559+ $ classReflection ,
5560+ $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
5561+ null ,
5562+ [],
5563+ );
5564+ }
5565+
55395566 return new GenericObjectType (
55405567 $ resolvedClassName ,
55415568 $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
@@ -5544,13 +5571,31 @@ private function exactInstantiation(New_ $node, string $className): ?Type
55445571 $ newType = new GenericObjectType ($ resolvedClassName , $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()));
55455572 $ ancestorType = $ newType ->getAncestorWithClassName ($ constructorMethod ->getDeclaringClass ()->getName ());
55465573 if ($ ancestorType === null ) {
5574+ if ($ isStatic ) {
5575+ return new GenericStaticType (
5576+ $ classReflection ,
5577+ $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
5578+ null ,
5579+ [],
5580+ );
5581+ }
5582+
55475583 return new GenericObjectType (
55485584 $ resolvedClassName ,
55495585 $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
55505586 );
55515587 }
55525588 $ ancestorClassReflections = $ ancestorType ->getObjectClassReflections ();
55535589 if (count ($ ancestorClassReflections ) !== 1 ) {
5590+ if ($ isStatic ) {
5591+ return new GenericStaticType (
5592+ $ classReflection ,
5593+ $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
5594+ null ,
5595+ [],
5596+ );
5597+ }
5598+
55545599 return new GenericObjectType (
55555600 $ resolvedClassName ,
55565601 $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
@@ -5561,6 +5606,15 @@ private function exactInstantiation(New_ $node, string $className): ?Type
55615606 $ newParentType = $ this ->getType ($ newParentNode );
55625607 $ newParentTypeClassReflections = $ newParentType ->getObjectClassReflections ();
55635608 if (count ($ newParentTypeClassReflections ) !== 1 ) {
5609+ if ($ isStatic ) {
5610+ return new GenericStaticType (
5611+ $ classReflection ,
5612+ $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
5613+ null ,
5614+ [],
5615+ );
5616+ }
5617+
55645618 return new GenericObjectType (
55655619 $ resolvedClassName ,
55665620 $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
@@ -5597,6 +5651,15 @@ private function exactInstantiation(New_ $node, string $className): ?Type
55975651 $ resolvedTypeMap [$ ancestorType ->getName ()] = TypeCombinator::union ($ resolvedTypeMap [$ ancestorType ->getName ()], $ type );
55985652 }
55995653
5654+ if ($ isStatic ) {
5655+ return new GenericStaticType (
5656+ $ classReflection ,
5657+ $ classReflection ->typeMapToList (new TemplateTypeMap ($ resolvedTypeMap )),
5658+ null ,
5659+ [],
5660+ );
5661+ }
5662+
56005663 return new GenericObjectType (
56015664 $ resolvedClassName ,
56025665 $ classReflection ->typeMapToList (new TemplateTypeMap ($ resolvedTypeMap )),
@@ -5612,10 +5675,19 @@ private function exactInstantiation(New_ $node, string $className): ?Type
56125675
56135676 if ($ this ->explicitMixedInUnknownGenericNew ) {
56145677 $ resolvedTemplateTypeMap = $ parametersAcceptor ->getResolvedTemplateTypeMap ();
5615- return TypeTraverser:: map ( new GenericObjectType (
5678+ $ newGenericType = new GenericObjectType (
56165679 $ resolvedClassName ,
56175680 $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()),
5618- ), static function (Type $ type , callable $ traverse ) use ($ resolvedTemplateTypeMap ): Type {
5681+ );
5682+ if ($ isStatic ) {
5683+ $ newGenericType = new GenericStaticType (
5684+ $ classReflection ,
5685+ $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()),
5686+ null ,
5687+ [],
5688+ );
5689+ }
5690+ return TypeTraverser::map ($ newGenericType , static function (Type $ type , callable $ traverse ) use ($ resolvedTemplateTypeMap ): Type {
56195691 if ($ type instanceof TemplateType && !$ type ->isArgument ()) {
56205692 $ newType = $ resolvedTemplateTypeMap ->getType ($ type ->getName ());
56215693 if ($ newType === null || $ newType instanceof ErrorType) {
@@ -5654,6 +5726,15 @@ private function exactInstantiation(New_ $node, string $className): ?Type
56545726 $ list [] = $ bound ;
56555727 }
56565728
5729+ if ($ isStatic ) {
5730+ return new GenericStaticType (
5731+ $ classReflection ,
5732+ $ list ,
5733+ null ,
5734+ [],
5735+ );
5736+ }
5737+
56575738 return new GenericObjectType (
56585739 $ resolvedClassName ,
56595740 $ list ,
0 commit comments