renderSwitchCase
Function parameters
Parameters
Type definitions in this namespace
Types
Functions in this namespace
Functions
Error sets in this namespace
Error Sets
Source
Implementation
fn renderSwitchCase(
r: *Render,
switch_case: Ast.full.SwitchCase,
space: Space,
) Error!void {
const ais = r.ais;
const tree = r.tree;
const trailing_comma = tree.tokenTag(switch_case.ast.arrow_token - 1) == .comma;
const has_comment_before_arrow = blk: {
if (switch_case.ast.values.len == 0) break :blk false;
break :blk hasComment(tree, tree.firstToken(switch_case.ast.values[0]), switch_case.ast.arrow_token);
};
// render inline keyword
if (switch_case.inline_token) |some| {
try renderToken(r, some, .space);
}
// Render everything before the arrow
if (switch_case.ast.values.len == 0) {
try renderToken(r, switch_case.ast.arrow_token - 1, .space); // else keyword
} else if (trailing_comma or has_comment_before_arrow) {
// Render each value on a new line
try ais.pushSpace(.comma);
try renderExpressions(r, switch_case.ast.values, .comma);
ais.popSpace();
} else {
// Render on one line
for (switch_case.ast.values) |value_expr| {
try renderExpression(r, value_expr, .comma_space);
}
}
// Render the arrow and everything after it
const pre_target_space = if (tree.nodeTag(switch_case.ast.target_expr) == .multiline_string_literal)
// Newline gets inserted when rendering the target expr.
Space.none
else
Space.space;
const after_arrow_space: Space = if (switch_case.payload_token == null) pre_target_space else .space;
try renderToken(r, switch_case.ast.arrow_token, after_arrow_space); // =>
if (switch_case.payload_token) |payload_token| {
try renderToken(r, payload_token - 1, .none); // pipe
const ident = payload_token + @intFromBool(tree.tokenTag(payload_token) == .asterisk);
if (tree.tokenTag(payload_token) == .asterisk) {
try renderToken(r, payload_token, .none); // asterisk
}
try renderIdentifier(r, ident, .none, .preserve_when_shadowing); // identifier
if (tree.tokenTag(ident + 1) == .comma) {
try renderToken(r, ident + 1, .space); // ,
try renderIdentifier(r, ident + 2, .none, .preserve_when_shadowing); // identifier
try renderToken(r, ident + 3, pre_target_space); // pipe
} else {
try renderToken(r, ident + 1, pre_target_space); // pipe
}
}
try renderExpression(r, switch_case.ast.target_expr, space);
}