// Copyright Epic Games, Inc. All Rights Reserved. using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using EpicGames.Core; using EpicGames.UHT.Tables; using EpicGames.UHT.Types; using EpicGames.UHT.Utils; namespace EpicGames.UHT.Parsers { /// /// Collection of UENUM specifiers /// [UnrealHeaderTool] [SuppressMessage("CodeQuality", "IDE0051:Remove unused private members", Justification = "Attribute accessed method")] public static class UhtFieldSpecifiers { private static bool VerseCommonFieldKeys(UhtField fieldObj, StringView key, StringView value) { if (key.Equals("name", StringComparison.OrdinalIgnoreCase)) { fieldObj.VerseName = value.ToString(); return true; } else if (key.Equals("module", StringComparison.OrdinalIgnoreCase)) { fieldObj.VerseModule = value.ToString(); return true; } else if (key.Equals("noalias", StringComparison.OrdinalIgnoreCase)) { fieldObj.FieldExportFlags |= UhtFieldExportFlags.NoVerseAlias; return true; } return false; } private static void VerseCommonSpecifier(UhtField fieldObj, string what, List> values, Func keyAndValueFunc) { // Extract all the elements of the meta data foreach (KeyValuePair kvp in values) { if (!keyAndValueFunc(kvp.Key, kvp.Value)) { fieldObj.LogError($"Verse specifier option '{kvp.Key}' is unknown or not valid on a {what}"); } } if (String.IsNullOrEmpty(fieldObj.VerseName)) { fieldObj.LogError($"A verse name must be specified containing the name of the verse type"); return; } // Generate the engine name if (String.IsNullOrEmpty(fieldObj.VerseModule)) { fieldObj.EngineName = fieldObj.VerseName!; } else { fieldObj.EngineName = $"{fieldObj.VerseModule}_{fieldObj.VerseName!}"; } using BorrowStringBuilder borrowBuilder = new(StringBuilderCache.Small); borrowBuilder.StringBuilder.AppendVerseUEVNIPackageName(fieldObj); fieldObj.Outer = fieldObj.Module.CreatePackage(borrowBuilder.StringBuilder.ToString()); } [UhtSpecifier(Extends = UhtTableNames.Enum, Name = "Verse", ValueType = UhtSpecifierValueType.OptionalEqualsKeyValuePairList)] private static void VerseEnumSpecifier(UhtSpecifierContext specifierContext, List> values) { UhtEnum enumObj = (UhtEnum)specifierContext.Type; VerseCommonSpecifier(enumObj, "enum", values, (key, value) => { if (VerseCommonFieldKeys(enumObj, key, value)) { return true; } return false; }); } [UhtSpecifier(Extends = UhtTableNames.ScriptStruct, Name = "Verse", ValueType = UhtSpecifierValueType.OptionalEqualsKeyValuePairList)] private static void VerseScriptStructSpecifier(UhtSpecifierContext specifierContext, List> values) { UhtScriptStruct scriptStructObj = (UhtScriptStruct)specifierContext.Type; VerseCommonSpecifier(scriptStructObj, "script struct", values, (key, value) => { if (VerseCommonFieldKeys(scriptStructObj, key, value)) { return true; } else if (key.Equals("parametric", StringComparison.OrdinalIgnoreCase)) { scriptStructObj.ScriptStructExportFlags |= UhtScriptStructExportFlags.IsVerseParametric; return true; } return false; }); } [UhtSpecifier(Extends = UhtTableNames.Class, Name = "Verse", ValueType = UhtSpecifierValueType.OptionalEqualsKeyValuePairList)] private static void VerseClassSpecifier(UhtSpecifierContext specifierContext, List> values) { UhtClass classObj = (UhtClass)specifierContext.Type; VerseCommonSpecifier(classObj, "class", values, (key, value) => { if (VerseCommonFieldKeys(classObj, key, value)) { return true; } else if (key.Equals("experimental", StringComparison.OrdinalIgnoreCase)) { classObj.MetaData.Add(classObj.Session.Config!.ValkyrieDevelopmentStatusKey, classObj.Session.Config!.ValkyrieDevelopmentStatusValueExperimental); return true; } else if (key.Equals("deprecated", StringComparison.OrdinalIgnoreCase)) { classObj.MetaData.Add(classObj.Session.Config!.ValkyrieDeprecationStatusKey, classObj.Session.Config!.ValkyrieDeprecationStatusValueDeprecated); return true; } return false; }); } [UhtSpecifier(Extends = UhtTableNames.Interface, Name = "Verse", ValueType = UhtSpecifierValueType.OptionalEqualsKeyValuePairList)] private static void VerseInterfaceSpecifier(UhtSpecifierContext specifierContext, List> values) { UhtClass classObj = (UhtClass)specifierContext.Type; VerseCommonSpecifier(classObj, "interface", values, (key, value) => { if (VerseCommonFieldKeys(classObj, key, value)) { return true; } return false; }); } [UhtSpecifier(Extends = UhtTableNames.NativeInterface, Name = "Verse", ValueType = UhtSpecifierValueType.OptionalEqualsKeyValuePairList)] private static void VerseNativeInterfaceSpecifier(UhtSpecifierContext specifierContext, List> values) { UhtClass classObj = (UhtClass)specifierContext.Type; VerseCommonSpecifier(classObj, "native interface", values, (key, value) => { if (VerseCommonFieldKeys(classObj, key, value)) { return true; } return false; }); } [UhtSpecifier(Extends = UhtTableNames.VModule, Name = "Verse", ValueType = UhtSpecifierValueType.OptionalEqualsKeyValuePairList)] private static void VerseVModuleSpecifier(UhtSpecifierContext specifierContext, List> values) { UhtClass classObj = (UhtClass)specifierContext.Type; VerseCommonSpecifier(classObj, "verse module", values, (key, value) => { if (VerseCommonFieldKeys(classObj, key, value)) { return true; } return false; }); } } }