static ObjectMemberSharedInfo CreateItem(ObjectConverter item, IntermediateItem intermediate, MapGenerator gen) { var dest = new ObjectMemberSharedInfo(); MemberInfo?memberInfo = intermediate.Details.Unprocessed; Type itemType; if (memberInfo is FieldInfo field) { itemType = field.FieldType; MemberAccessorGenerator.GenerateFieldAccessor(ref dest.Accessor, memberInfo); } else if (memberInfo is PropertyInfo property) { itemType = property.PropertyType; MemberAccessorGenerator.GeneratePropertyAccessor(gen, dest, property, item); } else { throw new Exception("Unrecognized member info in shared info"); } dest.Map = gen.GetMap(itemType); return(dest); }
public void FillMainInfo_CorrectValues() { IntermediateItem info = new IntermediateItem(); IntermediateMapper.FillMainInfo(info, 3, 6, uint.MaxValue); Assert.AreEqual(3, info.Order); Assert.AreEqual(6u, info.StartVer); Assert.AreEqual(uint.MaxValue, info.EndVer); }
public void FillMainInfo_CorrectHighestVersion_CustomHighs() { var ctx = new IntermediateMappingContext(); IntermediateItem info = new IntermediateItem(); IntermediateMapper.FillMainInfo(info, 3, 6, 7); IntermediateMapper.UpdateContextFromItem(ref ctx, info); IntermediateMapper.FillMainInfo(info, 5, 8, 34); IntermediateMapper.UpdateContextFromItem(ref ctx, info); IntermediateMapper.FillMainInfo(info, 9, 11, 59); IntermediateMapper.UpdateContextFromItem(ref ctx, info); Assert.AreEqual(9, ctx.TranslationCurrentOrderInfo); Assert.AreEqual(59u, ctx.HighestVersion); }
static ObjectMemberSharedInfo GetOrCreateItemFrom(ObjectConverter item, IntermediateItem intermediate, MapGenerator gen) { if (!intermediate.IsProcessed) { lock (intermediate) { // Now that we've taken the lock it may have been marked as processed while we waiting for it. // So check one more time to ensure that isn't the case. if (!intermediate.IsProcessed) { intermediate.Details.Processed = CreateItem(item, intermediate, gen); intermediate.IsProcessed = true; } } } return(intermediate.Details.Processed); }
public void FillMainInfo_CorrectOrderInfo_Ordered() { Setup(); var ctx = new IntermediateMappingContext(); IntermediateItem info = new IntermediateItem(); IntermediateMapper.FillMainInfo(info, 3, 0, uint.MaxValue); IntermediateMapper.UpdateContextFromItem(ref ctx, info); IntermediateMapper.FillMainInfo(info, 5, 0, uint.MaxValue); IntermediateMapper.UpdateContextFromItem(ref ctx, info); IntermediateMapper.FillMainInfo(info, 9, 0, uint.MaxValue); IntermediateMapper.UpdateContextFromItem(ref ctx, info); Assert.AreEqual(9, ctx.TranslationCurrentOrderInfo); }
static bool FillItemFromAttributes(IntermediateItem dest, MemberInfo info, object[] attributes) { dest.Details.Unprocessed = info; bool loadedSaveAttribute = false; for (int i = 0; i < attributes.Length; i++) { // TODO: Add more attributes switch (attributes[i]) { case SaveAttribute save: IntermediateMapper.FillMainInfo(dest, save.Order, save.FromVer, save.ToVer); loadedSaveAttribute = true; break; } } return(loadedSaveAttribute); }
internal static IntermediateItem?GetItemForMember(ref IntermediateMappingContext ctx, MemberInfo info) { // Get the attributes - skip this item if there are none object[]? attributes = info.GetCustomAttributes(typeof(SaveAttribute), false); if (attributes.Length == 0) { return(null); } var newItem = new IntermediateItem(); // Create the item. bool successful = FillItemFromAttributes(newItem, info, attributes); if (!successful) { throw new IncompleteDetailsException(info); } IntermediateMapper.UpdateContextFromItem(ref ctx, newItem); return(newItem); }