Browse Source

Correctly set OperatorResolveResult.IsLiftedOperator in more cases.

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
51bd4164fe
  1. 38
      ICSharpCode.NRefactory.CSharp/Resolver/CSharpResolver.cs

38
ICSharpCode.NRefactory.CSharp/Resolver/CSharpResolver.cs

@ -392,7 +392,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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);
}
/// <summary>
@ -897,7 +893,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -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);
}
/// <summary>
@ -923,7 +919,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -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)

Loading…
Cancel
Save