From 51bd4164fe2a5756c15514ddb2d105a33e89c5a3 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 15 Mar 2012 17:26:05 +0100 Subject: [PATCH] Correctly set OperatorResolveResult.IsLiftedOperator in more cases. --- .../Resolver/CSharpResolver.cs | 38 +++++++++---------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/CSharpResolver.cs b/ICSharpCode.NRefactory.CSharp/Resolver/CSharpResolver.cs index 61d03ec388..d4503d6877 100644 --- a/ICSharpCode.NRefactory.CSharp/Resolver/CSharpResolver.cs +++ b/ICSharpCode.NRefactory.CSharp/Resolver/CSharpResolver.cs @@ -392,7 +392,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver // C# 4.0 spec: ยง7.7.5 Prefix increment and decrement operators TypeCode code = ReflectionHelper.GetTypeCode(type); if ((code >= TypeCode.Char && code <= TypeCode.Decimal) || type.Kind == TypeKind.Enum || type.Kind == TypeKind.Pointer) - return UnaryOperatorResolveResult(expression.Type, op, expression); + return UnaryOperatorResolveResult(expression.Type, op, expression, isNullable); else return new ErrorResolveResult(expression.Type); case UnaryOperatorType.Plus: @@ -412,7 +412,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver var unpackedEnum = new ConstantResolveResult(U, expression.ConstantValue); return CheckErrorAndResolveCast(expression.Type, ResolveUnaryOperator(op, unpackedEnum)); } else { - return UnaryOperatorResolveResult(expression.Type, op, expression); + return UnaryOperatorResolveResult(expression.Type, op, expression, isNullable); } } else { methodGroup = operators.BitwiseComplementOperators; @@ -449,18 +449,16 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver return new ConstantResolveResult(resultType, val); } else { expression = Convert(expression, m.Parameters[0].Type, builtinOperatorOR.ArgumentConversions[0]); - if (builtinOperatorOR.BestCandidate is OverloadResolution.ILiftedOperator) { - return new OperatorResolveResult( - resultType, UnaryOperatorExpression.GetLinqNodeType(op, this.CheckForOverflow), - null, true, new[] { expression }); - } - return UnaryOperatorResolveResult(resultType, op, expression); + return UnaryOperatorResolveResult(resultType, op, expression, + builtinOperatorOR.BestCandidate is OverloadResolution.ILiftedOperator); } } - OperatorResolveResult UnaryOperatorResolveResult(IType resultType, UnaryOperatorType op, ResolveResult expression) + OperatorResolveResult UnaryOperatorResolveResult(IType resultType, UnaryOperatorType op, ResolveResult expression, bool isLifted = false) { - return new OperatorResolveResult(resultType, UnaryOperatorExpression.GetLinqNodeType(op, this.CheckForOverflow), expression); + return new OperatorResolveResult( + resultType, UnaryOperatorExpression.GetLinqNodeType(op, this.CheckForOverflow), + null, isLifted, new[] { expression }); } #endregion @@ -808,12 +806,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver } else { lhs = Convert(lhs, m.Parameters[0].Type, builtinOperatorOR.ArgumentConversions[0]); rhs = Convert(rhs, m.Parameters[1].Type, builtinOperatorOR.ArgumentConversions[1]); - if (builtinOperatorOR.BestCandidate is OverloadResolution.ILiftedOperator) { - return new OperatorResolveResult( - resultType, BinaryOperatorExpression.GetLinqNodeType(op, this.CheckForOverflow), - null, true, new[] { lhs, rhs }); - } - return BinaryOperatorResolveResult(resultType, lhs, op, rhs); + return BinaryOperatorResolveResult(resultType, lhs, op, rhs, + builtinOperatorOR.BestCandidate is OverloadResolution.ILiftedOperator); } } @@ -822,9 +816,11 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver return NullableType.IsNullable(type) || type.IsReferenceType != false; } - ResolveResult BinaryOperatorResolveResult(IType resultType, ResolveResult lhs, BinaryOperatorType op, ResolveResult rhs) + ResolveResult BinaryOperatorResolveResult(IType resultType, ResolveResult lhs, BinaryOperatorType op, ResolveResult rhs, bool isLifted = false) { - return new OperatorResolveResult(resultType, BinaryOperatorExpression.GetLinqNodeType(op, this.CheckForOverflow), lhs, rhs); + return new OperatorResolveResult( + resultType, BinaryOperatorExpression.GetLinqNodeType(op, this.CheckForOverflow), + null, isLifted, new[] { lhs, rhs }); } #endregion @@ -876,7 +872,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver return ResolveBinaryOperator(op, lhs, rhs); } IType resultType = compilation.FindType(KnownTypeCode.Boolean); - return BinaryOperatorResolveResult(resultType, lhs, op, rhs); + return BinaryOperatorResolveResult(resultType, lhs, op, rhs, isNullable); } /// @@ -897,7 +893,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver return CheckErrorAndResolveCast(elementType, ResolveBinaryOperator(BinaryOperatorType.Subtract, lhs, rhs)); } IType resultType = MakeNullable(elementType, isNullable); - return BinaryOperatorResolveResult(resultType, lhs, BinaryOperatorType.Subtract, rhs); + return BinaryOperatorResolveResult(resultType, lhs, BinaryOperatorType.Subtract, rhs, isNullable); } /// @@ -923,7 +919,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver return CheckErrorAndResolveCast(enumType, ResolveBinaryOperator(op, lhs, rhs)); } IType resultType = MakeNullable(enumType, isNullable); - return BinaryOperatorResolveResult(resultType, lhs, op, rhs); + return BinaryOperatorResolveResult(resultType, lhs, op, rhs, isNullable); } IType MakeNullable(IType type, bool isNullable)