authorgravatar for spexguy070@gmail.comMartin Wickham <spexguy070@gmail.com> 2021-10-01 12:05:12-05:00
committergravatar for spexguy070@gmail.comMartin Wickham <spexguy070@gmail.com> 2021-10-02 15:21:48-05:00
log53a36eacfa145244902e9230243c76892d141b03
tree6d750e53c9b86537f9ddfdeda7a24ee54356a7e9
parentd1a4bdb1f375b6aa737f1c02c346899336465e00

Remove my dumb "namespace decl" hack


9 files changed, 96 insertions(+), 87 deletions(-)

src/Compilation.zig+7-7
...@@ -1770,7 +1770,7 @@ pub fn update(self: *Compilation) !void {...@@ -1770,7 +1770,7 @@ pub fn update(self: *Compilation) !void {
1770 assert(decl.deletion_flag);1770 assert(decl.deletion_flag);
1771 assert(decl.dependants.count() == 0);1771 assert(decl.dependants.count() == 0);
1772 const is_anon = if (decl.zir_decl_index == 0) blk: {1772 const is_anon = if (decl.zir_decl_index == 0) blk: {
1773 break :blk decl.namespace.anon_decls.swapRemove(decl);1773 break :blk decl.src_namespace.anon_decls.swapRemove(decl);
1774 } else false;1774 } else false;
17751775
1776 try module.clearDecl(decl, null);1776 try module.clearDecl(decl, null);
...@@ -1889,13 +1889,13 @@ pub fn totalErrorCount(self: *Compilation) usize {...@@ -1889,13 +1889,13 @@ pub fn totalErrorCount(self: *Compilation) usize {
1889 // the previous parse success, including compile errors, but we cannot1889 // the previous parse success, including compile errors, but we cannot
1890 // emit them until the file succeeds parsing.1890 // emit them until the file succeeds parsing.
1891 for (module.failed_decls.keys()) |key| {1891 for (module.failed_decls.keys()) |key| {
1892 if (key.namespace.file_scope.okToReportErrors()) {1892 if (key.getFileScope().okToReportErrors()) {
1893 total += 1;1893 total += 1;
1894 }1894 }
1895 }1895 }
1896 if (module.emit_h) |emit_h| {1896 if (module.emit_h) |emit_h| {
1897 for (emit_h.failed_decls.keys()) |key| {1897 for (emit_h.failed_decls.keys()) |key| {
1898 if (key.namespace.file_scope.okToReportErrors()) {1898 if (key.getFileScope().okToReportErrors()) {
1899 total += 1;1899 total += 1;
1900 }1900 }
1901 }1901 }
...@@ -1968,7 +1968,7 @@ pub fn getAllErrorsAlloc(self: *Compilation) !AllErrors {...@@ -1968,7 +1968,7 @@ pub fn getAllErrorsAlloc(self: *Compilation) !AllErrors {
1968 while (it.next()) |entry| {1968 while (it.next()) |entry| {
1969 // Skip errors for Decls within files that had a parse failure.1969 // Skip errors for Decls within files that had a parse failure.
1970 // We'll try again once parsing succeeds.1970 // We'll try again once parsing succeeds.
1971 if (entry.key_ptr.*.namespace.file_scope.okToReportErrors()) {1971 if (entry.key_ptr.*.getFileScope().okToReportErrors()) {
1972 try AllErrors.add(module, &arena, &errors, entry.value_ptr.*.*);1972 try AllErrors.add(module, &arena, &errors, entry.value_ptr.*.*);
1973 }1973 }
1974 }1974 }
...@@ -1978,7 +1978,7 @@ pub fn getAllErrorsAlloc(self: *Compilation) !AllErrors {...@@ -1978,7 +1978,7 @@ pub fn getAllErrorsAlloc(self: *Compilation) !AllErrors {
1978 while (it.next()) |entry| {1978 while (it.next()) |entry| {
1979 // Skip errors for Decls within files that had a parse failure.1979 // Skip errors for Decls within files that had a parse failure.
1980 // We'll try again once parsing succeeds.1980 // We'll try again once parsing succeeds.
1981 if (entry.key_ptr.*.namespace.file_scope.okToReportErrors()) {1981 if (entry.key_ptr.*.getFileScope().okToReportErrors()) {
1982 try AllErrors.add(module, &arena, &errors, entry.value_ptr.*.*);1982 try AllErrors.add(module, &arena, &errors, entry.value_ptr.*.*);
1983 }1983 }
1984 }1984 }
...@@ -2169,12 +2169,12 @@ pub fn performAllTheWork(self: *Compilation) error{ TimerUnsupported, OutOfMemor...@@ -2169,12 +2169,12 @@ pub fn performAllTheWork(self: *Compilation) error{ TimerUnsupported, OutOfMemor
2169 defer air.deinit(gpa);2169 defer air.deinit(gpa);
21702170
2171 log.debug("analyze liveness of {s}", .{decl.name});2171 log.debug("analyze liveness of {s}", .{decl.name});
2172 var liveness = try Liveness.analyze(gpa, air, decl.namespace.file_scope.zir);2172 var liveness = try Liveness.analyze(gpa, air, decl.getFileScope().zir);
2173 defer liveness.deinit(gpa);2173 defer liveness.deinit(gpa);
21742174
2175 if (builtin.mode == .Debug and self.verbose_air) {2175 if (builtin.mode == .Debug and self.verbose_air) {
2176 std.debug.print("# Begin Function AIR: {s}:\n", .{decl.name});2176 std.debug.print("# Begin Function AIR: {s}:\n", .{decl.name});
2177 @import("print_air.zig").dump(gpa, air, decl.namespace.file_scope.zir, liveness);2177 @import("print_air.zig").dump(gpa, air, decl.getFileScope().zir, liveness);
2178 std.debug.print("# End Function AIR: {s}\n\n", .{decl.name});2178 std.debug.print("# End Function AIR: {s}\n\n", .{decl.name});
2179 }2179 }
21802180
src/Module.zig+55-49
...@@ -264,7 +264,7 @@ pub const Export = struct {...@@ -264,7 +264,7 @@ pub const Export = struct {
264264
265 pub fn getSrcLoc(exp: Export) SrcLoc {265 pub fn getSrcLoc(exp: Export) SrcLoc {
266 return .{266 return .{
267 .file_scope = exp.src_decl.namespace.file_scope,267 .file_scope = exp.src_decl.getFileScope(),
268 .parent_decl_node = exp.src_decl.src_node,268 .parent_decl_node = exp.src_decl.src_node,
269 .lazy = exp.src,269 .lazy = exp.src,
270 };270 };
...@@ -350,7 +350,7 @@ pub const Decl = struct {...@@ -350,7 +350,7 @@ pub const Decl = struct {
350 /// Reference to externally owned memory.350 /// Reference to externally owned memory.
351 /// In the case of the Decl corresponding to a file, this is351 /// In the case of the Decl corresponding to a file, this is
352 /// the namespace of the struct, since there is no parent.352 /// the namespace of the struct, since there is no parent.
353 namespace: *Scope.Namespace,353 src_namespace: *Scope.Namespace,
354354
355 /// The scope which lexically contains this decl. A decl must depend355 /// The scope which lexically contains this decl. A decl must depend
356 /// on its lexical parent, in order to ensure that this pointer is valid.356 /// on its lexical parent, in order to ensure that this pointer is valid.
...@@ -516,7 +516,7 @@ pub const Decl = struct {...@@ -516,7 +516,7 @@ pub const Decl = struct {
516 /// This name is relative to the containing namespace of the decl.516 /// This name is relative to the containing namespace of the decl.
517 /// The memory is owned by the containing File ZIR.517 /// The memory is owned by the containing File ZIR.
518 pub fn getName(decl: Decl) ?[:0]const u8 {518 pub fn getName(decl: Decl) ?[:0]const u8 {
519 const zir = decl.namespace.file_scope.zir;519 const zir = decl.getFileScope().zir;
520 return decl.getNameZir(zir);520 return decl.getNameZir(zir);
521 }521 }
522522
...@@ -528,7 +528,7 @@ pub const Decl = struct {...@@ -528,7 +528,7 @@ pub const Decl = struct {
528 }528 }
529529
530 pub fn contentsHash(decl: Decl) std.zig.SrcHash {530 pub fn contentsHash(decl: Decl) std.zig.SrcHash {
531 const zir = decl.namespace.file_scope.zir;531 const zir = decl.getFileScope().zir;
532 return decl.contentsHashZir(zir);532 return decl.contentsHashZir(zir);
533 }533 }
534534
...@@ -541,21 +541,21 @@ pub const Decl = struct {...@@ -541,21 +541,21 @@ pub const Decl = struct {
541541
542 pub fn zirBlockIndex(decl: *const Decl) Zir.Inst.Index {542 pub fn zirBlockIndex(decl: *const Decl) Zir.Inst.Index {
543 assert(decl.zir_decl_index != 0);543 assert(decl.zir_decl_index != 0);
544 const zir = decl.namespace.file_scope.zir;544 const zir = decl.getFileScope().zir;
545 return zir.extra[decl.zir_decl_index + 6];545 return zir.extra[decl.zir_decl_index + 6];
546 }546 }
547547
548 pub fn zirAlignRef(decl: Decl) Zir.Inst.Ref {548 pub fn zirAlignRef(decl: Decl) Zir.Inst.Ref {
549 if (!decl.has_align) return .none;549 if (!decl.has_align) return .none;
550 assert(decl.zir_decl_index != 0);550 assert(decl.zir_decl_index != 0);
551 const zir = decl.namespace.file_scope.zir;551 const zir = decl.getFileScope().zir;
552 return @intToEnum(Zir.Inst.Ref, zir.extra[decl.zir_decl_index + 7]);552 return @intToEnum(Zir.Inst.Ref, zir.extra[decl.zir_decl_index + 7]);
553 }553 }
554554
555 pub fn zirLinksectionRef(decl: Decl) Zir.Inst.Ref {555 pub fn zirLinksectionRef(decl: Decl) Zir.Inst.Ref {
556 if (!decl.has_linksection_or_addrspace) return .none;556 if (!decl.has_linksection_or_addrspace) return .none;
557 assert(decl.zir_decl_index != 0);557 assert(decl.zir_decl_index != 0);
558 const zir = decl.namespace.file_scope.zir;558 const zir = decl.getFileScope().zir;
559 const extra_index = decl.zir_decl_index + 7 + @boolToInt(decl.has_align);559 const extra_index = decl.zir_decl_index + 7 + @boolToInt(decl.has_align);
560 return @intToEnum(Zir.Inst.Ref, zir.extra[extra_index]);560 return @intToEnum(Zir.Inst.Ref, zir.extra[extra_index]);
561 }561 }
...@@ -563,16 +563,16 @@ pub const Decl = struct {...@@ -563,16 +563,16 @@ pub const Decl = struct {
563 pub fn zirAddrspaceRef(decl: Decl) Zir.Inst.Ref {563 pub fn zirAddrspaceRef(decl: Decl) Zir.Inst.Ref {
564 if (!decl.has_linksection_or_addrspace) return .none;564 if (!decl.has_linksection_or_addrspace) return .none;
565 assert(decl.zir_decl_index != 0);565 assert(decl.zir_decl_index != 0);
566 const zir = decl.namespace.file_scope.zir;566 const zir = decl.getFileScope().zir;
567 const extra_index = decl.zir_decl_index + 7 + @boolToInt(decl.has_align) + 1;567 const extra_index = decl.zir_decl_index + 7 + @boolToInt(decl.has_align) + 1;
568 return @intToEnum(Zir.Inst.Ref, zir.extra[extra_index]);568 return @intToEnum(Zir.Inst.Ref, zir.extra[extra_index]);
569 }569 }
570570
571 /// Returns true if and only if the Decl is the top level struct associated with a File.571 /// Returns true if and only if the Decl is the top level struct associated with a File.
572 pub fn isRoot(decl: *const Decl) bool {572 pub fn isRoot(decl: *const Decl) bool {
573 if (decl.namespace.parent != null)573 if (decl.src_namespace.parent != null)
574 return false;574 return false;
575 return decl == decl.namespace.ty.getOwnerDecl();575 return decl == decl.src_namespace.getDecl();
576 }576 }
577577
578 pub fn relativeToLine(decl: Decl, offset: u32) u32 {578 pub fn relativeToLine(decl: Decl, offset: u32) u32 {
...@@ -608,29 +608,21 @@ pub const Decl = struct {...@@ -608,29 +608,21 @@ pub const Decl = struct {
608 }608 }
609609
610 pub fn srcToken(decl: Decl) Ast.TokenIndex {610 pub fn srcToken(decl: Decl) Ast.TokenIndex {
611 const tree = &decl.namespace.file_scope.tree;611 const tree = &decl.getFileScope().tree;
612 return tree.firstToken(decl.src_node);612 return tree.firstToken(decl.src_node);
613 }613 }
614614
615 pub fn srcByteOffset(decl: Decl) u32 {615 pub fn srcByteOffset(decl: Decl) u32 {
616 const tree = &decl.namespace.file_scope.tree;616 const tree = &decl.getFileScope().tree;
617 return tree.tokens.items(.start)[decl.srcToken()];617 return tree.tokens.items(.start)[decl.srcToken()];
618 }618 }
619619
620 pub fn renderFullyQualifiedName(decl: *const Decl, writer: anytype) @TypeOf(writer).Error!void {620 pub fn renderFullyQualifiedName(decl: *const Decl, writer: anytype) @TypeOf(writer).Error!void {
621 // Namespace decls (struct/enum/union/opaque) use their own namespace,621 return try decl.src_namespace.renderFullyQualifiedName(mem.spanZ(decl.name), writer);
622 // which means the decl name and the namespace name are the same.
623 // In that case we want to omit the decl name, unless this is the root decl.
624 const unqualified_name = if (decl.namespace.getDecl() != decl or decl.namespace.parent == null) mem.spanZ(decl.name) else "";
625 return try decl.namespace.renderFullyQualifiedName(unqualified_name, writer);
626 }622 }
627623
628 pub fn renderFullyQualifiedDebugName(decl: *const Decl, writer: anytype) @TypeOf(writer).Error!void {624 pub fn renderFullyQualifiedDebugName(decl: *const Decl, writer: anytype) @TypeOf(writer).Error!void {
629 // Namespace decls (struct/enum/union/opaque) use their own namespace,625 return try decl.src_namespace.renderFullyQualifiedDebugName(mem.spanZ(decl.name), writer);
630 // which means the decl name and the namespace name are the same.
631 // In that case we want to omit the decl name, unless this is the root decl.
632 const unqualified_name = if (decl.namespace.getDecl() != decl or decl.namespace.parent == null) mem.spanZ(decl.name) else "";
633 return try decl.namespace.renderFullyQualifiedDebugName(unqualified_name, writer);
634 }626 }
635627
636 pub fn getFullyQualifiedName(decl: *const Decl, gpa: *Allocator) ![:0]u8 {628 pub fn getFullyQualifiedName(decl: *const Decl, gpa: *Allocator) ![:0]u8 {
...@@ -742,7 +734,7 @@ pub const Decl = struct {...@@ -742,7 +734,7 @@ pub const Decl = struct {
742 }734 }
743735
744 pub fn getFileScope(decl: Decl) *Scope.File {736 pub fn getFileScope(decl: Decl) *Scope.File {
745 return decl.namespace.file_scope;737 return decl.src_namespace.file_scope;
746 }738 }
747739
748 pub fn getEmitH(decl: *Decl, module: *Module) *EmitH {740 pub fn getEmitH(decl: *Decl, module: *Module) *EmitH {
...@@ -1118,8 +1110,8 @@ pub const Scope = struct {...@@ -1118,8 +1110,8 @@ pub const Scope = struct {
1118 /// Asserts the scope has a parent which is a Namespace and returns it.1110 /// Asserts the scope has a parent which is a Namespace and returns it.
1119 pub fn namespace(scope: *Scope) *Namespace {1111 pub fn namespace(scope: *Scope) *Namespace {
1120 switch (scope.tag) {1112 switch (scope.tag) {
1121 .block => return scope.cast(Block).?.src_decl.namespace,1113 .block => return scope.cast(Block).?.namespace,
1122 .file => return scope.cast(File).?.root_decl.?.namespace,1114 .file => return scope.cast(File).?.root_decl.?.src_namespace,
1123 .namespace => return scope.cast(Namespace).?,1115 .namespace => return scope.cast(Namespace).?,
1124 }1116 }
1125 }1117 }
...@@ -1134,14 +1126,14 @@ pub const Scope = struct {...@@ -1134,14 +1126,14 @@ pub const Scope = struct {
1134 }1126 }
1135 }1127 }
11361128
1137 /// When called from inside a Block Scope, chases the src_decl, not the owner_decl.1129 /// When called from inside a Block Scope, chases the namespace, not the owner_decl.
1138 pub fn getFileScope(base: *Scope) *Scope.File {1130 pub fn getFileScope(base: *Scope) *Scope.File {
1139 var cur = base;1131 var cur = base;
1140 while (true) {1132 while (true) {
1141 cur = switch (cur.tag) {1133 cur = switch (cur.tag) {
1142 .namespace => return @fieldParentPtr(Namespace, "base", cur).file_scope,1134 .namespace => return @fieldParentPtr(Namespace, "base", cur).file_scope,
1143 .file => return @fieldParentPtr(File, "base", cur),1135 .file => return @fieldParentPtr(File, "base", cur),
1144 .block => return @fieldParentPtr(Block, "base", cur).src_decl.namespace.file_scope,1136 .block => return @fieldParentPtr(Block, "base", cur).namespace.file_scope,
1145 };1137 };
1146 }1138 }
1147 }1139 }
...@@ -1475,6 +1467,10 @@ pub const Scope = struct {...@@ -1475,6 +1467,10 @@ pub const Scope = struct {
1475 /// This can vary during inline or comptime function calls. See `Sema.owner_decl`1467 /// This can vary during inline or comptime function calls. See `Sema.owner_decl`
1476 /// for the one that will be the same for all Block instances.1468 /// for the one that will be the same for all Block instances.
1477 src_decl: *Decl,1469 src_decl: *Decl,
1470 /// The namespace to use for lookups from this source block
1471 /// When analyzing fields, this is different from src_decl.src_namepsace.
1472 namespace: *Namespace,
1473 /// The AIR instructions generated for this block.
1478 instructions: ArrayListUnmanaged(Air.Inst.Index),1474 instructions: ArrayListUnmanaged(Air.Inst.Index),
1479 // `param` instructions are collected here to be used by the `func` instruction.1475 // `param` instructions are collected here to be used by the `func` instruction.
1480 params: std.ArrayListUnmanaged(Param) = .{},1476 params: std.ArrayListUnmanaged(Param) = .{},
...@@ -1541,6 +1537,7 @@ pub const Scope = struct {...@@ -1541,6 +1537,7 @@ pub const Scope = struct {
1541 .parent = parent,1537 .parent = parent,
1542 .sema = parent.sema,1538 .sema = parent.sema,
1543 .src_decl = parent.src_decl,1539 .src_decl = parent.src_decl,
1540 .namespace = parent.namespace,
1544 .instructions = .{},1541 .instructions = .{},
1545 .wip_capture_scope = parent.wip_capture_scope,1542 .wip_capture_scope = parent.wip_capture_scope,
1546 .label = null,1543 .label = null,
...@@ -1564,7 +1561,7 @@ pub const Scope = struct {...@@ -1564,7 +1561,7 @@ pub const Scope = struct {
1564 }1561 }
15651562
1566 pub fn getFileScope(block: *Block) *Scope.File {1563 pub fn getFileScope(block: *Block) *Scope.File {
1567 return block.src_decl.namespace.file_scope;1564 return block.namespace.file_scope;
1568 }1565 }
15691566
1570 pub fn addTy(1567 pub fn addTy(
...@@ -3327,6 +3324,7 @@ pub fn semaFile(mod: *Module, file: *Scope.File) SemaError!void {...@@ -3327,6 +3324,7 @@ pub fn semaFile(mod: *Module, file: *Scope.File) SemaError!void {
3327 .parent = null,3324 .parent = null,
3328 .sema = &sema,3325 .sema = &sema,
3329 .src_decl = new_decl,3326 .src_decl = new_decl,
3327 .namespace = &struct_obj.namespace,
3330 .wip_capture_scope = wip_captures.scope,3328 .wip_capture_scope = wip_captures.scope,
3331 .instructions = .{},3329 .instructions = .{},
3332 .inlining = null,3330 .inlining = null,
...@@ -3355,12 +3353,12 @@ fn semaDecl(mod: *Module, decl: *Decl) !bool {...@@ -3355,12 +3353,12 @@ fn semaDecl(mod: *Module, decl: *Decl) !bool {
3355 const tracy = trace(@src());3353 const tracy = trace(@src());
3356 defer tracy.end();3354 defer tracy.end();
33573355
3358 if (decl.namespace.file_scope.status != .success_zir) {3356 if (decl.getFileScope().status != .success_zir) {
3359 return error.AnalysisFail;3357 return error.AnalysisFail;
3360 }3358 }
33613359
3362 const gpa = mod.gpa;3360 const gpa = mod.gpa;
3363 const zir = decl.namespace.file_scope.zir;3361 const zir = decl.getFileScope().zir;
3364 const zir_datas = zir.instructions.items(.data);3362 const zir_datas = zir.instructions.items(.data);
33653363
3366 decl.analysis = .in_progress;3364 decl.analysis = .in_progress;
...@@ -3406,6 +3404,7 @@ fn semaDecl(mod: *Module, decl: *Decl) !bool {...@@ -3406,6 +3404,7 @@ fn semaDecl(mod: *Module, decl: *Decl) !bool {
3406 .parent = null,3404 .parent = null,
3407 .sema = &sema,3405 .sema = &sema,
3408 .src_decl = decl,3406 .src_decl = decl,
3407 .namespace = decl.src_namespace,
3409 .wip_capture_scope = wip_captures.scope,3408 .wip_capture_scope = wip_captures.scope,
3410 .instructions = .{},3409 .instructions = .{},
3411 .inlining = null,3410 .inlining = null,
...@@ -4042,8 +4041,8 @@ pub fn deleteUnusedDecl(mod: *Module, decl: *Decl) void {...@@ -4042,8 +4041,8 @@ pub fn deleteUnusedDecl(mod: *Module, decl: *Decl) void {
4042 },4041 },
4043 }4042 }
40444043
4045 const owner_namespace = if (decl.namespace.getDecl() == decl and decl.namespace.parent != null) decl.namespace.parent.? else decl.namespace;4044 assert(!decl.isRoot());
4046 assert(owner_namespace.anon_decls.swapRemove(decl));4045 assert(decl.src_namespace.anon_decls.swapRemove(decl));
40474046
4048 const dependants = decl.dependants.keys();4047 const dependants = decl.dependants.keys();
4049 for (dependants) |dep| {4048 for (dependants) |dep| {
...@@ -4059,8 +4058,8 @@ pub fn deleteUnusedDecl(mod: *Module, decl: *Decl) void {...@@ -4059,8 +4058,8 @@ pub fn deleteUnusedDecl(mod: *Module, decl: *Decl) void {
4059pub fn abortAnonDecl(mod: *Module, decl: *Decl) void {4058pub fn abortAnonDecl(mod: *Module, decl: *Decl) void {
4060 log.debug("abortAnonDecl {*} ({s})", .{ decl, decl.name });4059 log.debug("abortAnonDecl {*} ({s})", .{ decl, decl.name });
40614060
4062 const owner_namespace = if (decl.namespace.getDecl() == decl and decl.namespace.parent != null) decl.namespace.parent.? else decl.namespace;4061 assert(!decl.isRoot());
4063 assert(owner_namespace.anon_decls.swapRemove(decl));4062 assert(decl.src_namespace.anon_decls.swapRemove(decl));
40644063
4065 const dependants = decl.dependants.keys();4064 const dependants = decl.dependants.keys();
4066 for (dependants) |dep| {4065 for (dependants) |dep| {
...@@ -4128,7 +4127,7 @@ pub fn analyzeFnBody(mod: *Module, decl: *Decl, func: *Fn, arena: *Allocator) Se...@@ -4128,7 +4127,7 @@ pub fn analyzeFnBody(mod: *Module, decl: *Decl, func: *Fn, arena: *Allocator) Se
4128 .gpa = gpa,4127 .gpa = gpa,
4129 .arena = arena,4128 .arena = arena,
4130 .perm_arena = &decl_arena.allocator,4129 .perm_arena = &decl_arena.allocator,
4131 .code = decl.namespace.file_scope.zir,4130 .code = decl.getFileScope().zir,
4132 .owner_decl = decl,4131 .owner_decl = decl,
4133 .func = func,4132 .func = func,
4134 .fn_ret_ty = func.owner_decl.ty.fnReturnType(),4133 .fn_ret_ty = func.owner_decl.ty.fnReturnType(),
...@@ -4148,6 +4147,7 @@ pub fn analyzeFnBody(mod: *Module, decl: *Decl, func: *Fn, arena: *Allocator) Se...@@ -4148,6 +4147,7 @@ pub fn analyzeFnBody(mod: *Module, decl: *Decl, func: *Fn, arena: *Allocator) Se
4148 .parent = null,4147 .parent = null,
4149 .sema = &sema,4148 .sema = &sema,
4150 .src_decl = decl,4149 .src_decl = decl,
4150 .namespace = decl.src_namespace,
4151 .wip_capture_scope = wip_captures.scope,4151 .wip_capture_scope = wip_captures.scope,
4152 .instructions = .{},4152 .instructions = .{},
4153 .inlining = null,4153 .inlining = null,
...@@ -4279,7 +4279,7 @@ pub fn allocateNewDecl(mod: *Module, name: [:0]const u8, namespace: *Scope.Names...@@ -4279,7 +4279,7 @@ pub fn allocateNewDecl(mod: *Module, name: [:0]const u8, namespace: *Scope.Names
42794279
4280 new_decl.* = .{4280 new_decl.* = .{
4281 .name = name,4281 .name = name,
4282 .namespace = namespace,4282 .src_namespace = namespace,
4283 .src_node = src_node,4283 .src_node = src_node,
4284 .src_line = undefined,4284 .src_line = undefined,
4285 .has_tv = false,4285 .has_tv = false,
...@@ -4426,32 +4426,38 @@ pub fn createAnonymousDeclNamed(...@@ -4426,32 +4426,38 @@ pub fn createAnonymousDeclNamed(
4426 typed_value: TypedValue,4426 typed_value: TypedValue,
4427 name: [:0]u8,4427 name: [:0]u8,
4428) !*Decl {4428) !*Decl {
4429 return mod.createAnonymousDeclFromDeclNamed(scope.srcDecl().?, scope.srcScope(), typed_value, name);4429 return mod.createAnonymousDeclFromDeclNamed(scope.srcDecl().?, scope.namespace(), scope.srcScope(), typed_value, name);
4430}4430}
44314431
4432pub fn createAnonymousDecl(mod: *Module, scope: *Scope, typed_value: TypedValue) !*Decl {4432pub fn createAnonymousDecl(mod: *Module, scope: *Scope, typed_value: TypedValue) !*Decl {
4433 return mod.createAnonymousDeclFromDecl(scope.srcDecl().?, scope.srcScope(), typed_value);4433 return mod.createAnonymousDeclFromDecl(scope.srcDecl().?, scope.namespace(), scope.srcScope(), typed_value);
4434}4434}
44354435
4436pub fn createAnonymousDeclFromDecl(mod: *Module, src_decl: *Decl, src_scope: ?*CaptureScope, tv: TypedValue) !*Decl {4436pub fn createAnonymousDeclFromDecl(
4437 mod: *Module,
4438 src_decl: *Decl,
4439 namespace: *Scope.Namespace,
4440 src_scope: ?*CaptureScope,
4441 tv: TypedValue,
4442) !*Decl {
4437 const name_index = mod.getNextAnonNameIndex();4443 const name_index = mod.getNextAnonNameIndex();
4438 const name = try std.fmt.allocPrintZ(mod.gpa, "{s}__anon_{d}", .{4444 const name = try std.fmt.allocPrintZ(mod.gpa, "{s}__anon_{d}", .{
4439 src_decl.name, name_index,4445 src_decl.name, name_index,
4440 });4446 });
4441 return mod.createAnonymousDeclFromDeclNamed(src_decl, src_scope, tv, name);4447 return mod.createAnonymousDeclFromDeclNamed(src_decl, namespace, src_scope, tv, name);
4442}4448}
44434449
4444/// Takes ownership of `name` even if it returns an error.4450/// Takes ownership of `name` even if it returns an error.
4445pub fn createAnonymousDeclFromDeclNamed(4451pub fn createAnonymousDeclFromDeclNamed(
4446 mod: *Module,4452 mod: *Module,
4447 src_decl: *Decl,4453 src_decl: *Decl,
4454 namespace: *Scope.Namespace,
4448 src_scope: ?*CaptureScope,4455 src_scope: ?*CaptureScope,
4449 typed_value: TypedValue,4456 typed_value: TypedValue,
4450 name: [:0]u8,4457 name: [:0]u8,
4451) !*Decl {4458) !*Decl {
4452 errdefer mod.gpa.free(name);4459 errdefer mod.gpa.free(name);
44534460
4454 const namespace = src_decl.namespace;
4455 try namespace.anon_decls.ensureUnusedCapacity(mod.gpa, 1);4461 try namespace.anon_decls.ensureUnusedCapacity(mod.gpa, 1);
44564462
4457 const new_decl = try mod.allocateNewDecl(name, namespace, src_decl.src_node, src_scope);4463 const new_decl = try mod.allocateNewDecl(name, namespace, src_decl.src_node, src_scope);
...@@ -4705,10 +4711,10 @@ pub const SwitchProngSrc = union(enum) {...@@ -4705,10 +4711,10 @@ pub const SwitchProngSrc = union(enum) {
4705 range_expand: RangeExpand,4711 range_expand: RangeExpand,
4706 ) LazySrcLoc {4712 ) LazySrcLoc {
4707 @setCold(true);4713 @setCold(true);
4708 const tree = decl.namespace.file_scope.getTree(gpa) catch |err| {4714 const tree = decl.getFileScope().getTree(gpa) catch |err| {
4709 // In this case we emit a warning + a less precise source location.4715 // In this case we emit a warning + a less precise source location.
4710 log.warn("unable to load {s}: {s}", .{4716 log.warn("unable to load {s}: {s}", .{
4711 decl.namespace.file_scope.sub_file_path, @errorName(err),4717 decl.getFileScope().sub_file_path, @errorName(err),
4712 });4718 });
4713 return LazySrcLoc{ .node_offset = 0 };4719 return LazySrcLoc{ .node_offset = 0 };
4714 };4720 };
...@@ -4817,10 +4823,10 @@ pub const PeerTypeCandidateSrc = union(enum) {...@@ -4817,10 +4823,10 @@ pub const PeerTypeCandidateSrc = union(enum) {
4817 else => {},4823 else => {},
4818 }4824 }
48194825
4820 const tree = decl.namespace.file_scope.getTree(gpa) catch |err| {4826 const tree = decl.getFileScope().getTree(gpa) catch |err| {
4821 // In this case we emit a warning + a less precise source location.4827 // In this case we emit a warning + a less precise source location.
4822 log.warn("unable to load {s}: {s}", .{4828 log.warn("unable to load {s}: {s}", .{
4823 decl.namespace.file_scope.sub_file_path, @errorName(err),4829 decl.getFileScope().sub_file_path, @errorName(err),
4824 });4830 });
4825 return LazySrcLoc{ .node_offset = 0 };4831 return LazySrcLoc{ .node_offset = 0 };
4826 };4832 };
...@@ -4863,7 +4869,7 @@ pub fn processOutdatedAndDeletedDecls(mod: *Module) !void {...@@ -4863,7 +4869,7 @@ pub fn processOutdatedAndDeletedDecls(mod: *Module) !void {
48634869
4864 // Remove from the namespace it resides in, preserving declaration order.4870 // Remove from the namespace it resides in, preserving declaration order.
4865 assert(decl.zir_decl_index != 0);4871 assert(decl.zir_decl_index != 0);
4866 _ = decl.namespace.decls.orderedRemove(mem.spanZ(decl.name));4872 _ = decl.src_namespace.decls.orderedRemove(mem.spanZ(decl.name));
48674873
4868 try mod.clearDecl(decl, &outdated_decls);4874 try mod.clearDecl(decl, &outdated_decls);
4869 decl.destroy(mod);4875 decl.destroy(mod);
...@@ -4929,7 +4935,7 @@ pub fn populateTestFunctions(mod: *Module) !void {...@@ -4929,7 +4935,7 @@ pub fn populateTestFunctions(mod: *Module) !void {
4929 const gpa = mod.gpa;4935 const gpa = mod.gpa;
4930 const builtin_pkg = mod.main_pkg.table.get("builtin").?;4936 const builtin_pkg = mod.main_pkg.table.get("builtin").?;
4931 const builtin_file = (mod.importPkg(builtin_pkg) catch unreachable).file;4937 const builtin_file = (mod.importPkg(builtin_pkg) catch unreachable).file;
4932 const builtin_namespace = builtin_file.root_decl.?.namespace;4938 const builtin_namespace = builtin_file.root_decl.?.src_namespace;
4933 const decl = builtin_namespace.decls.get("test_functions").?;4939 const decl = builtin_namespace.decls.get("test_functions").?;
4934 var buf: Type.SlicePtrFieldTypeBuffer = undefined;4940 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
4935 const tmp_test_fn_ty = decl.ty.slicePtrFieldType(&buf).elemType();4941 const tmp_test_fn_ty = decl.ty.slicePtrFieldType(&buf).elemType();
...@@ -4942,7 +4948,7 @@ pub fn populateTestFunctions(mod: *Module) !void {...@@ -4942,7 +4948,7 @@ pub fn populateTestFunctions(mod: *Module) !void {
4942 const arena = &new_decl_arena.allocator;4948 const arena = &new_decl_arena.allocator;
49434949
4944 const test_fn_vals = try arena.alloc(Value, mod.test_functions.count());4950 const test_fn_vals = try arena.alloc(Value, mod.test_functions.count());
4945 const array_decl = try mod.createAnonymousDeclFromDecl(decl, null, .{4951 const array_decl = try mod.createAnonymousDeclFromDecl(decl, decl.src_namespace, null, .{
4946 .ty = try Type.Tag.array.create(arena, .{4952 .ty = try Type.Tag.array.create(arena, .{
4947 .len = test_fn_vals.len,4953 .len = test_fn_vals.len,
4948 .elem_type = try tmp_test_fn_ty.copy(arena),4954 .elem_type = try tmp_test_fn_ty.copy(arena),
...@@ -4955,7 +4961,7 @@ pub fn populateTestFunctions(mod: *Module) !void {...@@ -4955,7 +4961,7 @@ pub fn populateTestFunctions(mod: *Module) !void {
4955 var name_decl_arena = std.heap.ArenaAllocator.init(gpa);4961 var name_decl_arena = std.heap.ArenaAllocator.init(gpa);
4956 errdefer name_decl_arena.deinit();4962 errdefer name_decl_arena.deinit();
4957 const bytes = try name_decl_arena.allocator.dupe(u8, test_name_slice);4963 const bytes = try name_decl_arena.allocator.dupe(u8, test_name_slice);
4958 const test_name_decl = try mod.createAnonymousDeclFromDecl(array_decl, null, .{4964 const test_name_decl = try mod.createAnonymousDeclFromDecl(array_decl, array_decl.src_namespace, null, .{
4959 .ty = try Type.Tag.array_u8.create(&name_decl_arena.allocator, bytes.len),4965 .ty = try Type.Tag.array_u8.create(&name_decl_arena.allocator, bytes.len),
4960 .val = try Value.Tag.bytes.create(&name_decl_arena.allocator, bytes),4966 .val = try Value.Tag.bytes.create(&name_decl_arena.allocator, bytes),
4961 });4967 });
src/Sema.zig+23-20
...@@ -1042,8 +1042,6 @@ pub fn analyzeStructDecl(...@@ -1042,8 +1042,6 @@ pub fn analyzeStructDecl(
1042 } else 0;1042 } else 0;
10431043
1044 _ = try sema.mod.scanNamespace(&struct_obj.namespace, extra_index, decls_len, new_decl);1044 _ = try sema.mod.scanNamespace(&struct_obj.namespace, extra_index, decls_len, new_decl);
1045
1046 new_decl.namespace = &struct_obj.namespace;
1047}1045}
10481046
1049fn zirStructDecl(1047fn zirStructDecl(
...@@ -1080,7 +1078,7 @@ fn zirStructDecl(...@@ -1080,7 +1078,7 @@ fn zirStructDecl(
1080 .status = .none,1078 .status = .none,
1081 .known_has_bits = undefined,1079 .known_has_bits = undefined,
1082 .namespace = .{1080 .namespace = .{
1083 .parent = block.src_decl.namespace,1081 .parent = block.namespace,
1084 .ty = struct_ty,1082 .ty = struct_ty,
1085 .file_scope = block.getFileScope(),1083 .file_scope = block.getFileScope(),
1086 },1084 },
...@@ -1188,7 +1186,7 @@ fn zirEnumDecl(...@@ -1188,7 +1186,7 @@ fn zirEnumDecl(
1188 .values = .{},1186 .values = .{},
1189 .node_offset = src.node_offset,1187 .node_offset = src.node_offset,
1190 .namespace = .{1188 .namespace = .{
1191 .parent = block.src_decl.namespace,1189 .parent = block.namespace,
1192 .ty = enum_ty,1190 .ty = enum_ty,
1193 .file_scope = block.getFileScope(),1191 .file_scope = block.getFileScope(),
1194 },1192 },
...@@ -1199,8 +1197,6 @@ fn zirEnumDecl(...@@ -1199,8 +1197,6 @@ fn zirEnumDecl(
11991197
1200 extra_index = try mod.scanNamespace(&enum_obj.namespace, extra_index, decls_len, new_decl);1198 extra_index = try mod.scanNamespace(&enum_obj.namespace, extra_index, decls_len, new_decl);
12011199
1202 new_decl.namespace = &enum_obj.namespace;
1203
1204 const body = sema.code.extra[extra_index..][0..body_len];1200 const body = sema.code.extra[extra_index..][0..body_len];
1205 if (fields_len == 0) {1201 if (fields_len == 0) {
1206 assert(body.len == 0);1202 assert(body.len == 0);
...@@ -1238,6 +1234,7 @@ fn zirEnumDecl(...@@ -1238,6 +1234,7 @@ fn zirEnumDecl(
1238 .parent = null,1234 .parent = null,
1239 .sema = sema,1235 .sema = sema,
1240 .src_decl = new_decl,1236 .src_decl = new_decl,
1237 .namespace = &enum_obj.namespace,
1241 .wip_capture_scope = wip_captures.scope,1238 .wip_capture_scope = wip_captures.scope,
1242 .instructions = .{},1239 .instructions = .{},
1243 .inlining = null,1240 .inlining = null,
...@@ -1377,7 +1374,7 @@ fn zirUnionDecl(...@@ -1377,7 +1374,7 @@ fn zirUnionDecl(
1377 .layout = small.layout,1374 .layout = small.layout,
1378 .status = .none,1375 .status = .none,
1379 .namespace = .{1376 .namespace = .{
1380 .parent = block.src_decl.namespace,1377 .parent = block.namespace,
1381 .ty = union_ty,1378 .ty = union_ty,
1382 .file_scope = block.getFileScope(),1379 .file_scope = block.getFileScope(),
1383 },1380 },
...@@ -1388,8 +1385,6 @@ fn zirUnionDecl(...@@ -1388,8 +1385,6 @@ fn zirUnionDecl(
13881385
1389 _ = try sema.mod.scanNamespace(&union_obj.namespace, extra_index, decls_len, new_decl);1386 _ = try sema.mod.scanNamespace(&union_obj.namespace, extra_index, decls_len, new_decl);
13901387
1391 new_decl.namespace = &union_obj.namespace;
1392
1393 try new_decl.finalizeNewArena(&new_decl_arena);1388 try new_decl.finalizeNewArena(&new_decl_arena);
1394 return sema.analyzeDeclVal(block, src, new_decl);1389 return sema.analyzeDeclVal(block, src, new_decl);
1395}1390}
...@@ -2283,6 +2278,7 @@ fn zirCImport(sema: *Sema, parent_block: *Scope.Block, inst: Zir.Inst.Index) Com...@@ -2283,6 +2278,7 @@ fn zirCImport(sema: *Sema, parent_block: *Scope.Block, inst: Zir.Inst.Index) Com
2283 .parent = parent_block,2278 .parent = parent_block,
2284 .sema = sema,2279 .sema = sema,
2285 .src_decl = parent_block.src_decl,2280 .src_decl = parent_block.src_decl,
2281 .namespace = parent_block.namespace,
2286 .wip_capture_scope = parent_block.wip_capture_scope,2282 .wip_capture_scope = parent_block.wip_capture_scope,
2287 .instructions = .{},2283 .instructions = .{},
2288 .inlining = parent_block.inlining,2284 .inlining = parent_block.inlining,
...@@ -2383,6 +2379,7 @@ fn zirBlock(...@@ -2383,6 +2379,7 @@ fn zirBlock(
2383 .parent = parent_block,2379 .parent = parent_block,
2384 .sema = sema,2380 .sema = sema,
2385 .src_decl = parent_block.src_decl,2381 .src_decl = parent_block.src_decl,
2382 .namespace = parent_block.namespace,
2386 .wip_capture_scope = parent_block.wip_capture_scope,2383 .wip_capture_scope = parent_block.wip_capture_scope,
2387 .instructions = .{},2384 .instructions = .{},
2388 .label = &label,2385 .label = &label,
...@@ -2684,7 +2681,7 @@ fn zirDeclVal(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileErr...@@ -2684,7 +2681,7 @@ fn zirDeclVal(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileErr
2684}2681}
26852682
2686fn lookupIdentifier(sema: *Sema, block: *Scope.Block, src: LazySrcLoc, name: []const u8) !*Decl {2683fn lookupIdentifier(sema: *Sema, block: *Scope.Block, src: LazySrcLoc, name: []const u8) !*Decl {
2687 var namespace = block.src_decl.namespace;2684 var namespace = block.namespace;
2688 while (true) {2685 while (true) {
2689 if (try sema.lookupInNamespace(block, src, namespace, name, false)) |decl| {2686 if (try sema.lookupInNamespace(block, src, namespace, name, false)) |decl| {
2690 return decl;2687 return decl;
...@@ -2713,7 +2710,7 @@ fn lookupInNamespace(...@@ -2713,7 +2710,7 @@ fn lookupInNamespace(
2713 }2710 }
27142711
2715 if (observe_usingnamespace and namespace.usingnamespace_set.count() != 0) {2712 if (observe_usingnamespace and namespace.usingnamespace_set.count() != 0) {
2716 const src_file = block.src_decl.namespace.file_scope;2713 const src_file = block.namespace.file_scope;
27172714
2718 const gpa = sema.gpa;2715 const gpa = sema.gpa;
2719 var checked_namespaces: std.AutoArrayHashMapUnmanaged(*Scope.Namespace, void) = .{};2716 var checked_namespaces: std.AutoArrayHashMapUnmanaged(*Scope.Namespace, void) = .{};
...@@ -2731,7 +2728,7 @@ fn lookupInNamespace(...@@ -2731,7 +2728,7 @@ fn lookupInNamespace(
2731 if (check_ns.decls.get(ident_name)) |decl| {2728 if (check_ns.decls.get(ident_name)) |decl| {
2732 // Skip decls which are not marked pub, which are in a different2729 // Skip decls which are not marked pub, which are in a different
2733 // file than the `a.b`/`@hasDecl` syntax.2730 // file than the `a.b`/`@hasDecl` syntax.
2734 if (decl.is_pub or src_file == decl.namespace.file_scope) {2731 if (decl.is_pub or src_file == decl.getFileScope()) {
2735 try candidates.append(gpa, decl);2732 try candidates.append(gpa, decl);
2736 }2733 }
2737 }2734 }
...@@ -2739,7 +2736,7 @@ fn lookupInNamespace(...@@ -2739,7 +2736,7 @@ fn lookupInNamespace(
2739 while (it.next()) |entry| {2736 while (it.next()) |entry| {
2740 const sub_usingnamespace_decl = entry.key_ptr.*;2737 const sub_usingnamespace_decl = entry.key_ptr.*;
2741 const sub_is_pub = entry.value_ptr.*;2738 const sub_is_pub = entry.value_ptr.*;
2742 if (!sub_is_pub and src_file != sub_usingnamespace_decl.namespace.file_scope) {2739 if (!sub_is_pub and src_file != sub_usingnamespace_decl.getFileScope()) {
2743 // Skip usingnamespace decls which are not marked pub, which are in2740 // Skip usingnamespace decls which are not marked pub, which are in
2744 // a different file than the `a.b`/`@hasDecl` syntax.2741 // a different file than the `a.b`/`@hasDecl` syntax.
2745 continue;2742 continue;
...@@ -2992,7 +2989,7 @@ fn analyzeCall(...@@ -2992,7 +2989,7 @@ fn analyzeCall(
2992 // In order to save a bit of stack space, directly modify Sema rather2989 // In order to save a bit of stack space, directly modify Sema rather
2993 // than create a child one.2990 // than create a child one.
2994 const parent_zir = sema.code;2991 const parent_zir = sema.code;
2995 sema.code = module_fn.owner_decl.namespace.file_scope.zir;2992 sema.code = module_fn.owner_decl.getFileScope().zir;
2996 defer sema.code = parent_zir;2993 defer sema.code = parent_zir;
29972994
2998 const parent_inst_map = sema.inst_map;2995 const parent_inst_map = sema.inst_map;
...@@ -3013,6 +3010,7 @@ fn analyzeCall(...@@ -3013,6 +3010,7 @@ fn analyzeCall(
3013 .parent = null,3010 .parent = null,
3014 .sema = sema,3011 .sema = sema,
3015 .src_decl = module_fn.owner_decl,3012 .src_decl = module_fn.owner_decl,
3013 .namespace = module_fn.owner_decl.src_namespace,
3016 .wip_capture_scope = wip_captures.scope,3014 .wip_capture_scope = wip_captures.scope,
3017 .instructions = .{},3015 .instructions = .{},
3018 .label = null,3016 .label = null,
...@@ -3182,7 +3180,7 @@ fn analyzeCall(...@@ -3182,7 +3180,7 @@ fn analyzeCall(
3182 // Check the Module's generic function map with an adapted context, so that we3180 // Check the Module's generic function map with an adapted context, so that we
3183 // can match against `uncasted_args` rather than doing the work below to create a3181 // can match against `uncasted_args` rather than doing the work below to create a
3184 // generic Scope only to junk it if it matches an existing instantiation.3182 // generic Scope only to junk it if it matches an existing instantiation.
3185 const namespace = module_fn.owner_decl.namespace;3183 const namespace = module_fn.owner_decl.src_namespace;
3186 const fn_zir = namespace.file_scope.zir;3184 const fn_zir = namespace.file_scope.zir;
3187 const fn_info = fn_zir.getFnInfo(module_fn.zir_body_inst);3185 const fn_info = fn_zir.getFnInfo(module_fn.zir_body_inst);
3188 const zir_tags = fn_zir.instructions.items(.tag);3186 const zir_tags = fn_zir.instructions.items(.tag);
...@@ -3314,6 +3312,7 @@ fn analyzeCall(...@@ -3314,6 +3312,7 @@ fn analyzeCall(
3314 .parent = null,3312 .parent = null,
3315 .sema = &child_sema,3313 .sema = &child_sema,
3316 .src_decl = new_decl,3314 .src_decl = new_decl,
3315 .namespace = namespace,
3317 .wip_capture_scope = wip_captures.scope,3316 .wip_capture_scope = wip_captures.scope,
3318 .instructions = .{},3317 .instructions = .{},
3319 .inlining = null,3318 .inlining = null,
...@@ -5338,6 +5337,7 @@ fn analyzeSwitch(...@@ -5338,6 +5337,7 @@ fn analyzeSwitch(
5338 .parent = block,5337 .parent = block,
5339 .sema = sema,5338 .sema = sema,
5340 .src_decl = block.src_decl,5339 .src_decl = block.src_decl,
5340 .namespace = block.namespace,
5341 .wip_capture_scope = block.wip_capture_scope,5341 .wip_capture_scope = block.wip_capture_scope,
5342 .instructions = .{},5342 .instructions = .{},
5343 .label = &label,5343 .label = &label,
...@@ -5861,7 +5861,7 @@ fn zirHasDecl(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileErr...@@ -5861,7 +5861,7 @@ fn zirHasDecl(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileErr
5861 .{container_type},5861 .{container_type},
5862 );5862 );
5863 if (try sema.lookupInNamespace(block, src, namespace, decl_name, true)) |decl| {5863 if (try sema.lookupInNamespace(block, src, namespace, decl_name, true)) |decl| {
5864 if (decl.is_pub or decl.namespace.file_scope == block.base.namespace().file_scope) {5864 if (decl.is_pub or decl.getFileScope() == block.base.namespace().file_scope) {
5865 return Air.Inst.Ref.bool_true;5865 return Air.Inst.Ref.bool_true;
5866 }5866 }
5867 }5867 }
...@@ -9603,8 +9603,9 @@ fn addSafetyCheck(...@@ -9603,8 +9603,9 @@ fn addSafetyCheck(
9603 var fail_block: Scope.Block = .{9603 var fail_block: Scope.Block = .{
9604 .parent = parent_block,9604 .parent = parent_block,
9605 .sema = sema,9605 .sema = sema,
9606 .wip_capture_scope = parent_block.wip_capture_scope,
9607 .src_decl = parent_block.src_decl,9606 .src_decl = parent_block.src_decl,
9607 .namespace = parent_block.namespace,
9608 .wip_capture_scope = parent_block.wip_capture_scope,
9608 .instructions = .{},9609 .instructions = .{},
9609 .inlining = parent_block.inlining,9610 .inlining = parent_block.inlining,
9610 .is_comptime = parent_block.is_comptime,9611 .is_comptime = parent_block.is_comptime,
...@@ -10259,7 +10260,7 @@ fn namespaceLookup(...@@ -10259,7 +10260,7 @@ fn namespaceLookup(
10259 const mod = sema.mod;10260 const mod = sema.mod;
10260 const gpa = sema.gpa;10261 const gpa = sema.gpa;
10261 if (try sema.lookupInNamespace(block, src, namespace, decl_name, true)) |decl| {10262 if (try sema.lookupInNamespace(block, src, namespace, decl_name, true)) |decl| {
10262 if (!decl.is_pub and decl.namespace.file_scope != block.getFileScope()) {10263 if (!decl.is_pub and decl.getFileScope() != block.getFileScope()) {
10263 const msg = msg: {10264 const msg = msg: {
10264 const msg = try mod.errMsg(&block.base, src, "'{s}' is not marked 'pub'", .{10265 const msg = try mod.errMsg(&block.base, src, "'{s}' is not marked 'pub'", .{
10265 decl_name,10266 decl_name,
...@@ -11911,6 +11912,7 @@ fn semaStructFields(...@@ -11911,6 +11912,7 @@ fn semaStructFields(
11911 .parent = null,11912 .parent = null,
11912 .sema = &sema,11913 .sema = &sema,
11913 .src_decl = decl,11914 .src_decl = decl,
11915 .namespace = &struct_obj.namespace,
11914 .wip_capture_scope = wip_captures.scope,11916 .wip_capture_scope = wip_captures.scope,
11915 .instructions = .{},11917 .instructions = .{},
11916 .inlining = null,11918 .inlining = null,
...@@ -12080,6 +12082,7 @@ fn semaUnionFields(...@@ -12080,6 +12082,7 @@ fn semaUnionFields(
12080 .parent = null,12082 .parent = null,
12081 .sema = &sema,12083 .sema = &sema,
12082 .src_decl = decl,12084 .src_decl = decl,
12085 .namespace = &union_obj.namespace,
12083 .wip_capture_scope = wip_captures.scope,12086 .wip_capture_scope = wip_captures.scope,
12084 .instructions = .{},12087 .instructions = .{},
12085 .inlining = null,12088 .inlining = null,
...@@ -12290,7 +12293,7 @@ fn getBuiltin(...@@ -12290,7 +12293,7 @@ fn getBuiltin(
12290 const opt_builtin_inst = try sema.namespaceLookupRef(12293 const opt_builtin_inst = try sema.namespaceLookupRef(
12291 block,12294 block,
12292 src,12295 src,
12293 std_file.root_decl.?.namespace,12296 std_file.root_decl.?.src_namespace,
12294 "builtin",12297 "builtin",
12295 );12298 );
12296 const builtin_inst = try sema.analyzeLoad(block, src, opt_builtin_inst.?, src);12299 const builtin_inst = try sema.analyzeLoad(block, src, opt_builtin_inst.?, src);
...@@ -12484,7 +12487,7 @@ fn typeHasOnePossibleValue(...@@ -12484,7 +12487,7 @@ fn typeHasOnePossibleValue(
12484}12487}
1248512488
12486fn getAstTree(sema: *Sema, block: *Scope.Block) CompileError!*const std.zig.Ast {12489fn getAstTree(sema: *Sema, block: *Scope.Block) CompileError!*const std.zig.Ast {
12487 return block.src_decl.namespace.file_scope.getTree(sema.gpa) catch |err| {12490 return block.namespace.file_scope.getTree(sema.gpa) catch |err| {
12488 log.err("unable to load AST to report compile error: {s}", .{@errorName(err)});12491 log.err("unable to load AST to report compile error: {s}", .{@errorName(err)});
12489 return error.AnalysisFail;12492 return error.AnalysisFail;
12490 };12493 };
src/codegen.zig+2-2
...@@ -2584,7 +2584,7 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {...@@ -2584,7 +2584,7 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
25842584
2585 fn genArgDbgInfo(self: *Self, inst: Air.Inst.Index, mcv: MCValue) !void {2585 fn genArgDbgInfo(self: *Self, inst: Air.Inst.Index, mcv: MCValue) !void {
2586 const ty_str = self.air.instructions.items(.data)[inst].ty_str;2586 const ty_str = self.air.instructions.items(.data)[inst].ty_str;
2587 const zir = &self.mod_fn.owner_decl.namespace.file_scope.zir;2587 const zir = &self.mod_fn.owner_decl.getFileScope().zir;
2588 const name = zir.nullTerminatedString(ty_str.str);2588 const name = zir.nullTerminatedString(ty_str.str);
2589 const name_with_null = name.ptr[0 .. name.len + 1];2589 const name_with_null = name.ptr[0 .. name.len + 1];
2590 const ty = self.air.getRefType(ty_str.ty);2590 const ty = self.air.getRefType(ty_str.ty);
...@@ -3834,7 +3834,7 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {...@@ -3834,7 +3834,7 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
3834 fn airAsm(self: *Self, inst: Air.Inst.Index) !void {3834 fn airAsm(self: *Self, inst: Air.Inst.Index) !void {
3835 const air_datas = self.air.instructions.items(.data);3835 const air_datas = self.air.instructions.items(.data);
3836 const air_extra = self.air.extraData(Air.Asm, air_datas[inst].ty_pl.payload);3836 const air_extra = self.air.extraData(Air.Asm, air_datas[inst].ty_pl.payload);
3837 const zir = self.mod_fn.owner_decl.namespace.file_scope.zir;3837 const zir = self.mod_fn.owner_decl.getFileScope().zir;
3838 const extended = zir.instructions.items(.data)[air_extra.data.zir_index].extended;3838 const extended = zir.instructions.items(.data)[air_extra.data.zir_index].extended;
3839 const zir_extra = zir.extraData(Zir.Inst.Asm, extended.operand);3839 const zir_extra = zir.extraData(Zir.Inst.Asm, extended.operand);
3840 const asm_source = zir.nullTerminatedString(zir_extra.data.asm_source);3840 const asm_source = zir.nullTerminatedString(zir_extra.data.asm_source);
src/codegen/c.zig+1-1
...@@ -1696,7 +1696,7 @@ fn airSwitchBr(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -1696,7 +1696,7 @@ fn airSwitchBr(f: *Function, inst: Air.Inst.Index) !CValue {
1696fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue {1696fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue {
1697 const air_datas = f.air.instructions.items(.data);1697 const air_datas = f.air.instructions.items(.data);
1698 const air_extra = f.air.extraData(Air.Asm, air_datas[inst].ty_pl.payload);1698 const air_extra = f.air.extraData(Air.Asm, air_datas[inst].ty_pl.payload);
1699 const zir = f.object.dg.decl.namespace.file_scope.zir;1699 const zir = f.object.dg.decl.getFileScope().zir;
1700 const extended = zir.instructions.items(.data)[air_extra.data.zir_index].extended;1700 const extended = zir.instructions.items(.data)[air_extra.data.zir_index].extended;
1701 const zir_extra = zir.extraData(Zir.Inst.Asm, extended.operand);1701 const zir_extra = zir.extraData(Zir.Inst.Asm, extended.operand);
1702 const asm_source = zir.nullTerminatedString(zir_extra.data.asm_source);1702 const asm_source = zir.nullTerminatedString(zir_extra.data.asm_source);
src/codegen/llvm.zig+1-1
...@@ -1819,7 +1819,7 @@ pub const FuncGen = struct {...@@ -1819,7 +1819,7 @@ pub const FuncGen = struct {
18191819
1820 const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;1820 const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
1821 const air_asm = self.air.extraData(Air.Asm, ty_pl.payload);1821 const air_asm = self.air.extraData(Air.Asm, ty_pl.payload);
1822 const zir = self.dg.decl.namespace.file_scope.zir;1822 const zir = self.dg.decl.getFileScope().zir;
1823 const extended = zir.instructions.items(.data)[air_asm.data.zir_index].extended;1823 const extended = zir.instructions.items(.data)[air_asm.data.zir_index].extended;
1824 const zir_extra = zir.extraData(Zir.Inst.Asm, extended.operand);1824 const zir_extra = zir.extraData(Zir.Inst.Asm, extended.operand);
1825 const asm_source = zir.nullTerminatedString(zir_extra.data.asm_source);1825 const asm_source = zir.nullTerminatedString(zir_extra.data.asm_source);
src/codegen/spirv.zig+1-1
...@@ -139,7 +139,7 @@ pub const SPIRVModule = struct {...@@ -139,7 +139,7 @@ pub const SPIRVModule = struct {
139 }139 }
140140
141 fn resolveSourceFileName(self: *SPIRVModule, decl: *Decl) !ResultId {141 fn resolveSourceFileName(self: *SPIRVModule, decl: *Decl) !ResultId {
142 const path = decl.namespace.file_scope.sub_file_path;142 const path = decl.getFileScope().sub_file_path;
143 const result = try self.file_names.getOrPut(path);143 const result = try self.file_names.getOrPut(path);
144 if (!result.found_existing) {144 if (!result.found_existing) {
145 result.value_ptr.* = self.allocResultId();145 result.value_ptr.* = self.allocResultId();
src/crash_report.zig+3-3
...@@ -97,7 +97,7 @@ fn dumpStatusReport() !void {...@@ -97,7 +97,7 @@ fn dumpStatusReport() !void {
97 allocator,97 allocator,
98 anal.body,98 anal.body,
99 anal.body_index,99 anal.body_index,
100 block.src_decl.getFileScope(),100 block.namespace.file_scope,
101 block.src_decl.src_node,101 block.src_decl.src_node,
102 6, // indent102 6, // indent
103 stderr,103 stderr,
...@@ -106,7 +106,7 @@ fn dumpStatusReport() !void {...@@ -106,7 +106,7 @@ fn dumpStatusReport() !void {
106 else => |e| return e,106 else => |e| return e,
107 };107 };
108 try stderr.writeAll(" For full context, use the command\n zig ast-check -t ");108 try stderr.writeAll(" For full context, use the command\n zig ast-check -t ");
109 try writeFilePath(block.src_decl.getFileScope(), stderr);109 try writeFilePath(block.namespace.file_scope, stderr);
110 try stderr.writeAll("\n\n");110 try stderr.writeAll("\n\n");
111111
112 var parent = anal.parent;112 var parent = anal.parent;
...@@ -118,7 +118,7 @@ fn dumpStatusReport() !void {...@@ -118,7 +118,7 @@ fn dumpStatusReport() !void {
118 print_zir.renderSingleInstruction(118 print_zir.renderSingleInstruction(
119 allocator,119 allocator,
120 curr.body[curr.body_index],120 curr.body[curr.body_index],
121 curr.block.src_decl.getFileScope(),121 curr.block.namespace.file_scope,
122 curr.block.src_decl.src_node,122 curr.block.src_decl.src_node,
123 6, // indent123 6, // indent
124 stderr,124 stderr,
src/link/Plan9.zig+3-3
...@@ -163,11 +163,11 @@ pub fn createEmpty(gpa: *Allocator, options: link.Options) !*Plan9 {...@@ -163,11 +163,11 @@ pub fn createEmpty(gpa: *Allocator, options: link.Options) !*Plan9 {
163163
164fn putFn(self: *Plan9, decl: *Module.Decl, out: FnDeclOutput) !void {164fn putFn(self: *Plan9, decl: *Module.Decl, out: FnDeclOutput) !void {
165 const gpa = self.base.allocator;165 const gpa = self.base.allocator;
166 const fn_map_res = try self.fn_decl_table.getOrPut(gpa, decl.namespace.file_scope);166 const fn_map_res = try self.fn_decl_table.getOrPut(gpa, decl.getFileScope());
167 if (fn_map_res.found_existing) {167 if (fn_map_res.found_existing) {
168 try fn_map_res.value_ptr.functions.put(gpa, decl, out);168 try fn_map_res.value_ptr.functions.put(gpa, decl, out);
169 } else {169 } else {
170 const file = decl.namespace.file_scope;170 const file = decl.getFileScope();
171 const arena = &self.path_arena.allocator;171 const arena = &self.path_arena.allocator;
172 // each file gets a symbol172 // each file gets a symbol
173 fn_map_res.value_ptr.* = .{173 fn_map_res.value_ptr.* = .{
...@@ -548,7 +548,7 @@ pub fn freeDecl(self: *Plan9, decl: *Module.Decl) void {...@@ -548,7 +548,7 @@ pub fn freeDecl(self: *Plan9, decl: *Module.Decl) void {
548 const is_fn = (decl.val.tag() == .function);548 const is_fn = (decl.val.tag() == .function);
549 if (is_fn) {549 if (is_fn) {
550 var symidx_and_submap =550 var symidx_and_submap =
551 self.fn_decl_table.get(decl.namespace.file_scope).?;551 self.fn_decl_table.get(decl.getFileScope()).?;
552 var submap = symidx_and_submap.functions;552 var submap = symidx_and_submap.functions;
553 _ = submap.swapRemove(decl);553 _ = submap.swapRemove(decl);
554 if (submap.count() == 0) {554 if (submap.count() == 0) {