@@ -46,7 +46,7 @@ pub enum TokenTree {
46
46
/// delimiters are implicitly represented by `Delimited`.
47
47
Token ( Token , Spacing ) ,
48
48
/// A delimited sequence of token trees.
49
- Delimited ( DelimSpan , Delimiter , TokenStream ) ,
49
+ Delimited ( DelimSpan , DelimSpacing , Delimiter , TokenStream ) ,
50
50
}
51
51
52
52
// Ensure all fields of `TokenTree` are `DynSend` and `DynSync`.
@@ -62,11 +62,11 @@ where
62
62
}
63
63
64
64
impl TokenTree {
65
- /// Checks if this `TokenTree` is equal to the other, regardless of span information.
65
+ /// Checks if this `TokenTree` is equal to the other, regardless of span/spacing information.
66
66
pub fn eq_unspanned ( & self , other : & TokenTree ) -> bool {
67
67
match ( self , other) {
68
68
( TokenTree :: Token ( token, _) , TokenTree :: Token ( token2, _) ) => token. kind == token2. kind ,
69
- ( TokenTree :: Delimited ( _ , delim, tts) , TokenTree :: Delimited ( _ , delim2, tts2) ) => {
69
+ ( TokenTree :: Delimited ( .. , delim, tts) , TokenTree :: Delimited ( .. , delim2, tts2) ) => {
70
70
delim == delim2 && tts. eq_unspanned ( tts2)
71
71
}
72
72
_ => false ,
@@ -188,7 +188,7 @@ pub struct AttrTokenStream(pub Lrc<Vec<AttrTokenTree>>);
188
188
#[ derive( Clone , Debug , Encodable , Decodable ) ]
189
189
pub enum AttrTokenTree {
190
190
Token ( Token , Spacing ) ,
191
- Delimited ( DelimSpan , Delimiter , AttrTokenStream ) ,
191
+ Delimited ( DelimSpan , DelimSpacing , Delimiter , AttrTokenStream ) ,
192
192
/// Stores the attributes for an attribute target,
193
193
/// along with the tokens for that attribute target.
194
194
/// See `AttributesData` for more information
@@ -213,9 +213,14 @@ impl AttrTokenStream {
213
213
AttrTokenTree :: Token ( inner, spacing) => {
214
214
smallvec ! [ TokenTree :: Token ( inner. clone( ) , * spacing) ] . into_iter ( )
215
215
}
216
- AttrTokenTree :: Delimited ( span, delim, stream) => {
217
- smallvec ! [ TokenTree :: Delimited ( * span, * delim, stream. to_tokenstream( ) ) , ]
218
- . into_iter ( )
216
+ AttrTokenTree :: Delimited ( span, spacing, delim, stream) => {
217
+ smallvec ! [ TokenTree :: Delimited (
218
+ * span,
219
+ * spacing,
220
+ * delim,
221
+ stream. to_tokenstream( )
222
+ ) , ]
223
+ . into_iter ( )
219
224
}
220
225
AttrTokenTree :: Attributes ( data) => {
221
226
let idx = data
@@ -235,7 +240,7 @@ impl AttrTokenStream {
235
240
let mut found = false ;
236
241
// Check the last two trees (to account for a trailing semi)
237
242
for tree in target_tokens. iter_mut ( ) . rev ( ) . take ( 2 ) {
238
- if let TokenTree :: Delimited ( span, delim, delim_tokens) = tree {
243
+ if let TokenTree :: Delimited ( span, spacing , delim, delim_tokens) = tree {
239
244
// Inner attributes are only supported on extern blocks, functions,
240
245
// impls, and modules. All of these have their inner attributes
241
246
// placed at the beginning of the rightmost outermost braced group:
@@ -255,7 +260,7 @@ impl AttrTokenStream {
255
260
stream. push_stream ( inner_attr. tokens ( ) ) ;
256
261
}
257
262
stream. push_stream ( delim_tokens. clone ( ) ) ;
258
- * tree = TokenTree :: Delimited ( * span, * delim, stream) ;
263
+ * tree = TokenTree :: Delimited ( * span, * spacing , * delim, stream) ;
259
264
found = true ;
260
265
break ;
261
266
}
@@ -477,11 +482,6 @@ impl TokenStream {
477
482
TokenStream :: new ( vec ! [ TokenTree :: token_alone( kind, span) ] )
478
483
}
479
484
480
- /// Create a token stream containing a single `Delimited`.
481
- pub fn delimited ( span : DelimSpan , delim : Delimiter , tts : TokenStream ) -> TokenStream {
482
- TokenStream :: new ( vec ! [ TokenTree :: Delimited ( span, delim, tts) ] )
483
- }
484
-
485
485
pub fn from_ast ( node : & ( impl HasAttrs + HasSpan + HasTokens + fmt:: Debug ) ) -> TokenStream {
486
486
let Some ( tokens) = node. tokens ( ) else {
487
487
panic ! ( "missing tokens for node at {:?}: {:?}" , node. span( ) , node) ;
@@ -528,6 +528,7 @@ impl TokenStream {
528
528
}
529
529
token:: Interpolated ( nt) => TokenTree :: Delimited (
530
530
DelimSpan :: from_single ( token. span ) ,
531
+ DelimSpacing :: new ( Spacing :: JointHidden , spacing) ,
531
532
Delimiter :: Invisible ,
532
533
TokenStream :: from_nonterminal_ast ( & nt. 0 ) . flattened ( ) ,
533
534
) ,
@@ -538,8 +539,8 @@ impl TokenStream {
538
539
fn flatten_token_tree ( tree : & TokenTree ) -> TokenTree {
539
540
match tree {
540
541
TokenTree :: Token ( token, spacing) => TokenStream :: flatten_token ( token, * spacing) ,
541
- TokenTree :: Delimited ( span, delim, tts) => {
542
- TokenTree :: Delimited ( * span, * delim, tts. flattened ( ) )
542
+ TokenTree :: Delimited ( span, spacing , delim, tts) => {
543
+ TokenTree :: Delimited ( * span, * spacing , * delim, tts. flattened ( ) )
543
544
}
544
545
}
545
546
}
@@ -549,7 +550,7 @@ impl TokenStream {
549
550
fn can_skip ( stream : & TokenStream ) -> bool {
550
551
stream. trees ( ) . all ( |tree| match tree {
551
552
TokenTree :: Token ( token, _) => !matches ! ( token. kind, token:: Interpolated ( _) ) ,
552
- TokenTree :: Delimited ( _ , _ , inner) => can_skip ( inner) ,
553
+ TokenTree :: Delimited ( .. , inner) => can_skip ( inner) ,
553
554
} )
554
555
}
555
556
@@ -638,9 +639,10 @@ impl TokenStream {
638
639
639
640
& TokenTree :: Token ( ..) => i += 1 ,
640
641
641
- & TokenTree :: Delimited ( sp, delim, ref delim_stream) => {
642
+ & TokenTree :: Delimited ( sp, spacing , delim, ref delim_stream) => {
642
643
if let Some ( desugared_delim_stream) = desugar_inner ( delim_stream. clone ( ) ) {
643
- let new_tt = TokenTree :: Delimited ( sp, delim, desugared_delim_stream) ;
644
+ let new_tt =
645
+ TokenTree :: Delimited ( sp, spacing, delim, desugared_delim_stream) ;
644
646
Lrc :: make_mut ( & mut stream. 0 ) [ i] = new_tt;
645
647
modified = true ;
646
648
}
@@ -668,10 +670,11 @@ impl TokenStream {
668
670
num_of_hashes = cmp:: max ( num_of_hashes, count) ;
669
671
}
670
672
671
- // `/// foo` becomes `doc = r"foo"`.
673
+ // `/// foo` becomes `[ doc = r"foo"] `.
672
674
let delim_span = DelimSpan :: from_single ( span) ;
673
675
let body = TokenTree :: Delimited (
674
676
delim_span,
677
+ DelimSpacing :: new ( Spacing :: JointHidden , Spacing :: Alone ) ,
675
678
Delimiter :: Bracket ,
676
679
[
677
680
TokenTree :: token_alone ( token:: Ident ( sym:: doc, false ) , span) ,
@@ -784,6 +787,18 @@ impl DelimSpan {
784
787
}
785
788
}
786
789
790
+ #[ derive( Copy , Clone , Debug , PartialEq , Encodable , Decodable , HashStable_Generic ) ]
791
+ pub struct DelimSpacing {
792
+ pub open : Spacing ,
793
+ pub close : Spacing ,
794
+ }
795
+
796
+ impl DelimSpacing {
797
+ pub fn new ( open : Spacing , close : Spacing ) -> DelimSpacing {
798
+ DelimSpacing { open, close }
799
+ }
800
+ }
801
+
787
802
// Some types are used a lot. Make sure they don't unintentionally get bigger.
788
803
#[ cfg( all( target_arch = "x86_64" , target_pointer_width = "64" ) ) ]
789
804
mod size_asserts {
0 commit comments