diff --git a/src/Reflection/ClassReflection.php b/src/Reflection/ClassReflection.php index 6a32e34a6b..c4bda7ea73 100644 --- a/src/Reflection/ClassReflection.php +++ b/src/Reflection/ClassReflection.php @@ -595,6 +595,22 @@ public function isEnum(): bool return $this->reflection->isEnum(); } + /** + * @return 'Interface'|'Trait'|'Enum'|'Class' + */ + public function getClassTypeDescription(): string + { + if ($this->isInterface()) { + return 'Interface'; + } elseif ($this->isTrait()) { + return 'Trait'; + } elseif ($this->isEnum()) { + return 'Enum'; + } + + return 'Class'; + } + public function isReadOnly(): bool { return $this->reflection->isReadOnly(); diff --git a/src/Rules/Api/ApiInstanceofRule.php b/src/Rules/Api/ApiInstanceofRule.php index 612d30fb87..5f2c4d531a 100644 --- a/src/Rules/Api/ApiInstanceofRule.php +++ b/src/Rules/Api/ApiInstanceofRule.php @@ -14,6 +14,7 @@ use PHPStan\Type\UnionType; use function count; use function sprintf; +use function strtolower; /** * @implements Rule @@ -52,9 +53,9 @@ public function processNode(Node $node, Scope $scope): array $ruleError = RuleErrorBuilder::message(sprintf( 'Asking about instanceof %s is not covered by backward compatibility promise. The %s might change in a minor PHPStan version.', $classReflection->getDisplayName(), - $classReflection->isInterface() ? 'interface' : 'class', + strtolower($classReflection->getClassTypeDescription()), )) - ->identifier(sprintf('phpstanApi.%s', $classReflection->isInterface() ? 'interface' : 'class')) + ->identifier(sprintf('phpstanApi.%s', strtolower($classReflection->getClassTypeDescription()))) ->tip(sprintf( "If you think it should be covered by backward compatibility promise, open a discussion:\n %s\n\n See also:\n https://phpstan.org/developing-extensions/backward-compatibility-promise", 'https://github.com/phpstan/phpstan/discussions', diff --git a/src/Rules/AttributesCheck.php b/src/Rules/AttributesCheck.php index 6b526c52b0..41de6e7b85 100644 --- a/src/Rules/AttributesCheck.php +++ b/src/Rules/AttributesCheck.php @@ -53,16 +53,7 @@ public function check( $attributeClass = $this->reflectionProvider->getClass($name); if (!$attributeClass->isAttributeClass()) { - $classLikeDescription = 'Class'; - if ($attributeClass->isInterface()) { - $classLikeDescription = 'Interface'; - } elseif ($attributeClass->isTrait()) { - $classLikeDescription = 'Trait'; - } elseif ($attributeClass->isEnum()) { - $classLikeDescription = 'Enum'; - } - - $errors[] = RuleErrorBuilder::message(sprintf('%s %s is not an Attribute class.', $classLikeDescription, $attributeClass->getDisplayName())) + $errors[] = RuleErrorBuilder::message(sprintf('%s %s is not an Attribute class.', $attributeClass->getClassTypeDescription(), $attributeClass->getDisplayName())) ->identifier('attribute.notAttribute') ->line($attribute->getLine()) ->build(); diff --git a/src/Rules/ClassCaseSensitivityCheck.php b/src/Rules/ClassCaseSensitivityCheck.php index 327133dfdb..da3438eeb8 100644 --- a/src/Rules/ClassCaseSensitivityCheck.php +++ b/src/Rules/ClassCaseSensitivityCheck.php @@ -2,7 +2,6 @@ namespace PHPStan\Rules; -use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\ReflectionProvider; use function sprintf; use function strtolower; @@ -38,7 +37,7 @@ public function checkClassNames(array $pairs): array continue; } - $typeName = $this->getTypeName($classReflection); + $typeName = $classReflection->getClassTypeDescription(); $errors[] = RuleErrorBuilder::message(sprintf( '%s %s referenced with incorrect case: %s.', $typeName, @@ -53,20 +52,4 @@ public function checkClassNames(array $pairs): array return $errors; } - /** - * @return 'Interface'|'Trait'|'Enum'|'Class' - */ - private function getTypeName(ClassReflection $classReflection): string - { - if ($classReflection->isInterface()) { - return 'Interface'; - } elseif ($classReflection->isTrait()) { - return 'Trait'; - } elseif ($classReflection->isEnum()) { - return 'Enum'; - } - - return 'Class'; - } - } diff --git a/src/Rules/Classes/AllowedSubTypesRule.php b/src/Rules/Classes/AllowedSubTypesRule.php index d6b9500965..164e63d9d7 100644 --- a/src/Rules/Classes/AllowedSubTypesRule.php +++ b/src/Rules/Classes/AllowedSubTypesRule.php @@ -9,6 +9,7 @@ use PHPStan\Rules\RuleErrorBuilder; use function array_values; use function sprintf; +use function strtolower; /** * @implements Rule @@ -53,13 +54,7 @@ public function processNode(Node $node, Scope $scope): array } } - $identifierType = 'class'; - if ($classReflection->isInterface()) { - $identifierType = 'interface'; - } elseif ($classReflection->isEnum()) { - $identifierType = 'enum'; - } - + $identifierType = strtolower($classReflection->getClassTypeDescription()); $messages[] = RuleErrorBuilder::message(sprintf( 'Type %s is not allowed to be a subtype of %s.', $className, diff --git a/src/Rules/Classes/DuplicateClassDeclarationRule.php b/src/Rules/Classes/DuplicateClassDeclarationRule.php index b097b46580..ae2658de79 100644 --- a/src/Rules/Classes/DuplicateClassDeclarationRule.php +++ b/src/Rules/Classes/DuplicateClassDeclarationRule.php @@ -15,6 +15,7 @@ use function count; use function implode; use function sprintf; +use function strtolower; /** * @implements Rule @@ -51,12 +52,7 @@ public function processNode(Node $node, Scope $scope): array $filteredClasses = array_filter($filteredClasses, static fn (ReflectionClass $class) => $class->getStartLine() !== $thisClass->getNativeReflection()->getStartLine()); - $identifierType = 'class'; - if ($thisClass->isInterface()) { - $identifierType = 'interface'; - } elseif ($thisClass->isEnum()) { - $identifierType = 'enum'; - } + $identifierType = strtolower($thisClass->getClassTypeDescription()); return [ RuleErrorBuilder::message(sprintf( diff --git a/src/Rules/Classes/DuplicateDeclarationRule.php b/src/Rules/Classes/DuplicateDeclarationRule.php index 594b73811f..a6f554e842 100644 --- a/src/Rules/Classes/DuplicateDeclarationRule.php +++ b/src/Rules/Classes/DuplicateDeclarationRule.php @@ -33,12 +33,7 @@ public function processNode(Node $node, Scope $scope): array throw new ShouldNotHappenException(); } - $identifierType = 'class'; - if ($classReflection->isInterface()) { - $identifierType = 'interface'; - } elseif ($classReflection->isEnum()) { - $identifierType = 'enum'; - } + $identifierType = strtolower($classReflection->getClassTypeDescription()); $errors = []; diff --git a/src/Rules/Classes/NonClassAttributeClassRule.php b/src/Rules/Classes/NonClassAttributeClassRule.php index 9fb75101d2..c6318d07a4 100644 --- a/src/Rules/Classes/NonClassAttributeClassRule.php +++ b/src/Rules/Classes/NonClassAttributeClassRule.php @@ -10,6 +10,7 @@ use PHPStan\Rules\RuleErrorBuilder; use PHPStan\ShouldNotHappenException; use function sprintf; +use function strtolower; /** * @implements Rule @@ -50,9 +51,9 @@ private function check(Scope $scope): array return [ RuleErrorBuilder::message(sprintf( '%s cannot be an Attribute class.', - $classReflection->isInterface() ? 'Interface' : 'Enum', + $classReflection->getClassTypeDescription(), )) - ->identifier(sprintf('attribute.%s', $classReflection->isInterface() ? 'interface' : 'enum')) + ->identifier(sprintf('attribute.%s', strtolower($classReflection->getClassTypeDescription()))) ->build(), ]; } diff --git a/src/Rules/Generics/GenericObjectTypeCheck.php b/src/Rules/Generics/GenericObjectTypeCheck.php index 991743c966..1d1d3456a7 100644 --- a/src/Rules/Generics/GenericObjectTypeCheck.php +++ b/src/Rules/Generics/GenericObjectTypeCheck.php @@ -16,6 +16,7 @@ use function count; use function implode; use function sprintf; +use function strtolower; class GenericObjectTypeCheck { @@ -39,14 +40,7 @@ public function check( continue; } - $classLikeDescription = 'class'; - if ($classReflection->isInterface()) { - $classLikeDescription = 'interface'; - } elseif ($classReflection->isTrait()) { - $classLikeDescription = 'trait'; - } elseif ($classReflection->isEnum()) { - $classLikeDescription = 'enum'; - } + $classLikeDescription = strtolower($classReflection->getClassTypeDescription()); if (!$classReflection->isGeneric()) { $messages[] = RuleErrorBuilder::message(sprintf($classNotGenericMessage, $genericType->describe(VerbosityLevel::typeOnly()), $classLikeDescription, $classReflection->getDisplayName())) ->identifier('generics.notGeneric') diff --git a/src/Rules/Generics/UsedTraitsRule.php b/src/Rules/Generics/UsedTraitsRule.php index fa8ec17a47..bef8093aa5 100644 --- a/src/Rules/Generics/UsedTraitsRule.php +++ b/src/Rules/Generics/UsedTraitsRule.php @@ -12,6 +12,7 @@ use PHPStan\Type\Type; use function array_map; use function sprintf; +use function strtolower; use function ucfirst; /** @@ -56,11 +57,11 @@ public function processNode(Node $node, Scope $scope): array $useTags = $resolvedPhpDoc->getUsesTags(); } - $description = sprintf('class %s', SprintfHelper::escapeFormatString($className)); - $typeDescription = 'class'; + $typeDescription = strtolower($scope->getClassReflection()->getClassTypeDescription()); + $description = sprintf('%s %s', $typeDescription, SprintfHelper::escapeFormatString($className)); if ($traitName !== null) { - $description = sprintf('trait %s', SprintfHelper::escapeFormatString($traitName)); $typeDescription = 'trait'; + $description = sprintf('%s %s', $typeDescription, SprintfHelper::escapeFormatString($traitName)); } return $this->genericAncestorsCheck->check( diff --git a/src/Rules/MissingTypehintCheck.php b/src/Rules/MissingTypehintCheck.php index c8e6f27656..1e1078657b 100644 --- a/src/Rules/MissingTypehintCheck.php +++ b/src/Rules/MissingTypehintCheck.php @@ -24,6 +24,7 @@ use function array_merge; use function in_array; use function sprintf; +use function strtolower; class MissingTypehintCheck { @@ -139,7 +140,7 @@ public function getNonGenericObjectTypesWithGenericClass(Type $type): array throw new ShouldNotHappenException(); } $objectTypes[] = [ - sprintf('%s %s', $classReflection->isInterface() ? 'interface' : 'class', $classReflection->getDisplayName(false)), + sprintf('%s %s', strtolower($classReflection->getClassTypeDescription()), $classReflection->getDisplayName(false)), array_keys($classReflection->getTemplateTypeMap()->getTypes()), ]; return $type;