102
102
use PHPStan \Type \GeneralizePrecision ;
103
103
use PHPStan \Type \Generic \GenericClassStringType ;
104
104
use PHPStan \Type \Generic \GenericObjectType ;
105
+ use PHPStan \Type \Generic \GenericStaticType ;
105
106
use PHPStan \Type \Generic \TemplateType ;
106
107
use PHPStan \Type \Generic \TemplateTypeHelper ;
107
108
use PHPStan \Type \Generic \TemplateTypeMap ;
@@ -5437,8 +5438,17 @@ public function debug(): array
5437
5438
private function exactInstantiation (New_ $ node , string $ className ): ?Type
5438
5439
{
5439
5440
$ resolvedClassName = $ this ->resolveExactName (new Name ($ className ));
5441
+ $ isStatic = false ;
5440
5442
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 ;
5442
5452
}
5443
5453
5444
5454
if (!$ this ->reflectionProvider ->hasClass ($ resolvedClassName )) {
@@ -5495,7 +5505,7 @@ private function exactInstantiation(New_ $node, string $className): ?Type
5495
5505
return $ methodResult ;
5496
5506
}
5497
5507
5498
- $ objectType = new ObjectType ($ resolvedClassName );
5508
+ $ objectType = $ isStatic ? new StaticType ( $ classReflection ) : new ObjectType ($ resolvedClassName );
5499
5509
if (!$ classReflection ->isGeneric ()) {
5500
5510
return $ objectType ;
5501
5511
}
@@ -5528,6 +5538,14 @@ private function exactInstantiation(New_ $node, string $className): ?Type
5528
5538
}
5529
5539
5530
5540
if ($ constructorMethod instanceof DummyConstructorReflection) {
5541
+ if ($ isStatic ) {
5542
+ return new GenericStaticType (
5543
+ $ classReflection ,
5544
+ $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
5545
+ null ,
5546
+ [],
5547
+ );
5548
+ }
5531
5549
return new GenericObjectType (
5532
5550
$ resolvedClassName ,
5533
5551
$ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
@@ -5536,6 +5554,15 @@ private function exactInstantiation(New_ $node, string $className): ?Type
5536
5554
5537
5555
if ($ constructorMethod ->getDeclaringClass ()->getName () !== $ classReflection ->getName ()) {
5538
5556
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
+
5539
5566
return new GenericObjectType (
5540
5567
$ resolvedClassName ,
5541
5568
$ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
@@ -5544,13 +5571,31 @@ private function exactInstantiation(New_ $node, string $className): ?Type
5544
5571
$ newType = new GenericObjectType ($ resolvedClassName , $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()));
5545
5572
$ ancestorType = $ newType ->getAncestorWithClassName ($ constructorMethod ->getDeclaringClass ()->getName ());
5546
5573
if ($ ancestorType === null ) {
5574
+ if ($ isStatic ) {
5575
+ return new GenericStaticType (
5576
+ $ classReflection ,
5577
+ $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
5578
+ null ,
5579
+ [],
5580
+ );
5581
+ }
5582
+
5547
5583
return new GenericObjectType (
5548
5584
$ resolvedClassName ,
5549
5585
$ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
5550
5586
);
5551
5587
}
5552
5588
$ ancestorClassReflections = $ ancestorType ->getObjectClassReflections ();
5553
5589
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
+
5554
5599
return new GenericObjectType (
5555
5600
$ resolvedClassName ,
5556
5601
$ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
@@ -5561,6 +5606,15 @@ private function exactInstantiation(New_ $node, string $className): ?Type
5561
5606
$ newParentType = $ this ->getType ($ newParentNode );
5562
5607
$ newParentTypeClassReflections = $ newParentType ->getObjectClassReflections ();
5563
5608
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
+
5564
5618
return new GenericObjectType (
5565
5619
$ resolvedClassName ,
5566
5620
$ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
@@ -5597,6 +5651,15 @@ private function exactInstantiation(New_ $node, string $className): ?Type
5597
5651
$ resolvedTypeMap [$ ancestorType ->getName ()] = TypeCombinator::union ($ resolvedTypeMap [$ ancestorType ->getName ()], $ type );
5598
5652
}
5599
5653
5654
+ if ($ isStatic ) {
5655
+ return new GenericStaticType (
5656
+ $ classReflection ,
5657
+ $ classReflection ->typeMapToList (new TemplateTypeMap ($ resolvedTypeMap )),
5658
+ null ,
5659
+ [],
5660
+ );
5661
+ }
5662
+
5600
5663
return new GenericObjectType (
5601
5664
$ resolvedClassName ,
5602
5665
$ classReflection ->typeMapToList (new TemplateTypeMap ($ resolvedTypeMap )),
@@ -5612,10 +5675,19 @@ private function exactInstantiation(New_ $node, string $className): ?Type
5612
5675
5613
5676
if ($ this ->explicitMixedInUnknownGenericNew ) {
5614
5677
$ resolvedTemplateTypeMap = $ parametersAcceptor ->getResolvedTemplateTypeMap ();
5615
- return TypeTraverser:: map ( new GenericObjectType (
5678
+ $ newGenericType = new GenericObjectType (
5616
5679
$ resolvedClassName ,
5617
5680
$ 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 {
5619
5691
if ($ type instanceof TemplateType && !$ type ->isArgument ()) {
5620
5692
$ newType = $ resolvedTemplateTypeMap ->getType ($ type ->getName ());
5621
5693
if ($ newType === null || $ newType instanceof ErrorType) {
@@ -5654,6 +5726,15 @@ private function exactInstantiation(New_ $node, string $className): ?Type
5654
5726
$ list [] = $ bound ;
5655
5727
}
5656
5728
5729
+ if ($ isStatic ) {
5730
+ return new GenericStaticType (
5731
+ $ classReflection ,
5732
+ $ list ,
5733
+ null ,
5734
+ [],
5735
+ );
5736
+ }
5737
+
5657
5738
return new GenericObjectType (
5658
5739
$ resolvedClassName ,
5659
5740
$ list ,
0 commit comments