@@ -39,7 +39,10 @@ use std::collections::{HashMap, VecDeque};
39
39
40
40
use serde:: { Deserialize , Serialize } ;
41
41
42
- use crate :: tt:: { self , TokenId } ;
42
+ use crate :: {
43
+ msg:: ENCODE_CLOSE_SPAN_VERSION ,
44
+ tt:: { self , TokenId } ,
45
+ } ;
43
46
44
47
#[ derive( Serialize , Deserialize , Debug ) ]
45
48
pub struct FlatTree {
@@ -52,7 +55,8 @@ pub struct FlatTree {
52
55
}
53
56
54
57
struct SubtreeRepr {
55
- id : tt:: TokenId ,
58
+ open : tt:: TokenId ,
59
+ close : tt:: TokenId ,
56
60
kind : tt:: DelimiterKind ,
57
61
tt : [ u32 ; 2 ] ,
58
62
}
@@ -74,7 +78,7 @@ struct IdentRepr {
74
78
}
75
79
76
80
impl FlatTree {
77
- pub fn new ( subtree : & tt:: Subtree ) -> FlatTree {
81
+ pub fn new ( subtree : & tt:: Subtree , version : u32 ) -> FlatTree {
78
82
let mut w = Writer {
79
83
string_table : HashMap :: new ( ) ,
80
84
work : VecDeque :: new ( ) ,
@@ -89,7 +93,11 @@ impl FlatTree {
89
93
w. write ( subtree) ;
90
94
91
95
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
+ } ,
93
101
literal : write_vec ( w. literal , LiteralRepr :: write) ,
94
102
punct : write_vec ( w. punct , PunctRepr :: write) ,
95
103
ident : write_vec ( w. ident , IdentRepr :: write) ,
@@ -102,9 +110,13 @@ impl FlatTree {
102
110
}
103
111
}
104
112
105
- pub fn to_subtree ( self ) -> tt:: Subtree {
113
+ pub fn to_subtree ( self , version : u32 ) -> tt:: Subtree {
106
114
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
+ } ,
108
120
literal : read_vec ( self . literal , LiteralRepr :: read) ,
109
121
punct : read_vec ( self . punct , PunctRepr :: read) ,
110
122
ident : read_vec ( self . ident , IdentRepr :: read) ,
@@ -130,17 +142,36 @@ impl SubtreeRepr {
130
142
tt:: DelimiterKind :: Brace => 2 ,
131
143
tt:: DelimiterKind :: Bracket => 3 ,
132
144
} ;
133
- [ self . id . 0 , kind, self . tt [ 0 ] , self . tt [ 1 ] ]
145
+ [ self . open . 0 , kind, self . tt [ 0 ] , self . tt [ 1 ] ]
134
146
}
135
- fn read ( [ id , kind, lo, len] : [ u32 ; 4 ] ) -> SubtreeRepr {
147
+ fn read ( [ open , kind, lo, len] : [ u32 ; 4 ] ) -> SubtreeRepr {
136
148
let kind = match kind {
137
149
0 => tt:: DelimiterKind :: Invisible ,
138
150
1 => tt:: DelimiterKind :: Parenthesis ,
139
151
2 => tt:: DelimiterKind :: Brace ,
140
152
3 => tt:: DelimiterKind :: Bracket ,
141
153
other => panic ! ( "bad kind {other}" ) ,
142
154
} ;
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] }
144
175
}
145
176
}
146
177
@@ -244,9 +275,10 @@ impl<'a> Writer<'a> {
244
275
245
276
fn enqueue ( & mut self , subtree : & ' a tt:: Subtree ) -> u32 {
246
277
let idx = self . subtree . len ( ) ;
247
- let delimiter_id = subtree. delimiter . open ;
278
+ let open = subtree. delimiter . open ;
279
+ let close = subtree. delimiter . close ;
248
280
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 ] } ) ;
250
282
self . work . push_back ( ( idx, subtree) ) ;
251
283
idx as u32
252
284
}
@@ -277,11 +309,7 @@ impl Reader {
277
309
let repr = & self . subtree [ i] ;
278
310
let token_trees = & self . token_tree [ repr. tt [ 0 ] as usize ..repr. tt [ 1 ] as usize ] ;
279
311
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 } ,
285
313
token_trees : token_trees
286
314
. iter ( )
287
315
. copied ( )
0 commit comments