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