This commit is contained in:
nub31
2026-02-23 18:07:23 +01:00
parent 1511d5d2b8
commit 583c01201f
5 changed files with 252 additions and 16 deletions

View File

@@ -85,7 +85,7 @@ public class Generator
case Module.TypeInfoEnum e:
{
writer.WriteLine();
writer.Write($"struct {NameMangler.Mangle(module.Name, name, NubTypeStruct.Get(module.Name, name))}");
writer.Write($"struct {NameMangler.Mangle(module.Name, name, NubTypeEnum.Get(module.Name, name))}");
writer.WriteLine("{");
using (writer.Indent())
{
@@ -96,7 +96,7 @@ public class Generator
{
foreach (var variant in e.Variants)
{
writer.WriteLine($"struct {variant.Name}");
writer.WriteLine("struct");
writer.WriteLine("{");
using (writer.Indent())
{
@@ -105,7 +105,7 @@ public class Generator
writer.WriteLine($"{CType(field.Type, field.Name)};");
}
}
writer.WriteLine("};");
writer.WriteLine($"}} {variant.Name};");
}
}
writer.WriteLine("};");
@@ -165,7 +165,7 @@ public class Generator
{
if (!moduleGraph.TryResolveIdentifier(function.Module, function.Name.Ident, true, out var info))
throw new UnreachableException($"Module graph does not have info about the function {function.Module}::{function.Name.Ident}. This should have been caught earlier");
if (info.Kind == Module.DefinitionKind.Internal)
writer.Write("static ");
@@ -209,6 +209,9 @@ public class Generator
case TypedNodeStatementWhile statement:
EmitStatementWhile(statement);
break;
case TypedNodeStatementMatch statement:
EmitStatementMatch(statement);
break;
default:
throw new ArgumentOutOfRangeException(nameof(node), node, null);
}
@@ -286,7 +289,38 @@ public class Generator
writer.WriteLine("{");
using (writer.Indent())
{
EmitStatement(statement.Block);
EmitStatement(statement.Body);
}
writer.WriteLine("}");
}
private void EmitStatementMatch(TypedNodeStatementMatch statement)
{
var target = EmitExpression(statement.Target);
var enumType = (NubTypeEnum)statement.Target.Type;
if (!moduleGraph.TryResolveType(enumType.Module, enumType.Name, true, out var info))
throw new UnreachableException();
var enumInfo = (Module.TypeInfoEnum)info;
writer.WriteLine($"switch ({target}.tag)");
writer.WriteLine("{");
using (writer.Indent())
{
foreach (var @case in statement.Cases)
{
var tag = enumInfo.Variants.ToList().FindIndex(x => x.Name == @case.Type.Ident);
writer.WriteLine($"case {tag}:");
writer.WriteLine("{");
using (writer.Indent())
{
writer.WriteLine($"auto {@case.VariableName.Ident} = {target}.{@case.Type.Ident};");
EmitStatement(@case.Body);
}
writer.WriteLine("}");
}
}
writer.WriteLine("}");
}
@@ -301,6 +335,7 @@ public class Generator
TypedNodeExpressionIntLiteral expression => expression.Value.Value.ToString(),
TypedNodeExpressionStringLiteral expression => $"(struct nub_core_string){{ \"{expression.Value.Value}\", {expression.Value.Value.Length} }}",
TypedNodeExpressionStructLiteral expression => EmitExpressionStructLiteral(expression),
TypedNodeExpressionEnumLiteral expression => EmitExpressionEnumLiteral(expression),
TypedNodeExpressionMemberAccess expression => EmitExpressionMemberAccess(expression),
TypedNodeExpressionLocalIdent expression => expression.Value.Ident,
TypedNodeExpressionModuleIdent expression => EmitExpressionModuleIdent(expression),
@@ -362,6 +397,29 @@ public class Generator
return $"({CType(expression.Type)}){{ {string.Join(", ", initializerStrings)} }}";
}
private string EmitExpressionEnumLiteral(TypedNodeExpressionEnumLiteral expression)
{
var enumType = (NubTypeEnumVariant)expression.Type;
if (!moduleGraph.TryResolveType(enumType.Module, enumType.EnumName, true, out var info))
throw new UnreachableException();
var enumInfo = (Module.TypeInfoEnum)info;
var tag = enumInfo.Variants.ToList().FindIndex(x => x.Name == enumType.VariantName);
var initializerValues = new Dictionary<string, string>();
foreach (var initializer in expression.Initializers)
{
var values = EmitExpression(initializer.Value);
initializerValues[initializer.Name.Ident] = values;
}
var initializerStrings = initializerValues.Select(x => $".{x.Key} = {x.Value}");
return $"({CType(expression.Type)}){{ .tag = {tag}, .{enumType.VariantName} = {{{string.Join(", ", initializerStrings)}}} }}";
}
private string EmitExpressionMemberAccess(TypedNodeExpressionMemberAccess expression)
{
var target = EmitExpression(expression.Target);
@@ -390,6 +448,7 @@ public class Generator
NubTypeVoid => "void" + (varName != null ? $" {varName}" : ""),
NubTypeBool => "bool" + (varName != null ? $" {varName}" : ""),
NubTypeStruct type => $"struct {NameMangler.Mangle(type.Module, type.Name, type)}" + (varName != null ? $" {varName}" : ""),
NubTypeEnum type => $"struct {NameMangler.Mangle(type.Module, type.Name, type)}" + (varName != null ? $" {varName}" : ""),
NubTypeSInt type => $"int{type.Width}_t" + (varName != null ? $" {varName}" : ""),
NubTypeUInt type => $"uint{type.Width}_t" + (varName != null ? $" {varName}" : ""),
NubTypePointer type => CType(type.To) + (varName != null ? $" *{varName}" : "*"),