Private Function TransformRewrittenBinaryOperator()

in src/Compilers/VisualBasic/Portable/Lowering/LocalRewriter/LocalRewriter_BinaryOperators.vb [197:428]


        Private Function TransformRewrittenBinaryOperator(node As BoundBinaryOperator) As BoundExpression
            Dim opKind = node.OperatorKind

            Debug.Assert((opKind And BinaryOperatorKind.Lifted) = 0)

            Select Case (opKind And BinaryOperatorKind.OpMask)
                Case BinaryOperatorKind.Is, BinaryOperatorKind.IsNot
                    node = node.Update(node.OperatorKind,
                                       ReplaceMyGroupCollectionPropertyGetWithUnderlyingField(node.Left),
                                       ReplaceMyGroupCollectionPropertyGetWithUnderlyingField(node.Right),
                                       node.Checked,
                                       node.ConstantValueOpt,
                                       node.Type)

                    If (node.Left.Type IsNot Nothing AndAlso node.Left.Type.IsNullableType) OrElse
                       (node.Right.Type IsNot Nothing AndAlso node.Right.Type.IsNullableType) Then

                        Return RewriteNullableIsOrIsNotOperator(node)
                    End If

                Case BinaryOperatorKind.Concatenate  
                    If node.Type.IsObjectType() Then
                        Return RewriteObjectBinaryOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__ConcatenateObjectObjectObject)
                    Else
                        Return RewriteConcatenateOperator(node)
                    End If

                Case BinaryOperatorKind.Like
                    If node.Left.Type.IsObjectType() Then
                        Return RewriteLikeOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_LikeOperator__LikeObjectObjectObjectCompareMethod)
                    Else
                        Return RewriteLikeOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_LikeOperator__LikeStringStringStringCompareMethod)
                    End If

                Case BinaryOperatorKind.Equals
                    Dim leftType = node.Left.Type
                    
                    
                    
                    

                    If node.Type.IsObjectType() OrElse Me._inExpressionLambda AndAlso leftType.IsObjectType() Then
                        Return RewriteObjectComparisonOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__CompareObjectEqualObjectObjectBoolean)
                    ElseIf node.Type.IsBooleanType() Then

                        If leftType.IsObjectType() Then
                            Return RewriteObjectComparisonOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__ConditionalCompareObjectEqualObjectObjectBoolean)
                        ElseIf leftType.IsStringType() Then
                            Return RewriteStringComparisonOperator(node)
                        ElseIf leftType.IsDecimalType() Then
                            Return RewriteDecimalComparisonOperator(node)
                        ElseIf leftType.IsDateTimeType() Then
                            Return RewriteDateComparisonOperator(node)
                        End If
                    End If

                Case BinaryOperatorKind.NotEquals
                    Dim leftType = node.Left.Type
                    

                    If node.Type.IsObjectType() OrElse Me._inExpressionLambda AndAlso leftType.IsObjectType() Then
                        Return RewriteObjectComparisonOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__CompareObjectNotEqualObjectObjectBoolean)
                    ElseIf node.Type.IsBooleanType() Then

                        If leftType.IsObjectType() Then
                            Return RewriteObjectComparisonOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__ConditionalCompareObjectNotEqualObjectObjectBoolean)
                        ElseIf leftType.IsStringType() Then
                            Return RewriteStringComparisonOperator(node)
                        ElseIf leftType.IsDecimalType() Then
                            Return RewriteDecimalComparisonOperator(node)
                        ElseIf leftType.IsDateTimeType() Then
                            Return RewriteDateComparisonOperator(node)
                        End If
                    End If

                Case BinaryOperatorKind.LessThanOrEqual
                    Dim leftType = node.Left.Type
                    

                    If node.Type.IsObjectType() OrElse Me._inExpressionLambda AndAlso leftType.IsObjectType() Then
                        Return RewriteObjectComparisonOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__CompareObjectLessEqualObjectObjectBoolean)
                    ElseIf node.Type.IsBooleanType() Then

                        If leftType.IsObjectType() Then
                            Return RewriteObjectComparisonOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__ConditionalCompareObjectLessEqualObjectObjectBoolean)
                        ElseIf leftType.IsStringType() Then
                            Return RewriteStringComparisonOperator(node)
                        ElseIf leftType.IsDecimalType() Then
                            Return RewriteDecimalComparisonOperator(node)
                        ElseIf leftType.IsDateTimeType() Then
                            Return RewriteDateComparisonOperator(node)
                        End If
                    End If

                Case BinaryOperatorKind.GreaterThanOrEqual
                    Dim leftType = node.Left.Type
                    

                    If node.Type.IsObjectType() OrElse Me._inExpressionLambda AndAlso leftType.IsObjectType() Then
                        Return RewriteObjectComparisonOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__CompareObjectGreaterEqualObjectObjectBoolean)
                    ElseIf node.Type.IsBooleanType() Then

                        If leftType.IsObjectType() Then
                            Return RewriteObjectComparisonOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__ConditionalCompareObjectGreaterEqualObjectObjectBoolean)
                        ElseIf leftType.IsStringType() Then
                            Return RewriteStringComparisonOperator(node)
                        ElseIf leftType.IsDecimalType() Then
                            Return RewriteDecimalComparisonOperator(node)
                        ElseIf leftType.IsDateTimeType() Then
                            Return RewriteDateComparisonOperator(node)
                        End If
                    End If

                Case BinaryOperatorKind.LessThan
                    Dim leftType = node.Left.Type
                    

                    If node.Type.IsObjectType() OrElse Me._inExpressionLambda AndAlso leftType.IsObjectType() Then
                        Return RewriteObjectComparisonOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__CompareObjectLessObjectObjectBoolean)
                    ElseIf node.Type.IsBooleanType() Then

                        If leftType.IsObjectType() Then
                            Return RewriteObjectComparisonOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__ConditionalCompareObjectLessObjectObjectBoolean)
                        ElseIf leftType.IsStringType() Then
                            Return RewriteStringComparisonOperator(node)
                        ElseIf leftType.IsDecimalType() Then
                            Return RewriteDecimalComparisonOperator(node)
                        ElseIf leftType.IsDateTimeType() Then
                            Return RewriteDateComparisonOperator(node)
                        End If
                    End If

                Case BinaryOperatorKind.GreaterThan
                    Dim leftType = node.Left.Type
                    

                    If node.Type.IsObjectType() OrElse Me._inExpressionLambda AndAlso leftType.IsObjectType() Then
                        Return RewriteObjectComparisonOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__CompareObjectGreaterObjectObjectBoolean)
                    ElseIf node.Type.IsBooleanType() Then

                        If leftType.IsObjectType() Then
                            Return RewriteObjectComparisonOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__ConditionalCompareObjectGreaterObjectObjectBoolean)
                        ElseIf leftType.IsStringType() Then
                            Return RewriteStringComparisonOperator(node)
                        ElseIf leftType.IsDecimalType() Then
                            Return RewriteDecimalComparisonOperator(node)
                        ElseIf leftType.IsDateTimeType() Then
                            Return RewriteDateComparisonOperator(node)
                        End If
                    End If

                Case BinaryOperatorKind.Add
                    If node.Type.IsObjectType() AndAlso Not _inExpressionLambda Then
                        Return RewriteObjectBinaryOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__AddObjectObjectObject)
                    ElseIf node.Type.IsDecimalType() Then
                        Return RewriteDecimalBinaryOperator(node, SpecialMember.System_Decimal__AddDecimalDecimal)
                    End If

                Case BinaryOperatorKind.Subtract
                    If node.Type.IsObjectType() AndAlso Not _inExpressionLambda Then
                        Return RewriteObjectBinaryOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__SubtractObjectObjectObject)
                    ElseIf node.Type.IsDecimalType() Then
                        Return RewriteDecimalBinaryOperator(node, SpecialMember.System_Decimal__SubtractDecimalDecimal)
                    End If

                Case BinaryOperatorKind.Multiply
                    If node.Type.IsObjectType() AndAlso Not _inExpressionLambda Then
                        Return RewriteObjectBinaryOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__MultiplyObjectObjectObject)
                    ElseIf node.Type.IsDecimalType() Then
                        Return RewriteDecimalBinaryOperator(node, SpecialMember.System_Decimal__MultiplyDecimalDecimal)
                    End If

                Case BinaryOperatorKind.Modulo
                    If node.Type.IsObjectType() AndAlso Not _inExpressionLambda Then
                        Return RewriteObjectBinaryOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__ModObjectObjectObject)
                    ElseIf node.Type.IsDecimalType() Then
                        Return RewriteDecimalBinaryOperator(node, SpecialMember.System_Decimal__RemainderDecimalDecimal)
                    End If

                Case BinaryOperatorKind.Divide
                    If node.Type.IsObjectType() AndAlso Not _inExpressionLambda Then
                        Return RewriteObjectBinaryOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__DivideObjectObjectObject)
                    ElseIf node.Type.IsDecimalType() Then
                        Return RewriteDecimalBinaryOperator(node, SpecialMember.System_Decimal__DivideDecimalDecimal)
                    End If

                Case BinaryOperatorKind.IntegerDivide
                    If node.Type.IsObjectType() AndAlso Not _inExpressionLambda Then
                        Return RewriteObjectBinaryOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__IntDivideObjectObjectObject)
                    End If

                Case BinaryOperatorKind.Power
                    If node.Type.IsObjectType() AndAlso Not _inExpressionLambda Then
                        Return RewriteObjectBinaryOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__ExponentObjectObjectObject)
                    Else
                        Return RewritePowOperator(node)
                    End If

                Case BinaryOperatorKind.LeftShift
                    If node.Type.IsObjectType() AndAlso Not _inExpressionLambda Then
                        Return RewriteObjectBinaryOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__LeftShiftObjectObjectObject)
                    End If

                Case BinaryOperatorKind.RightShift
                    If node.Type.IsObjectType() AndAlso Not _inExpressionLambda Then
                        Return RewriteObjectBinaryOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__RightShiftObjectObjectObject)
                    End If

                Case BinaryOperatorKind.OrElse, BinaryOperatorKind.AndAlso
                    If node.Type.IsObjectType() AndAlso Not _inExpressionLambda Then
                        Return RewriteObjectShortCircuitOperator(node)
                    End If

                Case BinaryOperatorKind.Xor
                    If node.Type.IsObjectType() AndAlso Not _inExpressionLambda Then
                        Return RewriteObjectBinaryOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__XorObjectObjectObject)
                    End If

                Case BinaryOperatorKind.Or
                    If node.Type.IsObjectType() AndAlso Not _inExpressionLambda Then
                        Return RewriteObjectBinaryOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__OrObjectObjectObject)
                    End If

                Case BinaryOperatorKind.And
                    If node.Type.IsObjectType() AndAlso Not _inExpressionLambda Then
                        Return RewriteObjectBinaryOperator(node, WellKnownMember.Microsoft_VisualBasic_CompilerServices_Operators__AndObjectObjectObject)
                    End If

            End Select

            Return node
        End Function