@@ -5599,6 +5599,10 @@ private function exactInstantiation(New_ $node, string $className): ?Type
55995599 }
56005600
56015601 $ classReflection = $ this ->reflectionProvider ->getClass ($ resolvedClassName );
5602+ $ nonFinalClassReflection = $ classReflection ;
5603+ if (!$ isStatic ) {
5604+ $ classReflection = $ classReflection ->asFinal ();
5605+ }
56025606 if ($ classReflection ->hasConstructor ()) {
56035607 $ constructorMethod = $ classReflection ->getConstructor ();
56045608 } else {
@@ -5648,7 +5652,7 @@ private function exactInstantiation(New_ $node, string $className): ?Type
56485652 return $ methodResult ;
56495653 }
56505654
5651- $ objectType = $ isStatic ? new StaticType ($ classReflection ) : new ObjectType ($ resolvedClassName );
5655+ $ objectType = $ isStatic ? new StaticType ($ classReflection ) : new ObjectType ($ resolvedClassName, null , $ classReflection );
56525656 if (!$ classReflection ->isGeneric ()) {
56535657 return $ objectType ;
56545658 }
@@ -5674,7 +5678,8 @@ private function exactInstantiation(New_ $node, string $className): ?Type
56745678
56755679 if (count ($ classTemplateTypes ) === count ($ originalClassTemplateTypes )) {
56765680 $ propertyType = TypeCombinator::removeNull ($ this ->getType ($ assignedToProperty ));
5677- if ($ objectType ->isSuperTypeOf ($ propertyType )->yes ()) {
5681+ $ nonFinalObjectType = $ isStatic ? new StaticType ($ nonFinalClassReflection ) : new ObjectType ($ resolvedClassName , null , $ nonFinalClassReflection );
5682+ if ($ nonFinalObjectType ->isSuperTypeOf ($ propertyType )->yes ()) {
56785683 return $ propertyType ;
56795684 }
56805685 }
@@ -5689,9 +5694,13 @@ private function exactInstantiation(New_ $node, string $className): ?Type
56895694 [],
56905695 );
56915696 }
5697+
5698+ $ types = $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ());
56925699 return new GenericObjectType (
56935700 $ resolvedClassName ,
5694- $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
5701+ $ types ,
5702+ null ,
5703+ $ classReflection ->withTypes ($ types )->asFinal (),
56955704 );
56965705 }
56975706
@@ -5706,9 +5715,12 @@ private function exactInstantiation(New_ $node, string $className): ?Type
57065715 );
57075716 }
57085717
5718+ $ types = $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ());
57095719 return new GenericObjectType (
57105720 $ resolvedClassName ,
5711- $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
5721+ $ types ,
5722+ null ,
5723+ $ classReflection ->withTypes ($ types )->asFinal (),
57125724 );
57135725 }
57145726 $ newType = new GenericObjectType ($ resolvedClassName , $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()));
@@ -5723,9 +5735,12 @@ private function exactInstantiation(New_ $node, string $className): ?Type
57235735 );
57245736 }
57255737
5738+ $ types = $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ());
57265739 return new GenericObjectType (
57275740 $ resolvedClassName ,
5728- $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
5741+ $ types ,
5742+ null ,
5743+ $ classReflection ->withTypes ($ types )->asFinal (),
57295744 );
57305745 }
57315746 $ ancestorClassReflections = $ ancestorType ->getObjectClassReflections ();
@@ -5739,9 +5754,12 @@ private function exactInstantiation(New_ $node, string $className): ?Type
57395754 );
57405755 }
57415756
5757+ $ types = $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ());
57425758 return new GenericObjectType (
57435759 $ resolvedClassName ,
5744- $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
5760+ $ types ,
5761+ null ,
5762+ $ classReflection ->withTypes ($ types )->asFinal (),
57455763 );
57465764 }
57475765
@@ -5758,9 +5776,12 @@ private function exactInstantiation(New_ $node, string $className): ?Type
57585776 );
57595777 }
57605778
5779+ $ types = $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ());
57615780 return new GenericObjectType (
57625781 $ resolvedClassName ,
5763- $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()->resolveToBounds ()),
5782+ $ types ,
5783+ null ,
5784+ $ classReflection ->withTypes ($ types )->asFinal (),
57645785 );
57655786 }
57665787 $ newParentTypeClassReflection = $ newParentTypeClassReflections [0 ];
@@ -5803,9 +5824,12 @@ private function exactInstantiation(New_ $node, string $className): ?Type
58035824 );
58045825 }
58055826
5827+ $ types = $ classReflection ->typeMapToList (new TemplateTypeMap ($ resolvedTypeMap ));
58065828 return new GenericObjectType (
58075829 $ resolvedClassName ,
5808- $ classReflection ->typeMapToList (new TemplateTypeMap ($ resolvedTypeMap )),
5830+ $ types ,
5831+ null ,
5832+ $ classReflection ->withTypes ($ types )->asFinal (),
58095833 );
58105834 }
58115835
@@ -5817,14 +5841,17 @@ private function exactInstantiation(New_ $node, string $className): ?Type
58175841 );
58185842
58195843 $ resolvedTemplateTypeMap = $ parametersAcceptor ->getResolvedTemplateTypeMap ();
5844+ $ types = $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ());
58205845 $ newGenericType = new GenericObjectType (
58215846 $ resolvedClassName ,
5822- $ classReflection ->typeMapToList ($ classReflection ->getTemplateTypeMap ()),
5847+ $ types ,
5848+ null ,
5849+ $ classReflection ->withTypes ($ types )->asFinal (),
58235850 );
58245851 if ($ isStatic ) {
58255852 $ newGenericType = new GenericStaticType (
58265853 $ classReflection ,
5827- $ classReflection -> typeMapToList ( $ classReflection -> getTemplateTypeMap ()) ,
5854+ $ types ,
58285855 null ,
58295856 [],
58305857 );
0 commit comments