feature. See also
. The project being documented here (as the example) is the Zig library itself.
Render.renderVarDeclWithoutFixups
fn renderVarDeclWithoutFixups(
r: *Render,
var_decl: Ast.full.VarDecl,
ignore_comptime_token: bool,
space: Space,
) Error!void
File
Code
fn renderVarDeclWithoutFixups(
r: *Render,
var_decl: Ast.full.VarDecl,
ignore_comptime_token: bool,
space: Space,
) Error!void {
const tree = r.tree;
const ais = r.ais;
if (var_decl.visib_token) |visib_token| {
try renderToken(r, visib_token, Space.space);
}
if (var_decl.extern_export_token) |extern_export_token| {
try renderToken(r, extern_export_token, Space.space);
if (var_decl.lib_name) |lib_name| {
try renderToken(r, lib_name, Space.space);
}
}
if (var_decl.threadlocal_token) |thread_local_token| {
try renderToken(r, thread_local_token, Space.space);
}
if (!ignore_comptime_token) {
if (var_decl.comptime_token) |comptime_token| {
try renderToken(r, comptime_token, Space.space);
}
}
try renderToken(r, var_decl.ast.mut_token, .space);
const last_component: enum {
value,
@"linksection",
@"addrspace",
@"align",
type,
identifier,
} = if (var_decl.ast.init_node != .none)
.value
else if (var_decl.ast.section_node != .none)
.@"linksection"
else if (var_decl.ast.addrspace_node != .none)
.@"addrspace"
else if (var_decl.ast.align_node != .none)
.@"align"
else if (var_decl.ast.type_node != .none)
.type
else
.identifier;
if (last_component == .identifier) {
return renderIdentifier(r, var_decl.ast.mut_token + 1, space, .preserve_when_shadowing);
}
const after_ident_space: Space = if (var_decl.ast.type_node != .none) .none else .space;
try renderIdentifier(r, var_decl.ast.mut_token + 1, after_ident_space, .preserve_when_shadowing);
if (var_decl.ast.type_node.unwrap()) |type_node| {
try renderToken(r, var_decl.ast.mut_token + 2, .maybe_space);
if (last_component == .type) {
return renderExpression(r, type_node, space);
}
try renderExpression(r, type_node, .space);
}
if (var_decl.ast.align_node.unwrap()) |align_node| {
const lparen = tree.firstToken(align_node) - 1;
const align_kw = lparen - 1;
const rparen = tree.lastToken(align_node) + 1;
try renderToken(r, align_kw, Space.none);
try renderToken(r, lparen, Space.none);
try renderExpression(r, align_node, Space.none);
if (last_component == .@"align") {
return renderToken(r, rparen, space);
}
try renderToken(r, rparen, .space);
}
if (var_decl.ast.addrspace_node.unwrap()) |addrspace_node| {
const lparen = tree.firstToken(addrspace_node) - 1;
const addrspace_kw = lparen - 1;
const rparen = tree.lastToken(addrspace_node) + 1;
try renderToken(r, addrspace_kw, Space.none);
try renderToken(r, lparen, Space.none);
try renderExpression(r, addrspace_node, Space.none);
if (last_component == .@"addrspace") {
return renderToken(r, rparen, space);
}
try renderToken(r, rparen, .space);
}
if (var_decl.ast.section_node.unwrap()) |section_node| {
const lparen = tree.firstToken(section_node) - 1;
const section_kw = lparen - 1;
const rparen = tree.lastToken(section_node) + 1;
try renderToken(r, section_kw, Space.none);
try renderToken(r, lparen, Space.none);
try renderExpression(r, section_node, Space.none);
if (last_component == .@"linksection") {
return renderToken(r, rparen, space);
}
try renderToken(r, rparen, .space);
}
assert(last_component == .value);
const init_node = var_decl.ast.init_node.unwrap().?;
const eq_token = tree.firstToken(init_node) - 1;
const rhs_seperate_line = !tree.tokensOnSameLine(eq_token, eq_token + 1) or
tree.tokenTag(eq_token + 1) == .multiline_string_literal_line;
const eq_space: Space = if (rhs_seperate_line) .newline else .space;
try ais.pushIndent(.after_equals);
try renderToken(r, eq_token, eq_space);
try renderExpression(r, init_node, space);
ais.popIndent();
}