Files

74 lines
2.9 KiB
C#
Raw Permalink Normal View History

using EpicGames.Core;
using EpicGames.UHT.Types;
using UnrealSharpScriptGenerator.PropertyTranslators;
using UnrealSharpScriptGenerator.Utilities;
namespace UnrealSharpScriptGenerator.Exporters;
public enum GetterSetterMode
{
Get,
Set
}
public class GetterSetterFunctionExporter : FunctionExporter
{
private readonly UhtProperty _propertyGetterSetter;
private readonly GetterSetterMode _getterSetterMode;
private string _outParameterName;
public static GetterSetterFunctionExporter Create(UhtFunction function,
UhtProperty propertyGetterSetter,
GetterSetterMode getterSetterMode,
EFunctionProtectionMode protectionMode)
{
GetterSetterFunctionExporter exporter = new GetterSetterFunctionExporter(function, propertyGetterSetter, getterSetterMode);
exporter.Initialize(OverloadMode.SuppressOverloads, protectionMode, EBlueprintVisibility.GetterSetter);
return exporter;
}
private GetterSetterFunctionExporter(UhtFunction function, UhtProperty propertyGetterSetter, GetterSetterMode getterSetterMode) : base(function)
{
_outParameterName = string.Empty;
_propertyGetterSetter = propertyGetterSetter;
_getterSetterMode = getterSetterMode;
Initialize(OverloadMode.SuppressOverloads, EFunctionProtectionMode.OverrideWithInternal, EBlueprintVisibility.GetterSetter);
}
protected override string GetParameterName(UhtProperty parameter)
{
return _getterSetterMode == GetterSetterMode.Get ? _propertyGetterSetter.GetParameterName() : "value";
}
protected override string MakeOutMarshalDestination(UhtProperty parameter, PropertyTranslator propertyTranslator, GeneratorStringBuilder builder)
{
_outParameterName = GetParameterName(parameter) + "_Out";
builder.AppendLine($"{propertyTranslator.GetManagedType(parameter)} {_outParameterName};");
return _outParameterName;
}
protected override void ExportReturnStatement(GeneratorStringBuilder builder)
{
if (Function.ReturnProperty != null && Function.ReturnProperty.IsSameType(_propertyGetterSetter))
{
string castOperation = _propertyGetterSetter.HasAllFlags(EPropertyFlags.BlueprintReadOnly)
? $"({ReturnValueTranslator!.GetManagedType(_propertyGetterSetter)})" : string.Empty;
builder.AppendLine($"return {castOperation}returnValue;");
}
else if (Function.ReturnProperty != null)
{
// Types differ (e.g., getter returns FText, property bound as string). Still return and rely on
// available implicit/user-defined conversions on the managed types (FText -> string, etc.).
builder.AppendLine("return returnValue;");
}
if (string.IsNullOrEmpty(_outParameterName))
{
return;
}
builder.AppendLine($"return {_outParameterName};");
}
}