feature. See also
. The project being documented here (as the example) is the Zig library itself.
Render.renderThenElse
fn renderThenElse(
r: *Render,
last_prefix_token: Ast.TokenIndex,
then_expr: Ast.Node.Index,
else_token: ?Ast.TokenIndex,
maybe_error_token: ?Ast.TokenIndex,
opt_else_expr: Ast.Node.OptionalIndex,
space: Space,
) Error!void
File
Code
fn renderThenElse(
r: *Render,
last_prefix_token: Ast.TokenIndex,
then_expr: Ast.Node.Index,
else_token: ?Ast.TokenIndex,
maybe_error_token: ?Ast.TokenIndex,
opt_else_expr: Ast.Node.OptionalIndex,
space: Space,
) Error!void {
const tree = r.tree;
const ais = r.ais;
const then_expr_is_block = nodeIsBlock(tree.nodeTag(then_expr));
const then_expr_first_token = tree.firstToken(then_expr);
const indent_then_expr = !then_expr_is_block and
(!tree.tokensOnSameLine(last_prefix_token, then_expr_first_token) or
tree.tokenTag(then_expr_first_token) == .multiline_string_literal_line);
if (indent_then_expr) try ais.pushIndent(.normal);
if (then_expr_is_block and ais.isLineOverIndented()) {
ais.disableIndentCommitting();
try renderToken(r, last_prefix_token, .newline);
ais.enableIndentCommitting();
} else if (indent_then_expr) {
try renderToken(r, last_prefix_token, .newline);
} else {
try renderToken(r, last_prefix_token, .space);
}
if (opt_else_expr.unwrap()) |else_expr| {
if (indent_then_expr) {
try renderExpression(r, then_expr, .newline);
} else {
try renderExpression(r, then_expr, .space);
}
if (indent_then_expr) ais.popIndent();
var last_else_token = else_token.?;
if (maybe_error_token) |error_token| {
try renderToken(r, last_else_token, .space);
try renderToken(r, error_token - 1, .none);
try renderIdentifier(r, error_token, .none, .preserve_when_shadowing);
last_else_token = error_token + 1;
}
const indent_else_expr = indent_then_expr and
!nodeIsBlock(tree.nodeTag(else_expr)) and
!nodeIsIfForWhileSwitch(tree.nodeTag(else_expr)) or
tree.tokenTag(tree.firstToken(else_expr)) ==
.multiline_string_literal_line;
if (indent_else_expr) {
try ais.pushIndent(.normal);
try renderToken(r, last_else_token, .newline);
try renderExpression(r, else_expr, space);
ais.popIndent();
} else {
try renderToken(r, last_else_token, .space);
try renderExpression(r, else_expr, space);
}
} else {
try renderExpression(r, then_expr, space);
if (indent_then_expr) ais.popIndent();
}
}