56 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
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<ExtensionMethod> extensionMethods)
 | 
						|
    {
 | 
						|
        Dictionary<UhtType, List<ExtensionMethod>?> libraryToExtensionMethod = new();
 | 
						|
        
 | 
						|
        foreach (ExtensionMethod extensionMethod in extensionMethods)
 | 
						|
        {
 | 
						|
            UhtType outerClass = extensionMethod.Function.Outer!;
 | 
						|
            
 | 
						|
            if (!libraryToExtensionMethod.TryGetValue(outerClass, out List<ExtensionMethod>? libraryExtensions))
 | 
						|
            {
 | 
						|
                libraryExtensions = new List<ExtensionMethod>();
 | 
						|
                libraryToExtensionMethod[outerClass] = libraryExtensions;
 | 
						|
            }
 | 
						|
            
 | 
						|
            libraryExtensions!.Add(extensionMethod);
 | 
						|
        }
 | 
						|
        
 | 
						|
        foreach (KeyValuePair<UhtType, List<ExtensionMethod>?> pair in libraryToExtensionMethod)
 | 
						|
        {
 | 
						|
            UhtType libraryClass = pair.Key;
 | 
						|
            List<ExtensionMethod>? libraryExtensions = pair.Value;
 | 
						|
            ExportLibrary(package, libraryClass, libraryExtensions!);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public static void ExportLibrary(UhtPackage package, UhtType libraryClass, List<ExtensionMethod> 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());
 | 
						|
    }
 | 
						|
} |