| ... | @@ -185,7 +185,7 @@ fn prepopulateGlobalNameTable(c: *Context) !void { | ... | @@ -185,7 +185,7 @@ fn prepopulateGlobalNameTable(c: *Context) !void { |
| 185 | for (c.tree.root_decls) |node| { | 185 | for (c.tree.root_decls) |node| { |
| 186 | const data = node_data[@intFromEnum(node)]; | 186 | const data = node_data[@intFromEnum(node)]; |
| 187 | switch (node_tags[@intFromEnum(node)]) { | 187 | switch (node_tags[@intFromEnum(node)]) { |
| 188 | .typedef => @panic("TODO"), | 188 | .typedef => {}, |
| 189 | | 189 | |
| 190 | .struct_decl_two, | 190 | .struct_decl_two, |
| 191 | .union_decl_two, | 191 | .union_decl_two, |
| ... | @@ -309,8 +309,46 @@ fn transDecl(c: *Context, scope: *Scope, decl: NodeIndex) !void { | ... | @@ -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 { | 312 | fn transTypeDef(c: *Context, scope: *Scope, typedef_decl: NodeIndex) Error!void { |
| 313 | @panic("TODO"); | 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 | fn mangleWeakGlobalName(c: *Context, want_name: []const u8) ![]const u8 { | 354 | fn mangleWeakGlobalName(c: *Context, want_name: []const u8) ![]const u8 { |