Skip to content

Commit 5eaf06a

Browse files
committed
fixup! Improved support for enum-string types
1 parent 4901208 commit 5eaf06a

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

src/PhpDoc/TypeNodeResolver.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
use PHPStan\Type\ValueOfType;
108108
use PHPStan\Type\VoidType;
109109
use Traversable;
110+
use UnitEnum;
110111
use function array_key_exists;
111112
use function array_map;
112113
use function array_values;
@@ -238,7 +239,7 @@ private function resolveIdentifierTypeNode(IdentifierTypeNode $typeNode, NameSco
238239
return new ClassStringType();
239240

240241
case 'enum-string':
241-
return new GenericClassStringType(new ObjectType('UnitEnum'));
242+
return new GenericClassStringType(new ObjectType(UnitEnum::class));
242243

243244
case 'callable-string':
244245
return new IntersectionType([new StringType(), new CallableType()]);
@@ -698,14 +699,23 @@ static function (string $variance): TemplateTypeVariance {
698699
if (count($genericTypes) === 2) { // iterable<KeyType, ValueType>
699700
return new IterableType($genericTypes[0], $genericTypes[1]);
700701
}
701-
} elseif (in_array($mainTypeName, ['class-string', 'interface-string', 'enum-string'], true)) {
702+
} elseif (in_array($mainTypeName, ['class-string', 'interface-string'], true)) {
702703
if (count($genericTypes) === 1) {
703704
$genericType = $genericTypes[0];
704705
if ($genericType->isObject()->yes() || $genericType instanceof MixedType) {
705706
return new GenericClassStringType($genericType);
706707
}
707708
}
708709

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+
709719
return new ErrorType();
710720
} elseif ($mainTypeName === 'int') {
711721
if (count($genericTypes) === 2) { // int<min, max>, int<1, 3>

tests/PHPStan/Analyser/nsrt/more-type-strings-php8.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,23 @@ class Foo
1313
* @param interface-string<Foo> $genericInterfaceString
1414
* @param trait-string<Foo> $genericTraitString
1515
* @param enum-string<Bar> $genericEnumString
16+
* @param enum-string<BuzInterface> $genericInterfaceEnumString
1617
*/
1718
public function doFoo(
1819
string $interfaceString,
1920
string $traitString,
2021
string $genericInterfaceString,
2122
string $genericTraitString,
2223
string $genericEnumString,
24+
string $genericInterfaceEnumString,
2325
): void
2426
{
2527
assertType('class-string', $interfaceString);
2628
assertType('class-string', $traitString);
2729
assertType('class-string<MoreTypeStringsPhp8\Foo>', $genericInterfaceString);
2830
assertType('string', $genericTraitString);
2931
assertType('class-string<MoreTypeStringsPhp8\Bar>', $genericEnumString);
32+
assertType('class-string<MoreTypeStringsPhp8\BuzInterface&UnitEnum>', $genericInterfaceEnumString);
3033
}
3134

3235
}
@@ -38,3 +41,8 @@ enum Bar
3841
case B;
3942

4043
}
44+
45+
interface BuzInterface
46+
{
47+
48+
}

0 commit comments

Comments
 (0)