authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-10-03 12:49:57-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-10-03 12:49:57-07:00
log86c265aec8b9cdca0e78bfb02d7442e79c0be5a9
treea2c606991de931f0f74f0a2ce87ca51cd1dc08a3
parentc4df9bf56f204f63f4e87255933ba453d69d0182

stage2: Type: fix eql impl for error unions

Also implement renderFullyQualifiedName.

1 files changed, 80 insertions(+), 3 deletions(-)

src/type.zig+80-3
...@@ -580,9 +580,15 @@ pub const Type = extern union {...@@ -580,9 +580,15 @@ pub const Type = extern union {
580 return a.tag() == b.tag();580 return a.tag() == b.tag();
581 },581 },
582 .ErrorUnion => {582 .ErrorUnion => {
583 const a_data = a.castTag(.error_union).?.data;583 const a_set = a.errorUnionSet();
584 const b_data = b.castTag(.error_union).?.data;584 const b_set = b.errorUnionSet();
585 return a_data.error_set.eql(b_data.error_set) and a_data.payload.eql(b_data.payload);585 if (!a_set.eql(b_set)) return false;
586
587 const a_payload = a.errorUnionPayload();
588 const b_payload = b.errorUnionPayload();
589 if (!a_payload.eql(b_payload)) return false;
590
591 return true;
586 },592 },
587 .ErrorSet => {593 .ErrorSet => {
588 if (a.tag() == .anyerror and b.tag() == .anyerror) {594 if (a.tag() == .anyerror and b.tag() == .anyerror) {
...@@ -890,6 +896,77 @@ pub const Type = extern union {...@@ -890,6 +896,77 @@ pub const Type = extern union {
890 return Type{ .ptr_otherwise = &new_payload.base };896 return Type{ .ptr_otherwise = &new_payload.base };
891 }897 }
892898
899 pub fn renderFullyQualifiedName(ty: Type, writer: anytype) !void {
900 const t = ty.tag();
901 switch (t) {
902 .u1,
903 .u8,
904 .i8,
905 .u16,
906 .i16,
907 .u32,
908 .i32,
909 .u64,
910 .i64,
911 .u128,
912 .i128,
913 .usize,
914 .isize,
915 .c_short,
916 .c_ushort,
917 .c_int,
918 .c_uint,
919 .c_long,
920 .c_ulong,
921 .c_longlong,
922 .c_ulonglong,
923 .c_longdouble,
924 .c_void,
925 .f16,
926 .f32,
927 .f64,
928 .f128,
929 .bool,
930 .void,
931 .type,
932 .anyerror,
933 .@"anyframe",
934 .comptime_int,
935 .comptime_float,
936 .noreturn,
937 .var_args_param,
938 .bound_fn,
939 => return writer.writeAll(@tagName(t)),
940
941 .enum_literal => return writer.writeAll("@Type(.EnumLiteral)"),
942 .@"null" => return writer.writeAll("@Type(.Null)"),
943 .@"undefined" => return writer.writeAll("@Type(.Undefined)"),
944
945 .@"struct" => {
946 const struct_obj = ty.castTag(.@"struct").?.data;
947 return struct_obj.owner_decl.renderFullyQualifiedName(writer);
948 },
949 .@"union", .union_tagged => {
950 const union_obj = ty.cast(Payload.Union).?.data;
951 return union_obj.owner_decl.renderFullyQualifiedName(writer);
952 },
953 .enum_full, .enum_nonexhaustive => {
954 const enum_full = ty.cast(Payload.EnumFull).?.data;
955 return enum_full.owner_decl.renderFullyQualifiedName(writer);
956 },
957 .enum_simple => {
958 const enum_simple = ty.castTag(.enum_simple).?.data;
959 return enum_simple.owner_decl.renderFullyQualifiedName(writer);
960 },
961 .enum_numbered => {
962 const enum_numbered = ty.castTag(.enum_numbered).?.data;
963 return enum_numbered.owner_decl.renderFullyQualifiedName(writer);
964 },
965 .@"opaque" => @panic("TODO"),
966 else => unreachable,
967 }
968 }
969
893 pub fn format(970 pub fn format(
894 start_type: Type,971 start_type: Type,
895 comptime fmt: []const u8,972 comptime fmt: []const u8,