| ... | ... | @@ -67,6 +67,11 @@ pub const Tree = struct { |
| 67 | 67 | pub fn tokenLocation(self: &Tree, start_index: usize, token_index: TokenIndex) Location { |
| 68 | 68 | return self.tokenLocationPtr(start_index, self.tokens.at(token_index)); |
| 69 | 69 | } |
| 70 | |
| 71 | pub fn dump(self: &Tree) void { |
| 72 | self.root_node.base.dump(0); |
| 73 | } |
| 74 | |
| 70 | 75 | }; |
| 71 | 76 | |
| 72 | 77 | pub const Error = union(enum) { |
| ... | ... | @@ -415,6 +420,20 @@ pub const Node = struct { |
| 415 | 420 | } |
| 416 | 421 | } |
| 417 | 422 | |
| 423 | pub fn dump(self: &Node, indent: usize) void { |
| 424 | { |
| 425 | var i: usize = 0; |
| 426 | while (i < indent) : (i += 1) { |
| 427 | std.debug.warn(" "); |
| 428 | } |
| 429 | } |
| 430 | std.debug.warn("{}\n", @tagName(self.id)); |
| 431 | |
| 432 | var child_i: usize = 0; |
| 433 | while (self.iterate(child_i)) |child| : (child_i += 1) { |
| 434 | child.dump(indent + 2); |
| 435 | } |
| 436 | } |
| 418 | 437 | |
| 419 | 438 | pub const Root = struct { |
| 420 | 439 | base: Node, |
| ... | ... | @@ -426,7 +445,7 @@ pub const Node = struct { |
| 426 | 445 | |
| 427 | 446 | pub fn iterate(self: &Root, index: usize) ?&Node { |
| 428 | 447 | if (index < self.decls.len) { |
| 429 | | return self.decls.items[self.decls.len - index - 1]; |
| 448 | return *self.decls.at(index); |
| 430 | 449 | } |
| 431 | 450 | return null; |
| 432 | 451 | } |
| ... | ... | @@ -790,8 +809,16 @@ pub const Node = struct { |
| 790 | 809 | pub fn iterate(self: &FnProto, index: usize) ?&Node { |
| 791 | 810 | var i = index; |
| 792 | 811 | |
| 793 | | if (self.body_node) |body_node| { |
| 794 | | if (i < 1) return body_node; |
| 812 | if (self.lib_name) |lib_name| { |
| 813 | if (i < 1) return lib_name; |
| 814 | i -= 1; |
| 815 | } |
| 816 | |
| 817 | if (i < self.params.len) return *self.params.at(self.params.len - i - 1); |
| 818 | i -= self.params.len; |
| 819 | |
| 820 | if (self.align_expr) |align_expr| { |
| 821 | if (i < 1) return align_expr; |
| 795 | 822 | i -= 1; |
| 796 | 823 | } |
| 797 | 824 | |
| ... | ... | @@ -807,18 +834,11 @@ pub const Node = struct { |
| 807 | 834 | }, |
| 808 | 835 | } |
| 809 | 836 | |
| 810 | | if (self.align_expr) |align_expr| { |
| 811 | | if (i < 1) return align_expr; |
| 837 | if (self.body_node) |body_node| { |
| 838 | if (i < 1) return body_node; |
| 812 | 839 | i -= 1; |
| 813 | 840 | } |
| 814 | 841 | |
| 815 | | if (i < self.params.len) return self.params.items[self.params.len - i - 1]; |
| 816 | | i -= self.params.len; |
| 817 | | |
| 818 | | if (self.lib_name) |lib_name| { |
| 819 | | if (i < 1) return lib_name; |
| 820 | | i -= 1; |
| 821 | | } |
| 822 | 842 | |
| 823 | 843 | return null; |
| 824 | 844 | } |
| ... | ... | @@ -914,7 +934,7 @@ pub const Node = struct { |
| 914 | 934 | pub fn iterate(self: &Block, index: usize) ?&Node { |
| 915 | 935 | var i = index; |
| 916 | 936 | |
| 917 | | if (i < self.statements.len) return self.statements.items[i]; |
| 937 | if (i < self.statements.len) return *self.statements.at(i); |
| 918 | 938 | i -= self.statements.len; |
| 919 | 939 | |
| 920 | 940 | return null; |
| ... | ... | @@ -1596,7 +1616,7 @@ pub const Node = struct { |
| 1596 | 1616 | i -= 1; |
| 1597 | 1617 | |
| 1598 | 1618 | switch (self.op) { |
| 1599 | | Op.Call => |call_info| { |
| 1619 | @TagType(Op).Call => |*call_info| { |
| 1600 | 1620 | if (i < call_info.params.len) return *call_info.params.at(i); |
| 1601 | 1621 | i -= call_info.params.len; |
| 1602 | 1622 | }, |
| ... | ... | @@ -1604,7 +1624,7 @@ pub const Node = struct { |
| 1604 | 1624 | if (i < 1) return index_expr; |
| 1605 | 1625 | i -= 1; |
| 1606 | 1626 | }, |
| 1607 | | Op.Slice => |range| { |
| 1627 | @TagType(Op).Slice => |range| { |
| 1608 | 1628 | if (i < 1) return range.start; |
| 1609 | 1629 | i -= 1; |
| 1610 | 1630 | |
| ... | ... | @@ -1613,11 +1633,11 @@ pub const Node = struct { |
| 1613 | 1633 | i -= 1; |
| 1614 | 1634 | } |
| 1615 | 1635 | }, |
| 1616 | | Op.ArrayInitializer => |exprs| { |
| 1636 | Op.ArrayInitializer => |*exprs| { |
| 1617 | 1637 | if (i < exprs.len) return *exprs.at(i); |
| 1618 | 1638 | i -= exprs.len; |
| 1619 | 1639 | }, |
| 1620 | | Op.StructInitializer => |fields| { |
| 1640 | Op.StructInitializer => |*fields| { |
| 1621 | 1641 | if (i < fields.len) return *fields.at(i); |
| 1622 | 1642 | i -= fields.len; |
| 1623 | 1643 | }, |