Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /