6
6
use PhpParser \Node \Name ;
7
7
use PHPStan \Reflection \ReflectionProvider ;
8
8
use PHPStan \Rules \IdentifierRuleError ;
9
+ use PHPStan \Rules \PhpDoc \UnresolvableTypeHelper ;
9
10
use PHPStan \Rules \RuleErrorBuilder ;
10
11
use PHPStan \Type \Generic \GenericObjectType ;
11
12
use PHPStan \Type \Generic \TemplateTypeVariance ;
@@ -31,8 +32,10 @@ public function __construct(
31
32
private ReflectionProvider $ reflectionProvider ,
32
33
private GenericObjectTypeCheck $ genericObjectTypeCheck ,
33
34
private VarianceCheck $ varianceCheck ,
35
+ private UnresolvableTypeHelper $ unresolvableTypeHelper ,
34
36
private bool $ checkGenericClassInNonGenericObjectType ,
35
37
private array $ skipCheckGenericClasses ,
38
+ private bool $ absentTypeChecks ,
36
39
)
37
40
{
38
41
}
@@ -46,6 +49,7 @@ public function check(
46
49
array $ nameNodes ,
47
50
array $ ancestorTypes ,
48
51
string $ incompatibleTypeMessage ,
52
+ string $ unresolvableTypeMessage ,
49
53
string $ noNamesMessage ,
50
54
string $ noRelatedNameMessage ,
51
55
string $ classNotGenericMessage ,
@@ -99,6 +103,14 @@ public function check(
99
103
);
100
104
$ messages = array_merge ($ messages , $ genericObjectTypeCheckMessages );
101
105
106
+ if ($ this ->absentTypeChecks ) {
107
+ if ($ this ->unresolvableTypeHelper ->containsUnresolvableType ($ ancestorType )) {
108
+ $ messages [] = RuleErrorBuilder::message ($ unresolvableTypeMessage )
109
+ ->identifier ('generics.unresolvable ' )
110
+ ->build ();
111
+ }
112
+ }
113
+
102
114
foreach ($ ancestorType ->getReferencedClasses () as $ referencedClass ) {
103
115
if ($ this ->reflectionProvider ->hasClass ($ referencedClass )) {
104
116
continue ;
0 commit comments