Zig 0.17.0-dev (Split by item)

This is an example of documentation generated by ZigDoc, an alternative to Zig's built-in Auto Doc feature. See also examples in other modes/formats. The project being documented here (as the example) is the Zig library itself.

generate

ZonGen.generate
pub fn generate(gpa: Allocator, tree: Ast, options: Options) Allocator.Error!Zoir

File

lib/std/zig/ZonGen.zig:36

Code

pub fn generate(gpa: Allocator, tree: Ast, options: Options) Allocator.Error!Zoir {
    assert(tree.mode == .zon);

    var zg: ZonGen = .{
        .gpa = gpa,
        .tree = tree,
        .options = options,
        .nodes = .empty,
        .extra = .empty,
        .limbs = .empty,
        .string_bytes = .empty,
        .string_table = .empty,
        .compile_errors = .empty,
        .error_notes = .empty,
    };
    defer {
        zg.nodes.deinit(gpa);
        zg.extra.deinit(gpa);
        zg.limbs.deinit(gpa);
        zg.string_bytes.deinit(gpa);
        zg.string_table.deinit(gpa);
        zg.compile_errors.deinit(gpa);
        zg.error_notes.deinit(gpa);
    }

    if (tree.errors.len == 0) {
        const root_ast_node = tree.rootDecls()[0];
        try zg.nodes.append(gpa, undefined); // index 0; root node
        try zg.expr(root_ast_node, .root);
    } else {
        try zg.lowerAstErrors();
    }

    if (zg.compile_errors.items.len > 0) {
        try zg.string_bytes.shrinkToLen(gpa);
        try zg.compile_errors.shrinkToLen(gpa);
        try zg.error_notes.shrinkToLen(gpa);

        return .{
            .nodes = .empty,
            .extra = &.{},
            .limbs = &.{},
            .string_bytes = zg.string_bytes.toOwnedSliceAssert(),
            .compile_errors = zg.compile_errors.toOwnedSliceAssert(),
            .error_notes = zg.error_notes.toOwnedSliceAssert(),
        };
    } else {
        assert(zg.error_notes.items.len == 0);

        try zg.extra.shrinkToLen(gpa);
        try zg.limbs.shrinkToLen(gpa);
        try zg.string_bytes.shrinkToLen(gpa);

        return .{
            .nodes = zg.nodes.toOwnedSlice(),
            .extra = zg.extra.toOwnedSliceAssert(),
            .limbs = zg.limbs.toOwnedSliceAssert(),
            .string_bytes = zg.string_bytes.toOwnedSliceAssert(),
            .compile_errors = &.{},
            .error_notes = &.{},
        };
    }
}