DoxigAlpha

renderContainerField

Function parameters

Parameters

#
r:*Render
field_param:Ast.full.ContainerField

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();
    }
}