Skip to content

Commit 42224b5

Browse files
committed
WIP: TASK remove unneeded EnumMemberType::memberBackedValueType
1 parent 5e1dd20 commit 42224b5

File tree

6 files changed

+51
-29
lines changed

6 files changed

+51
-29
lines changed

src/TypeSystem/Type/EnumType/EnumMemberType.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ final class EnumMemberType implements TypeInterface
2828
{
2929
public function __construct(
3030
public readonly EnumInstanceType|EnumStaticType $enumType,
31-
public readonly string $memberName,
32-
public readonly ?TypeInterface $memberBackedValueType
31+
public readonly string $memberName
3332
) {
3433
}
3534

src/TypeSystem/Type/EnumType/EnumStaticType.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,6 @@ final class EnumStaticType implements TypeInterface
3030

3131
public function toEnumInstanceType(): EnumInstanceType
3232
{
33-
return new EnumInstanceType($this->moduleId, $this->enumName, $this->membersWithType);
33+
return new EnumInstanceType($this->moduleId, $this->enumName, $this->memberNameHashMap);
3434
}
3535
}

src/TypeSystem/Type/EnumType/EnumTrait.php

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -24,59 +24,44 @@
2424

2525
use PackageFactory\ComponentEngine\Module\ModuleId;
2626
use PackageFactory\ComponentEngine\Parser\Ast\EnumDeclarationNode;
27-
use PackageFactory\ComponentEngine\Parser\Ast\NumberLiteralNode;
28-
use PackageFactory\ComponentEngine\Parser\Ast\StringLiteralNode;
29-
use PackageFactory\ComponentEngine\TypeSystem\Resolver\NumberLiteral\NumberLiteralTypeResolver;
30-
use PackageFactory\ComponentEngine\TypeSystem\Resolver\StringLiteral\StringLiteralTypeResolver;
3127
use PackageFactory\ComponentEngine\TypeSystem\TypeInterface;
3228

