@zigc/lib 0.17.0-dev.633 → 0.17.0-dev.657

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/compiler/Maker/PkgConfig.zig +1 -0
  2. package/compiler/Maker/ScannedConfig.zig +4 -3
  3. package/compiler/Maker/Step/Compile.zig +1 -3
  4. package/compiler/Maker/Step/FindProgram.zig +2 -2
  5. package/compiler/Maker/Step/Run.zig +18 -3
  6. package/compiler/Maker/Step/TranslateC.zig +5 -4
  7. package/compiler/Maker/Watch/FsEvents.zig +3 -2
  8. package/compiler/aro/aro/Attribute.zig +52 -51
  9. package/compiler/aro/aro/Compilation.zig +5 -5
  10. package/compiler/aro/aro/Diagnostics.zig +7 -7
  11. package/compiler/aro/aro/Parser.zig +2 -2
  12. package/compiler/aro/aro/Tree.zig +11 -11
  13. package/compiler/aro/aro/features.zig +4 -4
  14. package/compiler/aro/aro/text_literal.zig +2 -2
  15. package/compiler/aro/backend/Interner.zig +14 -13
  16. package/compiler/configurer.zig +2 -2
  17. package/compiler/resinator/bmp.zig +3 -2
  18. package/compiler/resinator/code_pages.zig +14 -12
  19. package/compiler/resinator/cvtres.zig +11 -10
  20. package/compiler/resinator/errors.zig +18 -22
  21. package/compiler/resinator/lang.zig +7 -7
  22. package/compiler/resinator/parse.zig +1 -1
  23. package/compiler/translate-c/ast.zig +6 -6
  24. package/docs/wasm/markdown/Document.zig +3 -3
  25. package/docs/wasm/markdown/Parser.zig +3 -3
  26. package/package.json +1 -1
  27. package/std/Build/Cache.zig +2 -2
  28. package/std/Build/Configuration.zig +88 -37
  29. package/std/Build/Step/ConfigHeader.zig +3 -2
  30. package/std/Build/Step/Options.zig +28 -22
  31. package/std/Build.zig +85 -56
  32. package/std/Io/Kqueue.zig +2 -2
  33. package/std/Io/Reader.zig +1 -1
  34. package/std/Io/Threaded.zig +18 -15
  35. package/std/Io/Uring.zig +4 -2
  36. package/std/Io/Writer.zig +18 -18
  37. package/std/Io/net.zig +3 -1
  38. package/std/Io.zig +7 -6
  39. package/std/Progress.zig +2 -2
  40. package/std/Target/aarch64.zig +2 -2
  41. package/std/Target/alpha.zig +2 -2
  42. package/std/Target/amdgcn.zig +2 -2
  43. package/std/Target/arc.zig +2 -2
  44. package/std/Target/arm.zig +2 -2
  45. package/std/Target/avr.zig +2 -2
  46. package/std/Target/bpf.zig +2 -2
  47. package/std/Target/csky.zig +2 -2
  48. package/std/Target/hexagon.zig +2 -2
  49. package/std/Target/hppa.zig +2 -2
  50. package/std/Target/kvx.zig +2 -2
  51. package/std/Target/lanai.zig +2 -2
  52. package/std/Target/loongarch.zig +2 -2
  53. package/std/Target/m68k.zig +2 -2
  54. package/std/Target/mips.zig +2 -2
  55. package/std/Target/msp430.zig +2 -2
  56. package/std/Target/nvptx.zig +2 -2
  57. package/std/Target/powerpc.zig +2 -2
  58. package/std/Target/propeller.zig +2 -2
  59. package/std/Target/riscv.zig +2 -2
  60. package/std/Target/s390x.zig +2 -2
  61. package/std/Target/sparc.zig +2 -2
  62. package/std/Target/spirv.zig +2 -2
  63. package/std/Target/ve.zig +2 -2
  64. package/std/Target/wasm.zig +2 -2
  65. package/std/Target/x86.zig +2 -2
  66. package/std/Target/xcore.zig +2 -2
  67. package/std/Target/xtensa.zig +2 -2
  68. package/std/Target.zig +4 -4
  69. package/std/c/darwin.zig +1 -1
  70. package/std/coff.zig +1 -1
  71. package/std/crypto/codecs/asn1/Oid.zig +8 -8
  72. package/std/crypto/codecs/asn1/der/Decoder.zig +7 -7
  73. package/std/crypto/codecs/asn1/der/Encoder.zig +10 -8
  74. package/std/crypto/phc_encoding.zig +23 -20
  75. package/std/crypto/timing_safe.zig +1 -1
  76. package/std/crypto/tls/Client.zig +3 -3
  77. package/std/crypto/tls.zig +1 -1
  78. package/std/debug/Dwarf/Unwind/VirtualMachine.zig +11 -5
  79. package/std/debug/ElfFile.zig +12 -8
  80. package/std/debug/MachOFile.zig +2 -2
  81. package/std/debug/SelfInfo/MachO.zig +2 -2
  82. package/std/debug/SelfInfo/Windows.zig +2 -2
  83. package/std/elf.zig +7 -7
  84. package/std/enums.zig +66 -67
  85. package/std/gpu.zig +1 -1
  86. package/std/hash/auto_hash.zig +8 -8
  87. package/std/hash/verify.zig +3 -3
  88. package/std/http/Client.zig +2 -2
  89. package/std/json/Stringify.zig +14 -14
  90. package/std/json/static.zig +47 -31
  91. package/std/lang.zig +65 -97
  92. package/std/math.zig +2 -2
  93. package/std/mem/Allocator.zig +9 -9
  94. package/std/mem.zig +86 -102
  95. package/std/meta/trailer_flags.zig +26 -19
  96. package/std/meta.zig +131 -171
  97. package/std/multi_array_list.zig +49 -57
  98. package/std/os/uefi/protocol/device_path.zig +8 -7
  99. package/std/os/uefi/tables/boot_services.zig +1 -1
  100. package/std/os/windows.zig +9 -15
  101. package/std/start.zig +6 -6
  102. package/std/testing/Smith.zig +35 -21
  103. package/std/testing.zig +15 -15
  104. package/std/zig/Ast.zig +4 -4
  105. package/std/zig/AstGen.zig +42 -42
  106. package/std/zig/ErrorBundle.zig +16 -13
  107. package/std/zig/LibCInstallation.zig +11 -11
  108. package/std/zig/Parse.zig +6 -6
  109. package/std/zig/Zir.zig +10 -10
  110. package/std/zig/c_translation/helpers.zig +2 -2
  111. package/std/zig/llvm/BitcodeReader.zig +3 -3
  112. package/std/zig/llvm/Builder.zig +124 -93
  113. package/std/zig/llvm/bitcode_writer.zig +4 -4
  114. package/std/zig/system/windows.zig +11 -11
  115. package/std/zig/system.zig +4 -4
  116. package/std/zig.zig +4 -4
  117. package/std/zon/Serializer.zig +28 -23
  118. package/std/zon/parse.zig +58 -61
