Skip to content

Commit 8a34ee1

Browse files
committed
TASK: Introduce TernaryBranchScope
1 parent 8f0ba11 commit 8a34ee1

2 files changed

Lines changed: 31 additions & 31 deletions

File tree

src/TypeSystem/Resolver/TernaryOperation/TernaryOperationTypeResolver.php

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,10 @@
2323
namespace PackageFactory\ComponentEngine\TypeSystem\Resolver\TernaryOperation;
2424

2525
use PackageFactory\ComponentEngine\Parser\Ast\BooleanLiteralNode;
26-
use PackageFactory\ComponentEngine\Parser\Ast\IdentifierNode;
2726
use PackageFactory\ComponentEngine\Parser\Ast\TernaryOperationNode;
2827
use PackageFactory\ComponentEngine\TypeSystem\Resolver\Expression\ExpressionTypeResolver;
29-
use PackageFactory\ComponentEngine\TypeSystem\Scope\ShallowScope\ShallowScope;
28+
use PackageFactory\ComponentEngine\TypeSystem\Scope\ShallowScope\TernaryBranchScope;
3029
use PackageFactory\ComponentEngine\TypeSystem\ScopeInterface;
31-
use PackageFactory\ComponentEngine\TypeSystem\Type\NullType\NullType;
3230
use PackageFactory\ComponentEngine\TypeSystem\Type\UnionType\UnionType;
3331
use PackageFactory\ComponentEngine\TypeSystem\TypeInterface;
3432

@@ -54,32 +52,27 @@ public function resolveTypeOf(TernaryOperationNode $ternaryOperationNode): TypeI
5452
: $expressionTypeResolver->resolveTypeOf($ternaryOperationNode->false);
5553
}
5654

57-
if ($conditionNode->root instanceof IdentifierNode && $conditionType instanceof UnionType && $conditionType->containsNull()) {
58-
$trueExpressionTypeResolver = new ExpressionTypeResolver(
59-
scope: new ShallowScope(
60-
$conditionNode->root->value,
61-
$conditionType->withoutNull(),
62-
$this->scope
63-
)
64-
);
65-
66-
$falseExpressionTypeResolver = new ExpressionTypeResolver(
67-
scope: new ShallowScope(
68-
$conditionNode->root->value,
69-
NullType::get(),
70-
$this->scope
71-
)
72-
);
55+
$trueExpressionTypeResolver = new ExpressionTypeResolver(
56+
scope: new TernaryBranchScope(
57+
$ternaryOperationNode->condition,
58+
$conditionType,
59+
true,
60+
$this->scope
61+
)
62+
);
7363

74-
return UnionType::of(
75-
$trueExpressionTypeResolver->resolveTypeOf($ternaryOperationNode->true),
76-
$falseExpressionTypeResolver->resolveTypeOf($ternaryOperationNode->false)
77-
);
78-
}
64+
$falseExpressionTypeResolver = new ExpressionTypeResolver(
65+
scope: new TernaryBranchScope(
66+
$ternaryOperationNode->condition,
67+
$conditionType,
68+
false,
69+
$this->scope
70+
)
71+
);
7972

8073
return UnionType::of(
81-
$expressionTypeResolver->resolveTypeOf($ternaryOperationNode->true),
82-
$expressionTypeResolver->resolveTypeOf($ternaryOperationNode->false)
74+
$trueExpressionTypeResolver->resolveTypeOf($ternaryOperationNode->true),
75+
$falseExpressionTypeResolver->resolveTypeOf($ternaryOperationNode->false)
8376
);
8477
}
8578
}

src/TypeSystem/Scope/ShallowScope/ShallowScope.php renamed to src/TypeSystem/Scope/ShallowScope/TernaryBranchScope.php

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,30 @@
2222

2323
namespace PackageFactory\ComponentEngine\TypeSystem\Scope\ShallowScope;
2424

25+
use PackageFactory\ComponentEngine\Parser\Ast\ExpressionNode;
26+
use PackageFactory\ComponentEngine\Parser\Ast\IdentifierNode;
2527
use PackageFactory\ComponentEngine\Parser\Ast\TypeReferenceNode;
2628
use PackageFactory\ComponentEngine\TypeSystem\ScopeInterface;
29+
use PackageFactory\ComponentEngine\TypeSystem\Type\NullType\NullType;
30+
use PackageFactory\ComponentEngine\TypeSystem\Type\UnionType\UnionType;
2731
use PackageFactory\ComponentEngine\TypeSystem\TypeInterface;
2832

29-
final class ShallowScope implements ScopeInterface
33+
final class TernaryBranchScope implements ScopeInterface
3034
{
3135
public function __construct(
32-
private readonly string $overriddenName,
33-
private readonly TypeInterface $overriddenType,
36+
private readonly ExpressionNode $conditionNode,
37+
private readonly TypeInterface $conditionType,
38+
private readonly bool $isBranchLeft,
3439
private readonly ScopeInterface $parentScope
3540
) {
3641
}
3742

3843
public function lookupTypeFor(string $name): ?TypeInterface
3944
{
40-
if ($this->overriddenName === $name) {
41-
return $this->overriddenType;
45+
if ($this->conditionNode->root instanceof IdentifierNode && $this->conditionNode->root->value === $name) {
46+
if ($this->conditionType instanceof UnionType && $this->conditionType->containsNull()) {
47+
return $this->isBranchLeft ? $this->conditionType->withoutNull() : NullType::get();
48+
}
4249
}
4350

4451
return $this->parentScope->lookupTypeFor($name);

0 commit comments

Comments
 (0)