private Expression ReduceMember()
{
MemberExpression member = (MemberExpression)Left;
if (member.Expression == null)
{
// static member, reduce the same as variable
return ReduceVariable();
}
else
{
// left.b (op)= r
// ... is reduced into ...
// temp1 = left
// temp2 = temp1.b (op) r
// temp1.b = temp2
// temp2
ParameterExpression temp1 = Variable(member.Expression.Type, "temp1");
// 1. temp1 = left
Expression e1 = Expression.Assign(temp1, member.Expression);
// 2. temp2 = temp1.b (op) r
ExpressionType op = GetBinaryOpFromAssignmentOp(NodeType);
Expression e2 = Expression.MakeBinary(op, Expression.MakeMemberAccess(temp1, member.Member), Right, false, Method);
LambdaExpression conversion = GetConversion();
if (conversion != null)
{
e2 = Expression.Invoke(conversion, e2);
}
ParameterExpression temp2 = Variable(e2.Type, "temp2");
e2 = Expression.Assign(temp2, e2);
// 3. temp1.b = temp2
Expression e3 = Expression.Assign(Expression.MakeMemberAccess(temp1, member.Member), temp2);
// 3. temp2
Expression e4 = temp2;
return Expression.Block(
new TrueReadOnlyCollection<ParameterExpression>(temp1, temp2),
new TrueReadOnlyCollection<Expression>(e1, e2, e3, e4)
);
}
}