std: in fmt, use tag names of non-exhaustive enums when available

This commit is contained in:
daurnimator 2020-03-10 23:36:48 +11:00 committed by Andrew Kelley
parent 292d515e91
commit 5cdeac3b0e

View File

@ -364,8 +364,14 @@ pub fn formatType(
if (enumInfo.is_exhaustive) {
has_name = true;
} else {
// TODO: when @tagName works on exhaustive enums print known enum strings
has_name = false;
// Use @tagName only if value is one of known fields
inline for (enumInfo.fields) |enumField| {
if (@enumToInt(value) == enumField.value) {
has_name = true;
break;
}
}
}
var use_name = has_name;
@ -1335,8 +1341,8 @@ test "non-exhaustive enum" {
Two = 0xbeef,
_,
};
try testFmt("enum: Enum(15)\n", "enum: {}\n", .{Enum.One});
try testFmt("enum: Enum(48879)\n", "enum: {}\n", .{Enum.Two});
try testFmt("enum: Enum.One\n", "enum: {}\n", .{Enum.One});
try testFmt("enum: Enum.Two\n", "enum: {}\n", .{Enum.Two});
try testFmt("enum: Enum(4660)\n", "enum: {}\n", .{@intToEnum(Enum, 0x1234)});
try testFmt("enum: Enum(f)\n", "enum: {x}\n", .{Enum.One});
try testFmt("enum: Enum(beef)\n", "enum: {x}\n", .{Enum.Two});