Skip to content

Commit

Permalink
Swapped lots of skyrim concept to DataType
Browse files Browse the repository at this point in the history
  • Loading branch information
Noggog committed May 9, 2020
1 parent 2efea80 commit 7cc6675
Show file tree
Hide file tree
Showing 100 changed files with 19,262 additions and 46,333 deletions.
11 changes: 7 additions & 4 deletions Mutagen.Bethesda.Generation/Fields/DataType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public class DataType : SetMarkerType
public bool HasStateLogic => this.BreakIndices.Count > 0 || this.RangeIndices.Count > 0;
public string EnumName => $"{this.GetFieldData().RecordType.Value.Type}DataType";
public string StateName => $"{this.EnumName}State";
public bool HasBeenSet = false;

public class DataTypeRange
{
Expand Down Expand Up @@ -92,9 +93,9 @@ public override async Task Load(XElement node, bool requireName = true)
typeGen = await this.ObjectGen.LoadField(fieldNode, true);
if (typeGen.Succeeded)
{
typeGen.Value.HasBeenSetProperty.OnNext((false, true));
if (typeGen.Value is LoquiType loqui
&& loqui.HasBeenSet)
&& loqui.HasBeenSet
&& !loqui.HasBeenSetProperty.Value.HasBeenSet)
{
loqui.HasBeenSetProperty.OnNext((false, true));
}
Expand All @@ -108,7 +109,10 @@ public override async Task Load(XElement node, bool requireName = true)
{
typical.PreSetEvent += (fg) =>
{
fg.AppendLine($"this.{this.StateName} |= {this.EnumName}.Has;");
if (this.HasBeenSet)
{
fg.AppendLine($"this.{this.StateName} |= {this.EnumName}.Has;");
}
foreach (var b in subField.EncounteredBreaks)
{
fg.AppendLine($"this.{this.StateName} &= ~{this.EnumName}.Break{b};");
Expand All @@ -121,7 +125,6 @@ public override async Task Load(XElement node, bool requireName = true)
}
}
}
this.HasBeenSetProperty.OnNext((false, true));
}

