| ... | ... | @@ -11,6 +11,7 @@ pub const Dependency = struct { |
| 11 | 11 | location_tok: Ast.TokenIndex, |
| 12 | 12 | hash: ?[]const u8, |
| 13 | 13 | hash_tok: Ast.TokenIndex, |
| 14 | node: Ast.Node.Index, |
| 14 | 15 | |
| 15 | 16 | pub const Location = union(enum) { |
| 16 | 17 | url: []const u8, |
| ... | ... | @@ -55,7 +56,9 @@ comptime { |
| 55 | 56 | |
| 56 | 57 | name: []const u8, |
| 57 | 58 | version: std.SemanticVersion, |
| 59 | version_node: Ast.Node.Index, |
| 58 | 60 | dependencies: std.StringArrayHashMapUnmanaged(Dependency), |
| 61 | dependencies_node: Ast.Node.Index, |
| 59 | 62 | paths: std.StringArrayHashMapUnmanaged(void), |
| 60 | 63 | minimum_zig_version: ?std.SemanticVersion, |
| 61 | 64 | |
| ... | ... | @@ -68,7 +71,7 @@ pub const ParseOptions = struct { |
| 68 | 71 | |
| 69 | 72 | pub const Error = Allocator.Error; |
| 70 | 73 | |
| 71 | | pub fn parse(gpa: Allocator, ast: std.zig.Ast, options: ParseOptions) Error!Manifest { |
| 74 | pub fn parse(gpa: Allocator, ast: Ast, options: ParseOptions) Error!Manifest { |
| 72 | 75 | const node_tags = ast.nodes.items(.tag); |
| 73 | 76 | const node_datas = ast.nodes.items(.data); |
| 74 | 77 | assert(node_tags[0] == .root); |
| ... | ... | @@ -85,7 +88,9 @@ pub fn parse(gpa: Allocator, ast: std.zig.Ast, options: ParseOptions) Error!Mani |
| 85 | 88 | |
| 86 | 89 | .name = undefined, |
| 87 | 90 | .version = undefined, |
| 91 | .version_node = 0, |
| 88 | 92 | .dependencies = .{}, |
| 93 | .dependencies_node = 0, |
| 89 | 94 | .paths = .{}, |
| 90 | 95 | .allow_missing_paths_field = options.allow_missing_paths_field, |
| 91 | 96 | .minimum_zig_version = null, |
| ... | ... | @@ -104,7 +109,9 @@ pub fn parse(gpa: Allocator, ast: std.zig.Ast, options: ParseOptions) Error!Mani |
| 104 | 109 | return .{ |
| 105 | 110 | .name = p.name, |
| 106 | 111 | .version = p.version, |
| 112 | .version_node = p.version_node, |
| 107 | 113 | .dependencies = try p.dependencies.clone(p.arena), |
| 114 | .dependencies_node = p.dependencies_node, |
| 108 | 115 | .paths = try p.paths.clone(p.arena), |
| 109 | 116 | .minimum_zig_version = p.minimum_zig_version, |
| 110 | 117 | .errors = try p.arena.dupe(ErrorMessage, p.errors.items), |
| ... | ... | @@ -117,6 +124,33 @@ pub fn deinit(man: *Manifest, gpa: Allocator) void { |
| 117 | 124 | man.* = undefined; |
| 118 | 125 | } |
| 119 | 126 | |
| 127 | pub fn copyErrorsIntoBundle( |
| 128 | man: Manifest, |
| 129 | ast: Ast, |
| 130 | /// ErrorBundle null-terminated string index |
| 131 | src_path: u32, |
| 132 | eb: *std.zig.ErrorBundle.Wip, |
| 133 | ) Allocator.Error!void { |
| 134 | const token_starts = ast.tokens.items(.start); |
| 135 | |
| 136 | for (man.errors) |msg| { |
| 137 | const start_loc = ast.tokenLocation(0, msg.tok); |
| 138 | |
| 139 | try eb.addRootErrorMessage(.{ |
| 140 | .msg = try eb.addString(msg.msg), |
| 141 | .src_loc = try eb.addSourceLocation(.{ |
| 142 | .src_path = src_path, |
| 143 | .span_start = token_starts[msg.tok], |
| 144 | .span_end = @intCast(token_starts[msg.tok] + ast.tokenSlice(msg.tok).len), |
| 145 | .span_main = token_starts[msg.tok] + msg.off, |
| 146 | .line = @intCast(start_loc.line), |
| 147 | .column = @intCast(start_loc.column), |
| 148 | .source_line = try eb.addString(ast.source[start_loc.line_start..start_loc.line_end]), |
| 149 | }), |
| 150 | }); |
| 151 | } |
| 152 | } |
| 153 | |
| 120 | 154 | const hex_charset = "0123456789abcdef"; |
| 121 | 155 | |
| 122 | 156 | pub fn hex64(x: u64) [16]u8 { |
| ... | ... | @@ -153,14 +187,16 @@ pub fn hexDigest(digest: Digest) MultiHashHexDigest { |
| 153 | 187 | |
| 154 | 188 | const Parse = struct { |
| 155 | 189 | gpa: Allocator, |
| 156 | | ast: std.zig.Ast, |
| 190 | ast: Ast, |
| 157 | 191 | arena: Allocator, |
| 158 | 192 | buf: std.ArrayListUnmanaged(u8), |
| 159 | 193 | errors: std.ArrayListUnmanaged(ErrorMessage), |
| 160 | 194 | |
| 161 | 195 | name: []const u8, |
| 162 | 196 | version: std.SemanticVersion, |
| 197 | version_node: Ast.Node.Index, |
| 163 | 198 | dependencies: std.StringArrayHashMapUnmanaged(Dependency), |
| 199 | dependencies_node: Ast.Node.Index, |
| 164 | 200 | paths: std.StringArrayHashMapUnmanaged(void), |
| 165 | 201 | allow_missing_paths_field: bool, |
| 166 | 202 | minimum_zig_version: ?std.SemanticVersion, |
| ... | ... | @@ -188,6 +224,7 @@ const Parse = struct { |
| 188 | 224 | // things manually provides an opportunity to do any additional verification |
| 189 | 225 | // that is desirable on a per-field basis. |
| 190 | 226 | if (mem.eql(u8, field_name, "dependencies")) { |
| 227 | p.dependencies_node = field_init; |
| 191 | 228 | try parseDependencies(p, field_init); |
| 192 | 229 | } else if (mem.eql(u8, field_name, "paths")) { |
| 193 | 230 | have_included_paths = true; |
| ... | ... | @@ -196,6 +233,7 @@ const Parse = struct { |
| 196 | 233 | p.name = try parseString(p, field_init); |
| 197 | 234 | have_name = true; |
| 198 | 235 | } else if (mem.eql(u8, field_name, "version")) { |
| 236 | p.version_node = field_init; |
| 199 | 237 | const version_text = try parseString(p, field_init); |
| 200 | 238 | p.version = std.SemanticVersion.parse(version_text) catch |err| v: { |
| 201 | 239 | try appendError(p, main_tokens[field_init], "unable to parse semantic version: {s}", .{@errorName(err)}); |
| ... | ... | @@ -264,6 +302,7 @@ const Parse = struct { |
| 264 | 302 | .location_tok = 0, |
| 265 | 303 | .hash = null, |
| 266 | 304 | .hash_tok = 0, |
| 305 | .node = node, |
| 267 | 306 | }; |
| 268 | 307 | var has_location = false; |
| 269 | 308 | |
| ... | ... | @@ -548,7 +587,7 @@ test "basic" { |
| 548 | 587 | \\} |
| 549 | 588 | ; |
| 550 | 589 | |
| 551 | | var ast = try std.zig.Ast.parse(gpa, example, .zon); |
| 590 | var ast = try Ast.parse(gpa, example, .zon); |
| 552 | 591 | defer ast.deinit(gpa); |
| 553 | 592 | |
| 554 | 593 | try testing.expect(ast.errors.len == 0); |
| ... | ... | @@ -591,7 +630,7 @@ test "minimum_zig_version" { |
| 591 | 630 | \\} |
| 592 | 631 | ; |
| 593 | 632 | |
| 594 | | var ast = try std.zig.Ast.parse(gpa, example, .zon); |
| 633 | var ast = try Ast.parse(gpa, example, .zon); |
| 595 | 634 | defer ast.deinit(gpa); |
| 596 | 635 | |
| 597 | 636 | try testing.expect(ast.errors.len == 0); |
| ... | ... | @@ -623,7 +662,7 @@ test "minimum_zig_version - invalid version" { |
| 623 | 662 | \\} |
| 624 | 663 | ; |
| 625 | 664 | |
| 626 | | var ast = try std.zig.Ast.parse(gpa, example, .zon); |
| 665 | var ast = try Ast.parse(gpa, example, .zon); |
| 627 | 666 | defer ast.deinit(gpa); |
| 628 | 667 | |
| 629 | 668 | try testing.expect(ast.errors.len == 0); |