renderContainerField
Function parameters
Parameters
Type definitions in this namespace
Types
Functions in this namespace
Functions
Error sets in this namespace
Error Sets
Source
Implementation
fn renderContainerField(
r: *Render,
container: Container,
field_param: Ast.full.ContainerField,
space: Space,
) Error!void {
const tree = r.tree;
const ais = r.ais;
var field = field_param;
if (container != .tuple) field.convertToNonTupleLike(&tree);
const quote: QuoteBehavior = switch (container) {
.@"enum" => .eagerly_unquote_except_underscore,
.tuple, .other => .eagerly_unquote,
};
if (field.comptime_token) |t| {
try renderToken(r, t, .space); // comptime
}
if (field.ast.type_expr == .none and field.ast.value_expr == .none) {
if (field.ast.align_expr.unwrap()) |align_expr| {
try renderIdentifier(r, field.ast.main_token, .space, quote); // name
const lparen_token = tree.firstToken(align_expr) - 1;
const align_kw = lparen_token - 1;
const rparen_token = tree.lastToken(align_expr) + 1;
try renderToken(r, align_kw, .none); // align
try renderToken(r, lparen_token, .none); // (
try renderExpression(r, align_expr, .none); // alignment
return renderToken(r, rparen_token, .space); // )
}
return renderIdentifierComma(r, field.ast.main_token, space, quote); // name
}
if (field.ast.type_expr != .none and field.ast.value_expr == .none) {
const type_expr = field.ast.type_expr.unwrap().?;
if (!field.ast.tuple_like) {
try renderIdentifier(r, field.ast.main_token, .none, quote); // name
try renderToken(r, field.ast.main_token + 1, .space); // :
}
if (field.ast.align_expr.unwrap()) |align_expr| {
try renderExpression(r, type_expr, .space); // type
const align_token = tree.firstToken(align_expr) - 2;
try renderToken(r, align_token, .none); // align
try renderToken(r, align_token + 1, .none); // (
try renderExpression(r, align_expr, .none); // alignment
const rparen = tree.lastToken(align_expr) + 1;
return renderTokenComma(r, rparen, space); // )
} else {
return renderExpressionComma(r, type_expr, space); // type
}
}
if (field.ast.type_expr == .none and field.ast.value_expr != .none) {
const value_expr = field.ast.value_expr.unwrap().?;
try renderIdentifier(r, field.ast.main_token, .space, quote); // name
if (field.ast.align_expr.unwrap()) |align_expr| {
const lparen_token = tree.firstToken(align_expr) - 1;
const align_kw = lparen_token - 1;
const rparen_token = tree.lastToken(align_expr) + 1;
try renderToken(r, align_kw, .none); // align
try renderToken(r, lparen_token, .none); // (
try renderExpression(r, align_expr, .none); // alignment
try renderToken(r, rparen_token, .space); // )
}
try renderToken(r, field.ast.main_token + 1, .space); // =
return renderExpressionComma(r, value_expr, space); // value
}
if (!field.ast.tuple_like) {
try renderIdentifier(r, field.ast.main_token, .none, quote); // name
try renderToken(r, field.ast.main_token + 1, .space); // :
}
const type_expr = field.ast.type_expr.unwrap().?;
const value_expr = field.ast.value_expr.unwrap().?;
try renderExpression(r, type_expr, .space); // type
if (field.ast.align_expr.unwrap()) |align_expr| {
const lparen_token = tree.firstToken(align_expr) - 1;
const align_kw = lparen_token - 1;
const rparen_token = tree.lastToken(align_expr) + 1;
try renderToken(r, align_kw, .none); // align
try renderToken(r, lparen_token, .none); // (
try renderExpression(r, align_expr, .none); // alignment
try renderToken(r, rparen_token, .space); // )
}
const eq_token = tree.firstToken(value_expr) - 1;
const eq_space: Space = if (tree.tokensOnSameLine(eq_token, eq_token + 1)) .space else .newline;
try ais.pushIndent(.after_equals);
try renderToken(r, eq_token, eq_space); // =
if (eq_space == .space) {
ais.popIndent();
try renderExpressionComma(r, value_expr, space); // value
return;
}
const maybe_comma = tree.lastToken(value_expr) + 1;
if (tree.tokenTag(maybe_comma) == .comma) {
try renderExpression(r, value_expr, .none); // value
ais.popIndent();
try renderToken(r, maybe_comma, .newline);
} else {
try renderExpression(r, value_expr, space); // value
ais.popIndent();
}
}