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