@@ -261,25 +261,28 @@ impl TokenCursor {
261261 /// This always-inlined version should only be used on hot code paths.
262262 #[ inline( always) ]
263263 fn inlined_next ( & mut self , desugar_doc_comments : bool ) -> ( Token , Spacing ) {
264- let ( token , spacing ) = loop {
264+ loop {
265265 if !self . frame . open_delim {
266266 self . frame . open_delim = true ;
267267 return (
268268 Token :: new ( token:: OpenDelim ( self . frame . delim ) , self . frame . span . open ) ,
269269 Spacing :: Alone ,
270270 ) ;
271271 } else if let Some ( ( tree, spacing) ) = self . frame . tree_cursor . next_with_spacing ( ) {
272- match tree {
273- TokenTree :: Token ( token) => {
274- break ( token, spacing) ;
275- }
272+ return match tree {
273+ TokenTree :: Token ( token) => match ( desugar_doc_comments, & token) {
274+ ( true , & Token { kind : token:: DocComment ( _, attr_style, data) , span } ) => {
275+ self . desugar ( attr_style, data, span)
276+ }
277+ _ => ( token, spacing) ,
278+ } ,
276279 TokenTree :: Delimited ( sp, delim, tts) => {
277280 // Set `open_delim` to true here because we deal with it immediately.
278281 let frame = TokenCursorFrame :: new ( sp, delim, true , tts, false ) ;
279282 self . stack . push ( mem:: replace ( & mut self . frame , frame) ) ;
280- return ( Token :: new ( token:: OpenDelim ( delim) , sp. open ) , Spacing :: Alone ) ;
283+ ( Token :: new ( token:: OpenDelim ( delim) , sp. open ) , Spacing :: Alone )
281284 }
282- }
285+ } ;
283286 } else if !self . frame . close_delim {
284287 self . frame . close_delim = true ;
285288 return (
@@ -291,69 +294,59 @@ impl TokenCursor {
291294 } else {
292295 return ( Token :: new ( token:: Eof , DUMMY_SP ) , Spacing :: Alone ) ;
293296 }
294- } ;
297+ }
298+ }
295299
296- match ( desugar_doc_comments, & token) {
297- ( true , & Token { kind : token:: DocComment ( _, attr_style, data) , span } ) => {
298- // Searches for the occurrences of `"#*` and returns the minimum number of `#`s
299- // required to wrap the text.
300- let mut num_of_hashes = 0 ;
301- let mut count = 0 ;
302- for ch in data. as_str ( ) . chars ( ) {
303- count = match ch {
304- '"' => 1 ,
305- '#' if count > 0 => count + 1 ,
306- _ => 0 ,
307- } ;
308- num_of_hashes = cmp:: max ( num_of_hashes, count) ;
309- }
300+ fn desugar ( & mut self , attr_style : AttrStyle , data : Symbol , span : Span ) -> ( Token , Spacing ) {
301+ // Searches for the occurrences of `"#*` and returns the minimum number of `#`s
302+ // required to wrap the text.
303+ let mut num_of_hashes = 0 ;
304+ let mut count = 0 ;
305+ for ch in data. as_str ( ) . chars ( ) {
306+ count = match ch {
307+ '"' => 1 ,
308+ '#' if count > 0 => count + 1 ,
309+ _ => 0 ,
310+ } ;
311+ num_of_hashes = cmp:: max ( num_of_hashes, count) ;
312+ }
310313
311- let delim_span = DelimSpan :: from_single ( span) ;
312- let body = TokenTree :: Delimited (
313- delim_span,
314- token:: Bracket ,
315- [
316- TokenTree :: token ( token:: Ident ( sym:: doc, false ) , span) ,
317- TokenTree :: token ( token:: Eq , span) ,
318- TokenTree :: token (
319- TokenKind :: lit ( token:: StrRaw ( num_of_hashes) , data, None ) ,
320- span,
321- ) ,
322- ]
323- . iter ( )
324- . cloned ( )
325- . collect :: < TokenStream > ( ) ,
326- ) ;
314+ let delim_span = DelimSpan :: from_single ( span) ;
315+ let body = TokenTree :: Delimited (
316+ delim_span,
317+ token:: Bracket ,
318+ [
319+ TokenTree :: token ( token:: Ident ( sym:: doc, false ) , span) ,
320+ TokenTree :: token ( token:: Eq , span) ,
321+ TokenTree :: token ( TokenKind :: lit ( token:: StrRaw ( num_of_hashes) , data, None ) , span) ,
322+ ]
323+ . iter ( )
324+ . cloned ( )
325+ . collect :: < TokenStream > ( ) ,
326+ ) ;
327327
328- self . stack . push ( mem:: replace (
329- & mut self . frame ,
330- TokenCursorFrame :: new (
331- delim_span,
332- token:: NoDelim ,
333- false ,
334- if attr_style == AttrStyle :: Inner {
335- [
336- TokenTree :: token ( token:: Pound , span) ,
337- TokenTree :: token ( token:: Not , span) ,
338- body,
339- ]
340- . iter ( )
341- . cloned ( )
342- . collect :: < TokenStream > ( )
343- } else {
344- [ TokenTree :: token ( token:: Pound , span) , body]
345- . iter ( )
346- . cloned ( )
347- . collect :: < TokenStream > ( )
348- } ,
349- false ,
350- ) ,
351- ) ) ;
352-
353- self . next ( /* desugar_doc_comments */ false )
354- }
355- _ => ( token, spacing) ,
356- }
328+ self . stack . push ( mem:: replace (
329+ & mut self . frame ,
330+ TokenCursorFrame :: new (
331+ delim_span,
332+ token:: NoDelim ,
333+ false ,
334+ if attr_style == AttrStyle :: Inner {
335+ [ TokenTree :: token ( token:: Pound , span) , TokenTree :: token ( token:: Not , span) , body]
336+ . iter ( )
337+ . cloned ( )
338+ . collect :: < TokenStream > ( )
339+ } else {
340+ [ TokenTree :: token ( token:: Pound , span) , body]
341+ . iter ( )
342+ . cloned ( )
343+ . collect :: < TokenStream > ( )
344+ } ,
345+ false ,
346+ ) ,
347+ ) ) ;
348+
349+ self . next ( /* desugar_doc_comments */ false )
357350 }
358351}
359352
0 commit comments