Skip to content

Commit 471b818

Browse files
Improved support for enum-string types
Co-authored-by: Ondřej Mirtes <[email protected]>
1 parent 166dcbe commit 471b818

File tree

3 files changed

+59
-2
lines changed

3 files changed

+59
-2
lines changed

src/PhpDoc/TypeNodeResolver.php

Lines changed: 10 additions & 1 deletion
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

@@ -704,6 +706,13 @@ static function (string $variance): TemplateTypeVariance {
704706
}
705707
}
706708

709+
return new ErrorType();
710+
} elseif ($mainTypeName === 'enum-string') {
711+
if (count($genericTypes) === 1) {
712+
$genericType = $genericTypes[0];
713+
return new GenericClassStringType(TypeCombinator::intersect($genericType, new ObjectType('UnitEnum')));
714+
}
715+
707716
return new ErrorType();
708717
} elseif ($mainTypeName === 'int') {
709718
if (count($genericTypes) === 2) { // int<min, max>, int<1, 3>
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php // lint >= 8.1
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+
* @param enum-string<BuzInterface> $genericInterfaceEnumString
17+
*/
18+
public function doFoo(
19+
string $interfaceString,
20+
string $traitString,
21+
string $genericInterfaceString,
22+
string $genericTraitString,
23+
string $genericEnumString,
24+
string $genericInterfaceEnumString,
25+
): void
26+
{
27+
assertType('class-string', $interfaceString);
28+
assertType('class-string', $traitString);
29+
assertType('class-string<MoreTypeStringsPhp8\Foo>', $genericInterfaceString);
30+
assertType('string', $genericTraitString);
31+
assertType('class-string<MoreTypeStringsPhp8\Bar>', $genericEnumString);
32+
assertType('class-string<MoreTypeStringsPhp8\BuzInterface&UnitEnum>', $genericInterfaceEnumString);
33+
}
34+
35+
}
36+
37+
enum Bar
38+
{
39+
40+
case A;
41+
case B;
42+
43+
}
44+
45+
interface BuzInterface
46+
{
47+
48+
}

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)