@@ -39,7 +39,10 @@ use std::collections::{HashMap, VecDeque};
3939
4040use serde:: { Deserialize , Serialize } ;
4141
42- use crate :: tt:: { self , TokenId } ;
42+ use crate :: {
43+ msg:: ENCODE_CLOSE_SPAN_VERSION ,
44+ tt:: { self , TokenId } ,
45+ } ;
4346
4447#[ derive( Serialize , Deserialize , Debug ) ]
4548pub struct FlatTree {
@@ -52,7 +55,8 @@ pub struct FlatTree {
5255}
5356
5457struct SubtreeRepr {
55- id : tt:: TokenId ,
58+ open : tt:: TokenId ,
59+ close : tt:: TokenId ,
5660 kind : tt:: DelimiterKind ,
5761 tt : [ u32 ; 2 ] ,
5862}
@@ -74,7 +78,7 @@ struct IdentRepr {
7478}
7579
7680impl FlatTree {
77- pub fn new ( subtree : & tt:: Subtree ) -> FlatTree {
81+ pub fn new ( subtree : & tt:: Subtree , version : u32 ) -> FlatTree {
7882 let mut w = Writer {
7983 string_table : HashMap :: new ( ) ,
8084 work : VecDeque :: new ( ) ,
@@ -89,7 +93,11 @@ impl FlatTree {
8993 w. write ( subtree) ;
9094
9195 return FlatTree {
92- subtree : write_vec ( w. subtree , SubtreeRepr :: write) ,
96+ subtree : if version >= ENCODE_CLOSE_SPAN_VERSION {
97+ write_vec ( w. subtree , SubtreeRepr :: write_with_close_span)
98+ } else {
99+ write_vec ( w. subtree , SubtreeRepr :: write)
100+ } ,
93101 literal : write_vec ( w. literal , LiteralRepr :: write) ,
94102 punct : write_vec ( w. punct , PunctRepr :: write) ,
95103 ident : write_vec ( w. ident , IdentRepr :: write) ,
@@ -102,9 +110,13 @@ impl FlatTree {
102110 }
103111 }
104112
105- pub fn to_subtree ( self ) -> tt:: Subtree {
113+ pub fn to_subtree ( self , version : u32 ) -> tt:: Subtree {
106114 return Reader {
107- subtree : read_vec ( self . subtree , SubtreeRepr :: read) ,
115+ subtree : if version >= ENCODE_CLOSE_SPAN_VERSION {
116+ read_vec ( self . subtree , SubtreeRepr :: read_with_close_span)
117+ } else {
118+ read_vec ( self . subtree , SubtreeRepr :: read)
119+ } ,
108120 literal : read_vec ( self . literal , LiteralRepr :: read) ,
109121 punct : read_vec ( self . punct , PunctRepr :: read) ,
110122 ident : read_vec ( self . ident , IdentRepr :: read) ,
@@ -130,17 +142,36 @@ impl SubtreeRepr {
130142 tt:: DelimiterKind :: Brace => 2 ,
131143 tt:: DelimiterKind :: Bracket => 3 ,
132144 } ;
133- [ self . id . 0 , kind, self . tt [ 0 ] , self . tt [ 1 ] ]
145+ [ self . open . 0 , kind, self . tt [ 0 ] , self . tt [ 1 ] ]
134146 }
135- fn read ( [ id , kind, lo, len] : [ u32 ; 4 ] ) -> SubtreeRepr {
147+ fn read ( [ open , kind, lo, len] : [ u32 ; 4 ] ) -> SubtreeRepr {
136148 let kind = match kind {
137149 0 => tt:: DelimiterKind :: Invisible ,
138150 1 => tt:: DelimiterKind :: Parenthesis ,
139151 2 => tt:: DelimiterKind :: Brace ,
140152 3 => tt:: DelimiterKind :: Bracket ,
141153 other => panic ! ( "bad kind {other}" ) ,
142154 } ;
143- SubtreeRepr { id : TokenId ( id) , kind, tt : [ lo, len] }
155+ SubtreeRepr { open : TokenId ( open) , close : TokenId :: UNSPECIFIED , kind, tt : [ lo, len] }
156+ }
157+ fn write_with_close_span ( self ) -> [ u32 ; 5 ] {
158+ let kind = match self . kind {
159+ tt:: DelimiterKind :: Invisible => 0 ,
160+ tt:: DelimiterKind :: Parenthesis => 1 ,
161+ tt:: DelimiterKind :: Brace => 2 ,
162+ tt:: DelimiterKind :: Bracket => 3 ,
163+ } ;
164+ [ self . open . 0 , self . close . 0 , kind, self . tt [ 0 ] , self . tt [ 1 ] ]
165+ }
166+ fn read_with_close_span ( [ open, close, kind, lo, len] : [ u32 ; 5 ] ) -> SubtreeRepr {
167+ let kind = match kind {
168+ 0 => tt:: DelimiterKind :: Invisible ,
169+ 1 => tt:: DelimiterKind :: Parenthesis ,
170+ 2 => tt:: DelimiterKind :: Brace ,
171+ 3 => tt:: DelimiterKind :: Bracket ,
172+ other => panic ! ( "bad kind {other}" ) ,
173+ } ;
174+ SubtreeRepr { open : TokenId ( open) , close : TokenId ( close) , kind, tt : [ lo, len] }
144175 }
145176}
146177
@@ -244,9 +275,10 @@ impl<'a> Writer<'a> {
244275
245276 fn enqueue ( & mut self , subtree : & ' a tt:: Subtree ) -> u32 {
246277 let idx = self . subtree . len ( ) ;
247- let delimiter_id = subtree. delimiter . open ;
278+ let open = subtree. delimiter . open ;
279+ let close = subtree. delimiter . close ;
248280 let delimiter_kind = subtree. delimiter . kind ;
249- self . subtree . push ( SubtreeRepr { id : delimiter_id , kind : delimiter_kind, tt : [ !0 , !0 ] } ) ;
281+ self . subtree . push ( SubtreeRepr { open , close , kind : delimiter_kind, tt : [ !0 , !0 ] } ) ;
250282 self . work . push_back ( ( idx, subtree) ) ;
251283 idx as u32
252284 }
@@ -277,11 +309,7 @@ impl Reader {
277309 let repr = & self . subtree [ i] ;
278310 let token_trees = & self . token_tree [ repr. tt [ 0 ] as usize ..repr. tt [ 1 ] as usize ] ;
279311 let s = tt:: Subtree {
280- delimiter : tt:: Delimiter {
281- open : repr. id ,
282- close : TokenId :: UNSPECIFIED ,
283- kind : repr. kind ,
284- } ,
312+ delimiter : tt:: Delimiter { open : repr. open , close : repr. close , kind : repr. kind } ,
285313 token_trees : token_trees
286314 . iter ( )
287315 . copied ( )
0 commit comments