union definitions
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user