| ... | ... | @@ -1,3 +1,4 @@ |
| 1 | pub const max_bytes = 10 * 1024 * 1024; |
| 1 | 2 | pub const basename = "build.zig.zon"; |
| 2 | 3 | pub const Hash = std.crypto.hash.sha2.Sha256; |
| 3 | 4 | |
| ... | ... | @@ -50,6 +51,7 @@ pub const multihash_len = 1 + 1 + Hash.digest_length; |
| 50 | 51 | name: []const u8, |
| 51 | 52 | version: std.SemanticVersion, |
| 52 | 53 | dependencies: std.StringArrayHashMapUnmanaged(Dependency), |
| 54 | paths: std.StringArrayHashMapUnmanaged(void), |
| 53 | 55 | |
| 54 | 56 | errors: []ErrorMessage, |
| 55 | 57 | arena_state: std.heap.ArenaAllocator.State, |
| ... | ... | @@ -74,11 +76,13 @@ pub fn parse(gpa: Allocator, ast: std.zig.Ast) Error!Manifest { |
| 74 | 76 | .name = undefined, |
| 75 | 77 | .version = undefined, |
| 76 | 78 | .dependencies = .{}, |
| 79 | .paths = .{}, |
| 77 | 80 | .buf = .{}, |
| 78 | 81 | }; |
| 79 | 82 | defer p.buf.deinit(gpa); |
| 80 | 83 | defer p.errors.deinit(gpa); |
| 81 | 84 | defer p.dependencies.deinit(gpa); |
| 85 | defer p.paths.deinit(gpa); |
| 82 | 86 | |
| 83 | 87 | p.parseRoot(main_node_index) catch |err| switch (err) { |
| 84 | 88 | error.ParseFailure => assert(p.errors.items.len > 0), |
| ... | ... | @@ -89,6 +93,7 @@ pub fn parse(gpa: Allocator, ast: std.zig.Ast) Error!Manifest { |
| 89 | 93 | .name = p.name, |
| 90 | 94 | .version = p.version, |
| 91 | 95 | .dependencies = try p.dependencies.clone(p.arena), |
| 96 | .paths = try p.paths.clone(p.arena), |
| 92 | 97 | .errors = try p.arena.dupe(ErrorMessage, p.errors.items), |
| 93 | 98 | .arena_state = arena_instance.state, |
| 94 | 99 | }; |
| ... | ... | @@ -143,6 +148,7 @@ const Parse = struct { |
| 143 | 148 | name: []const u8, |
| 144 | 149 | version: std.SemanticVersion, |
| 145 | 150 | dependencies: std.StringArrayHashMapUnmanaged(Dependency), |
| 151 | paths: std.StringArrayHashMapUnmanaged(void), |
| 146 | 152 | |
| 147 | 153 | const InnerError = error{ ParseFailure, OutOfMemory }; |
| 148 | 154 | |
| ... | ... | @@ -158,6 +164,7 @@ const Parse = struct { |
| 158 | 164 | |
| 159 | 165 | var have_name = false; |
| 160 | 166 | var have_version = false; |
| 167 | var have_included_paths = false; |
| 161 | 168 | |
| 162 | 169 | for (struct_init.ast.fields) |field_init| { |
| 163 | 170 | const name_token = ast.firstToken(field_init) - 2; |
| ... | ... | @@ -167,6 +174,8 @@ const Parse = struct { |
| 167 | 174 | // that is desirable on a per-field basis. |
| 168 | 175 | if (mem.eql(u8, field_name, "dependencies")) { |
| 169 | 176 | try parseDependencies(p, field_init); |
| 177 | } else if (mem.eql(u8, field_name, "paths")) { |
| 178 | try parseIncludedPaths(p, field_init); |
| 170 | 179 | } else if (mem.eql(u8, field_name, "name")) { |
| 171 | 180 | p.name = try parseString(p, field_init); |
| 172 | 181 | have_name = true; |
| ... | ... | @@ -190,6 +199,10 @@ const Parse = struct { |
| 190 | 199 | if (!have_version) { |
| 191 | 200 | try appendError(p, main_token, "missing top-level 'version' field", .{}); |
| 192 | 201 | } |
| 202 | |
| 203 | if (!have_included_paths) { |
| 204 | try appendError(p, main_token, "missing top-level 'paths' field", .{}); |
| 205 | } |
| 193 | 206 | } |
| 194 | 207 | |
| 195 | 208 | fn parseDependencies(p: *Parse, node: Ast.Node.Index) !void { |
| ... | ... | @@ -277,6 +290,23 @@ const Parse = struct { |
| 277 | 290 | return dep; |
| 278 | 291 | } |
| 279 | 292 | |
| 293 | fn parseIncludedPaths(p: *Parse, node: Ast.Node.Index) !void { |
| 294 | const ast = p.ast; |
| 295 | const main_tokens = ast.nodes.items(.main_token); |
| 296 | |
| 297 | var buf: [2]Ast.Node.Index = undefined; |
| 298 | const array_init = ast.fullArrayInit(&buf, node) orelse { |
| 299 | const tok = main_tokens[node]; |
| 300 | return fail(p, tok, "expected paths expression to be a struct", .{}); |
| 301 | }; |
| 302 | |
| 303 | for (array_init.ast.elements) |elem_node| { |
| 304 | const path_string = try parseString(p, elem_node); |
| 305 | const normalized = try std.fs.path.resolve(p.arena, &.{path_string}); |
| 306 | try p.paths.put(p.gpa, normalized, {}); |
| 307 | } |
| 308 | } |
| 309 | |
| 280 | 310 | fn parseString(p: *Parse, node: Ast.Node.Index) ![]const u8 { |
| 281 | 311 | const ast = p.ast; |
| 282 | 312 | const node_tags = ast.nodes.items(.tag); |