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

@@ -44,9 +44,14 @@ public class Generator
{
foreach (var (name, info) in module.GetTypes())
{
if (info is Module.TypeInfoStruct s)
switch (info)
{
writer.WriteLine($"struct {NameMangler.Mangle(module.Name, name, NubTypeStruct.Get(module.Name, name))};");
case Module.TypeInfoStruct s:
writer.WriteLine($"struct {NameMangler.Mangle(module.Name, name, NubTypeStruct.Get(module.Name, name))};");
break;
case Module.TypeInfoEnum e:
writer.WriteLine($"struct {NameMangler.Mangle(module.Name, name, NubTypeStruct.Get(module.Name, name))};");
break;
}
}
}
@@ -55,24 +60,59 @@ public class Generator
{
foreach (var (name, info) in module.GetTypes())
{
if (info is Module.TypeInfoStruct s)
switch (info)
{
writer.WriteLine();
writer.Write("struct ");
if (s.Packed)
writer.Write("__attribute__((__packed__)) ");
writer.WriteLine(NameMangler.Mangle(module.Name, name, NubTypeStruct.Get(module.Name, name)));
writer.WriteLine("{");
using (writer.Indent())
case Module.TypeInfoStruct s:
{
foreach (var field in s.Fields)
writer.WriteLine();
writer.Write("struct ");
if (s.Packed)
writer.Write("__attribute__((__packed__)) ");
writer.WriteLine(NameMangler.Mangle(module.Name, name, NubTypeStruct.Get(module.Name, name)));
writer.WriteLine("{");
using (writer.Indent())
{
writer.WriteLine($"{CType(field.Type, field.Name)};");
foreach (var field in s.Fields)
{
writer.WriteLine($"{CType(field.Type, field.Name)};");
}
}
writer.WriteLine("};");
break;
}
case Module.TypeInfoEnum e:
{
writer.WriteLine();
writer.Write($"struct {NameMangler.Mangle(module.Name, name, NubTypeStruct.Get(module.Name, name))}");
writer.WriteLine("{");
using (writer.Indent())
{
writer.WriteLine("uint32_t tag;");
writer.WriteLine("union");
writer.WriteLine("{");
using (writer.Indent())
{
foreach (var variant in e.Variants)
{
writer.WriteLine($"struct {variant.Name}");
writer.WriteLine("{");
using (writer.Indent())
{
foreach (var field in variant.Fields)
{
writer.WriteLine($"{CType(field.Type, field.Name)};");
}
}
writer.WriteLine("};");
}
}
writer.WriteLine("};");
}
writer.WriteLine("};");
break;
}
writer.WriteLine("};");
}
}
}