From 8389d7add6418696e3a0ae70e24745f4698fed00 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Mon, 10 Oct 2011 23:41:42 +0200 Subject: [PATCH] Use OperatorResolveResult for assignments. --- .../Ast/Expressions/AssignmentExpression.cs | 31 +++++++++++++++++++ .../Resolver/ResolveVisitor.cs | 6 ++-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Ast/Expressions/AssignmentExpression.cs b/ICSharpCode.NRefactory.CSharp/Ast/Expressions/AssignmentExpression.cs index c0e9ef3f7d..5bae45be1b 100644 --- a/ICSharpCode.NRefactory.CSharp/Ast/Expressions/AssignmentExpression.cs +++ b/ICSharpCode.NRefactory.CSharp/Ast/Expressions/AssignmentExpression.cs @@ -25,6 +25,7 @@ // THE SOFTWARE. using System; +using System.Linq.Expressions; namespace ICSharpCode.NRefactory.CSharp { @@ -115,6 +116,36 @@ namespace ICSharpCode.NRefactory.CSharp throw new NotSupportedException("Invalid value for AssignmentOperatorType"); } } + + public static ExpressionType GetLinqNodeType(AssignmentOperatorType op, bool checkForOverflow) + { + switch (op) { + case AssignmentOperatorType.Assign: + return ExpressionType.Assign; + case AssignmentOperatorType.Add: + return checkForOverflow ? ExpressionType.AddAssignChecked : ExpressionType.AddAssign; + case AssignmentOperatorType.Subtract: + return checkForOverflow ? ExpressionType.SubtractAssignChecked : ExpressionType.SubtractAssign; + case AssignmentOperatorType.Multiply: + return checkForOverflow ? ExpressionType.MultiplyAssignChecked : ExpressionType.MultiplyAssign; + case AssignmentOperatorType.Divide: + return ExpressionType.DivideAssign; + case AssignmentOperatorType.Modulus: + return ExpressionType.ModuloAssign; + case AssignmentOperatorType.ShiftLeft: + return ExpressionType.LeftShiftAssign; + case AssignmentOperatorType.ShiftRight: + return ExpressionType.RightShiftAssign; + case AssignmentOperatorType.BitwiseAnd: + return ExpressionType.AndAssign; + case AssignmentOperatorType.BitwiseOr: + return ExpressionType.OrAssign; + case AssignmentOperatorType.ExclusiveOr: + return ExpressionType.ExclusiveOrAssign; + default: + throw new NotSupportedException("Invalid value for AssignmentOperatorType"); + } + } } public enum AssignmentOperatorType diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs b/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs index da730b94c6..549ba43721 100644 --- a/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs +++ b/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs @@ -1033,8 +1033,10 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver { if (resolverEnabled) { ResolveResult left = Resolve(assignmentExpression.Left); - ResolveAndProcessConversion(assignmentExpression.Right, left.Type); - return new ResolveResult(left.Type); + ResolveResult right = Resolve(assignmentExpression.Right); + ProcessConversion(assignmentExpression.Right, right, left.Type); + var op = AssignmentExpression.GetLinqNodeType(assignmentExpression.Operator, resolver.CheckForOverflow); + return new OperatorResolveResult(left.Type, op, left, right); } else { ScanChildren(assignmentExpression); return null;