merge analysis dumps tool handles errors

master
Andrew Kelley 2019-10-11 18:36:00 -04:00
parent c7f994890c
commit 47dfaf3d17
No known key found for this signature in database
GPG Key ID: 7C5F548F728501A9
1 changed files with 52 additions and 0 deletions

View File

@ -46,6 +46,21 @@ const Node = struct {
}
};
const Error = struct {
src: usize,
name: []const u8,
fn hash(n: Error) u32 {
var hasher = std.hash.Wyhash.init(0);
std.hash.autoHash(&hasher, n.src);
return @truncate(u32, hasher.final());
}
fn eql(a: Error, b: Error) bool {
return a.src == b.src;
}
};
const Dump = struct {
zig_id: ?[]const u8 = null,
zig_version: ?[]const u8 = null,
@ -60,6 +75,10 @@ const Dump = struct {
node_list: std.ArrayList(Node),
node_map: NodeMap,
const ErrorMap = std.HashMap(Error, usize, Error.hash, Error.eql);
error_list: std.ArrayList(Error),
error_map: ErrorMap,
fn init(allocator: *mem.Allocator) Dump {
return Dump{
.targets = std.ArrayList([]const u8).init(allocator),
@ -67,6 +86,8 @@ const Dump = struct {
.file_map = FileMap.init(allocator),
.node_list = std.ArrayList(Node).init(allocator),
.node_map = NodeMap.init(allocator),
.error_list = std.ArrayList(Error).init(allocator),
.error_map = ErrorMap.init(allocator),
};
}
@ -129,6 +150,21 @@ const Dump = struct {
}
// Merge errors. If the AST Node matches, it's the same error value.
const other_errors = root.Object.get("errors").?.value.Array.toSliceConst();
var other_error_to_mine = std.AutoHashMap(usize, usize).init(self.a());
for (other_errors) |other_error_json, i| {
const other_src_id = jsonObjInt(other_error_json, "src");
const other_error = Error{
.src = other_ast_node_to_mine.getValue(other_src_id).?,
.name = other_error_json.Object.get("name").?.value.String,
};
const gop = try self.error_map.getOrPut(other_error);
if (!gop.found_existing) {
gop.kv.value = self.error_list.len;
try self.error_list.append(other_error);
}
try other_error_to_mine.putNoClobber(i, gop.kv.value);
}
}
fn render(self: *Dump, stream: var) !void {
@ -168,6 +204,22 @@ const Dump = struct {
try jw.endObject();
try jw.objectField("errors");
try jw.beginArray();
for (self.error_list.toSliceConst()) |zig_error| {
try jw.arrayElem();
try jw.beginObject();
try jw.objectField("src");
try jw.emitNumber(zig_error.src);
try jw.objectField("name");
try jw.emitString(zig_error.name);
try jw.endObject();
}
try jw.endArray();
try jw.objectField("astNodes");
try jw.beginArray();
for (self.node_list.toSliceConst()) |node| {