void ProcessAssignmentToSpecialMember(BinaryExpression node)
{
MemberReferenceExpression memberRef = (MemberReferenceExpression)node.Left;
List chain = WalkMemberChain(memberRef);
if (null == chain || 0 == chain.Count) return;
MethodInvocationExpression eval = CodeBuilder.CreateEvalInvocation(node.LexicalInfo);
// right hand side should always be executed before
// left hand side
InternalLocal value = DeclareTempLocal(GetExpressionType(node.Right));
eval.Arguments.Add(
CodeBuilder.CreateAssignment(
CodeBuilder.CreateReference(value),
node.Right));
foreach (ChainItem item in chain)
{
item.Local = DeclareTempLocal(item.Container.ExpressionType);
BinaryExpression tempInitialization = CodeBuilder.CreateAssignment(
node.LexicalInfo,
CodeBuilder.CreateReference(item.Local),
item.Container.CloneNode());
item.Container.ParentNode.Replace(item.Container,
CodeBuilder.CreateReference(item.Local));
eval.Arguments.Add(tempInitialization);
}
eval.Arguments.Add(
CodeBuilder.CreateAssignment(node.LexicalInfo,
node.Left,
CodeBuilder.CreateReference(value)));
PropagateChanges(eval, chain);
if (NodeType.ExpressionStatement != node.ParentNode.NodeType)
{
eval.Arguments.Add(CodeBuilder.CreateReference(value));
BindExpressionType(eval, value.Type);
}
ReplaceCurrentNode(eval);
}