2323namespace PackageFactory \ComponentEngine \TypeSystem \Resolver \BinaryOperation ;
2424
2525use PackageFactory \ComponentEngine \Definition \BinaryOperator ;
26- use PackageFactory \ComponentEngine \Parser \Ast \BinaryOperandNodes ;
2726use PackageFactory \ComponentEngine \Parser \Ast \BinaryOperationNode ;
2827use PackageFactory \ComponentEngine \TypeSystem \Resolver \Expression \ExpressionTypeResolver ;
2928use PackageFactory \ComponentEngine \TypeSystem \ScopeInterface ;
@@ -43,13 +42,13 @@ public function resolveTypeOf(BinaryOperationNode $binaryOperationNode): TypeInt
4342 {
4443 return match ($ binaryOperationNode ->operator ) {
4544 BinaryOperator::AND ,
46- BinaryOperator::OR => $ this ->resolveTypeOfBooleanOperation ($ binaryOperationNode-> operands ),
45+ BinaryOperator::OR => $ this ->resolveTypeOfBooleanOperation ($ binaryOperationNode ),
4746
4847 BinaryOperator::PLUS ,
4948 BinaryOperator::MINUS ,
5049 BinaryOperator::MULTIPLY_BY ,
5150 BinaryOperator::DIVIDE_BY ,
52- BinaryOperator::MODULO => $ this ->resolveTypeOfArithmeticOperation ($ binaryOperationNode-> operands ),
51+ BinaryOperator::MODULO => $ this ->resolveTypeOfArithmeticOperation ($ binaryOperationNode ),
5352
5453 BinaryOperator::EQUAL ,
5554 BinaryOperator::NOT_EQUAL ,
@@ -60,36 +59,31 @@ public function resolveTypeOf(BinaryOperationNode $binaryOperationNode): TypeInt
6059 };
6160 }
6261
63- private function resolveTypeOfBooleanOperation (BinaryOperandNodes $ operandNodes ): TypeInterface
62+ private function resolveTypeOfBooleanOperation (BinaryOperationNode $ binaryOperationNode ): TypeInterface
6463 {
6564 $ expressionTypeResolver = new ExpressionTypeResolver (
6665 scope: $ this ->scope
6766 );
68- $ operandTypes = [];
6967
70- foreach ($ operandNodes as $ operandNode ) {
71- $ operandTypes [] = $ expressionTypeResolver ->resolveTypeOf ($ operandNode );
72- }
73-
74- return UnionType::of (...$ operandTypes );
68+ return UnionType::of (
69+ $ expressionTypeResolver ->resolveTypeOf ($ binaryOperationNode ->left ),
70+ $ expressionTypeResolver ->resolveTypeOf ($ binaryOperationNode ->right )
71+ );
7572 }
7673
77- private function resolveTypeOfArithmeticOperation (BinaryOperandNodes $ operandNodes ): TypeInterface
74+ private function resolveTypeOfArithmeticOperation (BinaryOperationNode $ binaryOperationNode ): TypeInterface
7875 {
7976 $ expressionTypeResolver = new ExpressionTypeResolver (
8077 scope: $ this ->scope
8178 );
82- $ numberType = NumberType::get ();
8379
84- foreach ($ operandNodes as $ operandNode ) {
80+ foreach ([ $ binaryOperationNode -> left , $ binaryOperationNode -> right ] as $ operandNode ) {
8581 $ typeOfOperandNode = $ expressionTypeResolver ->resolveTypeOf ($ operandNode );
86- $ typeOfOperandNodeIsNumberType = $ typeOfOperandNode ->is ($ numberType );
87-
88- if (!$ typeOfOperandNodeIsNumberType ) {
82+ if (!$ typeOfOperandNode ->is (NumberType::get ())) {
8983 throw new \Exception ('@TODO: Operand must be of type number ' );
9084 }
9185 }
9286
93- return $ numberType ;
87+ return NumberType:: get () ;
9488 }
9589}
0 commit comments