|
107 | 107 | use PHPStan\Type\ValueOfType; |
108 | 108 | use PHPStan\Type\VoidType; |
109 | 109 | use Traversable; |
| 110 | +use UnitEnum; |
110 | 111 | use function array_key_exists; |
111 | 112 | use function array_map; |
112 | 113 | use function array_values; |
@@ -238,7 +239,7 @@ private function resolveIdentifierTypeNode(IdentifierTypeNode $typeNode, NameSco |
238 | 239 | return new ClassStringType(); |
239 | 240 |
|
240 | 241 | case 'enum-string': |
241 | | - return new GenericClassStringType(new ObjectType('UnitEnum')); |
| 242 | + return new GenericClassStringType(new ObjectType(UnitEnum::class)); |
242 | 243 |
|
243 | 244 | case 'callable-string': |
244 | 245 | return new IntersectionType([new StringType(), new CallableType()]); |
@@ -698,14 +699,23 @@ static function (string $variance): TemplateTypeVariance { |
698 | 699 | if (count($genericTypes) === 2) { // iterable<KeyType, ValueType> |
699 | 700 | return new IterableType($genericTypes[0], $genericTypes[1]); |
700 | 701 | } |
701 | | - } elseif (in_array($mainTypeName, ['class-string', 'interface-string', 'enum-string'], true)) { |
| 702 | + } elseif (in_array($mainTypeName, ['class-string', 'interface-string'], true)) { |
702 | 703 | if (count($genericTypes) === 1) { |
703 | 704 | $genericType = $genericTypes[0]; |
704 | 705 | if ($genericType->isObject()->yes() || $genericType instanceof MixedType) { |
705 | 706 | return new GenericClassStringType($genericType); |
706 | 707 | } |
707 | 708 | } |
708 | 709 |
|
| 710 | + return new ErrorType(); |
| 711 | + } elseif ($mainTypeName === 'enum-string') { |
| 712 | + if (count($genericTypes) === 1) { |
| 713 | + $genericType = $genericTypes[0]; |
| 714 | + if ($genericType->isObject()->yes() || $genericType instanceof MixedType) { |
| 715 | + return new GenericClassStringType(TypeCombinator::intersect($genericType, new ObjectType(UnitEnum::class))); |
| 716 | + } |
| 717 | + } |
| 718 | + |
709 | 719 | return new ErrorType(); |
710 | 720 | } elseif ($mainTypeName === 'int') { |
711 | 721 | if (count($genericTypes) === 2) { // int<min, max>, int<1, 3> |
|
0 commit comments