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