feature. See also
. The project being documented here (as the example) is the Zig library itself.
ZonGen.generate
pub fn generate(gpa: Allocator, tree: Ast, options: Options) Allocator.Error!Zoir
File
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);
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 = &.{},
};
}
}