1212use PHPStan \Rules \Rule ;
1313use PHPStan \Rules \RuleErrorBuilder ;
1414use PHPStan \Type \ErrorType ;
15+ use PHPStan \Type \FileTypeMapper ;
1516use PHPStan \Type \NeverType ;
1617use PHPStan \Type \VerbosityLevel ;
1718
2122class MixinRule implements Rule
2223{
2324
25+ /** @var FileTypeMapper */
26+ private $ fileTypeMapper ;
27+
2428 /** @var ReflectionProvider */
2529 private $ reflectionProvider ;
2630
@@ -37,13 +41,15 @@ class MixinRule implements Rule
3741 private $ checkClassCaseSensitivity ;
3842
3943 public function __construct (
44+ FileTypeMapper $ fileTypeMapper ,
4045 ReflectionProvider $ reflectionProvider ,
4146 ClassCaseSensitivityCheck $ classCaseSensitivityCheck ,
4247 GenericObjectTypeCheck $ genericObjectTypeCheck ,
4348 MissingTypehintCheck $ missingTypehintCheck ,
4449 bool $ checkClassCaseSensitivity
4550 )
4651 {
52+ $ this ->fileTypeMapper = $ fileTypeMapper ;
4753 $ this ->reflectionProvider = $ reflectionProvider ;
4854 $ this ->classCaseSensitivityCheck = $ classCaseSensitivityCheck ;
4955 $ this ->genericObjectTypeCheck = $ genericObjectTypeCheck ;
@@ -64,11 +70,18 @@ public function processNode(Node $node, Scope $scope): array
6470 }
6571
6672 $ className = (string ) $ node ->namespacedName ;
67- if (!$ this ->reflectionProvider ->hasClass ($ className )) {
73+ $ docComment = $ node ->getDocComment ();
74+ if ($ docComment === null ) {
6875 return [];
6976 }
70- $ classReflection = $ this ->reflectionProvider ->getClass ($ className );
71- $ mixinTags = $ classReflection ->getMixinTags ();
77+ $ resolvedPhpDoc = $ this ->fileTypeMapper ->getResolvedPhpDoc (
78+ $ scope ->getFile (),
79+ $ className ,
80+ null ,
81+ null ,
82+ $ docComment ->getText ()
83+ );
84+ $ mixinTags = $ resolvedPhpDoc ->getMixinTags ();
7285 $ errors = [];
7386 foreach ($ mixinTags as $ mixinTag ) {
7487 $ type = $ mixinTag ->getType ();
0 commit comments