public override void GenerateCopyIn( FileGeneration fg, ObjectGeneration objGen, TypeGeneration typeGen, Accessor frameAccessor, Accessor itemAccessor, Accessor errorMaskAccessor, Accessor translationMaskAccessor) { FormLinkType linkType = typeGen as FormLinkType; MaskGenerationUtility.WrapErrorFieldIndexPush(fg, () => { if (itemAccessor.IsAssignment) { using (var args = new ArgsWrapper(fg, $"{itemAccessor} = {(linkType.FormIDType == FormLinkType.FormIDTypeEnum.Normal ? "FormKey" : "RecordType")}XmlTranslation.Instance.Parse")) { args.AddPassArg("node"); args.AddPassArg("errorMask"); } } else { using (var args = new FunctionWrapper(fg, itemAccessor.Assign($"new {linkType.DirectTypeName(getter: false)}"))) { args.Add(subFg => { using (var subArgs = new FunctionWrapper(subFg, $"FormKeyXmlTranslation.Instance.Parse")) { subArgs.AddPassArg("node"); subArgs.AddPassArg("errorMask"); } }); } } }, indexAccessor: typeGen.HasIndex?typeGen.IndexEnumInt: null, errorMaskAccessor: errorMaskAccessor, doIt: typeGen.HasIndex); }
public override async Task GenerateInCommonMixin(ObjectGeneration obj, FileGeneration fg) { if (await MajorRecordModule.HasMajorRecordsInTree(obj, includeBaseClass: false) == Case.No) { return; } var needsCatch = obj.GetObjectType() == ObjectType.Mod; string catchLine = needsCatch ? ".Catch(e => throw RecordException.Enrich(e, obj.ModKey))" : string.Empty; string enderSemi = needsCatch ? string.Empty : ";"; fg.AppendLine("[DebuggerStepThrough]"); using (var args = new FunctionWrapper(fg, $"public static IEnumerable<{nameof(IMajorRecordCommonGetter)}> EnumerateMajorRecords{obj.GetGenericTypes(MaskType.Normal)}")) { args.Wheres.AddRange(obj.GenerateWhereClauses(LoquiInterfaceType.IGetter, obj.Generics)); args.Add($"this {obj.Interface(getter: true, internalInterface: true)} obj"); } using (new BraceWrapper(fg)) { using (var args = new ArgsWrapper(fg, $"return {obj.CommonClassInstance("obj", LoquiInterfaceType.IGetter, CommonGenerics.Class)}.EnumerateMajorRecords", suffixLine: catchLine)) { args.AddPassArg("obj"); } } fg.AppendLine(); fg.AppendLine("[DebuggerStepThrough]"); using (var args = new FunctionWrapper(fg, $"public static IEnumerable<TMajor> EnumerateMajorRecords{obj.GetGenericTypes(MaskType.Normal, "TMajor")}")) { args.Wheres.AddRange(obj.GenerateWhereClauses(LoquiInterfaceType.IGetter, obj.Generics)); args.Wheres.Add($"where TMajor : class, IMajorRecordCommonGetter"); args.Add($"this {obj.Interface(getter: true, internalInterface: true)} obj"); args.Add($"bool throwIfUnknown = true"); } using (new BraceWrapper(fg)) { using (var args = new FunctionWrapper(fg, $"return {obj.CommonClassInstance("obj", LoquiInterfaceType.IGetter, CommonGenerics.Class)}.EnumerateMajorRecords")) { args.AddPassArg("obj"); args.Add("type: typeof(TMajor)"); args.AddPassArg("throwIfUnknown"); } using (new DepthWrapper(fg)) { fg.AppendLine($".Select(m => (TMajor)m){enderSemi}"); if (needsCatch) { fg.AppendLine($"{catchLine};"); } } } fg.AppendLine(); fg.AppendLine("[DebuggerStepThrough]"); using (var args = new FunctionWrapper(fg, $"public static IEnumerable<{nameof(IMajorRecordCommonGetter)}> EnumerateMajorRecords{obj.GetGenericTypes(MaskType.Normal)}")) { args.Add($"this {obj.Interface(getter: true, internalInterface: true)} obj"); args.Add($"Type type"); args.Add($"bool throwIfUnknown = true"); args.Wheres.AddRange(obj.GenerateWhereClauses(LoquiInterfaceType.IGetter, obj.Generics)); } using (new BraceWrapper(fg)) { using (var args = new FunctionWrapper(fg, $"return {obj.CommonClassInstance("obj", LoquiInterfaceType.IGetter, CommonGenerics.Class)}.EnumerateMajorRecords")) { args.AddPassArg("obj"); args.AddPassArg("type"); args.AddPassArg("throwIfUnknown"); } using (new DepthWrapper(fg)) { fg.AppendLine($".Select(m => ({nameof(IMajorRecordCommonGetter)})m){enderSemi}"); if (needsCatch) { fg.AppendLine($"{catchLine};"); } } } fg.AppendLine(); fg.AppendLine("[DebuggerStepThrough]"); using (var args = new FunctionWrapper(fg, $"public static IEnumerable<{nameof(IMajorRecordCommon)}> EnumerateMajorRecords{obj.GetGenericTypes(MaskType.Normal)}")) { args.Wheres.AddRange(obj.GenerateWhereClauses(LoquiInterfaceType.ISetter, obj.Generics)); args.Add($"this {obj.Interface(getter: false, internalInterface: true)} obj"); } using (new BraceWrapper(fg)) { using (var args = new ArgsWrapper(fg, $"return {obj.CommonClassInstance("obj", LoquiInterfaceType.ISetter, CommonGenerics.Class)}.EnumerateMajorRecords", suffixLine: catchLine)) { args.AddPassArg("obj"); } } fg.AppendLine(); fg.AppendLine("[DebuggerStepThrough]"); using (var args = new FunctionWrapper(fg, $"public static IEnumerable<TMajor> EnumerateMajorRecords{obj.GetGenericTypes(MaskType.Normal, "TMajor")}")) { args.Wheres.AddRange(obj.GenerateWhereClauses(LoquiInterfaceType.ISetter, obj.Generics)); args.Wheres.Add($"where TMajor : class, IMajorRecordCommon"); args.Add($"this {obj.Interface(getter: false, internalInterface: true)} obj"); } using (new BraceWrapper(fg)) { using (var args = new FunctionWrapper(fg, $"return {obj.CommonClassInstance("obj", LoquiInterfaceType.ISetter, CommonGenerics.Class)}.EnumerateMajorRecords")) { args.AddPassArg("obj"); args.Add("type: typeof(TMajor)"); args.Add("throwIfUnknown: true"); } using (new DepthWrapper(fg)) { fg.AppendLine($".Select(m => (TMajor)m){enderSemi}"); if (needsCatch) { fg.AppendLine($"{catchLine};"); } } } fg.AppendLine(); fg.AppendLine("[DebuggerStepThrough]"); using (var args = new FunctionWrapper(fg, $"public static IEnumerable<{nameof(IMajorRecordCommon)}> EnumerateMajorRecords{obj.GetGenericTypes(MaskType.Normal)}")) { args.Add($"this {obj.Interface(getter: false, internalInterface: true)} obj"); args.Add($"Type? type"); args.Add($"bool throwIfUnknown = true"); args.Wheres.AddRange(obj.GenerateWhereClauses(LoquiInterfaceType.ISetter, obj.Generics)); } using (new BraceWrapper(fg)) { using (var args = new FunctionWrapper(fg, $"return {obj.CommonClassInstance("obj", LoquiInterfaceType.ISetter, CommonGenerics.Class)}.EnumeratePotentiallyTypedMajorRecords")) { args.AddPassArg("obj"); args.AddPassArg("type"); args.AddPassArg("throwIfUnknown"); } using (new DepthWrapper(fg)) { fg.AppendLine($".Select(m => ({nameof(IMajorRecordCommon)})m){enderSemi}"); if (needsCatch) { fg.AppendLine($"{catchLine};"); } } } fg.AppendLine(); }
public override async Task GenerateInCommonMixin(ObjectGeneration obj, FileGeneration fg) { if (obj.GetObjectType() != ObjectType.Mod) { return; } var needsCatch = obj.GetObjectType() == ObjectType.Mod; string catchLine = needsCatch ? ".Catch(e => throw RecordException.Factory(e, obj.ModKey))" : string.Empty; string enderSemi = needsCatch ? string.Empty : ";"; fg.AppendLine("[DebuggerStepThrough]"); using (var args = new FunctionWrapper(fg, $"public static IEnumerable<IModContext<{obj.GetObjectData().GameCategory.Value.ModInterface(getter: false)}, TSetter, TGetter>> EnumerateMajorRecordContexts{obj.GetGenericTypes(MaskType.Normal, new string[] { "TSetter", "TGetter" })}")) { args.Wheres.AddRange(obj.GenerateWhereClauses(LoquiInterfaceType.IGetter, obj.Generics)); args.Wheres.Add($"where TSetter : class, IMajorRecordCommon, TGetter"); args.Wheres.Add($"where TGetter : class, IMajorRecordCommonGetter"); args.Add($"this {obj.Interface(getter: true, internalInterface: true)} obj"); args.Add($"{nameof(ILinkCache)} linkCache"); args.Add($"bool throwIfUnknown = true"); } using (new BraceWrapper(fg)) { using (var args = new FunctionWrapper(fg, $"return {obj.CommonClassInstance("obj", LoquiInterfaceType.IGetter, CommonGenerics.Class)}.EnumerateMajorRecordContexts")) { args.AddPassArg("obj"); args.AddPassArg("linkCache"); args.Add("type: typeof(TGetter)"); args.AddPassArg("throwIfUnknown"); } using (new DepthWrapper(fg)) { fg.AppendLine($".Select(m => m.AsType<{obj.GetObjectData().GameCategory.Value.ModInterface(getter: false)}, {nameof(IMajorRecordCommon)}, {nameof(IMajorRecordCommonGetter)}, TSetter, TGetter>()){enderSemi}"); if (needsCatch) { fg.AppendLine($"{catchLine};"); } } } fg.AppendLine(); fg.AppendLine("[DebuggerStepThrough]"); using (var args = new FunctionWrapper(fg, $"public static IEnumerable<IModContext<{obj.GetObjectData().GameCategory.Value.ModInterface(getter: false)}, IMajorRecordCommon, IMajorRecordCommonGetter>> EnumerateMajorRecordContexts{obj.GetGenericTypes(MaskType.Normal)}")) { args.Add($"this {obj.Interface(getter: true, internalInterface: true)} obj"); args.Add($"{nameof(ILinkCache)} linkCache"); args.Add($"Type type"); args.Add($"bool throwIfUnknown = true"); args.Wheres.AddRange(obj.GenerateWhereClauses(LoquiInterfaceType.IGetter, obj.Generics)); } using (new BraceWrapper(fg)) { using (var args = new ArgsWrapper(fg, $"return {obj.CommonClassInstance("obj", LoquiInterfaceType.IGetter, CommonGenerics.Class)}.EnumerateMajorRecordContexts")) { args.AddPassArg("obj"); args.AddPassArg("linkCache"); args.AddPassArg("type"); args.AddPassArg("throwIfUnknown"); } } fg.AppendLine(); }