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);
}
}