Skip to content

Commit dcb943e

Browse files
committed
Improved support for enum-string types
1 parent efdd51e commit dcb943e

File tree

3 files changed

+45
-3
lines changed

3 files changed

+45
-3
lines changed

src/PhpDoc/TypeNodeResolver.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,9 +235,11 @@ private function resolveIdentifierTypeNode(IdentifierTypeNode $typeNode, NameSco
235235
case 'class-string':
236236
case 'interface-string':
237237
case 'trait-string':
238-
case 'enum-string':
239238
return new ClassStringType();
240239

240+
case 'enum-string':
241+
return new GenericClassStringType(new ObjectType('UnitEnum'));
242+
241243
case 'callable-string':
242244
return new IntersectionType([new StringType(), new CallableType()]);
243245

@@ -696,7 +698,7 @@ static function (string $variance): TemplateTypeVariance {
696698
if (count($genericTypes) === 2) { // iterable<KeyType, ValueType>
697699
return new IterableType($genericTypes[0], $genericTypes[1]);
698700
}
699-
} elseif (in_array($mainTypeName, ['class-string', 'interface-string'], true)) {
701+
} elseif (in_array($mainTypeName, ['class-string', 'interface-string', 'enum-string'], true)) {
700702
if (count($genericTypes) === 1) {
701703
$genericType = $genericTypes[0];
702704
if ($genericType->isObject()->yes() || $genericType instanceof MixedType) {
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php lint >= 8.0
2+
3+
namespace MoreTypeStringsPhp8;
4+
5+
use function PHPStan\Testing\assertType;
6+
7+
class Foo
8+
{
9+
10+
/**
11+
* @param interface-string $interfaceString
12+
* @param trait-string $traitString
13+
* @param interface-string<Foo> $genericInterfaceString
14+
* @param trait-string<Foo> $genericTraitString
15+
* @param enum-string<Bar> $genericEnumString
16+
*/
17+
public function doFoo(
18+
string $interfaceString,
19+
string $traitString,
20+
string $genericInterfaceString,
21+
string $genericTraitString,
22+
string $genericEnumString,
23+
): void
24+
{
25+
assertType('class-string', $interfaceString);
26+
assertType('class-string', $traitString);
27+
assertType('class-string<MoreTypeStringsPhp8\Foo>', $genericInterfaceString);
28+
assertType('string', $genericTraitString);
29+
assertType('class-string<MoreTypeStringsPhp8\Bar>', $genericEnumString);
30+
}
31+
32+
}
33+
34+
enum Bar
35+
{
36+
37+
case A;
38+
case B;
39+
40+
}

tests/PHPStan/Analyser/nsrt/more-types.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public function doFoo(
4242
assertType('array&callable(): mixed', $callableArray);
4343
assertType('resource', $closedResource);
4444
assertType('resource', $openResource);
45-
assertType('class-string', $enumString);
45+
assertType('class-string<UnitEnum>', $enumString);
4646
assertType('literal-string&non-empty-string', $nonEmptyLiteralString);
4747
assertType('float|int<min, -1>|int<1, max>|non-falsy-string|true', $nonEmptyScalar);
4848
assertType("0|0.0|''|'0'|false", $emptyScalar);

0 commit comments

Comments
 (0)