139 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Text;
 | |
| using EpicGames.Core;
 | |
| using EpicGames.UHT.Types;
 | |
| 
 | |
| namespace UnrealSharpScriptGenerator.Utilities;
 | |
| 
 | |
| public class AttributeBuilder
 | |
| {
 | |
|     private readonly StringBuilder _stringBuilder;
 | |
|     private AttributeState _state;
 | |
|     
 | |
|     public AttributeBuilder()
 | |
|     {
 | |
|         _stringBuilder = new StringBuilder("[");
 | |
|         _state = AttributeState.Open;
 | |
|     }
 | |
|     
 | |
|     public AttributeBuilder(UhtType type) : this()
 | |
|     {
 | |
|         AddAttribute(GetAttributeForType(type));
 | |
|     }
 | |
| 
 | |
|     public void AddGeneratedTypeAttribute(UhtType type)
 | |
|     {
 | |
|         AddAttribute("GeneratedType");
 | |
|         AddArgument($"\"{type.EngineName}\"");
 | |
|         
 | |
|         string fullName = type.GetNamespace() + "." + type.EngineName;
 | |
|         AddArgument($"\"{fullName}\"");
 | |
|     }
 | |
|     
 | |
|     public void AddIsBlittableAttribute()
 | |
|     {
 | |
|         AddAttribute("BlittableType");
 | |
|     }
 | |
| 
 | |
|     public void AddStructLayoutAttribute(System.Runtime.InteropServices.LayoutKind layoutKind)
 | |
|     {
 | |
|         AddAttribute("StructLayout");
 | |
|         AddArgument($"LayoutKind.{layoutKind}");
 | |
|     }
 | |
| 
 | |
|     private static string GetAttributeForType(UhtType type)
 | |
|     {
 | |
|         if (type is UhtClass uhtClass)
 | |
|         {
 | |
|             return uhtClass.HasAllFlags(EClassFlags.Interface) ? "UInterface" : "UClass";
 | |
|         }
 | |
| 
 | |
|         if (type is UhtScriptStruct)
 | |
|         {
 | |
|             return "UStruct";
 | |
|         }
 | |
| 
 | |
|         if (type is UhtEnum)
 | |
|         {
 | |
|             return "UEnum";
 | |
|         }
 | |
| 
 | |
|         if (type is UhtFunction)
 | |
|         {
 | |
|             return "UFunction";
 | |
|         }
 | |
| 
 | |
|         throw new InvalidOperationException("Invalid type");
 | |
|     }
 | |
| 
 | |
|     public void AddAttribute(string attributeName)
 | |
|     {
 | |
|         switch (_state)
 | |
|         {
 | |
|             case AttributeState.Open:
 | |
|                 break;
 | |
|             case AttributeState.InAttribute:
 | |
|                 _stringBuilder.Append(", ");
 | |
|                 break;
 | |
|             case AttributeState.InAttributeParams:
 | |
|                 _stringBuilder.Append("), ");
 | |
|                 break;
 | |
|             default:
 | |
|                 throw new InvalidOperationException("Invalid state");
 | |
|         }
 | |
|         _stringBuilder.Append(attributeName);
 | |
|         _state = AttributeState.InAttribute;
 | |
|     }
 | |
| 
 | |
|     public void AddArgument(string arg)
 | |
|     {
 | |
|         switch (_state)
 | |
|         {
 | |
|             case AttributeState.InAttribute:
 | |
|                 _stringBuilder.Append("(");
 | |
|                 break;
 | |
|             case AttributeState.InAttributeParams:
 | |
|                 _stringBuilder.Append(", ");
 | |
|                 break;
 | |
|             default:
 | |
|                 throw new InvalidOperationException("Invalid state");
 | |
|         }
 | |
|         _stringBuilder.Append(arg);
 | |
|         _state = AttributeState.InAttributeParams;
 | |
|     }
 | |
| 
 | |
|     public void Finish()
 | |
|     {
 | |
|         switch (_state)
 | |
|         {
 | |
|             case AttributeState.InAttribute:
 | |
|                 _stringBuilder.Append("]");
 | |
|                 break;
 | |
|             case AttributeState.InAttributeParams:
 | |
|                 _stringBuilder.Append(")]");
 | |
|                 break;
 | |
|             default:
 | |
|                 throw new InvalidOperationException("Invalid state");
 | |
|         }
 | |
| 
 | |
|         _state = AttributeState.Closed;
 | |
|     }
 | |
| 
 | |
|     public override string ToString()
 | |
|     {
 | |
|         if (_state != AttributeState.Closed)
 | |
|         {
 | |
|             throw new InvalidOperationException("Cannot convert to string. The builder is not in the closed state.");
 | |
|         }
 | |
|         return _stringBuilder.ToString();
 | |
|     }
 | |
| 
 | |
|     private enum AttributeState
 | |
|     {
 | |
|         Open,
 | |
|         Closed,
 | |
|         InAttribute,
 | |
|         InAttributeParams
 | |
|     }
 | |
| }
 |