From 5cdeac3b0eaf61bc07e45012d9c335a74f437276 Mon Sep 17 00:00:00 2001 From: daurnimator Date: Tue, 10 Mar 2020 23:36:48 +1100 Subject: [PATCH] std: in fmt, use tag names of non-exhaustive enums when available --- lib/std/fmt.zig | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/std/fmt.zig b/lib/std/fmt.zig index 28c90b06ec..a112528ab8 100644 --- a/lib/std/fmt.zig +++ b/lib/std/fmt.zig @@ -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});