lxdrgen-swift: fix warnings with exhaustive unions

This commit is contained in:
Přemysl Eric Janouch 2023-07-06 06:38:25 +02:00
parent 53197b51e5
commit be9a3e693e
Signed by: p
GPG Key ID: A0420B94F92B9493
6 changed files with 23 additions and 12 deletions

View File

@ -20,4 +20,9 @@ struct Struct {
case NOTHING:
void;
} u<>;
union Onion switch (Enum tag) {
case NOTHING:
void;
} o;
};

View File

@ -259,7 +259,7 @@ function codegen_union_struct( \
"\t\tbreak;\n")
}
function codegen_union(name, cg, f, ctype, funcname) {
function codegen_union(name, cg, exhaustive, f, ctype, funcname) {
ctype = "union " PrefixLower cameltosnake(name)
print ""
print ctype " {"

View File

@ -467,7 +467,7 @@ function codegen_union_struct(name, casename, cg, scg, structname, init) {
"\t\tu.Interface = &s\n")
}
function codegen_union(name, cg, gotype, tagvar) {
function codegen_union(name, cg, exhaustive, gotype, tagvar) {
gotype = PrefixCamel name
print "type " gotype " struct {"
print "\tInterface any"

View File

@ -208,7 +208,7 @@ function codegen_union_struct(name, casename, cg, scg, structname) {
"\t}\n")
}
function codegen_union(name, cg, tagvar) {
function codegen_union(name, cg, exhaustive, tagvar) {
tagvar = cg["tagname"]
print ""

View File

@ -246,7 +246,7 @@ function codegen_union_struct(name, casename, cg, scg, swifttype) {
delete scg[i]
}
function codegen_union(name, cg, swifttype, init) {
function codegen_union(name, cg, exhaustive, swifttype, init) {
# Classes don't have automatic member-wise initializers,
# thus using structs and protocols.
swifttype = PrefixCamel name
@ -255,6 +255,10 @@ function codegen_union(name, cg, swifttype, init) {
print "\tvar " cg["tagname"] ": " CodegenSwiftType[cg["tagtype"]] " { get }"
print "}"
if (!exhaustive)
append(cg, "cases", "\tdefault:\n" \
"\t\tthrow RelayReader.ReadError.unexpectedValue\n")
init = decapitalize(swifttype)
print ""
print "public func " init \
@ -262,11 +266,7 @@ function codegen_union(name, cg, swifttype, init) {
print "\tlet " cg["tagname"] ": " CodegenSwiftType[cg["tagtype"]] \
" = try from.read()"
print "\tswitch " cg["tagname"] " {"
# TODO: Only generate the default if there are remaining values,
# so that swiftc doesn't produce warnings.
print cg["cases"] "\tdefault:"
print "\t\tthrow RelayReader.ReadError.unexpectedValue"
print"\t}"
print cg["cases"] "\t}"
print "}"
CodegenSwiftType[name] = swifttype

View File

@ -217,7 +217,8 @@ function defstruct( name, d, cg) {
return name
}
function defunion( name, tag, tagtype, tagvalue, cg, scg, d, a, i, unseen) {
function defunion( name, tag, tagtype, tagvalue, cg, scg, d, a, i,
unseen, exhaustive) {
delete cg[0]
delete scg[0]
delete d[0]
@ -258,9 +259,14 @@ function defunion( name, tag, tagtype, tagvalue, cg, scg, d, a, i, unseen) {
if (tagvalue)
codegen_union_struct(name, tagvalue, cg, scg)
# What remains non-zero in unseen[2..] is simply not recognized/allowed.
# Unseen cases are simply not recognized/allowed.
exhaustive = 1
for (i in unseen)
if (i && unseen[i])
exhaustive = 0
Types[name] = "union"
codegen_union(name, cg)
codegen_union(name, cg, exhaustive)
return name
}