private static Expression ReduceDynamicMember(GetMemberDynamicCSharpExpression member, Func<Expression, Expression> functionalOp, CSharpBinderFlags flags, bool prefix) { var args = default(DynamicCSharpArgument[]); var block = default(Expression[]); var temps = default(ParameterExpression[]); var i = CopyArguments(member.Object, member.Arguments, prefix, out args, out block, out temps); member = member.Update(temps[0], new TrueReadOnlyCollection<DynamicCSharpArgument>(args)); if (prefix) { block[i++] = member.ReduceAssignment(functionalOp(member), flags); } else { var lastTemp = temps[i] = Expression.Parameter(member.Type, "__temp"); block[i] = Expression.Assign(temps[i], member); i++; block[i++] = member.ReduceAssignment(functionalOp(lastTemp), flags); block[i++] = lastTemp; } var res = Expression.Block(temps, block); return res; }
private static Expression ReduceDynamicMember(GetMemberDynamicCSharpExpression member, Func <Expression, Expression> functionalOp, CSharpBinderFlags flags, bool prefix) { var args = default(DynamicCSharpArgument[]); var block = default(Expression[]); var temps = default(ParameterExpression[]); var i = CopyArguments(member.Object, member.Arguments, prefix, out args, out block, out temps); member = member.Update(temps[0], new TrueReadOnlyCollection <DynamicCSharpArgument>(args)); if (prefix) { block[i++] = member.ReduceAssignment(functionalOp(member), flags); } else { var lastTemp = temps[i] = Expression.Parameter(member.Type, "__temp"); block[i] = Expression.Assign(temps[i], member); i++; block[i++] = member.ReduceAssignment(functionalOp(lastTemp), flags); block[i++] = lastTemp; } var res = Expression.Block(temps, block); return(res); }
private Expression ReduceAssign() { var lhs = Left.Expression; return(lhs switch { GetMemberDynamicCSharpExpression getMember => getMember.ReduceAssignment(Right.Expression, Flags, Left.Flags, Right.Flags), GetIndexDynamicCSharpExpression getIndex => getIndex.ReduceAssignment(Right.Expression, Flags, Left.Flags, Right.Flags), _ => ReduceStaticAssign(), });