2323namespace PackageFactory \ComponentEngine \TypeSystem \Resolver \TernaryOperation ;
2424
2525use PackageFactory \ComponentEngine \Parser \Ast \BooleanLiteralNode ;
26- use PackageFactory \ComponentEngine \Parser \Ast \IdentifierNode ;
2726use PackageFactory \ComponentEngine \Parser \Ast \TernaryOperationNode ;
2827use PackageFactory \ComponentEngine \TypeSystem \Resolver \Expression \ExpressionTypeResolver ;
29- use PackageFactory \ComponentEngine \TypeSystem \Scope \ShallowScope \ShallowScope ;
28+ use PackageFactory \ComponentEngine \TypeSystem \Scope \ShallowScope \TernaryBranchScope ;
3029use PackageFactory \ComponentEngine \TypeSystem \ScopeInterface ;
31- use PackageFactory \ComponentEngine \TypeSystem \Type \NullType \NullType ;
3230use PackageFactory \ComponentEngine \TypeSystem \Type \UnionType \UnionType ;
3331use 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}
0 commit comments