public override async Task GenerateInCommon(ObjectGeneration obj, FileGeneration fg, MaskTypeSet maskTypes) { if (!maskTypes.Applicable(LoquiInterfaceType.IGetter, CommonGenerics.Class)) { return; } await base.GenerateInCommon(obj, fg, maskTypes); if (!await obj.IsMajorRecord()) { return; } using (new RegionWrapper(fg, "Duplicate")) { using (var args = new FunctionWrapper(fg, $"public{obj.Virtual()}{obj.Name} Duplicate{obj.GetGenericTypes(MaskType.Normal, MaskType.NormalGetter)}")) { args.Wheres.AddRange(obj.GenericTypeMaskWheres(LoquiInterfaceType.IGetter, MaskType.Normal, MaskType.NormalGetter)); args.Add($"{obj.Interface(getter: true)} item"); args.Add($"{nameof(FormKey)} formKey"); args.Add($"TranslationCrystal? copyMask"); } using (new BraceWrapper(fg)) { if (obj.Abstract) { fg.AppendLine("throw new NotImplementedException();"); } else { fg.AppendLine($"var newRec = new {obj.Name}(formKey{(obj.GetObjectData().HasMultipleReleases ? $", default({obj.GetObjectData().GameCategory}Release)" : null)});"); fg.AppendLine($"newRec.DeepCopyIn(item, default({nameof(ErrorMaskBuilder)}?), copyMask);"); fg.AppendLine("return newRec;"); } } fg.AppendLine(); foreach (var baseClass in obj.BaseClassTrail()) { using (var args = new FunctionWrapper(fg, $"public override {baseClass.Name} Duplicate{baseClass.GetGenericTypes(MaskType.Normal, MaskType.NormalGetter)}")) { args.Wheres.AddRange(baseClass.GenericTypeMaskWheres(LoquiInterfaceType.IGetter, MaskType.Normal, MaskType.NormalGetter)); args.Add($"{baseClass.Interface(getter: true)} item"); args.Add($"{nameof(FormKey)} formKey"); args.Add($"TranslationCrystal? copyMask"); } using (new BraceWrapper(fg)) { using (var args = new ArgsWrapper(fg, $"return this.Duplicate")) { args.Add($"item: ({obj.Interface(getter: false)})item"); args.AddPassArg("formKey"); args.AddPassArg("copyMask"); } } fg.AppendLine(); } } }