Merge branch 'daurnimator-pretty-print-non-exhaustive-enums'

closes #4693
master
Andrew Kelley 2020-05-26 12:15:37 -04:00
commit 57b78fff73
1 changed files with 21 additions and 9 deletions

View File

@ -362,12 +362,21 @@ pub fn formatType(
if (enumInfo.is_exhaustive) {
try out_stream.writeAll(".");
try out_stream.writeAll(@tagName(value));
} else {
// TODO: when @tagName works on exhaustive enums print known enum strings
try out_stream.writeAll("(");
try formatType(@enumToInt(value), fmt, options, out_stream, max_depth);
try out_stream.writeAll(")");
return;
}
// Use @tagName only if value is one of known fields
inline for (enumInfo.fields) |enumField| {
if (@enumToInt(value) == enumField.value) {
try out_stream.writeAll(".");
try out_stream.writeAll(@tagName(value));
return;
}
}
try out_stream.writeAll("(");
try formatType(@enumToInt(value), fmt, options, out_stream, max_depth);
try out_stream.writeAll(")");
},
.Union => {
try out_stream.writeAll(@typeName(T));
@ -1308,6 +1317,8 @@ test "enum" {
const value = Enum.Two;
try testFmt("enum: Enum.Two\n", "enum: {}\n", .{value});
try testFmt("enum: Enum.Two\n", "enum: {}\n", .{&value});
try testFmt("enum: Enum.One\n", "enum: {x}\n", .{Enum.One});
try testFmt("enum: Enum.Two\n", "enum: {X}\n", .{Enum.Two});
}
test "non-exhaustive enum" {
@ -1316,11 +1327,12 @@ 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});
try testFmt("enum: Enum.One\n", "enum: {x}\n", .{Enum.One});
try testFmt("enum: Enum.Two\n", "enum: {x}\n", .{Enum.Two});
try testFmt("enum: Enum.Two\n", "enum: {X}\n", .{Enum.Two});
try testFmt("enum: Enum(1234)\n", "enum: {x}\n", .{@intToEnum(Enum, 0x1234)});
}