private void UnaryOperatorEasyOut( UnaryOperatorKind kind, BoundExpression operand, UnaryOperatorOverloadResolutionResult result ) { var operandType = operand.Type; if (operandType is null) { return; } var easyOut = UnopEasyOut.OpKind(kind, operandType); if (easyOut == UnaryOperatorKind.Error) { return; } UnaryOperatorSignature signature = this.Compilation.builtInOperators.GetSignature( easyOut ); Conversion?conversion = Conversions.FastClassifyConversion( operandType, signature.OperandType ); Debug.Assert(conversion.HasValue && conversion.Value.IsImplicit); result.Results.Add(UnaryOperatorAnalysisResult.Applicable(signature, conversion.Value)); }
private void BinaryOperatorEasyOut(BinaryOperatorKind kind, BoundExpression left, BoundExpression right, BinaryOperatorOverloadResolutionResult result) { var leftType = left.Type; if (leftType is null) { return; } var rightType = right.Type; if (rightType is null) { return; } if (PossiblyUnusualConstantOperation(left, right)) { return; } var easyOut = BinopEasyOut.OpKind(kind, leftType, rightType); if (easyOut == BinaryOperatorKind.Error) { return; } BinaryOperatorSignature signature = this.Compilation.builtInOperators.GetSignature(easyOut); Conversion leftConversion = Conversions.FastClassifyConversion(leftType, signature.LeftType); Conversion rightConversion = Conversions.FastClassifyConversion(rightType, signature.RightType); Debug.Assert(leftConversion.Exists && leftConversion.IsImplicit); Debug.Assert(rightConversion.Exists && rightConversion.IsImplicit); result.Results.Add(BinaryOperatorAnalysisResult.Applicable(signature, leftConversion, rightConversion)); }