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...@@ -7790,6 +7790,15 @@ fn zirHasField(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
7790 if (mem.eql(u8, field_name, "len")) break :hf true;7790 if (mem.eql(u8, field_name, "len")) break :hf true;
7791 break :hf false;7791 break :hf false;
7792 }7792 }
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 }
7793 break :hf switch (ty.zigTypeTag()) {7802 break :hf switch (ty.zigTypeTag()) {
7794 .Struct => ty.structFields().contains(field_name),7803 .Struct => ty.structFields().contains(field_name),
7795 .Union => ty.unionFields().contains(field_name),7804 .Union => ty.unionFields().contains(field_name),
test/behavior/hasfield.zig+12
...@@ -34,4 +34,16 @@ test "@hasField" {...@@ -34,4 +34,16 @@ test "@hasField" {
34 try expect(@hasField(enm, "b") == true);34 try expect(@hasField(enm, "b") == true);
35 try expect(@hasField(enm, "non-existant") == false);35 try expect(@hasField(enm, "non-existant") == false);
36 try expect(@hasField(enm, "nope") == false);36 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);
37}49}