public IEnumerable<DataTypeIteration> IterateFieldsWithMeta()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -767,7 +767,7 @@ private static async Task GenerateLastParsedShortCircuit(
await toDo();
if (dataSet != null)
{
fg.AppendLine($"return TryGet<int?>.Succeed((int){dataSet.SubFields.Last(f => f.IntegrateField).IndexEnumName});");
fg.AppendLine($"return TryGet<int?>.Succeed((int){dataSet.SubFields.Last(f => f.IntegrateField && f.Enabled).IndexEnumName});");
}
else if (field.Field is SpecialParseType
|| field.Field is CustomLogic)
Expand Down Expand Up @@ -859,10 +859,13 @@ private async Task GenerateFillSnippet(ObjectGeneration obj, FileGeneration fg,
{
fg.AppendLine($"{frameAccessor}.Position += {frameAccessor}.{nameof(MutagenBinaryReadStream.MetaData)}.{nameof(GameConstants.SubConstants)}.{nameof(RecordHeaderConstants.HeaderLength)};");
fg.AppendLine($"var dataFrame = {frameAccessor}.SpawnWithLength(contentLength);");
fg.AppendLine($"if (!dataFrame.Complete)");
using (new BraceWrapper(fg))
{
fg.AppendLine($"item.{set.StateName} = {obj.ObjectName}.{set.EnumName}.Has;");
if (set.HasBeenSet)
{
fg.AppendLine($"if (!dataFrame.Complete)");
using (new BraceWrapper(fg))
{
fg.AppendLine($"item.{set.StateName} = {obj.ObjectName}.{set.EnumName}.Has;");
}
}
bool isInRange = false;
foreach (var subField in set.IterateFieldsWithMeta())
Expand Down Expand Up @@ -1447,8 +1450,11 @@ private void GenerateWriteExtras(ObjectGeneration obj, FileGeneration fg)
var accessor = Accessor.FromType(field, "item");
if (field is DataType dataType)
{
fg.AppendLine($"if (item.{dataType.StateName}.HasFlag({obj.Name}.{dataType.EnumName}.Has))");
using (new BraceWrapper(fg))
if (dataType.HasBeenSet)
{
fg.AppendLine($"if (item.{dataType.StateName}.HasFlag({obj.Name}.{dataType.EnumName}.Has))");
}
using (new BraceWrapper(fg, doIt: dataType.HasBeenSet))
{
fg.AppendLine($"using (HeaderExport.ExportSubrecordHeader(writer, recordTypeConverter.ConvertToCustom({obj.RecordTypeHeaderName(fieldData.RecordType.Value)})))");
using (new BraceWrapper(fg))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ await this.Module.CustomLogic.GenerateForCustomFlagWrapperFields(
}
else
{
DataBinaryTranslationGeneration.GenerateWrapperExtraMembers(fg, dataType, objGen, typeGen, currentPosition);
DataBinaryTranslationGeneration.GenerateWrapperExtraMembers(fg, dataType, objGen, typeGen, $"0x{currentPosition:X}");
fg.AppendLine($"public {typeGen.TypeName(getter: true)}{(typeGen.HasBeenSet ? "?" : null)} {typeGen.Name} => _{typeGen.Name}_IsSet ? {dataAccessor}.Span.Slice(_{typeGen.Name}Location, {(await this.ExpectedLength(objGen, typeGen)).Value}).ToArray() : default(ReadOnlyMemorySlice<byte>{(typeGen.HasBeenSet ? "?" : null)});");
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ await this.Module.CustomLogic.GenerateForCustomFlagWrapperFields(
}
else
{
DataBinaryTranslationGeneration.GenerateWrapperExtraMembers(fg, dataType, objGen, typeGen, currentPosition);
DataBinaryTranslationGeneration.GenerateWrapperExtraMembers(fg, dataType, objGen, typeGen, $"0x{currentPosition:X}");
fg.AppendLine($"public {typeGen.TypeName(getter: true)} {typeGen.Name} => _{typeGen.Name}_IsSet ? {dataAccessor}.Span[_{typeGen.Name}Location] : default;");
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -242,14 +242,14 @@ public async Task GenerateForCustomFlagWrapperFields(
else if (dataType != null)
{
loc = $"_{typeGen.Name}Location";
DataBinaryTranslationGeneration.GenerateWrapperExtraMembers(fg, dataType, objGen, typeGen, currentPosition);
DataBinaryTranslationGeneration.GenerateWrapperExtraMembers(fg, dataType, objGen, typeGen, $"0x{currentPosition:X}");
}
else
{
loc = $"0x{currentPosition:X}";
}
using (var args = new ArgsWrapper(fg,
$"public {typeGen.TypeName(getter: true)}{(typeGen.HasBeenSet && typeGen.CanBeNullable(getter: true) ? "?" : null)} {typeGen.Name} => Get{typeGen.Name}Custom"))
$"public {typeGen.TypeName(getter: true)}{(typeGen.IsNullable ? "?" : null)} {typeGen.Name} => Get{typeGen.Name}Custom"))
{
if (!fieldData.HasTrigger && dataType == null)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,6 @@ public override async Task GenerateWrapperFields(
string passedLengthAccesor,
DataType _)
{

DataType dataType = typeGen as DataType;

fg.AppendLine($"private int? _{dataType.GetFieldData().RecordType}Location;");
Expand All @@ -88,6 +87,16 @@ await this.Module.CustomLogic.GenerateWrapperFields(
int? dataPassedLength = 0;
foreach (var field in dataType.IterateFieldsWithMeta())
{
if (!field.Field.Enabled) continue;
if (!field.Field.IntegrateField)
{
var fieldData = field.Field.GetFieldData();
if (fieldData.Length.HasValue)
{
dataPassedLength += fieldData.Length.Value;
continue;
}
}
if (!this.Module.TryGetTypeGeneration(field.Field.GetType(), out var subTypeGen)) continue;
using (new RegionWrapper(fg, field.Field.Name)
{
Expand Down Expand Up @@ -137,7 +146,10 @@ await this.Module.CustomLogic.GenerateWrapperRecordTypeParse(
break;
}
fg.AppendLine($"_{dataType.GetFieldData().RecordType}Location = (ushort){locationAccessor} + _package.Meta.SubConstants.TypeAndLengthLength;");
fg.AppendLine($"this.{dataType.StateName} = {objGen.ObjectName}.{dataType.EnumName}.Has;");
if (dataType.HasBeenSet)
{
fg.AppendLine($"this.{dataType.StateName} = {objGen.ObjectName}.{dataType.EnumName}.Has;");
}
bool generatedStart = false;
int? passedLen = 0;
foreach (var item in dataType.IterateFieldsWithMeta())
Expand Down Expand Up @@ -181,7 +193,7 @@ await this.Module.CustomLogic.GenerateWrapperRecordTypeParse(

public override async Task<int?> ExpectedLength(ObjectGeneration objGen, TypeGeneration typeGen) => null;

public static void GenerateWrapperExtraMembers(FileGeneration fg, DataType dataType, ObjectGeneration objGen, TypeGeneration typeGen, int? pos)
public static void GenerateWrapperExtraMembers(FileGeneration fg, DataType dataType, ObjectGeneration objGen, TypeGeneration typeGen, string posAccessor)
{
var dataMeta = dataType.IterateFieldsWithMeta().First(item => item.Field == typeGen);
StringBuilder extraChecks = new StringBuilder();
Expand All @@ -194,14 +206,13 @@ public static void GenerateWrapperExtraMembers(FileGeneration fg, DataType dataT
{
extraChecks.Append($"{dataType.StateName}.HasFlag({objGen.Name}.{dataType.EnumName}.Range{dataMeta.RangeIndex})");
}
fg.AppendLine($"private int _{typeGen.Name}Location => _{dataType.GetFieldData().RecordType}Location!.Value + 0x{pos.Value.ToString("X")};");
fg.AppendLine($"private int _{typeGen.Name}Location => _{dataType.GetFieldData().RecordType}Location!.Value + {posAccessor};");
switch (typeGen.GetFieldData().BinaryOverlayFallback)
{
case BinaryGenerationType.Normal:
fg.AppendLine($"private bool _{typeGen.Name}_IsSet => _{dataType.GetFieldData().RecordType}Location.HasValue{(extraChecks.Length > 0 ? $" && {extraChecks}" : null)};");
break;
case BinaryGenerationType.Custom:
fg.AppendLine($"private bool _{typeGen.Name}_IsSet => Get{typeGen.Name}IsSetCustom();");
break;
default:
throw new NotImplementedException();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -312,10 +312,16 @@ public override async Task GenerateWrapperFields(
throw new ArgumentException("Unsupported type generator: " + dict.ValueTypeGen);
}

var posStr = data == null ? $"{passedLengthAccessor}" : $"_{typeGen.Name}Location";
if (data != null)
{
DataBinaryTranslationGeneration.GenerateWrapperExtraMembers(fg, data, objGen, typeGen, passedLengthAccessor);
}

using (var args = new ArgsWrapper(fg,
$"public IReadOnlyDictionary<{dict.KeyTypeGen.TypeName(getter: true)}, {dict.ValueTypeGen.TypeName(getter: true)}> {typeGen.Name} => DictBinaryTranslation<{dict.ValueTypeGen.TypeName(getter: false)}>.Instance.Parse<{dict.KeyTypeGen.TypeName(false)}>"))
{
args.Add($"new {nameof(MutagenFrame)}(new {nameof(MutagenMemoryReadStream)}({dataAccessor}.Slice({passedLengthAccessor}), _package.Meta, _package.MasterReferences))");
args.Add($"new {nameof(MutagenFrame)}(new {nameof(MutagenMemoryReadStream)}({dataAccessor}.Slice({posStr}), _package.Meta, _package.MasterReferences))");
args.Add($"new Dictionary<{dict.KeyTypeGen.TypeName(getter: true)}, {dict.ValueTypeGen.TypeName(getter: true)}>()");
args.Add($"{subTransl.GetTranslatorInstance(dict.ValueTypeGen, getter: true)}.Parse");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,10 @@ await this.Module.CustomLogic.GenerateForCustomFlagWrapperFields(
}
var getType = GenerateForTypicalWrapper(objGen, typeGen, slice, "_package");

if (dataType != null)
{
DataBinaryTranslationGeneration.GenerateWrapperExtraMembers(fg, dataType, objGen, typeGen, $"0x{currentPosition:X}");
}
if (eType.HasBeenSetFallbackInt != null)
{
fg.AppendLine($"public {eType.TypeName(getter: true)}? {eType.Name}");
Expand Down Expand Up @@ -208,7 +212,6 @@ await this.Module.CustomLogic.GenerateForCustomFlagWrapperFields(
}
else
{
DataBinaryTranslationGeneration.GenerateWrapperExtraMembers(fg, dataType, objGen, typeGen, currentPosition);
fg.AppendLine($"public {eType.TypeName(getter: true)} {eType.Name} => _{typeGen.Name}_IsSet ? {getType} : default;");
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -253,8 +253,8 @@ public override async Task GenerateWrapperFields(
}
else
{
DataBinaryTranslationGeneration.GenerateWrapperExtraMembers(fg, dataType, objGen, typeGen, currentPosition);
fg.AppendLine($"public {typeGen.TypeName(getter: true)} {typeGen.Name} => _{typeGen.Name}_IsSet ? {GenerateForTypicalWrapper(objGen, typeGen, $"{dataAccessor}.Span.Slice(_{typeGen.Name}Location, 0x{(await this.ExpectedLength(objGen, typeGen)).Value:X})", "_package")} : {linkType.DirectTypeName(getter: true)}.Empty;");
DataBinaryTranslationGeneration.GenerateWrapperExtraMembers(fg, dataType, objGen, typeGen, $"0x{currentPosition:X}");
fg.AppendLine($"public {typeGen.TypeName(getter: true)} {typeGen.Name} => _{typeGen.Name}_IsSet ? {GenerateForTypicalWrapper(objGen, typeGen, $"{dataAccessor}.Span.Slice(_{typeGen.Name}Location, 0x{(await this.ExpectedLength(objGen, typeGen)).Value:X})", "_package")} : {linkType.DirectTypeName(getter: true)}.Null;");
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,7 @@ await this.Module.CustomLogic.GenerateForCustomFlagWrapperFields(
}
else
{
DataBinaryTranslationGeneration.GenerateWrapperExtraMembers(fg, dataType, objGen, typeGen, currentPosition);
DataBinaryTranslationGeneration.GenerateWrapperExtraMembers(fg, dataType, objGen, typeGen, $"0x{currentPosition:X}");
fg.AppendLine($"public IGenderedItemGetter<{gendered.SubTypeGeneration.TypeName(getter: true)}>{(typeGen.HasBeenSet ? "?" : null)} {typeGen.Name}");
using (new BraceWrapper(fg))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -410,7 +410,6 @@ string DataAccessor(Accessor accessor, string positionStr, string lenStr)
}
}
}

else
{
if (!loqui.Singleton)
Expand All @@ -423,13 +422,10 @@ string DataAccessor(Accessor accessor, string positionStr, string lenStr)
}
}
}
else if (!loqui.Singleton)
{
throw new NotImplementedException();
}
else
{
DataBinaryTranslationGeneration.GenerateWrapperExtraMembers(fg, dataType, objGen, typeGen, currentPosition);
isRequiredRecord = true;
DataBinaryTranslationGeneration.GenerateWrapperExtraMembers(fg, dataType, objGen, typeGen, $"0x{currentPosition:X}");
fg.AppendLine($"private {loqui.Interface(getter: true, internalInterface: true)}? _{typeGen.Name} => _{typeGen.Name}_IsSet ? {this.Module.BinaryOverlayClassName(loqui)}.{loqui.TargetObjectGeneration.Name}Factory(new {nameof(BinaryMemoryReadStream)}({DataAccessor(dataAccessor, $"_{typeGen.Name}Location", null)}), _package) : default;");
}

Expand All @@ -446,6 +442,9 @@ string DataAccessor(Accessor accessor, string positionStr, string lenStr)

public override async Task<int?> ExpectedLength(ObjectGeneration objGen, TypeGeneration typeGen)
{
var data = typeGen.GetFieldData();
if (data.Length.HasValue) return data.Length;

LoquiType loqui = typeGen as LoquiType;
if (loqui.TargetObjectGeneration == null) return null;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ await this.Module.CustomLogic.GenerateForCustomFlagWrapperFields(
}
else
{
DataBinaryTranslationGeneration.GenerateWrapperExtraMembers(fg, dataType, objGen, typeGen, currentPosition);
DataBinaryTranslationGeneration.GenerateWrapperExtraMembers(fg, dataType, objGen, typeGen, $"0x{currentPosition:X}");
fg.AppendLine($"public {typeGen.TypeName(getter: true)} {typeGen.Name} => _{typeGen.Name}_IsSet ? {GenerateForTypicalWrapper(objGen, typeGen, $"{dataAccessor}.Slice(_{typeGen.Name}Location, {(await this.ExpectedLength(objGen, typeGen)).Value})", "_package")} : {typeGen.GetDefault(getter: true)};");
}
}
Expand Down
Loading

0 comments on commit 7cc6675

Please sign in to comment.