@@ -46,7 +46,7 @@ pub enum TokenTree {
4646 /// delimiters are implicitly represented by `Delimited`.
4747 Token ( Token , Spacing ) ,
4848 /// A delimited sequence of token trees.
49- Delimited ( DelimSpan , Delimiter , TokenStream ) ,
49+ Delimited ( DelimSpan , DelimSpacing , Delimiter , TokenStream ) ,
5050}
5151
5252// Ensure all fields of `TokenTree` are `DynSend` and `DynSync`.
@@ -62,11 +62,11 @@ where
6262}
6363
6464impl 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.
6666 pub fn eq_unspanned ( & self , other : & TokenTree ) -> bool {
6767 match ( self , other) {
6868 ( 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) ) => {
7070 delim == delim2 && tts. eq_unspanned ( tts2)
7171 }
7272 _ => false ,
@@ -188,7 +188,7 @@ pub struct AttrTokenStream(pub Lrc<Vec<AttrTokenTree>>);
188188#[ derive( Clone , Debug , Encodable , Decodable ) ]
189189pub enum AttrTokenTree {
190190 Token ( Token , Spacing ) ,
191- Delimited ( DelimSpan , Delimiter , AttrTokenStream ) ,
191+ Delimited ( DelimSpan , DelimSpacing , Delimiter , AttrTokenStream ) ,
192192 /// Stores the attributes for an attribute target,
193193 /// along with the tokens for that attribute target.
194194 /// See `AttributesData` for more information
@@ -213,9 +213,14 @@ impl AttrTokenStream {
213213 AttrTokenTree :: Token ( inner, spacing) => {
214214 smallvec ! [ TokenTree :: Token ( inner. clone( ) , * spacing) ] . into_iter ( )
215215 }
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 ( )
219224 }
220225 AttrTokenTree :: Attributes ( data) => {
221226 let idx = data
@@ -235,7 +240,7 @@ impl AttrTokenStream {
235240 let mut found = false ;
236241 // Check the last two trees (to account for a trailing semi)
237242 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 {
239244 // Inner attributes are only supported on extern blocks, functions,
240245 // impls, and modules. All of these have their inner attributes
241246 // placed at the beginning of the rightmost outermost braced group:
@@ -255,7 +260,7 @@ impl AttrTokenStream {
255260 stream. push_stream ( inner_attr. tokens ( ) ) ;
256261 }
257262 stream. push_stream ( delim_tokens. clone ( ) ) ;
258- * tree = TokenTree :: Delimited ( * span, * delim, stream) ;
263+ * tree = TokenTree :: Delimited ( * span, * spacing , * delim, stream) ;
259264 found = true ;
260265 break ;
261266 }
@@ -477,11 +482,6 @@ impl TokenStream {
477482 TokenStream :: new ( vec ! [ TokenTree :: token_alone( kind, span) ] )
478483 }
479484
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-
485485 pub fn from_ast ( node : & ( impl HasAttrs + HasSpan + HasTokens + fmt:: Debug ) ) -> TokenStream {
486486 let Some ( tokens) = node. tokens ( ) else {
487487 panic ! ( "missing tokens for node at {:?}: {:?}" , node. span( ) , node) ;
@@ -528,6 +528,7 @@ impl TokenStream {
528528 }
529529 token:: Interpolated ( nt) => TokenTree :: Delimited (
530530 DelimSpan :: from_single ( token. span ) ,
531+ DelimSpacing :: new ( Spacing :: JointHidden , spacing) ,
531532 Delimiter :: Invisible ,
532533 TokenStream :: from_nonterminal_ast ( & nt. 0 ) . flattened ( ) ,
533534 ) ,
@@ -538,8 +539,8 @@ impl TokenStream {
538539 fn flatten_token_tree ( tree : & TokenTree ) -> TokenTree {
539540 match tree {
540541 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 ( ) )
543544 }
544545 }
545546 }
@@ -549,7 +550,7 @@ impl TokenStream {
549550 fn can_skip ( stream : & TokenStream ) -> bool {
550551 stream. trees ( ) . all ( |tree| match tree {
551552 TokenTree :: Token ( token, _) => !matches ! ( token. kind, token:: Interpolated ( _) ) ,
552- TokenTree :: Delimited ( _ , _ , inner) => can_skip ( inner) ,
553+ TokenTree :: Delimited ( .. , inner) => can_skip ( inner) ,
553554 } )
554555 }
555556
@@ -638,9 +639,10 @@ impl TokenStream {
638639
639640 & TokenTree :: Token ( ..) => i += 1 ,
640641
641- & TokenTree :: Delimited ( sp, delim, ref delim_stream) => {
642+ & TokenTree :: Delimited ( sp, spacing , delim, ref delim_stream) => {
642643 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) ;
644646 Lrc :: make_mut ( & mut stream. 0 ) [ i] = new_tt;
645647 modified = true ;
646648 }
@@ -668,10 +670,11 @@ impl TokenStream {
668670 num_of_hashes = cmp:: max ( num_of_hashes, count) ;
669671 }
670672
671- // `/// foo` becomes `doc = r"foo"`.
673+ // `/// foo` becomes `[ doc = r"foo"] `.
672674 let delim_span = DelimSpan :: from_single ( span) ;
673675 let body = TokenTree :: Delimited (
674676 delim_span,
677+ DelimSpacing :: new ( Spacing :: JointHidden , Spacing :: Alone ) ,
675678 Delimiter :: Bracket ,
676679 [
677680 TokenTree :: token_alone ( token:: Ident ( sym:: doc, false ) , span) ,
@@ -784,6 +787,18 @@ impl DelimSpan {
784787 }
785788}
786789
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+
787802// Some types are used a lot. Make sure they don't unintentionally get bigger.
788803#[ cfg( all( target_arch = "x86_64" , target_pointer_width = "64" ) ) ]
789804mod size_asserts {
0 commit comments