| @ -0,0 +1,173 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using EpicGames.Core; | ||||
| using EpicGames.UHT.Types; | ||||
| using UnrealSharpScriptGenerator.PropertyTranslators; | ||||
| using UnrealSharpScriptGenerator.Tooltip; | ||||
| using UnrealSharpScriptGenerator.Utilities; | ||||
|  | ||||
| namespace UnrealSharpScriptGenerator.Exporters; | ||||
|  | ||||
| public static class InterfaceExporter | ||||
| { | ||||
|     public static void ExportInterface(UhtClass interfaceObj) | ||||
|     { | ||||
|         GeneratorStringBuilder stringBuilder = new(); | ||||
|          | ||||
|         bool nullableEnabled = interfaceObj.HasMetadata(UhtTypeUtilities.NullableEnable); | ||||
|         string interfaceName = interfaceObj.GetStructName(); | ||||
|         string typeNamespace = interfaceObj.GetNamespace(); | ||||
|          | ||||
|         stringBuilder.GenerateTypeSkeleton(typeNamespace, nullableEnabled: nullableEnabled); | ||||
|         stringBuilder.AppendTooltip(interfaceObj); | ||||
|          | ||||
|         AttributeBuilder attributeBuilder = new AttributeBuilder(interfaceObj); | ||||
|         attributeBuilder.AddGeneratedTypeAttribute(interfaceObj); | ||||
|         attributeBuilder.Finish(); | ||||
|          | ||||
|         stringBuilder.AppendLine(attributeBuilder.ToString()); | ||||
|         stringBuilder.DeclareType(interfaceObj, "interface", interfaceName); | ||||
|         stringBuilder.AppendLine(); | ||||
|         stringBuilder.AppendLine($"static {interfaceName} Wrap(UnrealSharp.CoreUObject.UObject obj)"); | ||||
|         stringBuilder.OpenBrace(); | ||||
|         stringBuilder.AppendLine($"return new {interfaceName}Wrapper(obj);"); | ||||
|         stringBuilder.CloseBrace(); | ||||
|          | ||||
|         List<UhtFunction> exportedFunctions = new(); | ||||
|         List<UhtFunction> exportedOverrides = new(); | ||||
|         Dictionary<string, GetterSetterPair> exportedGetterSetters = new(); | ||||
|         Dictionary<string, GetterSetterPair> getSetOverrides = new(); | ||||
|  | ||||
|         if (interfaceObj.AlternateObject is UhtClass alternateObject) | ||||
|         { | ||||
|             ScriptGeneratorUtilities.GetExportedFunctions(alternateObject, exportedFunctions, exportedOverrides, exportedGetterSetters, getSetOverrides); | ||||
|         } | ||||
|          | ||||
|         ScriptGeneratorUtilities.GetExportedFunctions(interfaceObj, exportedFunctions, exportedOverrides, exportedGetterSetters, getSetOverrides); | ||||
|          | ||||
|         ExportInterfaceProperties(stringBuilder, exportedGetterSetters); | ||||
|         ExportInterfaceFunctions(stringBuilder, exportedFunctions); | ||||
|         ExportInterfaceFunctions(stringBuilder, exportedOverrides); | ||||
|          | ||||
|         stringBuilder.CloseBrace(); | ||||
|          | ||||
|         stringBuilder.AppendLine(); | ||||
|         stringBuilder.AppendLine($"internal sealed class {interfaceName}Wrapper : {interfaceName}, UnrealSharp.CoreUObject.IScriptInterface"); | ||||
|         stringBuilder.OpenBrace(); | ||||
|         stringBuilder.AppendLine("public UnrealSharp.CoreUObject.UObject Object { get; }"); | ||||
|         stringBuilder.AppendLine("private IntPtr NativeObject => Object.NativeObject;"); | ||||
|         stringBuilder.AppendLine(); | ||||
|         stringBuilder.AppendLine($"internal {interfaceName}Wrapper(UnrealSharp.CoreUObject.UObject obj)"); | ||||
|         stringBuilder.OpenBrace(); | ||||
|         stringBuilder.AppendLine("Object = obj;"); | ||||
|         stringBuilder.CloseBrace(); | ||||
|  | ||||
|         StaticConstructorUtilities.ExportStaticConstructor(stringBuilder, interfaceObj, | ||||
|             new List<UhtProperty>(), | ||||
|             exportedFunctions, | ||||
|             exportedGetterSetters, | ||||
|             new Dictionary<UhtProperty, GetterSetterPair>(), | ||||
|             exportedOverrides,  | ||||
|             false, interfaceName + "Wrapper"); | ||||
|          | ||||
|         ClassExporter.ExportCustomProperties(stringBuilder, exportedGetterSetters, [], []); | ||||
|         ExportWrapperFunctions(stringBuilder, exportedFunctions); | ||||
|         ExportWrapperFunctions(stringBuilder, exportedOverrides); | ||||
|          | ||||
|         stringBuilder.CloseBrace(); | ||||
|          | ||||
|         stringBuilder.AppendLine(); | ||||
|         stringBuilder.AppendLine($"public static class {interfaceName}Marshaller"); | ||||
|         stringBuilder.OpenBrace(); | ||||
|         stringBuilder.AppendLine($"public static void ToNative(IntPtr nativeBuffer, int arrayIndex, {interfaceName} obj)"); | ||||
|         stringBuilder.OpenBrace(); | ||||
|         stringBuilder.AppendLine($"UnrealSharp.CoreUObject.ScriptInterfaceMarshaller<{interfaceName}>.ToNative(nativeBuffer, arrayIndex, obj);"); | ||||
|         stringBuilder.CloseBrace(); | ||||
|         stringBuilder.AppendLine(); | ||||
|  | ||||
|         stringBuilder.AppendLine($"public static {interfaceName} FromNative(IntPtr nativeBuffer, int arrayIndex)"); | ||||
|         stringBuilder.OpenBrace(); | ||||
|         stringBuilder.AppendLine($"return UnrealSharp.CoreUObject.ScriptInterfaceMarshaller<{interfaceName}>.FromNative(nativeBuffer, arrayIndex);"); | ||||
|         stringBuilder.CloseBrace(); | ||||
|         stringBuilder.CloseBrace(); | ||||
|          | ||||
|         FileExporter.SaveGlueToDisk(interfaceObj, stringBuilder); | ||||
|     } | ||||
|  | ||||
|     static void ExportInterfaceProperties(GeneratorStringBuilder stringBuilder, | ||||
|                                           Dictionary<string, GetterSetterPair> exportedGetterSetters) | ||||
|     { | ||||
|         foreach (var (_, getterSetterPair) in exportedGetterSetters) | ||||
|         { | ||||
|             if (getterSetterPair.Property is null) | ||||
|             { | ||||
|                 throw new InvalidDataException("Properties should have a UProperty associated with them."); | ||||
|             } | ||||
|              | ||||
|             UhtFunction firstAccessor = getterSetterPair.Accessors.First(); | ||||
|             UhtProperty firstProperty = getterSetterPair.Property; | ||||
|             string propertyName = getterSetterPair.PropertyName; | ||||
|              | ||||
|             PropertyTranslator translator = PropertyTranslatorManager.GetTranslator(firstProperty)!; | ||||
|             stringBuilder.TryAddWithEditor(firstAccessor); | ||||
|             string protection = firstProperty.GetProtection(); | ||||
|             stringBuilder.AppendTooltip(firstProperty); | ||||
|          | ||||
|             string managedType = translator.GetManagedType(firstProperty); | ||||
|             stringBuilder.AppendLine($"{managedType} {propertyName}"); | ||||
|             stringBuilder.OpenBrace(); | ||||
|  | ||||
|             if (getterSetterPair.Getter is not null) | ||||
|             { | ||||
|                 AppendPropertyFunctionDeclaration(stringBuilder, getterSetterPair.Getter); | ||||
|                 stringBuilder.AppendLine("get;"); | ||||
|             } | ||||
|  | ||||
|             if (getterSetterPair.Setter is not null) | ||||
|             { | ||||
|                 AppendPropertyFunctionDeclaration(stringBuilder, getterSetterPair.Setter); | ||||
|                 stringBuilder.AppendLine("set;"); | ||||
|             } | ||||
|          | ||||
|             stringBuilder.CloseBrace(); | ||||
|             stringBuilder.TryEndWithEditor(firstAccessor); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static void AppendPropertyFunctionDeclaration(GeneratorStringBuilder stringBuilder, UhtFunction function) | ||||
|     { | ||||
|         AttributeBuilder attributeBuilder = new AttributeBuilder(function); | ||||
|          | ||||
|         if (function.FunctionFlags.HasAnyFlags(EFunctionFlags.BlueprintEvent)) | ||||
|         { | ||||
|             attributeBuilder.AddArgument("FunctionFlags.BlueprintEvent"); | ||||
|         } | ||||
|          | ||||
|         attributeBuilder.AddGeneratedTypeAttribute(function); | ||||
|         attributeBuilder.Finish(); | ||||
|          | ||||
|         stringBuilder.AppendLine(attributeBuilder.ToString()); | ||||
|     } | ||||
|      | ||||
|     static void ExportInterfaceFunctions(GeneratorStringBuilder stringBuilder, List<UhtFunction> exportedFunctions) | ||||
|     { | ||||
|         foreach (UhtFunction function in exportedFunctions) | ||||
|         { | ||||
|             FunctionExporter.ExportInterfaceFunction(stringBuilder, function); | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     static void ExportWrapperFunctions(GeneratorStringBuilder stringBuilder, List<UhtFunction> exportedFunctions) | ||||
|     { | ||||
|         foreach (UhtFunction function in exportedFunctions) | ||||
|         { | ||||
|             FunctionType functionType = function.FunctionFlags.HasFlag(EFunctionFlags.BlueprintEvent)  | ||||
|                 ? FunctionType.BlueprintEvent  | ||||
|                 : FunctionType.Normal; | ||||
|              | ||||
|             FunctionExporter.ExportFunction(stringBuilder, function, functionType); | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user