feature. See also
. The project being documented here (as the example) is the Zig library itself.
Translator.transTypeDef
fn transTypeDef(t: *Translator, scope: *Scope, typedef_node: Node.Index) Error!void
File
Code
fn transTypeDef(t: *Translator, scope: *Scope, typedef_node: Node.Index) Error!void {
const typedef_decl = typedef_node.get(t.tree).typedef;
if (t.type_decls.get(typedef_node)) |_|
return;
const toplevel = scope.id == .root;
const bs: *Scope.Block = if (!toplevel) try scope.findBlockScope(t) else undefined;
var name: []const u8 = t.tree.tokSlice(typedef_decl.name_tok);
try t.typedefs.put(t.gpa, name, {});
if (builtin_typedef_map.get(name)) |builtin| {
return t.type_decls.putNoClobber(t.gpa, typedef_node, builtin);
}
if (!toplevel) name = try bs.makeMangledName(name);
try t.type_decls.putNoClobber(t.gpa, typedef_node, name);
const typedef_loc = typedef_decl.name_tok;
const init_node = t.transType(scope, typedef_decl.qt, typedef_loc) catch |err| switch (err) {
error.UnsupportedType => {
return t.failDecl(scope, typedef_loc, name, "unable to resolve typedef child type", .{});
},
error.OutOfMemory => |e| return e,
};
const payload = try t.arena.create(ast.Payload.SimpleVarDecl);
payload.* = .{
.base = .{ .tag = if (toplevel) .pub_var_simple else .var_simple },
.data = .{
.name = name,
.init = init_node,
},
};
const node = ZigNode.initPayload(&payload.base);
if (toplevel) {
try t.addTopLevelDecl(name, node);
} else {
try scope.appendNode(node);
try bs.discardVariable(name);
}
}