using System.Collections.Generic; using EpicGames.UHT.Types; using UnrealSharpScriptGenerator.Utilities; namespace UnrealSharpScriptGenerator.Exporters; public static class ExtensionsClassExporter { public static void ExportExtensionsClass(UhtPackage package, List extensionMethods) { Dictionary?> libraryToExtensionMethod = new(); foreach (ExtensionMethod extensionMethod in extensionMethods) { UhtType outerClass = extensionMethod.Function.Outer!; if (!libraryToExtensionMethod.TryGetValue(outerClass, out List? libraryExtensions)) { libraryExtensions = new List(); libraryToExtensionMethod[outerClass] = libraryExtensions; } libraryExtensions!.Add(extensionMethod); } foreach (KeyValuePair?> pair in libraryToExtensionMethod) { UhtType libraryClass = pair.Key; List? libraryExtensions = pair.Value; ExportLibrary(package, libraryClass, libraryExtensions!); } } public static void ExportLibrary(UhtPackage package, UhtType libraryClass, List extensionMethods) { string typeNamespace = package.GetNamespace(); string className = $"{libraryClass.EngineName}_Extensions"; GeneratorStringBuilder stringBuilder = new(); stringBuilder.GenerateTypeSkeleton(typeNamespace); stringBuilder.DeclareType(package, "static class", className, null, false); foreach (ExtensionMethod extensionMethod in extensionMethods) { FunctionExporter exporter = new FunctionExporter(extensionMethod); exporter.Initialize(OverloadMode.AllowOverloads, EFunctionProtectionMode.UseUFunctionProtection, EBlueprintVisibility.Call); exporter.ExportExtensionMethodOverloads(stringBuilder); exporter.ExportExtensionMethod(stringBuilder); } stringBuilder.CloseBrace(); string directory = FileExporter.GetDirectoryPath(package); FileExporter.SaveGlueToDisk(package, directory, className, stringBuilder.ToString()); } }