238 lines
12 KiB
C#
238 lines
12 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Text;
|
|||
|
|
using EpicGames.Core;
|
|||
|
|
using EpicGames.UHT.Types;
|
|||
|
|
using UnrealSharpScriptGenerator.Utilities;
|
|||
|
|
|
|||
|
|
namespace UnrealSharpScriptGenerator.PropertyTranslators;
|
|||
|
|
|
|||
|
|
public class MapPropertyTranslator : PropertyTranslator
|
|||
|
|
{
|
|||
|
|
public MapPropertyTranslator() : base(ContainerSupportedUsages)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override bool IsBlittable => false;
|
|||
|
|
public override bool SupportsSetter => true;
|
|||
|
|
public override bool CacheProperty => true;
|
|||
|
|
|
|||
|
|
public override bool CanExport(UhtProperty property)
|
|||
|
|
{
|
|||
|
|
if (property is not UhtMapProperty mapProperty)
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
PropertyTranslator? keyTranslator = PropertyTranslatorManager.GetTranslator(mapProperty.KeyProperty);
|
|||
|
|
PropertyTranslator? valueTranslator = PropertyTranslatorManager.GetTranslator(mapProperty.ValueProperty);
|
|||
|
|
|
|||
|
|
// These can be null apparently
|
|||
|
|
if (keyTranslator == null || valueTranslator == null)
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return keyTranslator.IsSupportedAsInner() && valueTranslator.IsSupportedAsInner();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override string GetManagedType(UhtProperty property)
|
|||
|
|
{
|
|||
|
|
UhtMapProperty mapProperty = (UhtMapProperty) property;
|
|||
|
|
PropertyTranslator keyTranslator = PropertyTranslatorManager.GetTranslator(mapProperty.KeyProperty)!;
|
|||
|
|
PropertyTranslator valueTranslator = PropertyTranslatorManager.GetTranslator(mapProperty.ValueProperty)!;
|
|||
|
|
|
|||
|
|
string keyManagedType = keyTranslator.GetManagedType(mapProperty.KeyProperty);
|
|||
|
|
string valueManagedType = valueTranslator.GetManagedType(mapProperty.ValueProperty);
|
|||
|
|
|
|||
|
|
string interfaceType = property.HasAnyFlags(EPropertyFlags.BlueprintReadOnly) ? "IReadOnlyDictionary" : "IDictionary";
|
|||
|
|
return $"System.Collections.Generic.{interfaceType}<{keyManagedType}, {valueManagedType}>";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override void ExportParameterStaticConstructor(GeneratorStringBuilder builder, UhtProperty property, UhtFunction function, string propertyEngineName, string functionName)
|
|||
|
|
{
|
|||
|
|
base.ExportParameterStaticConstructor(builder, property, function, propertyEngineName, functionName);
|
|||
|
|
builder.AppendLine($"{functionName}_{propertyEngineName}_NativeProperty = {ExporterCallbacks.FPropertyCallbacks}.CallGetNativePropertyFromName({functionName}_NativeFunction, \"{property.EngineName}\");");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override void ExportParameterVariables(GeneratorStringBuilder builder, UhtFunction function,
|
|||
|
|
string nativeMethodName,
|
|||
|
|
UhtProperty property, string propertyEngineName)
|
|||
|
|
{
|
|||
|
|
base.ExportParameterVariables(builder, function, nativeMethodName, property, propertyEngineName);
|
|||
|
|
|
|||
|
|
string marshaller = GetMarshaller((UhtMapProperty) property);
|
|||
|
|
|
|||
|
|
builder.AppendLine($"static IntPtr {nativeMethodName}_{propertyEngineName}_NativeProperty;");
|
|||
|
|
if (function.FunctionFlags.HasAnyFlags(EFunctionFlags.Static))
|
|||
|
|
{
|
|||
|
|
builder.AppendLine($"static {marshaller} {nativeMethodName}_{propertyEngineName}_Marshaller = null;");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
builder.AppendLine($"{marshaller} {nativeMethodName}_{propertyEngineName}_Marshaller = null;");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override void ExportPropertyVariables(GeneratorStringBuilder builder, UhtProperty property, string propertyEngineName)
|
|||
|
|
{
|
|||
|
|
base.ExportPropertyVariables(builder, property, propertyEngineName);
|
|||
|
|
|
|||
|
|
string marshaller = GetMarshaller((UhtMapProperty) property);
|
|||
|
|
|
|||
|
|
if (property.IsOuter<UhtScriptStruct>())
|
|||
|
|
{
|
|||
|
|
builder.AppendLine($"static {marshaller} {propertyEngineName}_Marshaller = null;");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
builder.AppendLine($"{marshaller} {propertyEngineName}_Marshaller = null;");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override void ExportPropertyGetter(GeneratorStringBuilder builder, UhtProperty property,
|
|||
|
|
string propertyManagedName)
|
|||
|
|
{
|
|||
|
|
UhtMapProperty mapProperty = (UhtMapProperty) property;
|
|||
|
|
PropertyTranslator keyTranslator = PropertyTranslatorManager.GetTranslator(mapProperty.KeyProperty)!;
|
|||
|
|
PropertyTranslator valueTranslator = PropertyTranslatorManager.GetTranslator(mapProperty.ValueProperty)!;
|
|||
|
|
|
|||
|
|
string keyMarshallingDelegates = keyTranslator.ExportMarshallerDelegates(mapProperty.KeyProperty);
|
|||
|
|
string valueMarshallingDelegates = valueTranslator.ExportMarshallerDelegates(mapProperty.ValueProperty);
|
|||
|
|
|
|||
|
|
string marshaller = GetMarshaller(mapProperty);
|
|||
|
|
|
|||
|
|
builder.AppendLine($"{property.SourceName}_Marshaller ??= new {marshaller}({property.SourceName}_NativeProperty, {keyMarshallingDelegates}, {valueMarshallingDelegates});");
|
|||
|
|
builder.AppendLine($"return {property.SourceName}_Marshaller.FromNative(IntPtr.Add(NativeObject, {property.SourceName}_Offset), 0);");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override void ExportPropertySetter(GeneratorStringBuilder builder, UhtProperty property, string propertyManagedName)
|
|||
|
|
{
|
|||
|
|
UhtMapProperty mapProperty = (UhtMapProperty)property;
|
|||
|
|
PropertyTranslator keyTranslator = PropertyTranslatorManager.GetTranslator(mapProperty.KeyProperty)!;
|
|||
|
|
PropertyTranslator valueTranslator = PropertyTranslatorManager.GetTranslator(mapProperty.ValueProperty)!;
|
|||
|
|
|
|||
|
|
string keyMarshallingDelegates = keyTranslator.ExportMarshallerDelegates(mapProperty.KeyProperty);
|
|||
|
|
string valueMarshallingDelegates = valueTranslator.ExportMarshallerDelegates(mapProperty.ValueProperty);
|
|||
|
|
|
|||
|
|
string marshaller = GetMarshaller(mapProperty);
|
|||
|
|
|
|||
|
|
builder.AppendLine($"{property.SourceName}_Marshaller ??= new {marshaller}({property.SourceName}_NativeProperty, {keyMarshallingDelegates}, {valueMarshallingDelegates});");
|
|||
|
|
builder.AppendLine($"{property.SourceName}_Marshaller.ToNative(IntPtr.Add(NativeObject, {property.SourceName}_Offset), 0, value);");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override void ExportFromNative(GeneratorStringBuilder builder, UhtProperty property, string propertyName, string assignmentOrReturn,
|
|||
|
|
string sourceBuffer, string offset, bool bCleanupSourceBuffer, bool reuseRefMarshallers)
|
|||
|
|
{
|
|||
|
|
UhtMapProperty mapProperty = (UhtMapProperty) property;
|
|||
|
|
PropertyTranslator keyTranslator = PropertyTranslatorManager.GetTranslator(mapProperty.KeyProperty)!;
|
|||
|
|
PropertyTranslator valueTranslator = PropertyTranslatorManager.GetTranslator(mapProperty.ValueProperty)!;
|
|||
|
|
|
|||
|
|
string nativePropertyName = $"{propertyName}_NativeProperty";
|
|||
|
|
string marshaller = $"{propertyName}_Marshaller";
|
|||
|
|
|
|||
|
|
if (property.Outer is UhtFunction function)
|
|||
|
|
{
|
|||
|
|
string nativeMethodName = function.SourceName;
|
|||
|
|
nativePropertyName = $"{nativeMethodName}_{nativePropertyName}";
|
|||
|
|
marshaller = $"{nativeMethodName}_{marshaller}";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string keyType = keyTranslator.GetManagedType(mapProperty.KeyProperty);
|
|||
|
|
string valueType = valueTranslator.GetManagedType(mapProperty.ValueProperty);
|
|||
|
|
string marshallerType = $"MapCopyMarshaller<{keyType}, {valueType}>";
|
|||
|
|
|
|||
|
|
if (!reuseRefMarshallers)
|
|||
|
|
{
|
|||
|
|
string keyMarshallingDelegates = keyTranslator.ExportMarshallerDelegates(mapProperty.KeyProperty);
|
|||
|
|
string valueMarshallingDelegates = valueTranslator.ExportMarshallerDelegates(mapProperty.ValueProperty);
|
|||
|
|
|
|||
|
|
builder.AppendLine($"{marshaller} ??= new {marshallerType}({nativePropertyName}, {keyMarshallingDelegates}, {valueMarshallingDelegates});");
|
|||
|
|
builder.AppendLine($"IntPtr {nativePropertyName}_ParamsBuffer = IntPtr.Add({sourceBuffer}, {offset});");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
builder.AppendLine($"{assignmentOrReturn} {marshaller}.FromNative({sourceBuffer}, 0);");
|
|||
|
|
|
|||
|
|
if (bCleanupSourceBuffer)
|
|||
|
|
{
|
|||
|
|
ExportCleanupMarshallingBuffer(builder, property, propertyName);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override void ExportToNative(GeneratorStringBuilder builder, UhtProperty property, string propertyName, string destinationBuffer,
|
|||
|
|
string offset, string source)
|
|||
|
|
{
|
|||
|
|
UhtMapProperty mapProperty = (UhtMapProperty) property;
|
|||
|
|
PropertyTranslator keyTranslator = PropertyTranslatorManager.GetTranslator(mapProperty.KeyProperty)!;
|
|||
|
|
PropertyTranslator valueTranslator = PropertyTranslatorManager.GetTranslator(mapProperty.ValueProperty)!;
|
|||
|
|
|
|||
|
|
string nativePropertyName = $"{propertyName}_NativeProperty";
|
|||
|
|
string marshaller = $"{propertyName}_Marshaller";
|
|||
|
|
|
|||
|
|
if (property.Outer is UhtFunction function)
|
|||
|
|
{
|
|||
|
|
string nativeMethodName = function.SourceName;
|
|||
|
|
nativePropertyName = $"{nativeMethodName}_{nativePropertyName}";
|
|||
|
|
marshaller = $"{nativeMethodName}_{marshaller}";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string keyType = keyTranslator.GetManagedType(mapProperty.KeyProperty);
|
|||
|
|
string valueType = valueTranslator.GetManagedType(mapProperty.ValueProperty);
|
|||
|
|
|
|||
|
|
string marshallerType = GetWrapperType(property, keyType, valueType);
|
|||
|
|
string keyMarshallingDelegates = keyTranslator.ExportMarshallerDelegates(mapProperty.KeyProperty);
|
|||
|
|
string valueMarshallingDelegates = valueTranslator.ExportMarshallerDelegates(mapProperty.ValueProperty);
|
|||
|
|
|
|||
|
|
builder.AppendLine($"{marshaller} ??= new {marshallerType}({nativePropertyName}, {keyMarshallingDelegates}, {valueMarshallingDelegates});");
|
|||
|
|
builder.AppendLine($"IntPtr {nativePropertyName}_NativeBuffer = IntPtr.Add({destinationBuffer}, {offset});");
|
|||
|
|
builder.AppendLine($"{marshaller}.ToNative({nativePropertyName}_NativeBuffer, 0, {source});");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private string GetWrapperType(UhtProperty property, string keyType, string valueType)
|
|||
|
|
{
|
|||
|
|
bool isStructProperty = property.IsOuter<UhtScriptStruct>();
|
|||
|
|
bool isParameter = property.IsOuter<UhtFunction>() || (property.Getter is not null && property.Setter is not null);
|
|||
|
|
string containerType = isStructProperty || isParameter ? "MapCopyMarshaller" : property.PropertyFlags.HasAnyFlags(EPropertyFlags.BlueprintReadOnly) ? "MapReadOnlyMarshaller" : "MapMarshaller";
|
|||
|
|
return $"{containerType}<{keyType}, {valueType}>";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override string GetMarshaller(UhtProperty property)
|
|||
|
|
{
|
|||
|
|
throw new System.NotImplementedException();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override string ExportMarshallerDelegates(UhtProperty property)
|
|||
|
|
{
|
|||
|
|
throw new System.NotImplementedException();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override string GetNullValue(UhtProperty property)
|
|||
|
|
{
|
|||
|
|
return "null";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override string ConvertCPPDefaultValue(string defaultValue, UhtFunction function, UhtProperty parameter)
|
|||
|
|
{
|
|||
|
|
throw new System.NotImplementedException();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private string GetMarshaller(UhtMapProperty property)
|
|||
|
|
{
|
|||
|
|
bool isStructProperty = property.IsOuter<UhtScriptStruct>();
|
|||
|
|
bool isParameter = property.IsOuter<UhtFunction>() || property.HasAnyGetter();
|
|||
|
|
|
|||
|
|
PropertyTranslator keyTranslator = PropertyTranslatorManager.GetTranslator(property.KeyProperty)!;
|
|||
|
|
PropertyTranslator valueTranslator = PropertyTranslatorManager.GetTranslator(property.ValueProperty)!;
|
|||
|
|
|
|||
|
|
string marshallerType = isStructProperty || isParameter ? "MapCopyMarshaller"
|
|||
|
|
: property.PropertyFlags.HasAnyFlags(EPropertyFlags.BlueprintReadOnly) ? "MapReadOnlyMarshaller" : "MapMarshaller";
|
|||
|
|
|
|||
|
|
string keyType = keyTranslator.GetManagedType(property.KeyProperty);
|
|||
|
|
string valueType = valueTranslator.GetManagedType(property.ValueProperty);
|
|||
|
|
|
|||
|
|
return $"{marshallerType}<{keyType}, {valueType}>";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override bool CanSupportGenericType(UhtProperty property) => false;
|
|||
|
|
}
|