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;
|
||
|
|
}
|
||
|
|
}
|