Skip to content

Commit 0e2eb5c

Browse files
staabmondrejmirtes
authored andcommitted
Implement Type->getEnumCaseObject()
1 parent 96ee4cf commit 0e2eb5c

22 files changed

Lines changed: 148 additions & 2 deletions

src/Type/Accessory/HasMethodType.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use PHPStan\TrinaryLogic;
1414
use PHPStan\Type\AcceptsResult;
1515
use PHPStan\Type\CompoundType;
16+
use PHPStan\Type\Enum\EnumCaseObjectType;
1617
use PHPStan\Type\ErrorType;
1718
use PHPStan\Type\IntersectionType;
1819
use PHPStan\Type\IsSuperTypeOfResult;
@@ -166,6 +167,11 @@ public function getEnumCases(): array
166167
return [];
167168
}
168169

170+
public function getEnumCaseObject(): ?EnumCaseObjectType
171+
{
172+
return null;
173+
}
174+
169175
public function traverse(callable $cb): Type
170176
{
171177
return $this;

src/Type/Accessory/HasOffsetType.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use PHPStan\Type\CompoundType;
1212
use PHPStan\Type\Constant\ConstantIntegerType;
1313
use PHPStan\Type\Constant\ConstantStringType;
14+
use PHPStan\Type\Enum\EnumCaseObjectType;
1415
use PHPStan\Type\ErrorType;
1516
use PHPStan\Type\IntegerRangeType;
1617
use PHPStan\Type\IntersectionType;
@@ -412,6 +413,11 @@ public function getEnumCases(): array
412413
return [];
413414
}
414415

416+
public function getEnumCaseObject(): ?EnumCaseObjectType
417+
{
418+
return null;
419+
}
420+
415421
public function traverse(callable $cb): Type
416422
{
417423
return $this;

src/Type/Accessory/HasOffsetValueType.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use PHPStan\Type\Constant\ConstantIntegerType;
1414
use PHPStan\Type\Constant\ConstantStringType;
1515
use PHPStan\Type\ConstantScalarType;
16+
use PHPStan\Type\Enum\EnumCaseObjectType;
1617
use PHPStan\Type\ErrorType;
1718
use PHPStan\Type\IntegerRangeType;
1819
use PHPStan\Type\IntegerType;
@@ -476,6 +477,11 @@ public function getEnumCases(): array
476477
return [];
477478
}
478479

480+
public function getEnumCaseObject(): ?EnumCaseObjectType
481+
{
482+
return null;
483+
}
484+
479485
public function traverse(callable $cb): Type
480486
{
481487
$newValueType = $cb($this->valueType);

src/Type/Accessory/HasPropertyType.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use PHPStan\TrinaryLogic;
1010
use PHPStan\Type\AcceptsResult;
1111
use PHPStan\Type\CompoundType;
12+
use PHPStan\Type\Enum\EnumCaseObjectType;
1213
use PHPStan\Type\ErrorType;
1314
use PHPStan\Type\IntersectionType;
1415
use PHPStan\Type\IsSuperTypeOfResult;
@@ -149,6 +150,11 @@ public function getEnumCases(): array
149150
return [];
150151
}
151152

153+
public function getEnumCaseObject(): ?EnumCaseObjectType
154+
{
155+
return null;
156+
}
157+
152158
public function traverse(callable $cb): Type
153159
{
154160
return $this;

src/Type/CallableType.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
use PHPStan\ShouldNotHappenException;
2727
use PHPStan\TrinaryLogic;
2828
use PHPStan\Type\Accessory\AccessoryNonEmptyStringType;
29+
use PHPStan\Type\Enum\EnumCaseObjectType;
2930
use PHPStan\Type\Generic\TemplateType;
3031
use PHPStan\Type\Generic\TemplateTypeHelper;
3132
use PHPStan\Type\Generic\TemplateTypeMap;
@@ -645,6 +646,11 @@ public function getEnumCases(): array
645646
return [];
646647
}
647648

