Skip to content

Commit dec9e43

Browse files
committed
Introduce ClassReflection::getClassTypeDescription()
1 parent 8864fd7 commit dec9e43

11 files changed

+37
-63
lines changed

src/Reflection/ClassReflection.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,22 @@ public function isEnum(): bool
595595
return $this->reflection->isEnum();
596596
}
597597

598+
/**
599+
* @return 'Interface'|'Trait'|'Enum'|'Class'
600+
*/
601+
public function getClassTypeDescription(): string
602+
{
603+
if ($this->isInterface()) {
604+
return 'Interface';
605+
} elseif ($this->isTrait()) {
606+
return 'Trait';
607+
} elseif ($this->isEnum()) {
608+
return 'Enum';
609+
}
610+
611+
return 'Class';
612+
}
613+
598614
public function isReadOnly(): bool
599615
{
600616
return $this->reflection->isReadOnly();

src/Rules/Api/ApiInstanceofRule.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use PHPStan\Type\UnionType;
1515
use function count;
1616
use function sprintf;
17+
use function strtolower;
1718

1819
/**
1920
* @implements Rule<Node\Expr\Instanceof_>
@@ -52,9 +53,9 @@ public function processNode(Node $node, Scope $scope): array
5253
$ruleError = RuleErrorBuilder::message(sprintf(
5354
'Asking about instanceof %s is not covered by backward compatibility promise. The %s might change in a minor PHPStan version.',
5455
$classReflection->getDisplayName(),
55-
$classReflection->isInterface() ? 'interface' : 'class',
56+
strtolower($classReflection->getClassTypeDescription()),
5657
))
57-
->identifier(sprintf('phpstanApi.%s', $classReflection->isInterface() ? 'interface' : 'class'))
58+
->identifier(sprintf('phpstanApi.%s', strtolower($classReflection->getClassTypeDescription())))
5859
->tip(sprintf(
5960
"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",
6061
'https://github.com/phpstan/phpstan/discussions',

src/Rules/AttributesCheck.php

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,7 @@ public function check(
5353

5454
$attributeClass = $this->reflectionProvider->getClass($name);
5555
if (!$attributeClass->isAttributeClass()) {
56-
$classLikeDescription = 'Class';
57-
if ($attributeClass->isInterface()) {
58-
$classLikeDescription = 'Interface';
59-
} elseif ($attributeClass->isTrait()) {
60-
$classLikeDescription = 'Trait';
61-
} elseif ($attributeClass->isEnum()) {
62-
$classLikeDescription = 'Enum';
63-
}
64-
65-
$errors[] = RuleErrorBuilder::message(sprintf('%s %s is not an Attribute class.', $classLikeDescription, $attributeClass->getDisplayName()))
56+
$errors[] = RuleErrorBuilder::message(sprintf('%s %s is not an Attribute class.', $attributeClass->getClassTypeDescription(), $attributeClass->getDisplayName()))
6657
->identifier('attribute.notAttribute')
6758
->line($attribute->getLine())
6859
->build();

src/Rules/ClassCaseSensitivityCheck.php

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
namespace PHPStan\Rules;
44

5-
use PHPStan\Reflection\ClassReflection;
65
use PHPStan\Reflection\ReflectionProvider;
76
use function sprintf;
87
use function strtolower;
@@ -38,7 +37,7 @@ public function checkClassNames(array $pairs): array
3837
continue;
3938
}
4039

41-
$typeName = $this->getTypeName($classReflection);
40+
$typeName = $classReflection->getClassTypeDescription();
4241
$errors[] = RuleErrorBuilder::message(sprintf(
4342
'%s %s referenced with incorrect case: %s.',
4443
$typeName,
@@ -53,20 +52,4 @@ public function checkClassNames(array $pairs): array
5352
return $errors;
5453
}
5554

56-
/**
57-
* @return 'Interface'|'Trait'|'Enum'|'Class'
58-
*/
59-
private function getTypeName(ClassReflection $classReflection): string
60-
{
61-
if ($classReflection->isInterface()) {
62-
return 'Interface';
63-
} elseif ($classReflection->isTrait()) {
64-
return 'Trait';
65-
} elseif ($classReflection->isEnum()) {
66-
return 'Enum';
67-
}
68-
69-
return 'Class';
70-
}
71-
7255
}

src/Rules/Classes/AllowedSubTypesRule.php

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use PHPStan\Rules\RuleErrorBuilder;
1010
use function array_values;
1111
use function sprintf;
12+
use function strtolower;
1213

1314
/**
1415
* @implements Rule<InClassNode>
@@ -53,13 +54,7 @@ public function processNode(Node $node, Scope $scope): array
5354
}
5455
}
5556

56-
$identifierType = 'class';
57-
if ($classReflection->isInterface()) {
58-
$identifierType = 'interface';
59-
} elseif ($classReflection->isEnum()) {
60-
$identifierType = 'enum';
61-
}
62-
57+
$identifierType = strtolower($classReflection->getClassTypeDescription());
6358
$messages[] = RuleErrorBuilder::message(sprintf(
6459
'Type %s is not allowed to be a subtype of %s.',
6560
$className,

src/Rules/Classes/DuplicateClassDeclarationRule.php

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use function count;
1616
use function implode;
1717
use function sprintf;
18+
use function strtolower;
1819

1920
/**
2021
* @implements Rule<InClassNode>
@@ -51,12 +52,7 @@ public function processNode(Node $node, Scope $scope): array
5152

5253
$filteredClasses = array_filter($filteredClasses, static fn (ReflectionClass $class) => $class->getStartLine() !== $thisClass->getNativeReflection()->getStartLine());
5354

54-
$identifierType = 'class';
55-
if ($thisClass->isInterface()) {
56-
$identifierType = 'interface';
57-
} elseif ($thisClass->isEnum()) {
58-
$identifierType = 'enum';
59-
}
55+
$identifierType = strtolower($thisClass->getClassTypeDescription());
6056

6157
return [
6258
RuleErrorBuilder::message(sprintf(

src/Rules/Classes/DuplicateDeclarationRule.php

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,7 @@ public function processNode(Node $node, Scope $scope): array
3333
throw new ShouldNotHappenException();
3434
}
3535

36-
$identifierType = 'class';
37-
if ($classReflection->isInterface()) {
38-
$identifierType = 'interface';
39-
} elseif ($classReflection->isEnum()) {
40-
$identifierType = 'enum';
41-
}
36+
$identifierType = strtolower($classReflection->getClassTypeDescription());
4237

4338
$errors = [];
4439

src/Rules/Classes/NonClassAttributeClassRule.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use PHPStan\Rules\RuleErrorBuilder;
1111
use PHPStan\ShouldNotHappenException;
1212
use function sprintf;
13+
use function strtolower;
1314

1415
/**
1516
* @implements Rule<InClassNode>
@@ -50,9 +51,9 @@ private function check(Scope $scope): array
5051
return [
5152
RuleErrorBuilder::message(sprintf(
5253
'%s cannot be an Attribute class.',
53-
$classReflection->isInterface() ? 'Interface' : 'Enum',
54+
$classReflection->getClassTypeDescription(),
5455
))
55-
->identifier(sprintf('attribute.%s', $classReflection->isInterface() ? 'interface' : 'enum'))
56+
->identifier(sprintf('attribute.%s', strtolower($classReflection->getClassTypeDescription())))
5657
->build(),
5758
];
5859
}

src/Rules/Generics/GenericObjectTypeCheck.php

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use function count;
1717
use function implode;
1818
use function sprintf;
19+
use function strtolower;
1920

2021
class GenericObjectTypeCheck
2122
{
@@ -39,14 +40,7 @@ public function check(
3940
continue;
4041
}
4142

42-
$classLikeDescription = 'class';
43-
if ($classReflection->isInterface()) {
44-
$classLikeDescription = 'interface';
45-
} elseif ($classReflection->isTrait()) {
46-
$classLikeDescription = 'trait';
47-
} elseif ($classReflection->isEnum()) {
48-
$classLikeDescription = 'enum';
49-
}
43+
$classLikeDescription = strtolower($classReflection->getClassTypeDescription());
5044
if (!$classReflection->isGeneric()) {
5145
$messages[] = RuleErrorBuilder::message(sprintf($classNotGenericMessage, $genericType->describe(VerbosityLevel::typeOnly()), $classLikeDescription, $classReflection->getDisplayName()))
5246
->identifier('generics.notGeneric')

src/Rules/Generics/UsedTraitsRule.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use PHPStan\Type\Type;
1313
use function array_map;
1414
use function sprintf;
15+
use function strtolower;
1516
use function ucfirst;
1617

1718
/**
@@ -56,11 +57,11 @@ public function processNode(Node $node, Scope $scope): array
5657
$useTags = $resolvedPhpDoc->getUsesTags();
5758
}
5859

59-
$description = sprintf('class %s', SprintfHelper::escapeFormatString($className));
60-
$typeDescription = 'class';
60+
$typeDescription = strtolower($scope->getClassReflection()->getClassTypeDescription());
61+
$description = sprintf('%s %s', $typeDescription, SprintfHelper::escapeFormatString($className));
6162
if ($traitName !== null) {
62-
$description = sprintf('trait %s', SprintfHelper::escapeFormatString($traitName));
6363
$typeDescription = 'trait';
64+
$description = sprintf('%s %s', $typeDescription, SprintfHelper::escapeFormatString($traitName));
6465
}
6566

6667
return $this->genericAncestorsCheck->check(

0 commit comments

Comments
 (0)