|
40 | 40 | Base.reverse(node::GreenTreeCursor) = Base.Iterators.Reverse(node) |
41 | 41 | Base.IteratorSize(::Type{Reverse{GreenTreeCursor}}) = Base.SizeUnknown() |
42 | 42 | @inline function Base.iterate(node::Reverse{GreenTreeCursor}, |
43 | | - next_idx::UInt32 = node.itr.position-UInt32(1))::Union{Nothing, Tuple{GreenTreeCursor, UInt32}} |
| 43 | + (next_idx, final)::NTuple{2, UInt32} = |
| 44 | + (node.itr.position-UInt32(1), node.itr.position - this(node.itr).node_span - UInt32(1)))::Union{Nothing, Tuple{GreenTreeCursor, NTuple{2, UInt32}}} |
44 | 45 | node = node.itr |
45 | 46 | while true |
46 | | - next_idx == node.position - this(node).node_span - UInt32(1) && return nothing |
| 47 | + next_idx == final && return nothing |
47 | 48 | next_node = GreenTreeCursor(node.parser_output, next_idx) |
48 | | - if kind(next_node) == K"TOMBSTONE" |
| 49 | + nrgn = this(next_node) |
| 50 | + if getfield(nrgn, :head).kind == K"TOMBSTONE" |
49 | 51 | # TOMBSTONED nodes are counted as part of the size of the tree, but |
50 | 52 | # do not contribute either byte ranges or children. |
51 | 53 | next_idx -= UInt32(1) |
52 | 54 | continue |
53 | 55 | end |
54 | 56 | # Inlined prev_sibling_assumed |
55 | | - new_next_idx = next_idx - this(next_node).node_span - UInt32(1) |
56 | | - return (next_node, new_next_idx) |
| 57 | + new_next_idx = next_idx - nrgn.node_span - UInt32(1) |
| 58 | + return (next_node, (new_next_idx, final)) |
57 | 59 | end |
58 | 60 | end |
59 | 61 |
|
|
95 | 97 |
|
96 | 98 | Base.reverse(node::RedTreeCursor) = Base.Iterators.Reverse(node) |
97 | 99 | Base.IteratorSize(::Type{Reverse{RedTreeCursor}}) = Base.SizeUnknown() |
98 | | -@inline function Base.iterate( |
99 | | - node::Reverse{RedTreeCursor}, |
100 | | - (next_byte_end, next_idx)::NTuple{2, UInt32} = |
101 | | - (node.itr.byte_end, node.itr.green.position-UInt32(1)))::Union{Nothing, Tuple{RedTreeCursor, NTuple{2, UInt32}}} |
102 | | - r = iterate(Reverse(node.itr.green), next_idx) |
| 100 | +@inline function Base.iterate(node::Reverse{RedTreeCursor})::Union{Nothing, Tuple{RedTreeCursor, NTuple{3, UInt32}}} |
| 101 | + r = iterate(Reverse(node.itr.green)) |
| 102 | + return _iterate_red_cursor(r, node.itr.byte_end) |
| 103 | +end |
| 104 | + |
| 105 | +@inline function Base.iterate(node::Reverse{RedTreeCursor}, state::NTuple{3, UInt32})::Union{Nothing, Tuple{RedTreeCursor, NTuple{3, UInt32}}} |
| 106 | + r = iterate(Reverse(node.itr.green), Base.tail(state)) |
| 107 | + return _iterate_red_cursor(r, first(state)) |
| 108 | +end |
| 109 | + |
| 110 | +@inline function _iterate_red_cursor(r, byte_end) |
103 | 111 | r === nothing && return nothing |
104 | 112 | next_node, next_idx = r |
105 | | - return RedTreeCursor(next_node, next_byte_end), |
106 | | - (next_byte_end - span(next_node), next_idx) |
| 113 | + return RedTreeCursor(next_node, byte_end), |
| 114 | + (byte_end - span(next_node), next_idx...) |
107 | 115 | end |
108 | 116 |
|
109 | 117 | is_leaf(node::RedTreeCursor) = is_leaf(node.green) |
|
0 commit comments