From 01e08c92b3d1a7895762e7b8f8a7913d08c3fa6c Mon Sep 17 00:00:00 2001 From: Martin Wickham Date: Fri, 1 Oct 2021 12:45:46 -0500 Subject: [PATCH] Revert collateral changes, clarify abortAnonDecl() --- src/Module.zig | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/Module.zig b/src/Module.zig index 3dd576e3fc..fb6bdad3ac 100644 --- a/src/Module.zig +++ b/src/Module.zig @@ -617,15 +617,17 @@ pub const Decl = struct { return tree.tokens.items(.start)[decl.srcToken()]; } - pub fn renderFullyQualifiedName(decl: *const Decl, writer: anytype) @TypeOf(writer).Error!void { - return try decl.src_namespace.renderFullyQualifiedName(mem.spanZ(decl.name), writer); + pub fn renderFullyQualifiedName(decl: Decl, writer: anytype) !void { + const unqualified_name = mem.spanZ(decl.name); + return decl.src_namespace.renderFullyQualifiedName(unqualified_name, writer); } - pub fn renderFullyQualifiedDebugName(decl: *const Decl, writer: anytype) @TypeOf(writer).Error!void { - return try decl.src_namespace.renderFullyQualifiedDebugName(mem.spanZ(decl.name), writer); + pub fn renderFullyQualifiedDebugName(decl: Decl, writer: anytype) !void { + const unqualified_name = mem.spanZ(decl.name); + return decl.src_namespace.renderFullyQualifiedDebugName(unqualified_name, writer); } - pub fn getFullyQualifiedName(decl: *const Decl, gpa: *Allocator) ![:0]u8 { + pub fn getFullyQualifiedName(decl: Decl, gpa: *Allocator) ![:0]u8 { var buffer = std.ArrayList(u8).init(gpa); defer buffer.deinit(); try decl.renderFullyQualifiedName(buffer.writer()); @@ -1246,7 +1248,7 @@ pub const Scope = struct { } } - // This renders e.g. "std.fs:Dir.OpenOptions" + /// This renders e.g. "std/fs.zig:Dir.OpenOptions" pub fn renderFullyQualifiedDebugName( ns: Namespace, name: []const u8, @@ -4055,16 +4057,17 @@ pub fn deleteUnusedDecl(mod: *Module, decl: *Decl) void { decl.destroy(mod); } +/// Cancel the creation of an anon decl and delete any references to it. +/// If other decls depend on this decl, they must be aborted first. pub fn abortAnonDecl(mod: *Module, decl: *Decl) void { log.debug("abortAnonDecl {*} ({s})", .{ decl, decl.name }); assert(!decl.isRoot()); assert(decl.src_namespace.anon_decls.swapRemove(decl)); - const dependants = decl.dependants.keys(); - for (dependants) |dep| { - dep.removeDependency(decl); - } + // An aborted decl must not have dependants -- they must have + // been aborted first and removed from this list. + assert(decl.dependants.count() == 0); for (decl.dependencies.keys()) |dep| { dep.removeDependant(decl);