@@ -185,7 +185,7 @@ mod tests {
185185
186186 use super :: * ;
187187
188- fn fixture_token_tree ( ) -> TopSubtree < Span > {
188+ fn fixture_token_tree_top_many_none ( ) -> TopSubtree < Span > {
189189 let anchor = SpanAnchor {
190190 file_id : span:: EditionedFileId :: new (
191191 span:: FileId :: from_raw ( 0xe4e4e ) ,
@@ -201,7 +201,7 @@ mod tests {
201201 ctx : SyntaxContext :: root ( Edition :: CURRENT ) ,
202202 } ,
203203 close : Span {
204- range : TextRange :: empty ( TextSize :: new ( 19 ) ) ,
204+ range : TextRange :: empty ( TextSize :: new ( 0 ) ) ,
205205 anchor,
206206 ctx : SyntaxContext :: root ( Edition :: CURRENT ) ,
207207 } ,
@@ -259,56 +259,159 @@ mod tests {
259259 ctx : SyntaxContext :: root ( Edition :: CURRENT ) ,
260260 } ,
261261 ) ;
262+ builder. open (
263+ DelimiterKind :: Bracket ,
264+ Span {
265+ range : TextRange :: at ( TextSize :: new ( 15 ) , TextSize :: of ( '[' ) ) ,
266+ anchor,
267+ ctx : SyntaxContext :: root ( Edition :: CURRENT ) ,
268+ } ,
269+ ) ;
262270 builder. push ( Leaf :: Literal ( Literal {
263271 symbol : sym:: INTEGER_0 ,
264272 span : Span {
265- range : TextRange :: at ( TextSize :: new ( 15 ) , TextSize :: of ( "0u32" ) ) ,
273+ range : TextRange :: at ( TextSize :: new ( 16 ) , TextSize :: of ( "0u32" ) ) ,
266274 anchor,
267275 ctx : SyntaxContext :: root ( Edition :: CURRENT ) ,
268276 } ,
269277 kind : tt:: LitKind :: Integer ,
270278 suffix : Some ( sym:: u32) ,
271279 } ) ) ;
272280 builder. close ( Span {
273- range : TextRange :: at ( TextSize :: new ( 19 ) , TextSize :: of ( '} ' ) ) ,
281+ range : TextRange :: at ( TextSize :: new ( 20 ) , TextSize :: of ( '] ' ) ) ,
274282 anchor,
275283 ctx : SyntaxContext :: root ( Edition :: CURRENT ) ,
276284 } ) ;
277285
286+ builder. close ( Span {
287+ range : TextRange :: at ( TextSize :: new ( 21 ) , TextSize :: of ( '}' ) ) ,
288+ anchor,
289+ ctx : SyntaxContext :: root ( Edition :: CURRENT ) ,
290+ } ) ;
291+
292+ builder. build ( )
293+ }
294+
295+ fn fixture_token_tree_top_empty_none ( ) -> TopSubtree < Span > {
296+ let anchor = SpanAnchor {
297+ file_id : span:: EditionedFileId :: new (
298+ span:: FileId :: from_raw ( 0xe4e4e ) ,
299+ span:: Edition :: CURRENT ,
300+ ) ,
301+ ast_id : ROOT_ERASED_FILE_AST_ID ,
302+ } ;
303+
304+ let builder = TopSubtreeBuilder :: new ( Delimiter {
305+ open : Span {
306+ range : TextRange :: empty ( TextSize :: new ( 0 ) ) ,
307+ anchor,
308+ ctx : SyntaxContext :: root ( Edition :: CURRENT ) ,
309+ } ,
310+ close : Span {
311+ range : TextRange :: empty ( TextSize :: new ( 0 ) ) ,
312+ anchor,
313+ ctx : SyntaxContext :: root ( Edition :: CURRENT ) ,
314+ } ,
315+ kind : DelimiterKind :: Invisible ,
316+ } ) ;
317+
318+ builder. build ( )
319+ }
320+
321+ fn fixture_token_tree_top_empty_brace ( ) -> TopSubtree < Span > {
322+ let anchor = SpanAnchor {
323+ file_id : span:: EditionedFileId :: new (
324+ span:: FileId :: from_raw ( 0xe4e4e ) ,
325+ span:: Edition :: CURRENT ,
326+ ) ,
327+ ast_id : ROOT_ERASED_FILE_AST_ID ,
328+ } ;
329+
330+ let builder = TopSubtreeBuilder :: new ( Delimiter {
331+ open : Span {
332+ range : TextRange :: empty ( TextSize :: new ( 0 ) ) ,
333+ anchor,
334+ ctx : SyntaxContext :: root ( Edition :: CURRENT ) ,
335+ } ,
336+ close : Span {
337+ range : TextRange :: empty ( TextSize :: new ( 0 ) ) ,
338+ anchor,
339+ ctx : SyntaxContext :: root ( Edition :: CURRENT ) ,
340+ } ,
341+ kind : DelimiterKind :: Brace ,
342+ } ) ;
343+
278344 builder. build ( )
279345 }
280346
281347 #[ test]
282348 fn test_proc_macro_rpc_works ( ) {
283- let tt = fixture_token_tree ( ) ;
284- for v in version:: RUST_ANALYZER_SPAN_SUPPORT ..=version:: CURRENT_API_VERSION {
285- let mut span_data_table = Default :: default ( ) ;
286- let task = ExpandMacro {
287- data : ExpandMacroData {
288- macro_body : FlatTree :: from_subtree ( tt. view ( ) , v, & mut span_data_table) ,
289- macro_name : Default :: default ( ) ,
290- attributes : None ,
291- has_global_spans : ExpnGlobals {
292- serialize : true ,
293- def_site : 0 ,
294- call_site : 0 ,
295- mixed_site : 0 ,
349+ for tt in [
350+ fixture_token_tree_top_many_none,
351+ fixture_token_tree_top_empty_none,
352+ fixture_token_tree_top_empty_brace,
353+ ] {
354+ for v in version:: RUST_ANALYZER_SPAN_SUPPORT ..=version:: CURRENT_API_VERSION {
355+ let tt = tt ( ) ;
356+ let mut span_data_table = Default :: default ( ) ;
357+ let task = ExpandMacro {
358+ data : ExpandMacroData {
359+ macro_body : FlatTree :: from_subtree ( tt. view ( ) , v, & mut span_data_table) ,
360+ macro_name : Default :: default ( ) ,
361+ attributes : None ,
362+ has_global_spans : ExpnGlobals {
363+ serialize : true ,
364+ def_site : 0 ,
365+ call_site : 0 ,
366+ mixed_site : 0 ,
367+ } ,
368+ span_data_table : Vec :: new ( ) ,
296369 } ,
297- span_data_table : Vec :: new ( ) ,
298- } ,
299- lib : Utf8PathBuf :: from_path_buf ( std:: env:: current_dir ( ) . unwrap ( ) ) . unwrap ( ) ,
300- env : Default :: default ( ) ,
301- current_dir : Default :: default ( ) ,
302- } ;
303-
304- let json = serde_json:: to_string ( & task) . unwrap ( ) ;
305- // println!("{}", json);
306- let back: ExpandMacro = serde_json:: from_str ( & json) . unwrap ( ) ;
307-
308- assert ! (
309- tt == back. data. macro_body. to_subtree_resolved( v, & span_data_table) ,
310- "version: {v}"
311- ) ;
370+ lib : Utf8PathBuf :: from_path_buf ( std:: env:: current_dir ( ) . unwrap ( ) ) . unwrap ( ) ,
371+ env : Default :: default ( ) ,
372+ current_dir : Default :: default ( ) ,
373+ } ;
374+
375+ let json = serde_json:: to_string ( & task) . unwrap ( ) ;
376+ // println!("{}", json);
377+ let back: ExpandMacro = serde_json:: from_str ( & json) . unwrap ( ) ;
378+
379+ assert_eq ! (
380+ tt,
381+ back. data. macro_body. to_subtree_resolved( v, & span_data_table) ,
382+ "version: {v}"
383+ ) ;
384+ }
385+ }
386+ }
387+
388+ #[ test]
389+ #[ cfg( feature = "sysroot-abi" ) ]
390+ fn test_proc_macro_rpc_works_ts ( ) {
391+ for tt in [
392+ fixture_token_tree_top_many_none,
393+ fixture_token_tree_top_empty_none,
394+ fixture_token_tree_top_empty_brace,
395+ ] {
396+ let tt = tt ( ) ;
397+ for v in version:: RUST_ANALYZER_SPAN_SUPPORT ..=version:: CURRENT_API_VERSION {
398+ let mut span_data_table = Default :: default ( ) ;
399+ let flat_tree = FlatTree :: from_subtree ( tt. view ( ) , v, & mut span_data_table) ;
400+ assert_eq ! (
401+ tt,
402+ flat_tree. clone( ) . to_subtree_resolved( v, & span_data_table) ,
403+ "version: {v}"
404+ ) ;
405+ let ts = flat_tree. to_tokenstream_resolved ( v, & span_data_table, |a, b| a. cover ( b) ) ;
406+ let call_site = * span_data_table. first ( ) . unwrap ( ) ;
407+ let mut span_data_table = Default :: default ( ) ;
408+ assert_eq ! (
409+ tt,
410+ FlatTree :: from_tokenstream( ts. clone( ) , v, call_site, & mut span_data_table)
411+ . to_subtree_resolved( v, & span_data_table) ,
412+ "version: {v}, ts:\n {ts:#?}"
413+ ) ;
414+ }
312415 }
313416 }
314417}
0 commit comments