private static object PrepareValueIndexContext(Compiler compiler, ExpressionContext left, Parse.Statement statement, BaseType memberType, System.Type memberNative, Frame local)
{
// Register value argument
var valueSymbol = new Object();
local.Add(statement, Name.FromComponents(Parse.ReservedWords.Value), valueSymbol);
compiler.ContextsBySymbol.Add
(
valueSymbol,
new ExpressionContext
(
null,
memberType,
left.Characteristics,
m => { m.IL.Emit(OpCodes.Ldarg_0); }
)
);
// Register index argument
var indexSymbol = new Object();
local.Add(statement, Name.FromComponents(Parse.ReservedWords.Index), indexSymbol);
compiler.ContextsBySymbol.Add
(
indexSymbol,
new ExpressionContext
(
null,
SystemTypes.Int32,
Characteristic.Default,
m => { m.IL.Emit(OpCodes.Ldarg_1); }
)
);
// If the members are tuples, declare locals for each field
if (memberType is TupleType)
{
var tupleType = (TupleType)memberType;
foreach (var attribute in tupleType.Attributes)
{
local.Add(attribute.Key.ToID(), attribute);
compiler.ContextsBySymbol.Add
(
attribute,
new ExpressionContext
(
null,
attribute.Value,
Characteristic.Default,
m =>
{
m.IL.Emit(OpCodes.Ldarg_0); // value
m.IL.Emit(OpCodes.Ldfld, memberNative.GetField(attribute.Key.ToString()));
}
)
);
}
// TODO: Add references
}
return indexSymbol;
}