Parse & render sType from spec (fixes #3)

This commit is contained in:
Robin Voetter
2020-11-26 15:47:04 +01:00
parent 646d74ab6a
commit 7fdb6eaad3
3 changed files with 21 additions and 3 deletions

View File

@@ -171,9 +171,16 @@ fn parseContainer(allocator: *Allocator, ty: *xml.Element, is_union: bool) !regi
var i: usize = 0; var i: usize = 0;
var it = ty.findChildrenByTag("member"); var it = ty.findChildrenByTag("member");
var maybe_stype: ?[]const u8 = null;
while (it.next()) |member| { while (it.next()) |member| {
var xctok = cparse.XmlCTokenizer.init(member); var xctok = cparse.XmlCTokenizer.init(member);
members[i] = try cparse.parseMember(allocator, &xctok); members[i] = try cparse.parseMember(allocator, &xctok);
if (mem.eql(u8, members[i].name, "sType")) {
if (member.getAttribute("values")) |stype| {
maybe_stype = stype;
}
}
i += 1; i += 1;
} }
@@ -194,6 +201,7 @@ fn parseContainer(allocator: *Allocator, ty: *xml.Element, is_union: bool) !regi
.name = name, .name = name,
.decl_type = .{ .decl_type = .{
.container = .{ .container = .{
.stype = maybe_stype,
.fields = members, .fields = members,
.is_union = is_union, .is_union = is_union,
} }

View File

@@ -64,6 +64,7 @@ pub const Container = struct {
is_buffer_len: bool, is_buffer_len: bool,
}; };
stype: ?[]const u8,
fields: []Field, fields: []Field,
is_union: bool, is_union: bool,
}; };

View File

@@ -638,7 +638,7 @@ fn Renderer(comptime WriterType: type) type {
} }
} else { } else {
try self.renderTypeInfo(field.field_type); try self.renderTypeInfo(field.field_type);
try self.renderContainerDefaultField(name, field); try self.renderContainerDefaultField(container, field);
try self.writer.writeAll(", "); try self.writer.writeAll(", ");
} }
} }
@@ -646,12 +646,21 @@ fn Renderer(comptime WriterType: type) type {
try self.writer.writeAll("};\n"); try self.writer.writeAll("};\n");
} }
fn renderContainerDefaultField(self: *Self, name: []const u8, field: reg.Container.Field) !void { fn renderContainerDefaultField(self: *Self, container: reg.Container, field: reg.Container.Field) !void {
if (mem.eql(u8, field.name, "pNext")) { if (mem.eql(u8, field.name, "pNext")) {
try self.writer.writeAll(" = null"); try self.writer.writeAll(" = null");
} else if (mem.eql(u8, field.name, "sType")) { } else if (mem.eql(u8, field.name, "sType")) {
if (container.stype == null) {
return;
}
const stype = container.stype.?;
if (!mem.startsWith(u8, stype, "VK_STRUCTURE_TYPE_")) {
return error.InvalidRegistry;
}
try self.writer.writeAll(" = ."); try self.writer.writeAll(" = .");
try self.writeIdentifierWithCase(.snake, trimVkNamespace(name)); try self.writeIdentifierWithCase(.snake, stype["VK_STRUCTURE_TYPE_".len ..]);
} }
} }