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