| ... | ... | @@ -13,7 +13,7 @@ pub const Error = error{ParseError} || Allocator.Error; |
| 13 | 13 | |
| 14 | 14 | /// Result should be freed with tree.deinit() when there are |
| 15 | 15 | /// no more references to any of the tokens or nodes. |
| 16 | | pub fn parse(allocator: *Allocator, source: []const u8) !*Tree { |
| 16 | pub fn parse(allocator: *Allocator, source: []const u8) Allocator.Error!*Tree { |
| 17 | 17 | const tree = blk: { |
| 18 | 18 | // This block looks unnecessary, but is a "foot-shield" to prevent the SegmentedLists |
| 19 | 19 | // from being initialized with a pointer to this `arena`, which is created on |
| ... | ... | @@ -48,29 +48,32 @@ pub fn parse(allocator: *Allocator, source: []const u8) !*Tree { |
| 48 | 48 | |
| 49 | 49 | while (it.peek().?.id == .LineComment) _ = it.next(); |
| 50 | 50 | |
| 51 | | tree.root_node = try parseRoot(arena, &it, tree); |
| 51 | tree.root_node = parseRoot(arena, &it, tree) catch |err| blk: { |
| 52 | switch (err) { |
| 53 | error.ParseError => { |
| 54 | assert(tree.errors.len != 0); |
| 55 | break :blk undefined; |
| 56 | }, |
| 57 | error.OutOfMemory => { |
| 58 | return error.OutOfMemory; |
| 59 | }, |
| 60 | } |
| 61 | }; |
| 62 | |
| 52 | 63 | return tree; |
| 53 | 64 | } |
| 54 | 65 | |
| 55 | 66 | /// Root <- skip ContainerMembers eof |
| 56 | | fn parseRoot(arena: *Allocator, it: *TokenIterator, tree: *Tree) Allocator.Error!*Node.Root { |
| 67 | fn parseRoot(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!*Node.Root { |
| 57 | 68 | const node = try arena.create(Node.Root); |
| 58 | 69 | node.* = Node.Root{ |
| 59 | | .decls = undefined, |
| 60 | | .eof_token = undefined, |
| 61 | | }; |
| 62 | | node.decls = parseContainerMembers(arena, it, tree) catch |err| { |
| 63 | | // TODO: Switch on the error type |
| 64 | | // https://github.com/ziglang/zig/issues/2473 |
| 65 | | if (err == error.ParseError) return node; |
| 66 | | assert(err == Allocator.Error.OutOfMemory); |
| 67 | | return Allocator.Error.OutOfMemory; |
| 68 | | }; |
| 69 | | node.eof_token = eatToken(it, .Eof) orelse { |
| 70 | | try tree.errors.push(AstError{ |
| 71 | | .ExpectedContainerMembers = AstError.ExpectedContainerMembers{ .token = it.index }, |
| 72 | | }); |
| 73 | | return node; |
| 70 | .decls = try parseContainerMembers(arena, it, tree), |
| 71 | .eof_token = eatToken(it, .Eof) orelse { |
| 72 | try tree.errors.push(AstError{ |
| 73 | .ExpectedContainerMembers = .{ .token = it.index }, |
| 74 | }); |
| 75 | return error.ParseError; |
| 76 | }, |
| 74 | 77 | }; |
| 75 | 78 | return node; |
| 76 | 79 | } |
| ... | ... | @@ -400,7 +403,7 @@ fn parseVarDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { |
| 400 | 403 | .visib_token = null, |
| 401 | 404 | .thread_local_token = null, |
| 402 | 405 | .name_token = name_token, |
| 403 | | .eq_token = eq_token orelse undefined, |
| 406 | .eq_token = eq_token, |
| 404 | 407 | .mut_token = mut_token, |
| 405 | 408 | .comptime_token = null, |
| 406 | 409 | .extern_export_token = null, |
| ... | ... | @@ -2187,7 +2190,7 @@ fn parsePrefixOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { |
| 2187 | 2190 | node.* = Node.PrefixOp{ |
| 2188 | 2191 | .op_token = token.index, |
| 2189 | 2192 | .op = op, |
| 2190 | | .rhs = undefined, |
| 2193 | .rhs = undefined, // set by caller |
| 2191 | 2194 | }; |
| 2192 | 2195 | return &node.base; |
| 2193 | 2196 | } |
| ... | ... | @@ -2829,8 +2832,8 @@ fn parseUse(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { |
| 2829 | 2832 | .doc_comments = null, |
| 2830 | 2833 | .visib_token = null, |
| 2831 | 2834 | .use_token = token, |
| 2832 | | .expr = undefined, |
| 2833 | | .semicolon_token = undefined, |
| 2835 | .expr = undefined, // set by caller |
| 2836 | .semicolon_token = undefined, // set by caller |
| 2834 | 2837 | }; |
| 2835 | 2838 | return &node.base; |
| 2836 | 2839 | } |
| ... | ... | @@ -2989,9 +2992,9 @@ fn createInfixOp(arena: *Allocator, index: TokenIndex, op: Node.InfixOp.Op) !*No |
| 2989 | 2992 | const node = try arena.create(Node.InfixOp); |
| 2990 | 2993 | node.* = Node.InfixOp{ |
| 2991 | 2994 | .op_token = index, |
| 2992 | | .lhs = undefined, |
| 2995 | .lhs = undefined, // set by caller |
| 2993 | 2996 | .op = op, |
| 2994 | | .rhs = undefined, |
| 2997 | .rhs = undefined, // set by caller |
| 2995 | 2998 | }; |
| 2996 | 2999 | return &node.base; |
| 2997 | 3000 | } |