2323namespace PackageFactory\ComponentEngine\TypeSystem\Resolver\TernaryOperation;
2424
2525use PackageFactory\ComponentEngine\Parser\Ast\BooleanLiteralNode;
26+ use PackageFactory\ComponentEngine\Parser\Ast\IdentifierNode;
2627use PackageFactory\ComponentEngine\Parser\Ast\TernaryOperationNode;
2728use PackageFactory\ComponentEngine\TypeSystem\Resolver\Expression\ExpressionTypeResolver;
29+ use PackageFactory\ComponentEngine\TypeSystem\Scope\ShallowScope\ShallowScope;
2830use PackageFactory\ComponentEngine\TypeSystem\ScopeInterface;
31+ use PackageFactory\ComponentEngine\TypeSystem\Type\NullType\NullType;
2932use PackageFactory\ComponentEngine\TypeSystem\Type\UnionType\UnionType;
3033use PackageFactory\ComponentEngine\TypeSystem\TypeInterface;
3134
@@ -41,14 +44,39 @@ public function resolveTypeOf(TernaryOperationNode $ternaryOperationNode): TypeI
4144 $expressionTypeResolver = new ExpressionTypeResolver(
4245 scope: $this->scope
4346 );
44- $conditionNode = $ternaryOperationNode->condition->root ;
47+ $conditionNode = $ternaryOperationNode->condition;
4548
46- if ($conditionNode instanceof BooleanLiteralNode) {
47- return $conditionNode->value
49+ $rootType = $expressionTypeResolver->resolveTypeOf($conditionNode);
50+
51+ if ($conditionNode->root instanceof BooleanLiteralNode) {
52+ return $conditionNode->root->value
4853 ? $expressionTypeResolver->resolveTypeOf($ternaryOperationNode->true)
4954 : $expressionTypeResolver->resolveTypeOf($ternaryOperationNode->false);
5055 }
5156
57+ if ($conditionNode->root instanceof IdentifierNode && $rootType instanceof UnionType && $rootType->isNullable()) {
58+ $trueExpressionTypeResolver = new ExpressionTypeResolver(
59+ scope: new ShallowScope(
60+ $conditionNode->root->value,
61+ $rootType->withoutNullable(),
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+ );
73+
74+ return UnionType::of(
75+ $trueExpressionTypeResolver->resolveTypeOf($ternaryOperationNode->true),
76+ $falseExpressionTypeResolver->resolveTypeOf($ternaryOperationNode->false)
77+ );
78+ }
79+
5280 return UnionType::of(
5381 $expressionTypeResolver->resolveTypeOf($ternaryOperationNode->true),
5482 $expressionTypeResolver->resolveTypeOf($ternaryOperationNode->false)
0 commit comments