aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig30
1 files changed, 23 insertions, 7 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 42d5e96d3d..4f558ccae4 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -21394,14 +21394,30 @@ fn fieldCallBind(
switch (concrete_ty.zigTypeTag()) {
.Struct => {
const struct_ty = try sema.resolveTypeFields(block, src, concrete_ty);
- const struct_obj = struct_ty.castTag(.@"struct").?.data;
-
- const field_index_usize = struct_obj.fields.getIndex(field_name) orelse
- break :find_field;
- const field_index = @intCast(u32, field_index_usize);
- const field = struct_obj.fields.values()[field_index];
+ if (struct_ty.castTag(.@"struct")) |struct_obj| {
+ const field_index_usize = struct_obj.data.fields.getIndex(field_name) orelse
+ break :find_field;
+ const field_index = @intCast(u32, field_index_usize);
+ const field = struct_obj.data.fields.values()[field_index];
- return finishFieldCallBind(sema, block, src, ptr_ty, field.ty, field_index, object_ptr);
+ return finishFieldCallBind(sema, block, src, ptr_ty, field.ty, field_index, object_ptr);
+ } else if (struct_ty.isTuple()) {
+ if (mem.eql(u8, field_name, "len")) {
+ return sema.addIntUnsigned(Type.usize, struct_ty.structFieldCount());
+ }
+ if (std.fmt.parseUnsigned(u32, field_name, 10)) |field_index| {
+ if (field_index >= struct_ty.structFieldCount()) break :find_field;
+ return finishFieldCallBind(sema, block, src, ptr_ty, struct_ty.structFieldType(field_index), field_index, object_ptr);
+ } else |_| {}
+ } else {
+ const max = struct_ty.structFieldCount();
+ var i: u32 = 0;
+ while (i < max) : (i += 1) {
+ if (mem.eql(u8, struct_ty.structFieldName(i), field_name)) {
+ return finishFieldCallBind(sema, block, src, ptr_ty, struct_ty.structFieldType(i), i, object_ptr);
+ }
+ }
+ }
},
.Union => {
const union_ty = try sema.resolveTypeFields(block, src, concrete_ty);