authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-03-11 15:01:51-05:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2022-03-11 15:01:51-05:00
log79b169c5a564978dbbbb6253f847c2d9b1734e22
tree5e80c067eedc2941d8a30d62706a11e150f728c1
parent86a98b172be5060110efdd9c61415c841042564e
parenta2517117e7cffcc4be21e944f2b4f8661c8f15a3
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #11122 from mitchellh/anon-has-field

stage2: @hasField for anon structs

2 files changed, 21 insertions(+), 0 deletions(-)

src/Sema.zig+9
......@@ -7790,6 +7790,15 @@ fn zirHasField(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
77907790 if (mem.eql(u8, field_name, "len")) break :hf true;
77917791 break :hf false;
77927792 }
7793 if (ty.castTag(.anon_struct)) |pl| {
7794 break :hf for (pl.data.names) |name| {
7795 if (mem.eql(u8, name, field_name)) break true;
7796 } else false;
7797 }
7798 if (ty.isTuple()) {
7799 const field_index = std.fmt.parseUnsigned(u32, field_name, 10) catch break :hf false;
7800 break :hf field_index < ty.structFieldCount();
7801 }
77937802 break :hf switch (ty.zigTypeTag()) {
77947803 .Struct => ty.structFields().contains(field_name),
77957804 .Union => ty.unionFields().contains(field_name),
test/behavior/hasfield.zig+12
......@@ -34,4 +34,16 @@ test "@hasField" {
3434 try expect(@hasField(enm, "b") == true);
3535 try expect(@hasField(enm, "non-existant") == false);
3636 try expect(@hasField(enm, "nope") == false);
37
38 const anon = @TypeOf(.{ .a = 1 });
39 try expect(@hasField(anon, "a") == true);
40 try expect(@hasField(anon, "b") == false);
41
42 const tuple = @TypeOf(.{ 1, 2 });
43 try expect(@hasField(tuple, "a") == false);
44 try expect(@hasField(tuple, "b") == false);
45 try expect(@hasField(tuple, "0") == true);
46 try expect(@hasField(tuple, "1") == true);
47 try expect(@hasField(tuple, "2") == false);
48 try expect(@hasField(tuple, "9999999999999999999999999") == false);
3749}