feature. See also
. The project being documented here (as the example) is the Zig library itself.
Render.renderContainerDecl
fn renderContainerDecl(
r: *Render,
container_decl_node: Ast.Node.Index,
container_decl: Ast.full.ContainerDecl,
space: Space,
) Error!void
File
Code
fn renderContainerDecl(
r: *Render,
container_decl_node: Ast.Node.Index,
container_decl: Ast.full.ContainerDecl,
space: Space,
) Error!void {
const tree = r.tree;
const ais = r.ais;
if (container_decl.layout_token) |layout_token| {
try renderToken(r, layout_token, .space);
}
const container: Container = switch (tree.tokenTag(container_decl.ast.main_token)) {
.keyword_enum => .@"enum",
.keyword_struct => for (container_decl.ast.members) |member| {
if (tree.fullContainerField(member)) |field| if (!field.ast.tuple_like) break .other;
} else .tuple,
else => .other,
};
var lbrace: Ast.TokenIndex = undefined;
if (container_decl.ast.enum_token) |enum_token| {
try renderToken(r, container_decl.ast.main_token, .none);
try renderToken(r, enum_token - 1, .none);
try renderToken(r, enum_token, .none);
if (container_decl.ast.arg.unwrap()) |arg| {
try renderToken(r, enum_token + 1, .none);
try renderExpression(r, arg, .none);
const rparen = tree.lastToken(arg) + 1;
try renderToken(r, rparen, .none);
try renderToken(r, rparen + 1, .space);
lbrace = rparen + 2;
} else {
try renderToken(r, enum_token + 1, .space);
lbrace = enum_token + 2;
}
} else if (container_decl.ast.arg.unwrap()) |arg| {
try renderToken(r, container_decl.ast.main_token, .none);
try renderToken(r, container_decl.ast.main_token + 1, .none);
try renderExpression(r, arg, .none);
const rparen = tree.lastToken(arg) + 1;
try renderToken(r, rparen, .space);
lbrace = rparen + 1;
} else {
try renderToken(r, container_decl.ast.main_token, .space);
lbrace = container_decl.ast.main_token + 1;
}
const rbrace = tree.lastToken(container_decl_node);
if (container_decl.ast.members.len == 0) {
try ais.pushIndent(.normal);
if (tree.tokenTag(lbrace + 1) == .container_doc_comment) {
try renderToken(r, lbrace, .newline);
try renderContainerDocComments(r, lbrace + 1);
} else {
try renderToken(r, lbrace, .none);
}
ais.popIndent();
return renderToken(r, rbrace, space);
}
const src_has_trailing_comma = tree.tokenTag(rbrace - 1) == .comma;
if (!src_has_trailing_comma and isOneLineContainerDecl(tree, container_decl, lbrace, rbrace)) {
try renderToken(r, lbrace, .space);
for (container_decl.ast.members) |member| {
try renderMember(r, container, member, .space);
}
return renderToken(r, rbrace, space);
}
try ais.pushIndent(.normal);
try renderToken(r, lbrace, .newline);
if (tree.tokenTag(lbrace + 1) == .container_doc_comment) {
try renderContainerDocComments(r, lbrace + 1);
}
for (container_decl.ast.members, 0..) |member, i| {
if (i != 0) try renderExtraNewline(r, member);
switch (tree.nodeTag(member)) {
.container_field_init,
.container_field_align,
.container_field,
=> {
try ais.pushSpace(.comma);
try renderMember(r, container, member, .comma);
ais.popSpace();
},
else => try renderMember(r, container, member, .newline),
}
}
ais.popIndent();
return renderToken(r, rbrace, space);
}