/// <summary> /// Generates an enum. /// </summary> /// <param name="enumObj">The enum object.</param> private async Task GenerateEnum(GenericTypes.UEEnum enumObj) { var e = new Enum { Name = await NameValidator.MakeUniqueCppName(enumObj) }; if (e.Name.Contains("Default__") || e.Name.Contains("PLACEHOLDER-CLASS")) { return; } e.FullName = await enumObj.GetFullName(); var conflicts = new Dictionary <string, int>(); foreach (var s in await enumObj.GetNames()) { var clean = NameValidator.MakeValidName(s); if (!conflicts.ContainsKey(clean)) { e.Values.Add(clean); conflicts[clean] = 1; } else { e.Values.Add($"{clean}{conflicts[clean]:D2}"); conflicts[clean]++; } } Enums.Add(e); }
/// <summary> /// Generates a constant. /// </summary> /// <param name="constObj">The constant object.</param> private async Task GenerateConst(GenericTypes.UEConst constObj) { var name = await NameValidator.MakeUniqueCppName(constObj); if (name.Contains("Default__") || name.Contains("PLACEHOLDER-CLASS")) { return; } Constants.Add(new Constant { Name = name, Value = constObj.GetValue() }); }
/// <summary> /// Generates a script structure. /// </summary> /// <param name="scriptStructObj">The script structure object.</param> private async Task GenerateScriptStruct(GenericTypes.UEScriptStruct scriptStructObj) { var ss = new ScriptStruct { Name = await scriptStructObj.GetName(), FullName = await scriptStructObj.GetFullName() }; var logTask = Logger.Log($"Struct: {await GetName() + "." + ss.Name, -85} - instance: 0x{scriptStructObj.GetAddress().ToInt64():X8}"); ss.NameCpp = NameValidator.MakeValidName(await scriptStructObj.GetNameCpp()); ss.NameCppFull = "struct "; //some classes need special alignment var alignment = Generator.GetClassAlignas(ss.FullName); if (alignment == 0) { ss.NameCppFull += $"alignas({alignment}) "; } ss.NameCppFull += await NameValidator.MakeUniqueCppName(scriptStructObj); ss.Size = await scriptStructObj.GetPropertySize(); ss.InheritedSize = 0; int offset = 0; var super = await scriptStructObj.GetSuper(); if (super.IsValid() && super != scriptStructObj) { ss.InheritedSize = offset = await scriptStructObj.GetPropertySize(); ss.NameCppFull += $" : public {await NameValidator.MakeUniqueCppName(super.Cast<GenericTypes.UEScriptStruct>())}"; } var properties = new List <GenericTypes.UEProperty>(); for (var prop = (await scriptStructObj.GetChildren()).Cast <GenericTypes.UEProperty>(); prop.IsValid(); prop = (await prop.GetNext()).Cast <GenericTypes.UEProperty>()) { var isScriptStruct = prop.IsA <GenericTypes.UEScriptStruct>(); var isFunction = prop.IsA <GenericTypes.UEFunction>(); var isEnum = prop.IsA <GenericTypes.UEEnum>(); var isConst = prop.IsA <GenericTypes.UEConst>(); if (await prop.GetElementSize() > 0 && !await isScriptStruct && !await isFunction && !await isEnum && !await isConst) { properties.Add(prop); } } // As C# sort not same as C++ version, that's not work // Anyway after some testes it's not needed !! // properties.Sort((x, y) => ComparePropertyLess(x, y).Result ? 0 : 1); var memberT = GenerateMembers(scriptStructObj, offset, properties); if (Generator.SdkType == SdkType.External) { // ToDO: Add external Read/Write here for external } Generator.GetPredefinedClassMethods(await scriptStructObj.GetFullName(), ref ss.PredefinedMethods); ss.Members = await memberT; ScriptStructs.Add(ss); // wait logger await logTask; }