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