@@ -165,7 +165,7 @@ pub fn valueArbitraryDepth(self: *Serializer, val: anytype, options: ValueOption
165
165
  },
166
166
  .@"struct" => |@"struct"| if (@"struct".is_tuple) {
167
167
  var container = try self.beginTuple(
168
- .{ .whitespace_style = .{ .fields = @"struct".fields.len } },
168
+ .{ .whitespace_style = .{ .fields = @"struct".field_names.len } },
169
169
  );
170
170
  inline for (val) |field_value| {
171
171
  try container.fieldArbitraryDepth(field_value, options);
@@ -173,15 +173,20 @@ pub fn valueArbitraryDepth(self: *Serializer, val: anytype, options: ValueOption
173
173
  try container.end();
174
174
  } else {
175
175
  // Decide which fields to emit
176
- const fields, const skipped: [@"struct".fields.len]bool = if (options.emit_default_optional_fields) b: {
177
- break :b .{ @"struct".fields.len, @splat(false) };
176
+ const fields, const skipped: [@"struct".field_names.len]bool = if (options.emit_default_optional_fields) b: {
177
+ break :b .{ @"struct".field_names.len, @splat(false) };
178
178
  } else b: {
179
- var fields = @"struct".fields.len;
180
- var skipped: [@"struct".fields.len]bool = @splat(false);
181
- inline for (@"struct".fields, &skipped) |field_info, *skip| {
182
- if (field_info.default_value_ptr) |ptr| {
183
- const default: *const field_info.type = @ptrCast(@alignCast(ptr));
184
- const field_value = @field(val, field_info.name);
179
+ var fields = @"struct".field_names.len;
180
+ var skipped: [@"struct".field_names.len]bool = @splat(false);
181
+ inline for (
182
+ @"struct".field_names,
183
+ @"struct".field_types,
184
+ @"struct".field_attrs,
185
+ &skipped,
186
+ ) |field_name, field_type, field_attrs, *skip| {
187
+ if (field_attrs.default_value_ptr) |ptr| {
188
+ const default: *const field_type = @ptrCast(@alignCast(ptr));
189
+ const field_value = @field(val, field_name);
185
190
  if (std.meta.eql(field_value, default.*)) {
186
191
  skip.* = true;
187
192
  fields -= 1;
@@ -195,11 +200,11 @@ pub fn valueArbitraryDepth(self: *Serializer, val: anytype, options: ValueOption
195
200
  var container = try self.beginStruct(
196
201
  .{ .whitespace_style = .{ .fields = fields } },
197
202
  );
198
- inline for (@"struct".fields, skipped) |field_info, skip| {
203
+ inline for (@"struct".field_names, skipped) |field_name, skip| {
199
204
  if (!skip) {
200
205
  try container.fieldArbitraryDepth(
201
- field_info.name,
202
- @field(val, field_info.name),
206
+ field_name,
207
+ @field(val, field_name),
203
208
  options,
204
209
  );
205
210
  }
@@ -713,11 +718,11 @@ fn typeIsRecursiveInner(comptime T: type, comptime prev_visited: []const type) b
713
718
  .optional => |optional| typeIsRecursiveInner(optional.child, visited),
714
719
  .array => |array| typeIsRecursiveInner(array.child, visited),
715
720
  .vector => |vector| typeIsRecursiveInner(vector.child, visited),
716
- .@"struct" => |@"struct"| for (@"struct".fields) |field| {
717
- if (typeIsRecursiveInner(field.type, visited)) break true;
721
+ .@"struct" => |@"struct"| for (@"struct".field_types) |field_type| {
722
+ if (typeIsRecursiveInner(field_type, visited)) break true;
718
723
  } else false,
719
- .@"union" => |@"union"| inline for (@"union".fields) |field| {
720
- if (typeIsRecursiveInner(field.type, visited)) break true;
724
+ .@"union" => |@"union"| inline for (@"union".field_types) |field_type| {
725
+ if (typeIsRecursiveInner(field_type, visited)) break true;
721
726
  } else false,
722
727
  else => false,
723
728
  };
@@ -761,8 +766,8 @@ fn checkValueDepth(val: anytype, depth: usize) error{ExceededMaxDepth}!void {
761
766
  .array => for (val) |item| {
762
767
  try checkValueDepth(item, child_depth);
763
768
  },
764
- .@"struct" => |@"struct"| inline for (@"struct".fields) |field_info| {
765
- try checkValueDepth(@field(val, field_info.name), child_depth);
769
+ .@"struct" => |@"struct"| inline for (@"struct".field_names) |field_name| {
770
+ try checkValueDepth(@field(val, field_name), child_depth);
766
771
  },
767
772
  .@"union" => |@"union"| if (@"union".tag_type == null) {
768
773
  return;
@@ -851,7 +856,7 @@ fn canSerializeTypeInner(
851
856
  .@"opaque",
852
857
  => false,
853
858
 
854
- .@"enum" => |@"enum"| @"enum".is_exhaustive,
859
+ .@"enum" => |@"enum"| @"enum".mode == .exhaustive,
855
860
 
856
861
  .pointer => |pointer| switch (pointer.size) {
857
862
  .one => canSerializeTypeInner(pointer.child, visited, parent_is_optional),
@@ -870,8 +875,8 @@ fn canSerializeTypeInner(
870
875
  .@"struct" => |@"struct"| {
871
876
  for (visited) |V| if (T == V) return true;
872
877
  const new_visited = visited ++ .{T};
873
- for (@"struct".fields) |field| {
874
- if (!canSerializeTypeInner(field.type, new_visited, false)) return false;
878
+ for (@"struct".field_types) |field_type| {
879
+ if (!canSerializeTypeInner(field_type, new_visited, false)) return false;
875
880
  }
876
881
  return true;
877
882
  },
@@ -879,8 +884,8 @@ fn canSerializeTypeInner(
879
884
  for (visited) |V| if (T == V) return true;
880
885
  const new_visited = visited ++ .{T};
881
886
  if (@"union".tag_type == null) return false;
882
- for (@"union".fields) |field| {
883
- if (field.type != void and !canSerializeTypeInner(field.type, new_visited, false)) {
887
+ for (@"union".field_types) |field_type| {
888
+ if (field_type != void and !canSerializeTypeInner(field_type, new_visited, false)) {
884
889
  return false;
885
890
  }
886
891
  }
package/std/zon/parse.zig CHANGED
@@ -437,8 +437,8 @@ pub fn free(gpa: Allocator, value: anytype) void {
437
437
  const array: [vector.len]vector.child = value;
438
438
  freeArray(gpa, @TypeOf(array), &array);
439
439
  },
440
- .@"struct" => |@"struct"| inline for (@"struct".fields) |field| {
441
- free(gpa, @field(value, field.name));
440
+ .@"struct" => |@"struct"| inline for (@"struct".field_names) |field_name| {
441
+ free(gpa, @field(value, field_name));
442
442
  },
443
443
  .@"union" => |@"union"| if (@"union".tag_type == null) {
444
444
  if (comptime requiresAllocator(Value)) unreachable;
@@ -464,13 +464,13 @@ fn requiresAllocator(T: type) bool {
464
464
  return switch (@typeInfo(T)) {
465
465
  .pointer => true,
466
466
  .array => |array| return array.len > 0 and requiresAllocator(array.child),
467
- .@"struct" => |@"struct"| inline for (@"struct".fields) |field| {
468
- if (requiresAllocator(field.type)) {
467
+ .@"struct" => |@"struct"| inline for (@"struct".field_types) |field_type| {
468
+ if (requiresAllocator(field_type)) {
469
469
  break true;
470
470
  }
471
471
  } else false,
472
- .@"union" => |@"union"| inline for (@"union".fields) |field| {
473
- if (requiresAllocator(field.type)) {
472
+ .@"union" => |@"union"| inline for (@"union".field_types) |field_type| {
473
+ if (requiresAllocator(field_type)) {
474
474
  break true;
475
475
  }
476
476
  } else false,
@@ -589,9 +589,9 @@ const Parser = struct {
589
589
  .one => return self.failExpectedTypeInner(pointer.child, opt, node),
590
590
  .slice => {
591
591
  if (pointer.child == u8 and
592
- pointer.is_const and
592
+ pointer.attrs.@"const" and
593
593
  (pointer.sentinel() == null or pointer.sentinel() == 0) and
594
- (pointer.alignment == null or pointer.alignment == 1))
594
+ (pointer.attrs.@"align" == null or pointer.attrs.@"align" == 1))
595
595
  {
596
596
  if (opt) {
597
597
  return self.failNode(node, "expected optional string");
@@ -669,10 +669,10 @@ const Parser = struct {
669
669
  switch (node.get(self.zoir)) {
670
670
  .enum_literal => |field_name| {
671
671
  // Create a comptime string map for the enum fields
672
- const enum_fields = @typeInfo(T).@"enum".fields;
673
- comptime var kvs_list: [enum_fields.len]struct { []const u8, T } = undefined;
674
- inline for (enum_fields, 0..) |field, i| {
675
- kvs_list[i] = .{ field.name, @enumFromInt(field.value) };
672
+ const enum_info = @typeInfo(T).@"enum";
673
+ comptime var kvs_list: [enum_info.field_names.len]struct { []const u8, T } = undefined;
674
+ inline for (enum_info.field_names, enum_info.field_values, 0..) |enum_field_name, enum_field_value, i| {
675
+ kvs_list[i] = .{ enum_field_name, @enumFromInt(enum_field_value) };
676
676
  }
677
677
  const enum_tags = std.StaticStringMap(T).initComptime(kvs_list);
678
678
 
@@ -715,9 +715,9 @@ const Parser = struct {
715
715
 
716
716
  if (pointer.child != u8 or
717
717
  pointer.size != .slice or
718
- !pointer.is_const or
718
+ !pointer.attrs.@"const" or
719
719
  (pointer.sentinel() != null and pointer.sentinel() != 0) or
720
- (pointer.alignment != null and pointer.alignment != 1))
720
+ (pointer.attrs.@"align" != null and pointer.attrs.@"align" != 1))
721
721
  {
722
722
  return error.WrongType;
723
723
  }
@@ -742,7 +742,7 @@ const Parser = struct {
742
742
  const slice = try self.gpa.allocWithOptions(
743
743
  pointer.child,
744
744
  nodes.len,
745
- .fromByteUnitsOptional(pointer.alignment),
745
+ .fromByteUnitsOptional(pointer.attrs.@"align"),
746
746
  pointer.sentinel(),
747
747
  );
748
748
  errdefer self.gpa.free(slice);
@@ -808,30 +808,30 @@ const Parser = struct {
808
808
  else => return error.WrongType,
809
809
  };
810
810
 
811
- const field_infos = @typeInfo(T).@"struct".fields;
811
+ const info = @typeInfo(T).@"struct";
812
812
 
813
813
  // Build a map from field name to index.
814
814
  // The special value `comptime_field` indicates that this is actually a comptime field.
815
815
  const comptime_field = std.math.maxInt(usize);
816
816
  const field_indices: std.StaticStringMap(usize) = comptime b: {
817
- var kvs_list: [field_infos.len]struct { []const u8, usize } = undefined;
818
- for (&kvs_list, field_infos, 0..) |*kv, field, i| {
819
- kv.* = .{ field.name, if (field.is_comptime) comptime_field else i };
817
+ var kvs_list: [info.field_names.len]struct { []const u8, usize } = undefined;
818
+ for (&kvs_list, info.field_names, info.field_attrs, 0..) |*kv, field_name, field_attrs, i| {
819
+ kv.* = .{ field_name, if (field_attrs.@"comptime") comptime_field else i };
820
820
  }
821
821
  break :b .initComptime(kvs_list);
822
822
  };
823
823
 
824
824
  // Parse the struct
825
825
  var result: T = undefined;
826
- var field_found: [field_infos.len]bool = @splat(false);
826
+ var field_found: [info.field_names.len]bool = @splat(false);
827
827
 
828
828
  // If we fail partway through, free all already initialized fields
829
829
  var initialized: usize = 0;
830
- errdefer if (self.options.free_on_error and field_infos.len > 0) {
830
+ errdefer if (self.options.free_on_error and info.field_names.len > 0) {
831
831
  for (fields.names[0..initialized]) |name_runtime| {
832
832
  switch (field_indices.get(name_runtime.get(self.zoir)) orelse continue) {
833
- inline 0...(field_infos.len - 1) => |name_index| {
834
- const name = field_infos[name_index].name;
833
+ inline 0...(info.field_names.len - 1) => |name_index| {
834
+ const name = info.field_names[name_index];
835
835
  free(self.gpa, @field(result, name));
836
836
  },
837
837
  else => unreachable, // Can't be out of bounds
@@ -856,11 +856,11 @@ const Parser = struct {
856
856
  field_found[field_index] = true;
857
857
 
858
858
  switch (field_index) {
859
- inline 0...(field_infos.len - 1) => |j| {
860
- if (field_infos[j].is_comptime) unreachable;
859
+ inline 0...(info.field_names.len - 1) => |j| {
860
+ if (info.field_attrs[j].@"comptime") unreachable;
861
861
 
862
- @field(result, field_infos[j].name) = try self.parseExpr(
863
- field_infos[j].type,
862
+ @field(result, info.field_names[j]) = try self.parseExpr(
863
+ info.field_types[j],
864
864
  fields.vals.at(@intCast(i)),
865
865
  );
866
866
  },
@@ -873,15 +873,14 @@ const Parser = struct {
873
873
  // Fill in any missing default fields
874
874
  inline for (field_found, 0..) |found, i| {
875
875
  if (!found) {
876
- const field_info = field_infos[i];
877
- if (field_info.default_value_ptr) |default| {
878
- const typed: *const field_info.type = @ptrCast(@alignCast(default));
879
- @field(result, field_info.name) = typed.*;
876
+ const field_attrs = info.field_attrs[i];
877
+ if (field_attrs.defaultValue(info.field_types[i])) |default| {
878
+ @field(result, info.field_names[i]) = default;
880
879
  } else {
881
880
  return self.failNodeFmt(
882
881
  node,
883
882
  "missing required field {s}",
884
- .{field_infos[i].name},
883
+ .{info.field_names[i]},
885
884
  );
886
885
  }
887
886
  }
@@ -898,22 +897,21 @@ const Parser = struct {
898
897
  };
899
898
 
900
899
  var result: T = undefined;
901
- const field_infos = @typeInfo(T).@"struct".fields;
900
+ const info = @typeInfo(T).@"struct";
902
901
 
903
- if (nodes.len > field_infos.len) {
902
+ if (nodes.len > info.field_names.len) {
904
903
  return self.failNodeFmt(
905
- nodes.at(field_infos.len),
904
+ nodes.at(info.field_names.len),
906
905
  "index {} outside of tuple length {}",
907
- .{ field_infos.len, field_infos.len },
906
+ .{ info.field_names.len, info.field_names.len },
908
907
  );
909
908
  }
910
909
 
911
- inline for (0..field_infos.len) |i| {
910
+ inline for (0..info.field_names.len) |i| {
912
911
  // Check if we're out of bounds
913
912
  if (i >= nodes.len) {
914
- if (field_infos[i].default_value_ptr) |default| {
915
- const typed: *const field_infos[i].type = @ptrCast(@alignCast(default));
916
- @field(result, field_infos[i].name) = typed.*;
913
+ if (info.field_attrs[i].defaultValue(info.field_types[i])) |default| {
914
+ @field(result, info.field_names[i]) = default;
917
915
  } else {
918
916
  return self.failNodeFmt(node, "missing tuple field with index {}", .{i});
919
917
  }
@@ -926,10 +924,10 @@ const Parser = struct {
926
924
  }
927
925
  };
928
926
 
929
- if (field_infos[i].is_comptime) {
927
+ if (info.field_attrs[i].@"comptime") {
930
928
  return self.failComptimeField(node, i);
931
929
  } else {
932
- result[i] = try self.parseExpr(field_infos[i].type, nodes.at(i));
930
+ result[i] = try self.parseExpr(info.field_types[i], nodes.at(i));
933
931
  }
934
932
  }
935
933
  }
@@ -939,15 +937,14 @@ const Parser = struct {
939
937
 
940
938
  fn parseUnion(self: *@This(), T: type, node: Zoir.Node.Index) !T {
941
939
  const @"union" = @typeInfo(T).@"union";
942
- const field_infos = @"union".fields;
943
940
 
944
- if (field_infos.len == 0) comptime unreachable;
941
+ if (@"union".field_names.len == 0) comptime unreachable;
945
942
 
946
943
  // Gather info on the fields
947
944
  const field_indices = b: {
948
- comptime var kvs_list: [field_infos.len]struct { []const u8, usize } = undefined;
949
- inline for (field_infos, 0..) |field, i| {
950
- kvs_list[i] = .{ field.name, i };
945
+ comptime var kvs_list: [@"union".field_names.len]struct { []const u8, usize } = undefined;
946
+ inline for (@"union".field_names, 0..) |field_name, i| {
947
+ kvs_list[i] = .{ field_name, i };
951
948
  }
952
949
  break :b std.StaticStringMap(usize).initComptime(kvs_list);
953
950
  };
@@ -970,13 +967,13 @@ const Parser = struct {
970
967
 
971
968
  // Initialize the union from the given field.
972
969
  switch (field_index) {
973
- inline 0...field_infos.len - 1 => |i| {
970
+ inline 0...@"union".field_names.len - 1 => |i| {
974
971
  // Fail if the field is not void
975
- if (field_infos[i].type != void)
972
+ if (@"union".field_types[i] != void)
976
973
  return self.failNode(node, "expected union");
977
974
 
978
975
  // Instantiate the union
979
- return @unionInit(T, field_infos[i].name, {});
976
+ return @unionInit(T, @"union".field_names[i], {});
980
977
  },
981
978
  else => unreachable, // Can't be out of bounds
982
979
  }
@@ -994,12 +991,12 @@ const Parser = struct {
994
991
  return self.failUnexpected(T, "field", node, 0, field_name_str);
995
992
 
996
993
  switch (field_index) {
997
- inline 0...field_infos.len - 1 => |i| {
998
- if (field_infos[i].type == void) {
994
+ inline 0...@"union".field_names.len - 1 => |i| {
995
+ if (@"union".field_types[i] == void) {
999
996
  return self.failNode(field_val, "expected type 'void'");
1000
997
  } else {
1001
- const value = try self.parseExpr(field_infos[i].type, field_val);
1002
- return @unionInit(T, field_infos[i].name, value);
998
+ const value = try self.parseExpr(@"union".field_types[i], field_val);
999
+ return @unionInit(T, @"union".field_names[i], value);
1003
1000
  }
1004
1001
  },
1005
1002
  else => unreachable, // Can't be out of bounds
@@ -1106,7 +1103,7 @@ const Parser = struct {
1106
1103
  } else self.ast.nodeMainToken(node.getAstNode(self.zoir));
1107
1104
  switch (@typeInfo(T)) {
1108
1105
  inline .@"struct", .@"union", .@"enum" => |info| {
1109
- const note: Error.TypeCheckFailure.Note = if (info.fields.len == 0) b: {
1106
+ const note: Error.TypeCheckFailure.Note = if (info.field_names.len == 0) b: {
1110
1107
  break :b .{
1111
1108
  .token = token,
1112
1109
  .offset = 0,
@@ -1118,9 +1115,9 @@ const Parser = struct {
1118
1115
  var buf: std.ArrayList(u8) = try .initCapacity(gpa, 64);
1119
1116
  defer buf.deinit(gpa);
1120
1117
  try buf.appendSlice(gpa, msg);
1121
- inline for (info.fields, 0..) |field_info, i| {
1118
+ inline for (info.field_names, 0..) |field_name, i| {
1122
1119
  if (i != 0) try buf.appendSlice(gpa, ", ");
1123
- try buf.print(gpa, "'{f}'", .{std.zig.fmtIdFlags(field_info.name, .{
1120
+ try buf.print(gpa, "'{f}'", .{std.zig.fmtIdFlags(field_name, .{
1124
1121
  .allow_primitive = true,
1125
1122
  .allow_underscore = true,
1126
1123
  })});
@@ -1236,8 +1233,8 @@ fn canParseTypeInner(
1236
1233
  .@"struct" => |@"struct"| {
1237
1234
  for (visited) |V| if (T == V) return true;
1238
1235
  const new_visited = visited ++ .{T};
1239
- for (@"struct".fields) |field| {
1240
- if (!field.is_comptime and !canParseTypeInner(field.type, new_visited, false)) {
1236
+ for (@"struct".field_types, @"struct".field_attrs) |field_type, field_attrs| {
1237
+ if (!field_attrs.@"comptime" and !canParseTypeInner(field_type, new_visited, false)) {
1241
1238
  return false;
1242
1239
  }
1243
1240
  }
@@ -1246,8 +1243,8 @@ fn canParseTypeInner(
1246
1243
  .@"union" => |@"union"| {
1247
1244
  for (visited) |V| if (T == V) return true;
1248
1245
  const new_visited = visited ++ .{T};
1249
- for (@"union".fields) |field| {
1250
- if (field.type != void and !canParseTypeInner(field.type, new_visited, false)) {
1246
+ for (@"union".field_types) |field_type| {
1247
+ if (field_type != void and !canParseTypeInner(field_type, new_visited, false)) {
1251
1248
  return false;
1252
1249
  }
1253
1250
  }