@zigc/lib 0.17.0-dev.644 → 0.17.0-dev.667

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 (124) hide show
  1. package/compiler/Maker/ScannedConfig.zig +4 -3
  2. package/compiler/Maker/Step/FindProgram.zig +2 -2
  3. package/compiler/Maker/Watch/FsEvents.zig +3 -2
  4. package/compiler/Maker.zig +2 -2
  5. package/compiler/aro/aro/Attribute.zig +52 -51
  6. package/compiler/aro/aro/Compilation.zig +5 -5
  7. package/compiler/aro/aro/Diagnostics.zig +7 -7
  8. package/compiler/aro/aro/Parser.zig +2 -2
  9. package/compiler/aro/aro/Tree.zig +11 -11
  10. package/compiler/aro/aro/features.zig +4 -4
  11. package/compiler/aro/aro/text_literal.zig +2 -2
  12. package/compiler/aro/backend/Interner.zig +14 -13
  13. package/compiler/configurer.zig +2 -2
  14. package/compiler/resinator/bmp.zig +3 -2
  15. package/compiler/resinator/code_pages.zig +14 -12
  16. package/compiler/resinator/cvtres.zig +11 -10
  17. package/compiler/resinator/errors.zig +18 -22
  18. package/compiler/resinator/lang.zig +7 -7
  19. package/compiler/resinator/parse.zig +1 -1
  20. package/compiler/translate-c/ast.zig +6 -6
  21. package/docs/wasm/markdown/Document.zig +3 -3
  22. package/docs/wasm/markdown/Parser.zig +3 -3
  23. package/libc/include/powerpc-linux-gnu/bits/struct_mutex.h +2 -2
  24. package/libc/include/s390x-linux-gnu/bits/fenv.h +2 -2
  25. package/libc/include/s390x-linux-gnu/bits/struct_mutex.h +2 -2
  26. package/libc/include/x86-linux-gnu/bits/struct_mutex.h +2 -2
  27. package/package.json +1 -1
  28. package/std/Build/Cache.zig +2 -2
  29. package/std/Build/Configuration.zig +19 -16
  30. package/std/Build/Step/ConfigHeader.zig +3 -2
  31. package/std/Build/Step/Options.zig +28 -22
  32. package/std/Build.zig +52 -53
  33. package/std/Io/Kqueue.zig +2 -2
  34. package/std/Io/Reader.zig +1 -1
  35. package/std/Io/Threaded.zig +18 -15
  36. package/std/Io/Uring.zig +2 -2
  37. package/std/Io/Writer.zig +18 -18
  38. package/std/Io/net.zig +3 -1
  39. package/std/Io.zig +7 -6
  40. package/std/Progress.zig +2 -2
  41. package/std/Target/aarch64.zig +2 -2
  42. package/std/Target/alpha.zig +2 -2
  43. package/std/Target/amdgcn.zig +2 -2
  44. package/std/Target/arc.zig +2 -2
  45. package/std/Target/arm.zig +2 -2
  46. package/std/Target/avr.zig +2 -2
  47. package/std/Target/bpf.zig +2 -2
  48. package/std/Target/csky.zig +2 -2
  49. package/std/Target/hexagon.zig +2 -2
  50. package/std/Target/hppa.zig +2 -2
  51. package/std/Target/kvx.zig +2 -2
  52. package/std/Target/lanai.zig +2 -2
  53. package/std/Target/loongarch.zig +2 -2
  54. package/std/Target/m68k.zig +2 -2
  55. package/std/Target/mips.zig +2 -2
  56. package/std/Target/msp430.zig +2 -2
  57. package/std/Target/nvptx.zig +2 -2
  58. package/std/Target/powerpc.zig +2 -2
  59. package/std/Target/propeller.zig +2 -2
  60. package/std/Target/riscv.zig +2 -2
  61. package/std/Target/s390x.zig +2 -2
  62. package/std/Target/sparc.zig +2 -2
  63. package/std/Target/spirv.zig +2 -2
  64. package/std/Target/ve.zig +2 -2
  65. package/std/Target/wasm.zig +2 -2
  66. package/std/Target/x86.zig +2 -2
  67. package/std/Target/xcore.zig +2 -2
  68. package/std/Target/xtensa.zig +2 -2
  69. package/std/Target.zig +4 -4
  70. package/std/c/darwin.zig +1 -1
  71. package/std/coff.zig +1 -1
  72. package/std/crypto/aes/aesni.zig +1 -1
  73. package/std/crypto/aes/armcrypto.zig +4 -4
  74. package/std/crypto/aes/soft.zig +4 -4
  75. package/std/crypto/aes.zig +12 -0
  76. package/std/crypto/codecs/asn1/Oid.zig +8 -8
  77. package/std/crypto/codecs/asn1/der/Decoder.zig +7 -7
  78. package/std/crypto/codecs/asn1/der/Encoder.zig +10 -8
  79. package/std/crypto/phc_encoding.zig +23 -20
  80. package/std/crypto/timing_safe.zig +1 -1
  81. package/std/crypto/tls/Client.zig +3 -3
  82. package/std/crypto/tls.zig +1 -1
  83. package/std/debug/Dwarf/Unwind/VirtualMachine.zig +11 -5
  84. package/std/debug/ElfFile.zig +12 -8
  85. package/std/debug/MachOFile.zig +2 -2
  86. package/std/debug/SelfInfo/MachO.zig +44 -17
  87. package/std/debug/SelfInfo/Windows.zig +2 -2
  88. package/std/elf.zig +7 -7
  89. package/std/enums.zig +66 -67
  90. package/std/gpu.zig +1 -1
  91. package/std/hash/auto_hash.zig +8 -8
  92. package/std/hash/verify.zig +3 -3
  93. package/std/http/Client.zig +2 -2
  94. package/std/json/Stringify.zig +14 -14
  95. package/std/json/static.zig +47 -31
  96. package/std/lang.zig +65 -97
  97. package/std/math.zig +2 -2
  98. package/std/mem/Allocator.zig +9 -9
  99. package/std/mem.zig +86 -102
  100. package/std/meta/trailer_flags.zig +26 -19
  101. package/std/meta.zig +131 -171
  102. package/std/multi_array_list.zig +49 -57
  103. package/std/os/uefi/protocol/device_path.zig +8 -7
  104. package/std/os/uefi/tables/boot_services.zig +1 -1
  105. package/std/os/windows.zig +9 -15
  106. package/std/sort/pdq.zig +22 -5
  107. package/std/start.zig +6 -6
  108. package/std/testing/Smith.zig +35 -21
  109. package/std/testing.zig +15 -15
  110. package/std/zig/Ast.zig +4 -4
  111. package/std/zig/AstGen.zig +42 -42
  112. package/std/zig/ErrorBundle.zig +16 -13
  113. package/std/zig/LibCInstallation.zig +11 -11
  114. package/std/zig/Parse.zig +6 -6
  115. package/std/zig/Zir.zig +10 -10
  116. package/std/zig/c_translation/helpers.zig +2 -2
  117. package/std/zig/llvm/BitcodeReader.zig +3 -3
  118. package/std/zig/llvm/Builder.zig +124 -93
  119. package/std/zig/llvm/bitcode_writer.zig +4 -4
  120. package/std/zig/system/windows.zig +11 -11
  121. package/std/zig/system.zig +4 -4
  122. package/std/zig.zig +4 -4
  123. package/std/zon/Serializer.zig +28 -23
  124. package/std/zon/parse.zig +83 -61
