Boo.Lang.Compiler.Steps.ProcessMethodBodies.BindAssignmentToSliceProperty C# (CSharp) Метод

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

private BindAssignmentToSliceProperty ( Boo.Lang.Compiler.Ast.BinaryExpression node ) : void
node Boo.Lang.Compiler.Ast.BinaryExpression
Результат void
        void BindAssignmentToSliceProperty(BinaryExpression node)
        {
            var slice = (SlicingExpression)node.Left;
            var lhs = GetEntity(node.Left);
            if (IsError(lhs))
                return;

            var mie = new MethodInvocationExpression(node.Left.LexicalInfo);
            foreach (var index in slice.Indices)
                mie.Arguments.Add(index.Begin);
            mie.Arguments.Add(node.Right);

            IMethod setter = null;

            var property = lhs as IProperty;
            if (property != null)
            {
                var setMethod = property.GetSetMethod();
                if (setMethod == null)
                {
                    Error(node, CompilerErrorFactory.PropertyIsReadOnly(slice.Target, property));
                    return;
                }
                if (AssertParameters(node.Left, setMethod, mie.Arguments))
                    setter = setMethod;
            }
            else if (lhs.IsAmbiguous())
            {
                setter = (IMethod)GetCorrectCallableReference(node.Left, mie.Arguments, GetSetMethods(lhs));
                if (setter == null)
                {
                    Error(node.Left);
                    return;
                }
            }

            if (null == setter)
                Error(node, CompilerErrorFactory.LValueExpected(node.Left));
            else
            {
                mie.Target = CodeBuilder.CreateMemberReference(
                    GetIndexedPropertySlicingTarget(slice),
                    setter);
                BindExpressionType(mie, setter.ReturnType);
                node.ParentNode.Replace(node, mie);
            }
        }
ProcessMethodBodies