3636use PHPStan \Type \Generic \TemplateType ;
3737use PHPStan \Type \Generic \TemplateTypeHelper ;
3838use PHPStan \Type \Generic \TemplateTypeMap ;
39+ use PHPStan \Type \Generic \TemplateTypeVariance ;
3940use PHPStan \Type \Generic \TemplateTypeVarianceMap ;
4041use PHPStan \Type \Traits \NonArrayTypeTrait ;
4142use PHPStan \Type \Traits \NonGeneralizableTypeTrait ;
42- use PHPStan \Type \Traits \NonGenericTypeTrait ;
4343use PHPStan \Type \Traits \NonIterableTypeTrait ;
4444use PHPStan \Type \Traits \NonOffsetAccessibleTypeTrait ;
4545use PHPStan \Type \Traits \NonRemoveableTypeTrait ;
@@ -53,7 +53,6 @@ class ClosureType implements TypeWithClassName, CallableParametersAcceptor
5353{
5454
5555 use NonArrayTypeTrait;
56- use NonGenericTypeTrait;
5756 use NonIterableTypeTrait;
5857 use UndecidedComparisonTypeTrait;
5958 use NonOffsetAccessibleTypeTrait;
@@ -540,6 +539,23 @@ private function inferTemplateTypesOnParametersAcceptor(ParametersAcceptor $para
540539 return $ typeMap ->union ($ this ->getReturnType ()->inferTemplateTypes ($ returnType ));
541540 }
542541
542+ public function getReferencedTemplateTypes (TemplateTypeVariance $ positionVariance ): array
543+ {
544+ $ references = $ this ->getReturnType ()->getReferencedTemplateTypes (
545+ $ positionVariance ->compose (TemplateTypeVariance::createCovariant ()),
546+ );
547+
548+ $ paramVariance = $ positionVariance ->compose (TemplateTypeVariance::createContravariant ());
549+
550+ foreach ($ this ->getParameters () as $ param ) {
551+ foreach ($ param ->getType ()->getReferencedTemplateTypes ($ paramVariance ) as $ reference ) {
552+ $ references [] = $ reference ;
553+ }
554+ }
555+
556+ return $ references ;
557+ }
558+
543559 public function traverse (callable $ cb ): Type
544560 {
545561 if ($ this ->isCommonCallable ) {
0 commit comments