feature. See also
. The project being documented here (as the example) is the Zig library itself.
reduce.transformationsToFixups
fn transformationsToFixups(
gpa: Allocator,
arena: Allocator,
io: Io,
root_source_file_path: []const u8,
transforms: []const Walk.Transformation,
fixups: *Ast.Render.Fixups,
) !void
File
Code
fn transformationsToFixups(
gpa: Allocator,
arena: Allocator,
io: Io,
root_source_file_path: []const u8,
transforms: []const Walk.Transformation,
fixups: *Ast.Render.Fixups,
) !void {
fixups.clearRetainingCapacity();
for (transforms) |t| switch (t) {
.gut_function => |fn_decl_node| {
try fixups.gut_functions.put(gpa, fn_decl_node, {});
},
.delete_node => |decl_node| {
try fixups.omit_nodes.put(gpa, decl_node, {});
},
.delete_var_decl => |delete_var_decl| {
try fixups.omit_nodes.put(gpa, delete_var_decl.var_decl_node, {});
for (delete_var_decl.references.items) |ident_node| {
try fixups.replace_nodes_with_string.put(gpa, ident_node, "undefined");
}
},
.replace_with_undef => |node| {
try fixups.replace_nodes_with_string.put(gpa, node, "undefined");
},
.replace_with_true => |node| {
try fixups.replace_nodes_with_string.put(gpa, node, "true");
},
.replace_with_false => |node| {
try fixups.replace_nodes_with_string.put(gpa, node, "false");
},
.replace_node => |r| {
try fixups.replace_nodes_with_node.put(gpa, r.to_replace, r.replacement);
},
.inline_imported_file => |inline_imported_file| {
const full_imported_path = try std.fs.path.join(gpa, &.{
std.fs.path.dirname(root_source_file_path) orelse ".",
inline_imported_file.imported_string,
});
defer gpa.free(full_imported_path);
var other_file_ast = try parse(gpa, io, full_imported_path);
defer {
gpa.free(other_file_ast.source);
other_file_ast.deinit(gpa);
}
var inlined_fixups: Ast.Render.Fixups = .{};
defer inlined_fixups.deinit(gpa);
if (std.fs.path.dirname(inline_imported_file.imported_string)) |dirname| {
inlined_fixups.rebase_imported_paths = dirname;
}
for (inline_imported_file.in_scope_names.keys()) |name| {
// ambiguous reference error.
var i: u32 = 2;
const mangled = while (true) : (i += 1) {
const mangled = try std.fmt.allocPrint(gpa, "{s}{d}", .{ name, i });
if (!inline_imported_file.in_scope_names.contains(mangled))
break mangled;
gpa.free(mangled);
};
try inlined_fixups.rename_identifiers.put(gpa, name, mangled);
}
defer {
for (inlined_fixups.rename_identifiers.values()) |v| {
gpa.free(v);
}
}
var other_source: std.Io.Writer.Allocating = .init(gpa);
defer other_source.deinit();
try other_source.writer.writeAll("struct {\n");
try other_file_ast.render(gpa, &other_source.writer, inlined_fixups);
try other_source.writer.writeAll("}");
try fixups.replace_nodes_with_string.put(
gpa,
inline_imported_file.builtin_call_node,
try arena.dupe(u8, other_source.written()),
);
},
};
}