public Unit nativeFinishType(Runtime.Struct typeValue, TypeBuilder typeBuilder) { foreach (var field in typeValue.Fields) { typeBuilder.DefineField(field.Name, TypeBox.Unbox(field.Type), FieldAttributes.Public | FieldAttributes.InitOnly); } // Constructor var constuctor = typeBuilder.DefineConstructor( MethodAttributes.Public, CallingConventions.Standard, typeValue.Fields.Select(field => TypeBox.Unbox(field.Type)).ToArray() ); ILGenerator ilgen = constuctor.GetILGenerator(); for (int i = 0; i < typeValue.Fields.Count(); i++) { ilgen.Emit(OpCodes.Ldarg_0); ilgen.Emit(OpCodes.Ldarg, i + 1); ilgen.Emit(OpCodes.Stfld, typeBuilder.GetField(typeValue.Fields[i].Name)); } ilgen.Emit(OpCodes.Ret); // TODO: ToString // TODO: structural equality // TODO: structural comparison // TODO: structural hashcode return(Unit.Instance); }
public object array(object itemType) { return(typeof(IImmutableList <>).MakeGenericType(TypeBox.Unbox(itemType))); }