Exemple #1
0
        /// <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);
        }
Exemple #2
0
        /// <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()
            });
        }
Exemple #3
0
        /// <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;
        }