Ancestry.QueryProcessor.Type.NaryType.PrepareValueIndexContext C# (CSharp) Method

PrepareValueIndexContext() private static method

private static PrepareValueIndexContext ( Compiler compiler, ExpressionContext left, Parse statement, BaseType memberType, System memberNative, Frame local ) : object
compiler Compiler
left Ancestry.QueryProcessor.Compile.ExpressionContext
statement Parse
memberType BaseType
memberNative System
local Frame
return object
        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;
        }