internal Expression ReduceAssignment(ISupportsAssignment left, TokenKind tokenKind, Expression right) { IAssignableValue av = left.GetAssignableValue(); ExpressionType et = ExpressionType.Extension; switch (tokenKind) { case TokenKind.Equals: return av.SetValue(this, right); case TokenKind.PlusEquals: et = ExpressionType.Add; break; case TokenKind.MinusEquals: et = ExpressionType.Subtract; break; case TokenKind.MultiplyEquals: et = ExpressionType.Multiply; break; case TokenKind.DivideEquals: et = ExpressionType.Divide; break; case TokenKind.RemainderEquals: et = ExpressionType.Modulo; break; } var exprs = new List<Expression>(); var temps = new List<ParameterExpression>(); var getExpr = av.GetValue(this, exprs, temps); exprs.Add(av.SetValue(this, DynamicExpression.Dynamic(PSBinaryOperationBinder.Get(et), typeof(object), getExpr, right))); return Expression.Block(temps, exprs); }
internal Expression ReduceAssignment(ISupportsAssignment left, TokenKind tokenKind, Expression right) { IAssignableValue assignableValue = left.GetAssignableValue(); ExpressionType extension = ExpressionType.Extension; switch (tokenKind) { case TokenKind.Equals: return assignableValue.SetValue(this, right); case TokenKind.PlusEquals: extension = ExpressionType.Add; break; case TokenKind.MinusEquals: extension = ExpressionType.Subtract; break; case TokenKind.MultiplyEquals: extension = ExpressionType.Multiply; break; case TokenKind.DivideEquals: extension = ExpressionType.Divide; break; case TokenKind.RemainderEquals: extension = ExpressionType.Modulo; break; } List<Expression> exprs = new List<Expression>(); List<ParameterExpression> temps = new List<ParameterExpression>(); Expression expression = assignableValue.GetValue(this, exprs, temps); exprs.Add(assignableValue.SetValue(this, Expression.Dynamic(PSBinaryOperationBinder.Get(extension, true, false), typeof(object), expression, right))); return Expression.Block((IEnumerable<ParameterExpression>) temps, (IEnumerable<Expression>) exprs); }