feature. See also
. The project being documented here (as the example) is the Zig library itself.
Translator.prepopulateGlobalNameTable
fn prepopulateGlobalNameTable(t: *Translator) !void
File
Code
fn prepopulateGlobalNameTable(t: *Translator) !void {
for (t.tree.root_decls.items) |decl| {
switch (decl.get(t.tree)) {
.typedef => |typedef_decl| {
const decl_name = t.tree.tokSlice(typedef_decl.name_tok);
try t.global_names.put(t.gpa, decl_name, {});
const base = typedef_decl.qt.base(t.comp);
switch (base.type) {
.@"enum" => |enum_ty| {
if (enum_ty.name.lookup(t.comp)[0] != '(') continue;
},
.@"struct", .@"union" => |record_ty| {
if (record_ty.name.lookup(t.comp)[0] != '(') continue;
},
else => continue,
}
const gop = try t.unnamed_typedefs.getOrPut(t.gpa, base.qt);
if (gop.found_existing) {
// Don't put this one in `decl_table` so it's processed later.
continue;
}
gop.value_ptr.* = decl_name;
try t.type_decls.put(t.gpa, decl, decl_name);
try t.typedefs.put(t.gpa, decl_name, {});
},
.struct_decl,
.union_decl,
.struct_forward_decl,
.union_forward_decl,
.enum_decl,
.enum_forward_decl,
=> {
const decl_qt = decl.qt(t.tree);
const prefix, const name = switch (decl_qt.base(t.comp).type) {
.@"struct" => |struct_ty| .{ "struct", struct_ty.name.lookup(t.comp) },
.@"union" => |union_ty| .{ "union", union_ty.name.lookup(t.comp) },
.@"enum" => |enum_ty| .{ "enum", enum_ty.name.lookup(t.comp) },
else => unreachable,
};
const prefixed_name = try std.fmt.allocPrint(t.arena, "{s}_{s}", .{ prefix, name });
// However, we can name it anything else if necessary, so these are "weak names".
try t.weak_global_names.ensureUnusedCapacity(t.gpa, 2);
t.weak_global_names.putAssumeCapacity(name, {});
t.weak_global_names.putAssumeCapacity(prefixed_name, {});
},
.function, .variable => {
const decl_name = t.tree.tokSlice(decl.tok(t.tree));
try t.global_names.put(t.gpa, decl_name, {});
},
.static_assert => {},
.empty_decl => {},
.global_asm => {},
else => unreachable,
}
}
for (t.pp.defines.keys(), t.pp.defines.values()) |name, macro| {
if (macro.isBuiltin()) continue;
if (!t.isSelfDefinedMacro(name, macro)) {
try t.global_names.put(t.gpa, name, {});
}
}
}