Skip to content

Commit 39459e7

Browse files
authored
Merge pull request #19273 from mlugg/incremental-some-more
compiler: more progress on incremental
2 parents 5c8eda3 + 7c32370 commit 39459e7

File tree

6 files changed

+527
-178
lines changed

6 files changed

+527
-178
lines changed

lib/std/zig/AstGen.zig

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13496,6 +13496,15 @@ fn scanDecls(astgen: *AstGen, namespace: *Scope.Namespace, members: []const Ast.
1349613496
const node_tags = tree.nodes.items(.tag);
1349713497
const main_tokens = tree.nodes.items(.main_token);
1349813498
const token_tags = tree.tokens.items(.tag);
13499+
13500+
// We don't have shadowing for test names, so we just track those for duplicate reporting locally.
13501+
var named_tests: std.AutoHashMapUnmanaged(Zir.NullTerminatedString, Ast.Node.Index) = .{};
13502+
var decltests: std.AutoHashMapUnmanaged(Zir.NullTerminatedString, Ast.Node.Index) = .{};
13503+
defer {
13504+
named_tests.deinit(gpa);
13505+
decltests.deinit(gpa);
13506+
}
13507+
1349913508
var decl_count: u32 = 0;
1350013509
for (members) |member_node| {
1350113510
const name_token = switch (node_tags[member_node]) {
@@ -13525,11 +13534,50 @@ fn scanDecls(astgen: *AstGen, namespace: *Scope.Namespace, members: []const Ast.
1352513534
break :blk ident;
1352613535
},
1352713536

13528-
.@"comptime", .@"usingnamespace", .test_decl => {
13537+
.@"comptime", .@"usingnamespace" => {
1352913538
decl_count += 1;
1353013539
continue;
1353113540
},
1353213541

13542+
.test_decl => {
13543+
decl_count += 1;
13544+
// We don't want shadowing detection here, and test names work a bit differently, so
13545+
// we must do the redeclaration detection ourselves.
13546+
const test_name_token = main_tokens[member_node] + 1;
13547+
switch (token_tags[test_name_token]) {
13548+
else => {}, // unnamed test
13549+
.string_literal => {
13550+
const name = try astgen.strLitAsString(test_name_token);
13551+
const gop = try named_tests.getOrPut(gpa, name.index);
13552+
if (gop.found_existing) {
13553+
const name_slice = astgen.string_bytes.items[@intFromEnum(name.index)..][0..name.len];
13554+
const name_duped = try gpa.dupe(u8, name_slice);
13555+
defer gpa.free(name_duped);
13556+
try astgen.appendErrorNodeNotes(member_node, "duplicate test name '{s}'", .{name_duped}, &.{
13557+
try astgen.errNoteNode(gop.value_ptr.*, "other test here", .{}),
13558+
});
13559+
} else {
13560+
gop.value_ptr.* = member_node;
13561+
}
13562+
},
13563+
.identifier => {
13564+
const name = try astgen.identAsString(test_name_token);
13565+
const gop = try decltests.getOrPut(gpa, name);
13566+
if (gop.found_existing) {
13567+
const name_slice = mem.span(astgen.nullTerminatedString(name));
13568+
const name_duped = try gpa.dupe(u8, name_slice);
13569+
defer gpa.free(name_duped);
13570+
try astgen.appendErrorNodeNotes(member_node, "duplicate decltest '{s}'", .{name_duped}, &.{
13571+
try astgen.errNoteNode(gop.value_ptr.*, "other decltest here", .{}),
13572+
});
13573+
} else {
13574+
gop.value_ptr.* = member_node;
13575+
}
13576+
},
13577+
}
13578+
continue;
13579+
},
13580+
1353313581
else => continue,
1353413582
};
1353513583

src/InternPool.zig

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ src_hash_deps: std.AutoArrayHashMapUnmanaged(TrackedInst.Index, DepEntry.Index)
6767
/// Dependencies on the value of a Decl.
6868
/// Value is index into `dep_entries` of the first dependency on this Decl value.
6969
decl_val_deps: std.AutoArrayHashMapUnmanaged(DeclIndex, DepEntry.Index) = .{},
70+
/// Dependencies on the IES of a runtime function.
71+
/// Value is index into `dep_entries` of the first dependency on this Decl value.
72+
func_ies_deps: std.AutoArrayHashMapUnmanaged(Index, DepEntry.Index) = .{},
7073
/// Dependencies on the full set of names in a ZIR namespace.
7174
/// Key refers to a `struct_decl`, `union_decl`, etc.
7275
/// Value is index into `dep_entries` of the first dependency on this namespace.
@@ -167,6 +170,7 @@ pub const Depender = enum(u32) {
167170
pub const Dependee = union(enum) {
168171
src_hash: TrackedInst.Index,
169172
decl_val: DeclIndex,
173+
func_ies: Index,
170174
namespace: TrackedInst.Index,
171175
namespace_name: NamespaceNameKey,
172176
};
@@ -212,6 +216,7 @@ pub fn dependencyIterator(ip: *const InternPool, dependee: Dependee) DependencyI
212216
const first_entry = switch (dependee) {
213217
.src_hash => |x| ip.src_hash_deps.get(x),
214218
.decl_val => |x| ip.decl_val_deps.get(x),
219+
.func_ies => |x| ip.func_ies_deps.get(x),
215220
.namespace => |x| ip.namespace_deps.get(x),
216221
.namespace_name => |x| ip.namespace_name_deps.get(x),
217222
} orelse return .{
@@ -251,6 +256,7 @@ pub fn addDependency(ip: *InternPool, gpa: Allocator, depender: Depender, depend
251256
const gop = try switch (tag) {
252257
.src_hash => ip.src_hash_deps,
253258
.decl_val => ip.decl_val_deps,
259+
.func_ies => ip.func_ies_deps,
254260
.namespace => ip.namespace_deps,
255261
.namespace_name => ip.namespace_name_deps,
256262
}.getOrPut(gpa, dependee_payload);
@@ -4324,6 +4330,7 @@ pub fn deinit(ip: *InternPool, gpa: Allocator) void {
43244330

43254331
ip.src_hash_deps.deinit(gpa);
43264332
ip.decl_val_deps.deinit(gpa);
4333+
ip.func_ies_deps.deinit(gpa);
43274334
ip.namespace_deps.deinit(gpa);
43284335
ip.namespace_name_deps.deinit(gpa);
43294336

@@ -7103,7 +7110,7 @@ pub fn getGeneratedTagEnumType(ip: *InternPool, gpa: Allocator, ini: GeneratedTa
71037110
return @enumFromInt(gop.index);
71047111
}
71057112

7106-
pub const OpaqueTypeIni = struct {
7113+
pub const OpaqueTypeInit = struct {
71077114
has_namespace: bool,
71087115
key: union(enum) {
71097116
declared: struct {
@@ -7117,7 +7124,7 @@ pub const OpaqueTypeIni = struct {
71177124
},
71187125
};
71197126

7120-
pub fn getOpaqueType(ip: *InternPool, gpa: Allocator, ini: OpaqueTypeIni) Allocator.Error!WipNamespaceType.Result {
7127+
pub fn getOpaqueType(ip: *InternPool, gpa: Allocator, ini: OpaqueTypeInit) Allocator.Error!WipNamespaceType.Result {
71217128
const adapter: KeyAdapter = .{ .intern_pool = ip };
71227129
const gop = try ip.map.getOrPutAdapted(gpa, Key{ .opaque_type = switch (ini.key) {
71237130
.declared => |d| .{ .declared = .{
@@ -9216,7 +9223,7 @@ pub fn funcTypeParamsLen(ip: *const InternPool, i: Index) u32 {
92169223
return ip.extra.items[start + std.meta.fieldIndex(Tag.TypeFunction, "params_len").?];
92179224
}
92189225

9219-
fn unwrapCoercedFunc(ip: *const InternPool, i: Index) Index {
9226+
pub fn unwrapCoercedFunc(ip: *const InternPool, i: Index) Index {
92209227
const tags = ip.items.items(.tag);
92219228
return switch (tags[@intFromEnum(i)]) {
92229229
.func_coerced => {

0 commit comments

Comments
 (0)