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