Skip to content

Commit 0154b7e

Browse files
committed
fixup! Replace error-prone instanceof in Rules classes
1 parent ec24c82 commit 0154b7e

File tree

1 file changed

+26
-22
lines changed

1 file changed

+26
-22
lines changed

src/Rules/PhpDoc/RequireImplementsDefinitionTraitRule.php

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use PHPStan\Rules\Rule;
1111
use PHPStan\Rules\RuleErrorBuilder;
1212
use PHPStan\Type\VerbosityLevel;
13+
use function array_map;
1314
use function array_merge;
1415
use function count;
1516
use function sprintf;
@@ -49,35 +50,38 @@ public function processNode(Node $node, Scope $scope): array
4950
$errors = [];
5051
foreach ($implementsTags as $implementsTag) {
5152
$type = $implementsTag->getType();
52-
$classNames = $type->getObjectClassNames();
53-
if (count($classNames) === 0) {
53+
if (count($type->getObjectClassNames()) === 0) {
5454
$errors[] = RuleErrorBuilder::message(sprintf('PHPDoc tag @phpstan-require-implements contains non-object type %s.', $type->describe(VerbosityLevel::typeOnly())))
5555
->identifier('requireImplements.nonObject')
5656
->build();
5757
continue;
5858
}
5959

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

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-
);
8185
}
8286
}
8387

0 commit comments

Comments
 (0)