3329
trait EnumTrait
3430
{
3531
public function __construct(
3632
public readonly ?ModuleId $moduleId,
3733
public readonly string $enumName,
38-
private readonly array $membersWithType,
34+
private readonly array $memberNameHashMap,
3935
) {
4036
}
4137

4238
public static function fromModuleIdAndDeclaration(ModuleId $moduleId, EnumDeclarationNode $enumDeclarationNode): self
4339
{
44-
$membersWithType = [];
45-
40+
$memberNameHashMap = [];
4641
foreach ($enumDeclarationNode->memberDeclarations->items as $memberDeclarationNode) {
47-
$membersWithType[$memberDeclarationNode->name] = match ($memberDeclarationNode->value
48-
? $memberDeclarationNode->value::class
49-
: null
50-
) {
51-
NumberLiteralNode::class => (new NumberLiteralTypeResolver())
52-
->resolveTypeOf($memberDeclarationNode->value),
53-
StringLiteralNode::class => (new StringLiteralTypeResolver())
54-
->resolveTypeOf($memberDeclarationNode->value),
55-
null => null
56-
};
42+
$memberNameHashMap[$memberDeclarationNode->name] = true;
5743
}
5844

5945
return new self(
6046
moduleId: $moduleId,
6147
enumName: $enumDeclarationNode->enumName,
62-
membersWithType: $membersWithType
48+
memberNameHashMap: $memberNameHashMap
6349
);
6450
}
6551

6652
public function getMemberNames(): array
6753
{
68-
return array_keys($this->membersWithType);
54+
return array_keys($this->memberNameHashMap);
6955
}
7056

7157
public function getMemberType(string $memberName): EnumMemberType
7258
{
73-
if (!array_key_exists($memberName, $this->membersWithType)) {
59+
if (!array_key_exists($memberName, $this->memberNameHashMap)) {
7460
throw new \Exception('@TODO cannot access member ' . $memberName . ' of enum ' . $this->enumName);
7561
}
7662
return new EnumMemberType(
7763
$this,
78-
$memberName,
79-
$this->membersWithType[$memberName]
64+
$memberName
8065
);
8166
}
8267

test/Unit/TypeSystem/Resolver/Access/AccessTypeResolverTest.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,6 @@ public function access(): void
9191
$this->assertTrue($accessType->enumType->is($someEnum));
9292

9393
$this->assertEquals("A", $accessType->memberName);
94-
95-
$this->assertTrue($accessType->memberBackedValueType?->is(StringType::get()));
9694
}
9795

9896
/**

test/Unit/TypeSystem/Type/EnumType/EnumInstanceTypeTest.php

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
use PackageFactory\ComponentEngine\Module\ModuleId;
2626
use PackageFactory\ComponentEngine\Parser\Ast\EnumDeclarationNode;
2727
use PackageFactory\ComponentEngine\TypeSystem\Type\EnumType\EnumInstanceType;
28+
use PackageFactory\ComponentEngine\TypeSystem\Type\EnumType\EnumMemberType;
2829
use PackageFactory\ComponentEngine\TypeSystem\Type\EnumType\EnumStaticType;
2930
use PHPUnit\Framework\TestCase;
3031

@@ -69,14 +70,33 @@ public function providesNameOfTheEnum(): void
6970
*/
7071
public function providesMemberNames(): void
7172
{
72-
$enumStaticType = EnumStaticType::fromModuleIdAndDeclaration(
73+
$enumInstanceType = EnumInstanceType::fromModuleIdAndDeclaration(
74+
ModuleId::fromString("module-a"),
75+
EnumDeclarationNode::fromString(
76+
'enum SomeEnum { A B C }'
77+
)
78+
);
79+
80+
$this->assertSame(["A", "B", "C"], $enumInstanceType->getMemberNames());
81+
}
82+
83+
/**
84+
* @test
85+
*/
86+
public function providesMemberType(): void
87+
{
88+
$enumInstanceType = EnumInstanceType::fromModuleIdAndDeclaration(
7389
ModuleId::fromString("module-a"),
7490
EnumDeclarationNode::fromString(
7591
'enum SomeEnum { A B C }'
7692
)
7793
);
7894

79-
$this->assertSame(["A", "B", "C"], $enumStaticType->getMemberNames());
95+
$enumMemberType = $enumInstanceType->getMemberType('A');
96+
$this->assertInstanceOf(EnumMemberType::class, $enumMemberType);
97+
98+
$this->assertSame($enumInstanceType, $enumMemberType->enumType);
99+
$this->assertSame('A', $enumMemberType->memberName);
80100
}
81101

82102
/**

test/Unit/TypeSystem/Type/EnumType/EnumStaticTypeTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
use PackageFactory\ComponentEngine\Module\ModuleId;
2626
use PackageFactory\ComponentEngine\Parser\Ast\EnumDeclarationNode;
2727
use PackageFactory\ComponentEngine\TypeSystem\Type\EnumType\EnumInstanceType;
28+
use PackageFactory\ComponentEngine\TypeSystem\Type\EnumType\EnumMemberType;
2829
use PackageFactory\ComponentEngine\TypeSystem\Type\EnumType\EnumStaticType;
2930
use PHPUnit\Framework\TestCase;
3031

@@ -79,6 +80,25 @@ public function providesMemberNames(): void
7980
$this->assertSame(["A", "B", "C"], $enumStaticType->getMemberNames());
8081
}
8182

83+
/**
84+
* @test
85+
*/
86+
public function providesMemberType(): void
87+
{
88+
$enumStaticType = EnumStaticType::fromModuleIdAndDeclaration(
89+
ModuleId::fromString("module-a"),
90+
EnumDeclarationNode::fromString(
91+
'enum SomeEnum { A B C }'
92+
)
93+
);
94+
95+
$enumMemberType = $enumStaticType->getMemberType('A');
96+
$this->assertInstanceOf(EnumMemberType::class, $enumMemberType);
97+
98+
$this->assertSame($enumStaticType, $enumMemberType->enumType);
99+
$this->assertSame('A', $enumMemberType->memberName);
100+
}
101+
82102
/**
83103
* @test
84104
* @return void

0 commit comments

Comments
 (0)