union definitions

This commit is contained in:
nub31
2026-02-15 04:23:36 +01:00
parent cbe27c0ae8
commit caa3b378b3
7 changed files with 239 additions and 17 deletions

View File

@@ -111,6 +111,30 @@ public class NubTypeStruct : NubType
public override string ToString() => $"struct {Module}::{Name}";
}
public class NubTypeEnum : NubType
{
private static readonly Dictionary<(string Module, string Name), NubTypeEnum> Cache = new();
public static NubTypeEnum Get(string module, string name)
{
if (!Cache.TryGetValue((module, name), out var enumType))
Cache[(module, name)] = enumType = new NubTypeEnum(module, name);
return enumType;
}
private NubTypeEnum(string module, string name)
{
Module = module;
Name = name;
}
public string Module { get; }
public string Name { get; }
public override string ToString() => $"enum {Module}::{Name}";
}
public class NubTypePointer : NubType
{
private static readonly Dictionary<NubType, NubTypePointer> Cache = new();
@@ -172,8 +196,6 @@ public class TypeEncoder
{
}
private Dictionary<NubTypeStruct, Definition> structDefinitions = new();
private string EncodeRoot(NubType type)
{
var sb = new StringBuilder();
@@ -223,6 +245,14 @@ public class TypeEncoder
sb.Append(')');
break;
case NubTypeEnum st:
sb.Append("E(");
sb.Append(st.Module);
sb.Append(':');
sb.Append(st.Name);
sb.Append(')');
break;
case NubTypeFunc fn:
sb.Append("F(");
for (int i = 0; i < fn.Parameters.Count; i++)
@@ -273,6 +303,7 @@ public class TypeDecoder
'P' => DecodePointer(),
'F' => DecodeFunc(),
'T' => DecodeStruct(),
'E' => DecodeEnum(),
_ => throw new Exception($"'{start}' is not a valid start to a type")
};
}
@@ -333,6 +364,25 @@ public class TypeDecoder
return NubTypeStruct.Get(module, name);
}
private NubTypeEnum DecodeEnum()
{
var sb = new StringBuilder();
Expect('(');
while (!TryExpect(':'))
sb.Append(Consume());
var module = sb.ToString();
sb.Clear();
while (!TryExpect(')'))
sb.Append(Consume());
var name = sb.ToString();
return NubTypeEnum.Get(module, name);
}
private bool TryPeek(out char c)
{
if (index >= encoded.Length)