Boo.Lang.Compiler.Steps.ProcessAssignmentsToSpecialMembers.ProcessAssignmentToSpecialMember C# (CSharp) Метод

ProcessAssignmentToSpecialMember() приватный Метод

private ProcessAssignmentToSpecialMember ( Boo.Lang.Compiler.Ast.BinaryExpression node ) : void
node Boo.Lang.Compiler.Ast.BinaryExpression
Результат void
        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);
        }