| ... | ... | @@ -185,7 +185,7 @@ fn prepopulateGlobalNameTable(c: *Context) !void { |
| 185 | 185 | for (c.tree.root_decls) |node| { |
| 186 | 186 | const data = node_data[@intFromEnum(node)]; |
| 187 | 187 | switch (node_tags[@intFromEnum(node)]) { |
| 188 | | .typedef => @panic("TODO"), |
| 188 | .typedef => {}, |
| 189 | 189 | |
| 190 | 190 | .struct_decl_two, |
| 191 | 191 | .union_decl_two, |
| ... | ... | @@ -309,8 +309,46 @@ fn transDecl(c: *Context, scope: *Scope, decl: NodeIndex) !void { |
| 309 | 309 | } |
| 310 | 310 | } |
| 311 | 311 | |
| 312 | | fn transTypeDef(_: *Context, _: *Scope, _: NodeIndex) Error!void { |
| 313 | | @panic("TODO"); |
| 312 | fn transTypeDef(c: *Context, scope: *Scope, typedef_decl: NodeIndex) Error!void { |
| 313 | const ty = c.tree.nodes.items(.ty)[@intFromEnum(typedef_decl)]; |
| 314 | const data = c.tree.nodes.items(.data)[@intFromEnum(typedef_decl)]; |
| 315 | |
| 316 | const toplevel = scope.id == .root; |
| 317 | const bs: *Scope.Block = if (!toplevel) try scope.findBlockScope(c) else undefined; |
| 318 | |
| 319 | var name: []const u8 = c.tree.tokSlice(data.decl.name); |
| 320 | try c.typedefs.put(c.gpa, name, {}); |
| 321 | |
| 322 | if (!toplevel) name = try bs.makeMangledName(c, name); |
| 323 | |
| 324 | const typedef_loc = data.decl.name; |
| 325 | const init_node = transType(c, scope, ty, .standard, typedef_loc) catch |err| switch (err) { |
| 326 | error.UnsupportedType => { |
| 327 | return failDecl(c, typedef_loc, name, "unable to resolve typedef child type", .{}); |
| 328 | }, |
| 329 | error.OutOfMemory => |e| return e, |
| 330 | }; |
| 331 | |
| 332 | const payload = try c.arena.create(ast.Payload.SimpleVarDecl); |
| 333 | payload.* = .{ |
| 334 | .base = .{ .tag = ([2]ZigTag{ .var_simple, .pub_var_simple })[@intFromBool(toplevel)] }, |
| 335 | .data = .{ |
| 336 | .name = name, |
| 337 | .init = init_node, |
| 338 | }, |
| 339 | }; |
| 340 | const node = ZigNode.initPayload(&payload.base); |
| 341 | |
| 342 | if (toplevel) { |
| 343 | try addTopLevelDecl(c, name, node); |
| 344 | } else { |
| 345 | try scope.appendNode(node); |
| 346 | if (node.tag() != .pub_var_simple) { |
| 347 | try bs.discardVariable(c, name); |
| 348 | } |
| 349 | } |
| 350 | |
| 351 | |
| 314 | 352 | } |
| 315 | 353 | |
| 316 | 354 | fn mangleWeakGlobalName(c: *Context, want_name: []const u8) ![]const u8 { |