zig-webgpu-gen

git clone git://git.electrosoup.com/zig-webgpu-gen
Log | Files | Refs

commit 81ee36dcbae6104b42a145c499c8ec60f1555d8b
parent 3ef25b96045f81e8bd7f82ef238cde76dfc333c2
Author: Christian Ermann <christianermann@gmail.com>
Date:   Sun,  1 Mar 2026 14:42:51 -0800

Improve bitflag rendering

Diffstat:
Msrc/main.zig | 55++++++++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 48 insertions(+), 7 deletions(-)

diff --git a/src/main.zig b/src/main.zig @@ -407,15 +407,52 @@ const BitFlag = struct { extended: ?bool = null, entries: []const ?BitFlagEntry, - pub fn render(self: BitFlag, writer: anytype) !void { + pub fn render(self: BitFlag, writer: anytype, indent: u32) !void { + try renderDoc(self, writer, indent); + try renderIndent(indent, writer); try writer.writeAll("pub const "); try snakeToPascal(self.name, writer); try writer.writeAll(" = packed struct(u64) {\n"); for (self.entries) |maybe_entry| { if (maybe_entry) |entry| { - try writer.print(" {s}: bool = false\n", .{ entry.name }); + if (entry.value) |value| { + _ = value; + return error.Unimplemented; + } + if (entry.value_combination) |value| { + _ = value; + continue; + } + try renderDoc(entry, writer, indent + 1); + try renderIndent(indent + 1, writer); + try writer.print("{s}: bool = false,\n", .{ entry.name }); } } + for (self.entries) |maybe_entry| { + if (maybe_entry) |entry| { + if (entry.value_combination) |values| { + try writer.writeAll("\n"); + try renderDoc(entry, writer, indent + 1); + try renderIndent(indent + 1, writer); + try writer.writeAll("pub fn "); + try snakeToCamel(entry.name, writer); + try writer.writeAll("() "); + try snakeToPascal(self.name, writer); + try writer.writeAll(" {\n"); + try renderIndent(indent + 2, writer); + try writer.writeAll("return .{\n"); + for (values) |value| { + try renderIndent(indent + 3, writer); + try writer.print(".{s} = true,\n", .{ value }); + } + try renderIndent(indent + 2, writer); + try writer.writeAll("}\n"); + try renderIndent(indent + 1, writer); + try writer.writeAll("}\n"); + } + } + } + try renderIndent(indent, writer); try writer.writeAll("};\n"); } }; @@ -425,7 +462,7 @@ const BitFlagEntry = struct { namespace: ?[]const u8 = null, doc: []const u8, value: ?Value64 = null, - value_combination: ?[][]const u8 = null + value_combination: ?[][]const u8 = null, }; const Struct = struct { @@ -570,9 +607,7 @@ fn renderDoc( if (token.len <= 0) { continue; } - for (0..indent) |_| { - try writer.writeAll(" "); - } + try renderIndent(indent, writer); try writer.print("/// {s}", .{ token }); if (!std.mem.endsWith(u8, token, "\n")) { try writer.writeAll("\n"); @@ -580,6 +615,12 @@ fn renderDoc( } } +fn renderIndent(indent: u32, writer: anytype) !void { + for (0..indent) |_| { + try writer.writeAll(" "); + } +} + pub fn main() !void { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; const allocator = gpa.allocator(); @@ -613,7 +654,7 @@ pub fn main() !void { } try stdout.writeAll("// bitflags\n"); for (parsed.value.bitflags) |bitflag| { - try bitflag.render(stdout); + try bitflag.render(stdout, 0); try stdout.writeAll("\n"); } try stdout.writeAll("// structs\n");