@@ -49,9 +49,10 @@ pub fn print(sc: *const ScannedConfig, w: *Writer) Writer.Error!void {
49
49
  }
50
50
 
51
51
  fn printStruct(sc: *const ScannedConfig, s: *Serializer.Struct, comptime S: type, v: S) !void {
52
- inline for (@typeInfo(S).@"struct".fields) |field| {
53
- try s.fieldPrefix(field.name);
54
- try printValue(sc, s.container.serializer, field.type, @field(v, field.name));
52
+ const info = @typeInfo(S).@"struct";
53
+ inline for (info.field_names, info.field_types) |field_name, field_type| {
54
+ try s.fieldPrefix(field_name);
55
+ try printValue(sc, s.container.serializer, field_type, @field(v, field_name));
55
56
  }
56
57
  }
57
58
 
@@ -113,8 +113,8 @@ fn checkCandidate(
113
113
  }
114
114
 
115
115
  fn supportedWindowsProgramExtension(ext: []const u8) bool {
116
- inline for (@typeInfo(std.process.WindowsExtension).@"enum".fields) |field| {
117
- if (std.ascii.eqlIgnoreCase(ext, "." ++ field.name)) return true;
116
+ inline for (@typeInfo(std.process.WindowsExtension).@"enum".field_names) |field_name| {
117
+ if (std.ascii.eqlIgnoreCase(ext, "." ++ field_name)) return true;
118
118
  }
119
119
  return false;
120
120
  }
@@ -87,8 +87,9 @@ pub fn init(cwd_path: []const u8) error{ OpenFrameworkFailed, MissingCoreService
87
87
  errdefer core_services.close();
88
88
 
89
89
  var resolved_symbols: ResolvedSymbols = undefined;
90
- inline for (@typeInfo(ResolvedSymbols).@"struct".fields) |f| {
91
- @field(resolved_symbols, f.name) = core_services.lookup(f.type, f.name) orelse return error.MissingCoreServicesSymbol;
90
+ const info = @typeInfo(ResolvedSymbols).@"struct";
91
+ inline for (info.field_names, info.field_types) |f_name, f_type| {
92
+ @field(resolved_symbols, f_name) = core_services.lookup(f_type, f_name) orelse return error.MissingCoreServicesSymbol;
92
93
  }
93
94
 
94
95
  return .{
@@ -194,7 +194,7 @@ pub fn main(init: process.Init.Minimal) !void {
194
194
  var max_rss: u64 = 0;
195
195
  var skip_oom_steps = false;
196
196
  var test_timeout_ns: ?u64 = null;
197
- var color: Color = .auto;
197
+ var color: Color = .settingFromEnvironment(&graph.environ_map);
198
198
  var watch = false;
199
199
  var fuzz: ?Fuzz.Mode = null;
200
200
  var debounce_interval_ms: u16 = 50;
@@ -533,7 +533,7 @@ pub fn main(init: process.Init.Minimal) !void {
533
533
  }
534
534
 
535
535
  const main_progress_node = std.Progress.start(io, .{
536
- .disable_printing = (color == .off),
536
+ .disable_printing = (graph.stderr_mode.? == .no_color),
537
537
  });
538
538
  defer main_progress_node.end();
539
539
 
@@ -89,9 +89,9 @@ pub fn requiredArgCount(attr: Tag) u32 {
89
89
  inline else => |tag| {
90
90
  comptime var needed = 0;
91
91
  comptime {
92
- const fields = @typeInfo(@field(attributes, @tagName(tag))).@"struct".fields;
93
- for (fields) |arg_field| {
94
- if (!mem.eql(u8, arg_field.name, "__name_tok") and @typeInfo(arg_field.type) != .optional) needed += 1;
92
+ const info = @typeInfo(@field(attributes, @tagName(tag))).@"struct";
93
+ for (info.field_names, info.field_types) |arg_field_name, arg_field_type| {
94
+ if (!mem.eql(u8, arg_field_name, "__name_tok") and @typeInfo(arg_field_type) != .optional) needed += 1;
95
95
  }
96
96
  }
97
97
  return needed;
@@ -105,9 +105,9 @@ pub fn maxArgCount(attr: Tag) u32 {
105
105
  inline else => |tag| {
106
106
  comptime var max = 0;
107
107
  comptime {
108
- const fields = @typeInfo(@field(attributes, @tagName(tag))).@"struct".fields;
109
- for (fields) |arg_field| {
110
- if (!mem.eql(u8, arg_field.name, "__name_tok")) max += 1;
108
+ const field_names = @typeInfo(@field(attributes, @tagName(tag))).@"struct".field_names;
109
+ for (field_names) |arg_field_name| {
110
+ if (!mem.eql(u8, arg_field_name, "__name_tok")) max += 1;
111
111
  }
112
112
  }
113
113
  return max;
@@ -130,10 +130,10 @@ pub const Formatting = struct {
130
130
  switch (attr) {
131
131
  .calling_convention => unreachable,
132
132
  inline else => |tag| {
133
- const fields = @typeInfo(@field(attributes, @tagName(tag))).@"struct".fields;
133
+ const field_types = @typeInfo(@field(attributes, @tagName(tag))).@"struct".field_types;
134
134
 
135
- if (fields.len == 0) unreachable;
136
- const Unwrapped = UnwrapOptional(fields[0].type);
135
+ if (field_types.len == 0) unreachable;
136
+ const Unwrapped = UnwrapOptional(field_types[0]);
137
137
  if (@typeInfo(Unwrapped) != .@"enum") unreachable;
138
138
 
139
139
  return if (Unwrapped.opts.enum_kind == .identifier) "'" else "\"";
@@ -147,18 +147,18 @@ pub const Formatting = struct {
147
147
  switch (attr) {
148
148
  .calling_convention => unreachable,
149
149
  inline else => |tag| {
150
- const fields = @typeInfo(@field(attributes, @tagName(tag))).@"struct".fields;
150
+ const field_types = @typeInfo(@field(attributes, @tagName(tag))).@"struct".field_types;
151
151
 
152
- if (fields.len == 0) unreachable;
153
- const Unwrapped = UnwrapOptional(fields[0].type);
152
+ if (field_types.len == 0) unreachable;
153
+ const Unwrapped = UnwrapOptional(field_types[0]);
154
154
  if (@typeInfo(Unwrapped) != .@"enum") unreachable;
155
155
 
156
- const enum_fields = @typeInfo(Unwrapped).@"enum".fields;
156
+ const enum_field_names = @typeInfo(Unwrapped).@"enum".field_names;
157
157
  const quote = comptime quoteChar(@enumFromInt(@intFromEnum(tag)));
158
- comptime var values: []const u8 = quote ++ enum_fields[0].name ++ quote;
159
- inline for (enum_fields[1..]) |enum_field| {
158
+ comptime var values: []const u8 = quote ++ enum_field_names[0] ++ quote;
159
+ inline for (enum_field_names[1..]) |enum_field_name| {
160
160
  values = values ++ ", ";
161
- values = values ++ quote ++ enum_field.name ++ quote;
161
+ values = values ++ quote ++ enum_field_name ++ quote;
162
162
  }
163
163
  return values;
164
164
  },
@@ -171,10 +171,10 @@ pub fn wantsIdentEnum(attr: Tag) bool {
171
171
  switch (attr) {
172
172
  .calling_convention => return false,
173
173
  inline else => |tag| {
174
- const fields = @typeInfo(@field(attributes, @tagName(tag))).@"struct".fields;
174
+ const field_types = @typeInfo(@field(attributes, @tagName(tag))).@"struct".field_types;
175
175
 
176
- if (fields.len == 0) return false;
177
- const Unwrapped = UnwrapOptional(fields[0].type);
176
+ if (field_types.len == 0) return false;
177
+ const Unwrapped = UnwrapOptional(field_types[0]);
178
178
  if (@typeInfo(Unwrapped) != .@"enum") return false;
179
179
 
180
180
  return Unwrapped.opts.enum_kind == .identifier;
@@ -185,12 +185,12 @@ pub fn wantsIdentEnum(attr: Tag) bool {
185
185
  pub fn diagnoseIdent(attr: Tag, arguments: *Arguments, ident: TokenIndex, p: *Parser) !bool {
186
186
  switch (attr) {
187
187
  inline else => |tag| {
188
- const fields = @typeInfo(@field(attributes, @tagName(tag))).@"struct".fields;
189
- if (fields.len == 0) unreachable;
190
- const Unwrapped = UnwrapOptional(fields[0].type);
188
+ const info = @typeInfo(@field(attributes, @tagName(tag))).@"struct";
189
+ if (info.field_names.len == 0) unreachable;
190
+ const Unwrapped = UnwrapOptional(info.field_types[0]);
191
191
  if (@typeInfo(Unwrapped) != .@"enum") unreachable;
192
192
  if (std.meta.stringToEnum(Unwrapped, normalize(p.tokSlice(ident)))) |enum_val| {
193
- @field(@field(arguments, @tagName(tag)), fields[0].name) = enum_val;
193
+ @field(@field(arguments, @tagName(tag)), info.field_names[0]) = enum_val;
194
194
  return false;
195
195
  }
196
196
 
@@ -203,11 +203,11 @@ pub fn diagnoseIdent(attr: Tag, arguments: *Arguments, ident: TokenIndex, p: *Pa
203
203
  pub fn wantsAlignment(attr: Tag, idx: usize) bool {
204
204
  switch (attr) {
205
205
  inline else => |tag| {
206
- const fields = @typeInfo(@field(attributes, @tagName(tag))).@"struct".fields;
207
- if (fields.len == 0) return false;
206
+ const field_types = @typeInfo(@field(attributes, @tagName(tag))).@"struct".field_types;
207
+ if (field_types.len == 0) return false;
208
208
 
209
209
  return switch (idx) {
210
- inline 0...fields.len - 1 => |i| UnwrapOptional(fields[i].type) == Alignment,
210
+ inline 0...field_types.len - 1 => |i| UnwrapOptional(field_types[i]) == Alignment,
211
211
  else => false,
212
212
  };
213
213
  },
@@ -217,12 +217,12 @@ pub fn wantsAlignment(attr: Tag, idx: usize) bool {
217
217
  pub fn diagnoseAlignment(attr: Tag, arguments: *Arguments, arg_idx: u32, res: Parser.Result, arg_start: TokenIndex, p: *Parser) !bool {
218
218
  switch (attr) {
219
219
  inline else => |tag| {
220
- const arg_fields = @typeInfo(@field(attributes, @tagName(tag))).@"struct".fields;
221
- if (arg_fields.len == 0) unreachable;
220
+ const arg_info = @typeInfo(@field(attributes, @tagName(tag))).@"struct";
221
+ if (arg_info.field_names.len == 0) unreachable;
222
222
 
223
223
  switch (arg_idx) {
224
- inline 0...arg_fields.len - 1 => |arg_i| {
225
- if (UnwrapOptional(arg_fields[arg_i].type) != Alignment) unreachable;
224
+ inline 0...arg_info.field_names.len - 1 => |arg_i| {
225
+ if (UnwrapOptional(arg_info.field_types[arg_i]) != Alignment) unreachable;
226
226
 
227
227
  if (!res.val.is(.int, p.comp)) {
228
228
  try p.err(arg_start, .alignas_unavailable, .{});
@@ -241,7 +241,7 @@ pub fn diagnoseAlignment(attr: Tag, arguments: *Arguments, arg_idx: u32, res: Pa
241
241
  return true;
242
242
  }
243
243
 
244
- @field(@field(arguments, @tagName(tag)), arg_fields[arg_i].name) = .{ .requested = requested };
244
+ @field(@field(arguments, @tagName(tag)), arg_info.field_names[arg_i]) = .{ .requested = requested };
245
245
  return false;
246
246
  },
247
247
  else => unreachable,
@@ -251,8 +251,8 @@ pub fn diagnoseAlignment(attr: Tag, arguments: *Arguments, arg_idx: u32, res: Pa
251
251
  }
252
252
 
253
253
  fn diagnoseField(
254
- comptime decl: ZigType.Declaration,
255
- comptime field: ZigType.StructField,
254
+ comptime decl_name: []const u8,
255
+ comptime field_name: []const u8,
256
256
  comptime Wanted: type,
257
257
  arguments: *Arguments,
258
258
  res: Parser.Result,
@@ -283,7 +283,7 @@ fn diagnoseField(
283
283
 
284
284
  if (res.val.opt_ref == .none) {
285
285
  if (Wanted == Identifier and node == .decl_ref_expr) {
286
- @field(@field(arguments, decl.name), field.name) = .{ .tok = node.decl_ref_expr.name_tok };
286
+ @field(@field(arguments, decl_name), field_name) = .{ .tok = node.decl_ref_expr.name_tok };
287
287
  return false;
288
288
  }
289
289
 
@@ -294,7 +294,7 @@ fn diagnoseField(
294
294
  switch (key) {
295
295
  .int => {
296
296
  if (@typeInfo(Wanted) == .int) {
297
- @field(@field(arguments, decl.name), field.name) = res.val.toInt(Wanted, p.comp) orelse {
297
+ @field(@field(arguments, decl_name), field_name) = res.val.toInt(Wanted, p.comp) orelse {
298
298
  try p.err(arg_start, .attribute_int_out_of_range, .{res});
299
299
  return true;
300
300
  };
@@ -310,20 +310,20 @@ fn diagnoseField(
310
310
  .char, .uchar, .schar => {},
311
311
  else => break :validate,
312
312
  }
313
- @field(@field(arguments, decl.name), field.name) = try p.removeNull(res.val);
313
+ @field(@field(arguments, decl_name), field_name) = try p.removeNull(res.val);
314
314
  return false;
315
315
  }
316
316
 
317
- try p.err(arg_start, .attribute_requires_string, .{decl.name});
317
+ try p.err(arg_start, .attribute_requires_string, .{decl_name});
318
318
  return true;
319
319
  } else if (@typeInfo(Wanted) == .@"enum" and @hasDecl(Wanted, "opts") and Wanted.opts.enum_kind == .string) {
320
320
  const str = bytes[0 .. bytes.len - 1];
321
321
  if (std.meta.stringToEnum(Wanted, str)) |enum_val| {
322
- @field(@field(arguments, decl.name), field.name) = enum_val;
322
+ @field(@field(arguments, decl_name), field_name) = enum_val;
323
323
  return false;
324
324
  }
325
325
 
326
- try p.err(arg_start, .unknown_attr_enum, .{ decl.name, Formatting.choices(@field(Tag, decl.name)) });
326
+ try p.err(arg_start, .unknown_attr_enum, .{ decl_name, Formatting.choices(@field(Tag, decl_name)) });
327
327
  return true;
328
328
  }
329
329
  },
@@ -344,17 +344,18 @@ fn diagnoseField(
344
344
  pub fn diagnose(attr: Tag, arguments: *Arguments, arg_idx: u32, res: Parser.Result, arg_start: TokenIndex, node: Tree.Node, p: *Parser) !bool {
345
345
  switch (attr) {
346
346
  inline else => |tag| {
347
- const decl = @typeInfo(attributes).@"struct".decls[@intFromEnum(tag)];
347
+ const decl_name = @typeInfo(attributes).@"struct".decl_names[@intFromEnum(tag)];
348
348
  const max_arg_count = comptime maxArgCount(tag);
349
349
  if (arg_idx >= max_arg_count) {
350
350
  try p.err(arg_start, .attribute_too_many_args, .{ @tagName(attr), max_arg_count });
351
351
  return true;
352
352
  }
353
353
 
354
- const arg_fields = @typeInfo(@field(attributes, decl.name)).@"struct".fields;
354
+ const arg_field_names = @typeInfo(@field(attributes, decl_name)).@"struct".field_names;
355
+ const arg_field_types = @typeInfo(@field(attributes, decl_name)).@"struct".field_types;
355
356
  switch (arg_idx) {
356
- inline 0...arg_fields.len - 1 => |arg_i| {
357
- return diagnoseField(decl, arg_fields[arg_i], UnwrapOptional(arg_fields[arg_i].type), arguments, res, arg_start, node, p);
357
+ inline 0...arg_field_names.len - 1 => |arg_i| {
358
+ return diagnoseField(decl_name, arg_field_names[arg_i], UnwrapOptional(arg_field_types[arg_i]), arguments, res, arg_start, node, p);
358
359
  },
359
360
  else => unreachable,
360
361
  }
@@ -722,20 +723,20 @@ const attributes = struct {
722
723
  pub const Tag = std.meta.DeclEnum(attributes);
723
724
 
724
725
  pub const Arguments = blk: {
725
- const decls = @typeInfo(attributes).@"struct".decls;
726
- var names: [decls.len][]const u8 = undefined;
727
- var types: [decls.len]type = undefined;
728
- for (decls, &names, &types) |decl, *name, *T| {
729
- name.* = decl.name;
730
- T.* = @field(attributes, decl.name);
726
+ const decl_names = @typeInfo(attributes).@"struct".decl_names;
727
+ var names: [decl_names.len][]const u8 = undefined;
728
+ var types: [decl_names.len]type = undefined;
729
+ for (decl_names, &names, &types) |decl_name, *name, *T| {
730
+ name.* = decl_name;
731
+ T.* = @field(attributes, decl_name);
731
732
  }
732
733
 
733
734
  break :blk @Union(.auto, null, &names, &types, &@splat(.{}));
734
735
  };
735
736
 
736
737
  pub fn ArgumentsForTag(comptime tag: Tag) type {
737
- const decl = @typeInfo(attributes).@"struct".decls[@intFromEnum(tag)];
738
- return @field(attributes, decl.name);
738
+ const decl_name = @typeInfo(attributes).@"struct".decl_names[@intFromEnum(tag)];
739
+ return @field(attributes, decl_name);
739
740
  }
740
741
 
741
742
  pub fn initArguments(tag: Tag, name_tok: TokenIndex) Arguments {
@@ -78,12 +78,12 @@ pub const Environment = struct {
78
78
  pub fn loadAll(environ_map: *const std.process.Environ.Map) Environment {
79
79
  var env: Environment = .{};
80
80
 
81
- inline for (@typeInfo(@TypeOf(env)).@"struct".fields) |field| {
82
- std.debug.assert(@field(env, field.name) == null);
81
+ inline for (@typeInfo(@TypeOf(env)).@"struct".field_names) |field_name| {
82
+ std.debug.assert(@field(env, field_name) == null);
83
83
 
84
- var env_var_buf: [field.name.len]u8 = undefined;
85
- const env_var_name = std.ascii.upperString(&env_var_buf, field.name);
86
- @field(env, field.name) = environ_map.get(env_var_name);
84
+ var env_var_buf: [field_name.len]u8 = undefined;
85
+ const env_var_name = std.ascii.upperString(&env_var_buf, field_name);
86
+ @field(env, field_name) = environ_map.get(env_var_name);
87
87
  }
88
88
  return env;
89
89
  }
@@ -333,8 +333,8 @@ pub fn deinit(d: *Diagnostics) void {
333
333
  /// Used by the __has_warning builtin macro.
334
334
  pub fn warningExists(name: []const u8) bool {
335
335
  if (std.mem.eql(u8, name, "pedantic")) return true;
336
- inline for (comptime std.meta.declarations(Option)) |group| {
337
- if (std.mem.eql(u8, name, group.name)) return true;
336
+ inline for (comptime std.meta.declarations(Option)) |group_name| {
337
+ if (std.mem.eql(u8, name, group_name)) return true;
338
338
  }
339
339
  return std.meta.stringToEnum(Option, name) != null;
340
340
  }
@@ -349,9 +349,9 @@ pub fn set(d: *Diagnostics, name: []const u8, to: Message.Kind) Compilation.Erro
349
349
  return;
350
350
  }
351
351
 
352
- inline for (comptime std.meta.declarations(Option)) |group| {
353
- if (std.mem.eql(u8, name, group.name)) {
354
- for (@field(Option, group.name)) |option| {
352
+ inline for (comptime std.meta.declarations(Option)) |group_name| {
353
+ if (std.mem.eql(u8, name, group_name)) {
354
+ for (@field(Option, group_name)) |option| {
355
355
  d.state.options.put(option, to);
356
356
  }
357
357
  return;
@@ -494,8 +494,8 @@ pub fn addWithLocation(
494
494
 
495
495
  pub fn formatArgs(w: *std.Io.Writer, fmt: []const u8, args: anytype) std.Io.Writer.Error!void {
496
496
  var i: usize = 0;
497
- inline for (std.meta.fields(@TypeOf(args))) |arg_info| {
498
- const arg = @field(args, arg_info.name);
497
+ inline for (comptime std.meta.fieldNames(@TypeOf(args))) |arg_name| {
498
+ const arg = @field(args, arg_name);
499
499
  i += switch (@TypeOf(arg)) {
500
500
  []const u8 => try formatString(w, fmt[i..], arg),
501
501
  else => switch (@typeInfo(@TypeOf(arg))) {
@@ -456,8 +456,8 @@ pub fn err(p: *Parser, tok_i: TokenIndex, diagnostic: Diagnostic, args: anytype)
456
456
 
457
457
  fn formatArgs(p: *Parser, w: *std.Io.Writer, fmt: []const u8, args: anytype) !void {
458
458
  var i: usize = 0;
459
- inline for (std.meta.fields(@TypeOf(args))) |arg_info| {
460
- const arg = @field(args, arg_info.name);
459
+ inline for (comptime std.meta.fieldNames(@TypeOf(args))) |arg_name| {
460
+ const arg = @field(args, arg_name);
461
461
  i += switch (@TypeOf(arg)) {
462
462
  []const u8 => try Diagnostics.formatString(w, fmt[i..], arg),
463
463
  Tree.Token.Id => try formatTokenId(w, fmt[i..], arg),
@@ -3048,25 +3048,25 @@ fn dumpAttribute(tree: *const Tree, attr: Attribute, w: *std.Io.Writer) !void {
3048
3048
  switch (attr.tag) {
3049
3049
  inline else => |tag| {
3050
3050
  const args = @field(attr.args, @tagName(tag));
3051
- const fields = @typeInfo(@TypeOf(args)).@"struct".fields;
3052
- if (fields.len == 0) {
3051
+ const args_info = @typeInfo(@TypeOf(args)).@"struct";
3052
+ if (args_info.field_names.len == 0) {
3053
3053
  try w.writeByte('\n');
3054
3054
  return;
3055
3055
  }
3056
3056
  try w.writeByte(' ');
3057
- inline for (fields, 0..) |f, i| {
3058
- if (comptime std.mem.eql(u8, f.name, "__name_tok")) continue;
3057
+ inline for (args_info.field_names, args_info.field_types, 0..) |f_name, f_type, i| {
3058
+ if (comptime std.mem.eql(u8, f_name, "__name_tok")) continue;
3059
3059
  if (i != 0) {
3060
3060
  try w.writeAll(", ");
3061
3061
  }
3062
- try w.writeAll(f.name);
3062
+ try w.writeAll(f_name);
3063
3063
  try w.writeAll(": ");
3064
- switch (f.type) {
3065
- Interner.Ref => try w.print("\"{s}\"", .{tree.interner.get(@field(args, f.name)).bytes}),
3066
- ?Interner.Ref => try w.print("\"{?s}\"", .{if (@field(args, f.name)) |str| tree.interner.get(str).bytes else null}),
3067
- else => switch (@typeInfo(f.type)) {
3068
- .@"enum" => try w.writeAll(@tagName(@field(args, f.name))),
3069
- else => try w.print("{any}", .{@field(args, f.name)}),
3064
+ switch (f_type) {
3065
+ Interner.Ref => try w.print("\"{s}\"", .{tree.interner.get(@field(args, f_name)).bytes}),
3066
+ ?Interner.Ref => try w.print("\"{?s}\"", .{if (@field(args, f_name)) |str| tree.interner.get(str).bytes else null}),
3067
+ else => switch (@typeInfo(f_type)) {
3068
+ .@"enum" => try w.writeAll(@tagName(@field(args, f_name))),
3069
+ else => try w.print("{any}", .{@field(args, f_name)}),
3070
3070
  },
3071
3071
  }
3072
3072
  }
@@ -46,8 +46,8 @@ pub fn hasFeature(comp: *Compilation, ext: []const u8) bool {
46
46
  .c_thread_local = comp.langopts.standard.atLeast(.c11) and comp.target.isTlsSupported(),
47
47
  .bounds_attributes = comp.langopts.bounds_safety == .clang,
48
48
  };
49
- inline for (@typeInfo(@TypeOf(list)).@"struct".fields) |f| {
50
- if (std.mem.eql(u8, f.name, ext)) return @field(list, f.name);
49
+ inline for (@typeInfo(@TypeOf(list)).@"struct".field_names) |f_name| {
50
+ if (std.mem.eql(u8, f_name, ext)) return @field(list, f_name);
51
51
  }
52
52
  return false;
53
53
  }
@@ -70,8 +70,8 @@ pub fn hasExtension(comp: *Compilation, ext: []const u8) bool {
70
70
  .matrix_types = false, // TODO
71
71
  .matrix_types_scalar_division = false, // TODO
72
72
  };
73
- inline for (@typeInfo(@TypeOf(list)).@"struct".fields) |f| {
74
- if (std.mem.eql(u8, f.name, ext)) return @field(list, f.name);
73
+ inline for (@typeInfo(@TypeOf(list)).@"struct".field_names) |f_name| {
74
+ if (std.mem.eql(u8, f_name, ext)) return @field(list, f_name);
75
75
  }
76
76
  return false;
77
77
  }
@@ -335,8 +335,8 @@ pub const Parser = struct {
335
335
 
336
336
  fn formatArgs(w: *std.Io.Writer, fmt: []const u8, args: anytype) !void {
337
337
  var i: usize = 0;
338
- inline for (std.meta.fields(@TypeOf(args))) |arg_info| {
339
- const arg = @field(args, arg_info.name);
338
+ inline for (comptime std.meta.fieldNames(@TypeOf(args))) |arg_name| {
339
+ const arg = @field(args, arg_name);
340
340
  i += switch (@TypeOf(arg)) {
341
341
  []const u8 => try Diagnostics.formatString(w, fmt[i..], arg),
342
342
  Ascii => try arg.format(w, fmt[i..]),
@@ -733,7 +733,7 @@ pub fn put(i: *Interner, gpa: Allocator, key: Key) !Ref {
733
733
  });
734
734
  },
735
735
  .record_ty => |elems| {
736
- try i.extra.ensureUnusedCapacity(gpa, @typeInfo(Tag.Record).@"struct".fields.len +
736
+ try i.extra.ensureUnusedCapacity(gpa, @typeInfo(Tag.Record).@"struct".field_names.len +
737
737
  elems.len);
738
738
  i.items.appendAssumeCapacity(.{
739
739
  .tag = .record_ty,
@@ -755,18 +755,19 @@ pub fn put(i: *Interner, gpa: Allocator, key: Key) !Ref {
755
755
  }
756
756
 
757
757
  fn addExtra(i: *Interner, gpa: Allocator, extra: anytype) Allocator.Error!u32 {
758
- const fields = @typeInfo(@TypeOf(extra)).@"struct".fields;
759
- try i.extra.ensureUnusedCapacity(gpa, fields.len);
758
+ const field_count = @typeInfo(@TypeOf(extra)).@"struct".field_names.len;
759
+ try i.extra.ensureUnusedCapacity(gpa, field_count);
760
760
  return i.addExtraAssumeCapacity(extra);
761
761
  }
762
762
 
763
763
  fn addExtraAssumeCapacity(i: *Interner, extra: anytype) u32 {
764
764
  const result = @as(u32, @intCast(i.extra.items.len));
765
- inline for (@typeInfo(@TypeOf(extra)).@"struct".fields) |field| {
766
- i.extra.appendAssumeCapacity(switch (field.type) {
767
- Ref => @intFromEnum(@field(extra, field.name)),
768
- u32 => @field(extra, field.name),
769
- else => @compileError("bad field type: " ++ @typeName(field.type)),
765
+ const info = @typeInfo(@TypeOf(extra)).@"struct";
766
+ inline for (info.field_names, info.field_types) |field_name, field_type| {
767
+ i.extra.appendAssumeCapacity(switch (field_type) {
768
+ Ref => @intFromEnum(@field(extra, field_name)),
769
+ u32 => @field(extra, field_name),
770
+ else => @compileError("bad field type: " ++ @typeName(field_type)),
770
771
  });
771
772
  }
772
773
  return result;
@@ -891,17 +892,17 @@ fn extraData(i: *const Interner, comptime T: type, index: usize) T {
891
892
 
892
893
  fn extraDataTrail(i: *const Interner, comptime T: type, index: usize) struct { data: T, end: u32 } {
893
894
  var result: T = undefined;
894
- const fields = @typeInfo(T).@"struct".fields;
895
- inline for (fields, 0..) |field, field_i| {
895
+ const info = @typeInfo(T).@"struct";
896
+ inline for (info.field_names, info.field_types, 0..) |field_name, field_type, field_i| {
896
897
  const int32 = i.extra.items[field_i + index];
897
- @field(result, field.name) = switch (field.type) {
898
+ @field(result, field_name) = switch (field_type) {
898
899
  Ref => @enumFromInt(int32),
899
900
  u32 => int32,
900
- else => @compileError("bad field type: " ++ @typeName(field.type)),
901
+ else => @compileError("bad field type: " ++ @typeName(field_type)),
901
902
  };
902
903
  }
903
904
  return .{
904
905
  .data = result,
905
- .end = @intCast(index + fields.len),
906
+ .end = @intCast(index + info.field_names.len),
906
907
  };
907
908
  }
@@ -601,8 +601,8 @@ const Serialize = struct {
601
601
  dest_module.* = try addModule(s, src_module);
602
602
  }
603
603
 
604
- comptime assert(std.mem.eql(u8, @typeInfo(Configuration.Module).@"struct".fields[2].name, "import_table"));
605
- comptime assert(@typeInfo(Configuration.Module).@"struct".fields[2].type == Configuration.ImportTable.Index);
604
+ comptime assert(std.mem.eql(u8, @typeInfo(Configuration.Module).@"struct".field_names[2], "import_table"));
605
+ comptime assert(@typeInfo(Configuration.Module).@"struct".field_types[2] == Configuration.ImportTable.Index);
606
606
  assert(wc.extra.items[@intFromEnum(module_index) + 2] == @intFromEnum(Configuration.ImportTable.Index.invalid));
607
607
  const import_table_index = try wc.addDeduped(Configuration.ImportTable, .{
608
608
  .imports = .{ .mal = imports },
@@ -241,8 +241,9 @@ pub const Compression = enum(u32) {
241
241
  };
242
242
 
243
243
  fn structFieldsLittleToNative(comptime T: type, x: *T) void {
244
- inline for (@typeInfo(T).@"struct".fields) |field| {
245
- @field(x, field.name) = std.mem.littleToNative(field.type, @field(x, field.name));
244
+ const info = @typeInfo(T).@"struct";
245
+ inline for (info.field_names, info.field_types) |field_name, field_type| {
246
+ @field(x, field_name) = std.mem.littleToNative(field_type, @field(x, field_name));
246
247
  }
247
248
  }
248
249
 
@@ -178,19 +178,20 @@ pub const UnsupportedCodePage = enum(u16) {
178
178
  };
179
179
 
180
180
  pub const CodePage = blk: {
181
- const fields = @typeInfo(SupportedCodePage).@"enum".fields ++ @typeInfo(UnsupportedCodePage).@"enum".fields;
182
- var field_names: [fields.len][]const u8 = undefined;
183
- var field_values: [fields.len]u16 = undefined;
184
- for (fields, &field_names, &field_values) |field, *name, *val| {
185
- name.* = field.name;
186
- val.* = field.value;
181
+ const field_names = @typeInfo(SupportedCodePage).@"enum".field_names ++ @typeInfo(UnsupportedCodePage).@"enum".field_names;
182
+ const field_values = @typeInfo(SupportedCodePage).@"enum".field_values ++ @typeInfo(UnsupportedCodePage).@"enum".field_values;
183
+ var cp_field_names: [field_names.len][]const u8 = undefined;
184
+ var cp_field_values: [field_names.len]u16 = undefined;
185
+ for (field_names, field_values, &cp_field_names, &cp_field_values) |field_name, field_value, *name, *val| {
186
+ name.* = field_name;
187
+ val.* = field_value;
187
188
  }
188
- break :blk @Enum(u16, .exhaustive, &field_names, &field_values);
189
+ break :blk @Enum(u16, .exhaustive, &cp_field_names, &cp_field_values);
189
190
  };
190
191
 
191
192
  pub fn isSupported(code_page: CodePage) bool {
192
- inline for (@typeInfo(SupportedCodePage).@"enum".fields) |enumField| {
193
- if (@intFromEnum(code_page) == @intFromEnum(@field(SupportedCodePage, enumField.name))) {
193
+ inline for (@typeInfo(SupportedCodePage).@"enum".field_names) |field_name| {
194
+ if (@intFromEnum(code_page) == @intFromEnum(@field(SupportedCodePage, field_name))) {
194
195
  return true;
195
196
  }
196
197
  }
@@ -200,9 +201,10 @@ pub fn isSupported(code_page: CodePage) bool {
200
201
  pub fn getByIdentifier(identifier: u16) !CodePage {
201
202
  // There's probably a more efficient way to do this (e.g. ComptimeHashMap?) but
202
203
  // this should be fine, especially since this function likely won't be called much.
203
- inline for (@typeInfo(CodePage).@"enum".fields) |enumField| {
204
- if (identifier == enumField.value) {
205
- return @field(CodePage, enumField.name);
204
+ const info = @typeInfo(CodePage).@"enum";
205
+ inline for (info.field_names, info.field_values) |field_name, field_value| {
206
+ if (identifier == field_value) {
207
+ return @field(CodePage, field_name);
206
208
  }
207
209
  }
208
210
  return error.InvalidCodePage;
@@ -1054,17 +1054,18 @@ pub const supported_targets = struct {
1054
1054
  .ebc,
1055
1055
  };
1056
1056
  comptime {
1057
- for (@typeInfo(Arch).@"enum".fields) |enum_field| {
1058
- _ = std.mem.indexOfScalar(Arch, ordered_for_display, @enumFromInt(enum_field.value)) orelse {
1059
- @compileError(std.fmt.comptimePrint("'{s}' missing from ordered_for_display", .{enum_field.name}));
1057
+ const info = @typeInfo(Arch).@"enum";
1058
+ for (info.field_names, info.field_values) |field_name, field_value| {
1059
+ _ = std.mem.indexOfScalar(Arch, ordered_for_display, @enumFromInt(field_value)) orelse {
1060
+ @compileError(std.fmt.comptimePrint("'{s}' missing from ordered_for_display", .{field_name}));
1060
1061
  };
1061
1062
  }
1062
1063
  }
1063
1064
 
1064
1065
  pub const longest_name = blk: {
1065
1066
  var len = 0;
1066
- for (@typeInfo(Arch).@"enum".fields) |field| {
1067
- if (field.name.len > len) len = field.name.len;
1067
+ for (@typeInfo(Arch).@"enum".field_names) |field_name| {
1068
+ if (field_name.len > len) len = field_name.len;
1068
1069
  }
1069
1070
  break :blk len;
1070
1071
  };
@@ -1106,14 +1107,14 @@ pub const supported_targets = struct {
1106
1107
  // Enforce two things:
1107
1108
  // 1. Arch enum field names are all lowercase (necessary for how fromStringIgnoreCase is implemented)
1108
1109
  // 2. All enum fields in Arch have an associated RVA relocation type when converted to a coff.IMAGE.FILE.MACHINE
1109
- for (@typeInfo(Arch).@"enum".fields) |enum_field| {
1110
- const all_lower = all_lower: for (enum_field.name) |c| {
1110
+ for (@typeInfo(Arch).@"enum".field_names) |field_name| {
1111
+ const all_lower = all_lower: for (field_name) |c| {
1111
1112
  if (std.ascii.isUpper(c)) break :all_lower false;
1112
1113
  } else break :all_lower true;
1113
- if (!all_lower) @compileError(std.fmt.comptimePrint("Arch field is not all lowercase: {s}", .{enum_field.name}));
1114
- const coff_machine = @field(Arch, enum_field.name).toCoffMachineType();
1114
+ if (!all_lower) @compileError(std.fmt.comptimePrint("Arch field is not all lowercase: {s}", .{field_name}));
1115
+ const coff_machine = @field(Arch, field_name).toCoffMachineType();
1115
1116
  _ = rvaRelocationTypeIndicator(coff_machine) orelse {
1116
- @compileError(std.fmt.comptimePrint("No RVA relocation for Arch: {s}", .{enum_field.name}));
1117
+ @compileError(std.fmt.comptimePrint("No RVA relocation for Arch: {s}", .{field_name}));
1117
1118
  };
1118
1119
  }
1119
1120
  }