66use PhpParser \Node \Name ;
77use PHPStan \Reflection \ReflectionProvider ;
88use PHPStan \Rules \IdentifierRuleError ;
9+ use PHPStan \Rules \PhpDoc \UnresolvableTypeHelper ;
910use PHPStan \Rules \RuleErrorBuilder ;
1011use PHPStan \Type \Generic \GenericObjectType ;
1112use PHPStan \Type \Generic \TemplateTypeVariance ;
@@ -31,8 +32,10 @@ public function __construct(
3132 private ReflectionProvider $ reflectionProvider ,
3233 private GenericObjectTypeCheck $ genericObjectTypeCheck ,
3334 private VarianceCheck $ varianceCheck ,
35+ private UnresolvableTypeHelper $ unresolvableTypeHelper ,
3436 private bool $ checkGenericClassInNonGenericObjectType ,
3537 private array $ skipCheckGenericClasses ,
38+ private bool $ absentTypeChecks ,
3639 )
3740 {
3841 }
@@ -46,6 +49,7 @@ public function check(
4649 array $ nameNodes ,
4750 array $ ancestorTypes ,
4851 string $ incompatibleTypeMessage ,
52+ string $ unresolvableTypeMessage ,
4953 string $ noNamesMessage ,
5054 string $ noRelatedNameMessage ,
5155 string $ classNotGenericMessage ,
@@ -99,6 +103,14 @@ public function check(
99103 );
100104 $ messages = array_merge ($ messages , $ genericObjectTypeCheckMessages );
101105
106+ if ($ this ->absentTypeChecks ) {
107+ if ($ this ->unresolvableTypeHelper ->containsUnresolvableType ($ ancestorType )) {
108+ $ messages [] = RuleErrorBuilder::message ($ unresolvableTypeMessage )
109+ ->identifier ('generics.unresolvable ' )
110+ ->build ();
111+ }
112+ }
113+
102114 foreach ($ ancestorType ->getReferencedClasses () as $ referencedClass ) {
103115 if ($ this ->reflectionProvider ->hasClass ($ referencedClass )) {
104116 continue ;
0 commit comments