649+
public function getEnumCaseObject(): ?EnumCaseObjectType
650+
{
651+
return null;
652+
}
653+
648654
public function isCommonCallable(): bool
649655
{
650656
return $this->isCommonCallable;

src/Type/ClosureType.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
use PHPStan\Type\Constant\ConstantArrayType;
3636
use PHPStan\Type\Constant\ConstantBooleanType;
3737
use PHPStan\Type\Constant\ConstantIntegerType;
38+
use PHPStan\Type\Enum\EnumCaseObjectType;
3839
use PHPStan\Type\Generic\TemplateType;
3940
use PHPStan\Type\Generic\TemplateTypeHelper;
4041
use PHPStan\Type\Generic\TemplateTypeMap;
@@ -423,6 +424,11 @@ public function getEnumCases(): array
423424
return [];
424425
}
425426

427+
public function getEnumCaseObject(): ?EnumCaseObjectType
428+
{
429+
return null;
430+
}
431+
426432
public function isCommonCallable(): bool
427433
{
428434
return $this->isCommonCallable;

src/Type/Enum/EnumCaseObjectType.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@ public function getEnumCases(): array
217217
return [$this];
218218
}
219219

220+
public function getEnumCaseObject(): ?EnumCaseObjectType
221+
{
222+
return $this;
223+
}
224+
220225
public function toPhpDocNode(): TypeNode
221226
{
222227
return new ConstTypeNode(

src/Type/IntersectionType.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
use PHPStan\Type\Constant\ConstantArrayType;
3838
use PHPStan\Type\Constant\ConstantIntegerType;
3939
use PHPStan\Type\Constant\ConstantStringType;
40+
use PHPStan\Type\Enum\EnumCaseObjectType;
4041
use PHPStan\Type\Generic\TemplateType;
4142
use PHPStan\Type\Generic\TemplateTypeMap;
4243
use PHPStan\Type\Generic\TemplateTypeVariance;
@@ -1032,6 +1033,25 @@ public function getEnumCases(): array
10321033
return array_values(array_intersect_key(...$compare));
10331034
}
10341035

1036+
public function getEnumCaseObject(): ?EnumCaseObjectType
1037+
{
1038+
$singleCase = null;
1039+
foreach ($this->types as $type) {
1040+
$caseObject = $type->getEnumCaseObject();
1041+
if ($caseObject === null) {
1042+
continue;
1043+
}
1044+
1045+
if ($singleCase !== null) {
1046+
return null;
1047+
}
1048+
1049+
$singleCase = $caseObject;
1050+
}
1051+
1052+
return $singleCase;
1053+
}
1054+
10351055
public function isCallable(): TrinaryLogic
10361056
{
10371057
return $this->intersectResults(static fn (Type $type): TrinaryLogic => $type->isCallable());

src/Type/IterableType.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
88
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
99
use PHPStan\TrinaryLogic;
10+
use PHPStan\Type\Enum\EnumCaseObjectType;
1011
use PHPStan\Type\Generic\GenericObjectType;
1112
use PHPStan\Type\Generic\TemplateMixedType;
1213
use PHPStan\Type\Generic\TemplateTypeMap;
@@ -421,6 +422,11 @@ public function getEnumCases(): array
421422
return [];
422423
}
423424

425+
public function getEnumCaseObject(): ?EnumCaseObjectType
426+
{
427+
return null;
428+
}
429+
424430
public function inferTemplateTypes(Type $receivedType): TemplateTypeMap
425431
{
426432
if ($receivedType instanceof UnionType || $receivedType instanceof IntersectionType) {

src/Type/MixedType.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
use PHPStan\Type\Constant\ConstantFloatType;
3333
use PHPStan\Type\Constant\ConstantIntegerType;
3434
use PHPStan\Type\Constant\ConstantStringType;
35+
use PHPStan\Type\Enum\EnumCaseObjectType;
3536
use PHPStan\Type\Generic\TemplateMixedType;
3637
use PHPStan\Type\Generic\TemplateType;
3738
use PHPStan\Type\Traits\NonGeneralizableTypeTrait;
@@ -320,6 +321,11 @@ public function getEnumCases(): array
320321
return [];
321322
}
322323

324+
public function getEnumCaseObject(): ?EnumCaseObjectType
325+
{
326+
return null;
327+
}
328+
323329
public function getCallableParametersAcceptors(ClassMemberAccessAnswerer $scope): array
324330
{
325331
return [new TrivialParametersAcceptor()];

0 commit comments

Comments
 (0)