113 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Collections.Concurrent;
 | |
| using System.Collections.Generic;
 | |
| using System.Threading.Tasks;
 | |
| using EpicGames.UHT.Types;
 | |
| using UnrealSharpScriptGenerator.PropertyTranslators;
 | |
| using UnrealSharpScriptGenerator.Utilities;
 | |
| 
 | |
| namespace UnrealSharpScriptGenerator.Exporters;
 | |
| 
 | |
| public static class AutocastExporter 
 | |
| {
 | |
|     private static readonly ConcurrentDictionary<UhtStruct, List<UhtFunction>> ExportedAutocasts = new();
 | |
|     
 | |
|     public static void AddAutocastFunction(UhtStruct conversionStruct, UhtFunction function)
 | |
|     {
 | |
|         if (!ExportedAutocasts.TryGetValue(conversionStruct, out List<UhtFunction>? value))
 | |
|         {
 | |
|             value = new List<UhtFunction>();
 | |
|             ExportedAutocasts[conversionStruct] = value;
 | |
|         }
 | |
| 
 | |
|         value!.Add(function);
 | |
|     }
 | |
|     
 | |
|     public static void StartExportingAutocastFunctions(List<Task> tasks)
 | |
|     {
 | |
|         foreach (KeyValuePair<UhtStruct, List<UhtFunction>> pair in ExportedAutocasts)
 | |
|         {
 | |
|             tasks.Add(Program.Factory.CreateTask(_ => 
 | |
|             {
 | |
|                 ExportAutocast(pair.Key, pair.Value);
 | |
|             })!);
 | |
|         }
 | |
|     }
 | |
|     
 | |
|     static void ExportAutocast(UhtStruct conversionStruct, List<UhtFunction> functions)
 | |
|     {
 | |
|         GeneratorStringBuilder stringBuilder = new();
 | |
|         stringBuilder.GenerateTypeSkeleton(conversionStruct);
 | |
|         stringBuilder.DeclareType(conversionStruct, "struct", conversionStruct.GetStructName());
 | |
| 
 | |
|         string conversionStructName = conversionStruct.GetFullManagedName();
 | |
|         HashSet<UhtFunction> exportedFunctions = new();
 | |
|         
 | |
|         foreach (UhtFunction function in functions)
 | |
|         {
 | |
|             string returnType = PropertyTranslatorManager.GetTranslator(function.ReturnProperty!)!.GetManagedType(function.ReturnProperty!);
 | |
|             string functionCall = $"{function.Outer!.GetFullManagedName()}.{function.GetFunctionName()}";
 | |
|             
 | |
|             if (SharesSignature(function, exportedFunctions) || ReturnValueIsSameAsParameter(function))
 | |
|             {
 | |
|                 continue;
 | |
|             }
 | |
| 
 | |
|             stringBuilder.AppendLine($"public static implicit operator {returnType}({conversionStructName} value) => {functionCall}(value);");
 | |
|             exportedFunctions.Add(function);
 | |
|         }
 | |
| 
 | |
|         stringBuilder.CloseBrace();
 | |
| 
 | |
|         string directory = FileExporter.GetDirectoryPath(conversionStruct.Package);
 | |
|         string fileName = $"{conversionStruct.EngineName}.Autocast";
 | |
|         FileExporter.SaveGlueToDisk(conversionStruct.Package, directory, fileName, stringBuilder.ToString());
 | |
|     }
 | |
|     
 | |
|     static bool SharesSignature(UhtFunction function, IEnumerable<UhtFunction> otherFunctions)
 | |
|     {
 | |
|         foreach (UhtFunction otherFunction in otherFunctions)
 | |
|         {
 | |
|             if (function == otherFunction)
 | |
|             {
 | |
|                 continue;
 | |
|             }
 | |
| 
 | |
|             bool sharesSignature = true;
 | |
|             int parameterCount = function.Children.Count;
 | |
|             for (int i = 0; i < parameterCount; i++)
 | |
|             {
 | |
|                 UhtProperty parameter = (UhtProperty) function.Children[i];
 | |
|                 UhtProperty otherParameter = (UhtProperty) otherFunction.Children[i];
 | |
| 
 | |
|                 if (parameter.IsSameType(otherParameter))
 | |
|                 {
 | |
|                     continue;
 | |
|                 }
 | |
|                     
 | |
|                 sharesSignature = false;
 | |
|                 break;
 | |
|             }
 | |
|                 
 | |
|             if (sharesSignature)
 | |
|             {
 | |
|                 return true;
 | |
|             }
 | |
|         }
 | |
|         return false;
 | |
|     }
 | |
|         
 | |
|     static bool ReturnValueIsSameAsParameter(UhtFunction function)
 | |
|     {
 | |
|         UhtProperty returnProperty = function.ReturnProperty!;
 | |
|         foreach (UhtType uhtType in function.Children)
 | |
|         {
 | |
|             UhtProperty parameter = (UhtProperty) uhtType;
 | |
|             
 | |
|             if (parameter != returnProperty && parameter.IsSameType(returnProperty))
 | |
|             {
 | |
|                 return true;
 | |
|             }
 | |
|         }
 | |
|         return false;
 | |
|     }
 | |
| } |