aboutsummaryrefslogtreecommitdiff
path: root/src/type.zig
diff options
context:
space:
mode:
authorRobin Voetter <robin@voetter.nl>2021-12-17 04:39:09 +0100
committerRobin Voetter <robin@voetter.nl>2021-12-21 01:41:50 +0100
commit9d6c45f6979543607a7064be7155afa409be956a (patch)
treec92d89093e998cdca6fbe3c546e290ea00248366 /src/type.zig
parenta2958a4ede0af4b4559eeb142c0400ae640db63e (diff)
downloadzig-9d6c45f6979543607a7064be7155afa409be956a.tar.gz
zig-9d6c45f6979543607a7064be7155afa409be956a.zip
stage2: inferred error set coercion
Diffstat (limited to 'src/type.zig')
-rw-r--r--src/type.zig31
1 files changed, 30 insertions, 1 deletions
diff --git a/src/type.zig b/src/type.zig
index 3360477a03..a81bd3ed32 100644
--- a/src/type.zig
+++ b/src/type.zig
@@ -1203,7 +1203,7 @@ pub const Type = extern union {
return writer.writeAll(std.mem.sliceTo(error_set.owner_decl.name, 0));
},
.error_set_inferred => {
- const func = ty.castTag(.error_set_inferred).?.data;
+ const func = ty.castTag(.error_set_inferred).?.data.func;
return writer.print("(inferred error set of {s})", .{func.owner_decl.name});
},
.error_set_merged => {
@@ -2874,6 +2874,35 @@ pub const Type = extern union {
};
}
+ /// Returns whether ty, which must be an error set, includes an error `name`.
+ /// Might return a false negative if `ty` is an inferred error set and not fully
+ /// resolved yet.
+ pub fn errorSetHasField(ty: Type, name: []const u8) bool {
+ if (ty.isAnyError()) {
+ return true;
+ }
+
+ switch (ty.tag()) {
+ .error_set_single => {
+ const data = ty.castTag(.error_set_single).?.data;
+ return std.mem.eql(u8, data, name);
+ },
+ .error_set_inferred => {
+ const data = ty.castTag(.error_set_inferred).?.data;
+ return data.errors.contains(name);
+ },
+ .error_set_merged => {
+ const data = ty.castTag(.error_set_merged).?.data;
+ return data.contains(name);
+ },
+ .error_set => {
+ const data = ty.castTag(.error_set).?.data;
+ return data.names.contains(name);
+ },
+ else => unreachable,
+ }
+ }
+
/// Asserts the type is an array or vector.
pub fn arrayLen(ty: Type) u64 {
return switch (ty.tag()) {