Skip to content

Commit e56064f

Browse files
committed
fixup! Replace error-prone instanceof in Rules classes
1 parent d638ea7 commit e56064f

File tree

1 file changed

+27
-22
lines changed

1 file changed

+27
-22
lines changed

Diff for: src/Rules/PhpDoc/RequireImplementsDefinitionTraitRule.php

+27-22
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
use PHPStan\Rules\Rule;
1111
use PHPStan\Rules\RuleErrorBuilder;
1212
use PHPStan\Type\VerbosityLevel;
13+
use function array_column;
14+
use function array_map;
1315
use function array_merge;
1416
use function count;
1517
use function sprintf;
@@ -49,35 +51,38 @@ public function processNode(Node $node, Scope $scope): array
4951
$errors = [];
5052
foreach ($implementsTags as $implementsTag) {
5153
$type = $implementsTag->getType();
52-
$classNames = $type->getObjectClassNames();
53-
if (count($classNames) === 0) {
54+
if (count($type->getObjectClassNames()) === 0) {
5455
$errors[] = RuleErrorBuilder::message(sprintf('PHPDoc tag @phpstan-require-implements contains non-object type %s.', $type->describe(VerbosityLevel::typeOnly())))
5556
->identifier('requireImplements.nonObject')
5657
->build();
5758
continue;
5859
}
5960

60-
$class = $classNames[0];
61-
$referencedClassReflection = $type->getObjectClassReflections()[0] ?? null;
62-
if ($referencedClassReflection === null) {
63-
$errors[] = RuleErrorBuilder::message(sprintf('PHPDoc tag @phpstan-require-implements contains unknown class %s.', $class))
64-
->discoveringSymbolsTip()
65-
->identifier('class.notFound')
66-
->build();
67-
continue;
68-
}
61+
$referencedClassReflections = array_map(static fn ($reflection) => [$reflection, $reflection->getName()], $type->getObjectClassReflections());
62+
$referencedClassReflectionsMap = array_column($referencedClassReflections, 0, 1);
63+
foreach ($type->getObjectClassNames() as $class) {
64+
$referencedClassReflection = $referencedClassReflectionsMap[$class] ?? null;
65+
if ($referencedClassReflection === null) {
66+
$errors[] = RuleErrorBuilder::message(sprintf('PHPDoc tag @phpstan-require-implements contains unknown class %s.', $class))
67+
->discoveringSymbolsTip()
68+
->identifier('class.notFound')
69+
->build();
70+
continue;
71+
}
72+
73+
if (!$referencedClassReflection->isInterface()) {
74+
$errors[] = RuleErrorBuilder::message(sprintf('PHPDoc tag @phpstan-require-implements cannot contain non-interface type %s.', $class))
75+
->identifier(sprintf('requireImplements.%s', strtolower($referencedClassReflection->getClassTypeDescription())))
76+
->build();
77+
} else {
78+
$errors = array_merge(
79+
$errors,
80+
$this->classCheck->checkClassNames([
81+
new ClassNameNodePair($class, $node),
82+
], $this->checkClassCaseSensitivity),
83+
);
84+
}
6985

70-
if (!$referencedClassReflection->isInterface()) {
71-
$errors[] = RuleErrorBuilder::message(sprintf('PHPDoc tag @phpstan-require-implements cannot contain non-interface type %s.', $class))
72-
->identifier(sprintf('requireImplements.%s', strtolower($referencedClassReflection->getClassTypeDescription())))
73-
->build();
74-
} else {
75-
$errors = array_merge(
76-
$errors,
77-
$this->classCheck->checkClassNames([
78-
new ClassNameNodePair($class, $node),
79-
], $this->checkClassCaseSensitivity),
80-
);
8186
}
8287
}
8388

0 commit comments

Comments
 (0)