This commit is contained in:
nub31
2026-03-01 18:46:36 +01:00
parent 2b7eb56895
commit 693b119781
4 changed files with 122 additions and 69 deletions

View File

@@ -489,7 +489,7 @@ public class Generator
TypedNodeExpressionIntLiteral expression => expression.Value.Value.ToString(),
TypedNodeExpressionStringLiteral expression => EmitExpressionStringLiteral(expression),
TypedNodeExpressionStructLiteral expression => EmitExpressionStructLiteral(expression),
TypedNodeExpressionNewNamedType expression => EmitNodeExpressionNewNamedType(expression),
TypedNodeExpressionEnumLiteral expression => EmitExpressionEnumLiteral(expression),
TypedNodeExpressionStructMemberAccess expression => EmitExpressionMemberAccess(expression),
TypedNodeExpressionStringLength expression => EmitExpressionStringLength(expression),
TypedNodeExpressionStringPointer expression => EmitExpressionStringPointer(expression),
@@ -578,35 +578,34 @@ public class Generator
return name;
}
private string EmitNodeExpressionNewNamedType(TypedNodeExpressionNewNamedType expression)
private string EmitExpressionEnumLiteral(TypedNodeExpressionEnumLiteral expression)
{
switch (expression.Type)
var name = TmpName();
scopes.Peek().DeconstructableNames.Add((name, expression.Type));
var enumVariantType = (NubTypeEnumVariant)expression.Type;
if (!moduleGraph.TryResolveType(enumVariantType.EnumType.Module, enumVariantType.EnumType.Name, true, out var info))
throw new UnreachableException();
var enumInfo = (Module.TypeInfoEnum)info;
var tag = enumInfo.Variants.ToList().FindIndex(x => x.Name == enumVariantType.Variant);
string? value = null;
if (expression.Value != null)
{
case NubTypeEnumVariant enumVariantType:
{
var name = TmpName();
scopes.Peek().DeconstructableNames.Add((name, expression.Type));
if (!moduleGraph.TryResolveType(enumVariantType.EnumType.Module, enumVariantType.EnumType.Name, true, out var info))
throw new UnreachableException();
var enumInfo = (Module.TypeInfoEnum)info;
var tag = enumInfo.Variants.ToList().FindIndex(x => x.Name == enumVariantType.Variant);
var value = EmitExpression(expression.Value);
EmitCopyConstructor(value, expression.Value.Type);
writer.WriteLine($"{CType(expression.Type, name)} = ({CType(expression.Type)}){{ .tag = {tag}, .{enumVariantType.Variant} = {value} }};");
return name;
}
case NubTypeStruct structType:
{
return EmitExpression(expression.Value);
}
default:
throw new UnreachableException();
value = EmitExpression(expression.Value);
EmitCopyConstructor(value, expression.Value.Type);
}
writer.Write($"{CType(expression.Type, name)} = ({CType(expression.Type)}){{ .tag = {tag}");
if (value != null)
writer.WriteLine($", .{enumVariantType.Variant} = {value} }};");
else
writer.WriteLine(" }};");
return name;
}
private string EmitExpressionMemberAccess(TypedNodeExpressionStructMemberAccess expression)