| ... | @@ -67,6 +67,11 @@ pub const Tree = struct { | ... | @@ -67,6 +67,11 @@ pub const Tree = struct { |
| 67 | pub fn tokenLocation(self: &Tree, start_index: usize, token_index: TokenIndex) Location { | 67 | pub fn tokenLocation(self: &Tree, start_index: usize, token_index: TokenIndex) Location { |
| 68 | return self.tokenLocationPtr(start_index, self.tokens.at(token_index)); | 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 | pub const Error = union(enum) { | 77 | pub const Error = union(enum) { |
| ... | @@ -415,6 +420,20 @@ pub const Node = struct { | ... | @@ -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 | pub const Root = struct { | 438 | pub const Root = struct { |
| 420 | base: Node, | 439 | base: Node, |
| ... | @@ -426,7 +445,7 @@ pub const Node = struct { | ... | @@ -426,7 +445,7 @@ pub const Node = struct { |
| 426 | | 445 | |
| 427 | pub fn iterate(self: &Root, index: usize) ?&Node { | 446 | pub fn iterate(self: &Root, index: usize) ?&Node { |
| 428 | if (index < self.decls.len) { | 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 | return null; | 450 | return null; |
| 432 | } | 451 | } |
| ... | @@ -790,8 +809,16 @@ pub const Node = struct { | ... | @@ -790,8 +809,16 @@ pub const Node = struct { |
| 790 | pub fn iterate(self: &FnProto, index: usize) ?&Node { | 809 | pub fn iterate(self: &FnProto, index: usize) ?&Node { |
| 791 | var i = index; | 810 | var i = index; |
| 792 | | 811 | |
| 793 | if (self.body_node) |body_node| { | 812 | if (self.lib_name) |lib_name| { |
| 794 | if (i < 1) return body_node; | 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 | i -= 1; | 822 | i -= 1; |
| 796 | } | 823 | } |
| 797 | | 824 | |
| ... | @@ -807,18 +834,11 @@ pub const Node = struct { | ... | @@ -807,18 +834,11 @@ pub const Node = struct { |
| 807 | }, | 834 | }, |
| 808 | } | 835 | } |
| 809 | | 836 | |
| 810 | if (self.align_expr) |align_expr| { | 837 | if (self.body_node) |body_node| { |
| 811 | if (i < 1) return align_expr; | 838 | if (i < 1) return body_node; |
| 812 | i -= 1; | 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 | return null; | 843 | return null; |
| 824 | } | 844 | } |
| ... | @@ -914,7 +934,7 @@ pub const Node = struct { | ... | @@ -914,7 +934,7 @@ pub const Node = struct { |
| 914 | pub fn iterate(self: &Block, index: usize) ?&Node { | 934 | pub fn iterate(self: &Block, index: usize) ?&Node { |
| 915 | var i = index; | 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 | i -= self.statements.len; | 938 | i -= self.statements.len; |
| 919 | | 939 | |
| 920 | return null; | 940 | return null; |
| ... | @@ -1596,7 +1616,7 @@ pub const Node = struct { | ... | @@ -1596,7 +1616,7 @@ pub const Node = struct { |
| 1596 | i -= 1; | 1616 | i -= 1; |
| 1597 | | 1617 | |
| 1598 | switch (self.op) { | 1618 | switch (self.op) { |
| 1599 | Op.Call => |call_info| { | 1619 | @TagType(Op).Call => |*call_info| { |
| 1600 | if (i < call_info.params.len) return *call_info.params.at(i); | 1620 | if (i < call_info.params.len) return *call_info.params.at(i); |
| 1601 | i -= call_info.params.len; | 1621 | i -= call_info.params.len; |
| 1602 | }, | 1622 | }, |
| ... | @@ -1604,7 +1624,7 @@ pub const Node = struct { | ... | @@ -1604,7 +1624,7 @@ pub const Node = struct { |
| 1604 | if (i < 1) return index_expr; | 1624 | if (i < 1) return index_expr; |
| 1605 | i -= 1; | 1625 | i -= 1; |
| 1606 | }, | 1626 | }, |
| 1607 | Op.Slice => |range| { | 1627 | @TagType(Op).Slice => |range| { |
| 1608 | if (i < 1) return range.start; | 1628 | if (i < 1) return range.start; |
| 1609 | i -= 1; | 1629 | i -= 1; |
| 1610 | | 1630 | |
| ... | @@ -1613,11 +1633,11 @@ pub const Node = struct { | ... | @@ -1613,11 +1633,11 @@ pub const Node = struct { |
| 1613 | i -= 1; | 1633 | i -= 1; |
| 1614 | } | 1634 | } |
| 1615 | }, | 1635 | }, |
| 1616 | Op.ArrayInitializer => |exprs| { | 1636 | Op.ArrayInitializer => |*exprs| { |
| 1617 | if (i < exprs.len) return *exprs.at(i); | 1637 | if (i < exprs.len) return *exprs.at(i); |
| 1618 | i -= exprs.len; | 1638 | i -= exprs.len; |
| 1619 | }, | 1639 | }, |
| 1620 | Op.StructInitializer => |fields| { | 1640 | Op.StructInitializer => |*fields| { |
| 1621 | if (i < fields.len) return *fields.at(i); | 1641 | if (i < fields.len) return *fields.at(i); |
| 1622 | i -= fields.len; | 1642 | i -= fields.len; |
| 1623 | }, | 1643 | }, |