@@ -6,13 +6,14 @@ use rustc_ast::token::{self, Delimiter, IdentIsRaw, Lit, LitKind, Nonterminal, T
66use rustc_ast:: tokenstream:: { DelimSpacing , DelimSpan , Spacing , TokenStream , TokenTree } ;
77use rustc_data_structures:: fx:: FxHashMap ;
88use rustc_data_structures:: sync:: Lrc ;
9+ use rustc_data_structures:: unord:: UnordMap ;
910use rustc_errors:: { Diag , DiagCtxtHandle , PResult , pluralize} ;
1011use rustc_parse:: lexer:: nfc_normalize;
1112use rustc_parse:: parser:: ParseNtResult ;
1213use rustc_session:: parse:: { ParseSess , SymbolGallery } ;
1314use rustc_span:: hygiene:: { LocalExpnId , Transparency } ;
1415use rustc_span:: {
15- Ident , MacroRulesNormalizedIdent , Span , Symbol , SyntaxContext , sym, with_metavar_spans ,
16+ Ident , MacroRulesNormalizedIdent , Span , Symbol , SyntaxContext , sym, with_metavar_spans_mut ,
1617} ;
1718use smallvec:: { SmallVec , smallvec} ;
1819
@@ -282,11 +283,13 @@ pub(super) fn transcribe<'a>(
282283 }
283284 MatchedSingle ( ParseNtResult :: Ident ( ident, is_raw) ) => {
284285 marker. visit_span ( & mut sp) ;
286+ with_metavar_spans_mut ( |mspans| mspans. insert ( ident. span , sp) ) ;
285287 let kind = token:: NtIdent ( * ident, * is_raw) ;
286288 TokenTree :: token_alone ( kind, sp)
287289 }
288290 MatchedSingle ( ParseNtResult :: Lifetime ( ident, is_raw) ) => {
289291 marker. visit_span ( & mut sp) ;
292+ with_metavar_spans_mut ( |mspans| mspans. insert ( ident. span , sp) ) ;
290293 let kind = token:: NtLifetime ( * ident, * is_raw) ;
291294 TokenTree :: token_alone ( kind, sp)
292295 }
@@ -295,6 +298,8 @@ pub(super) fn transcribe<'a>(
295298 // `Delimiter::Invisible` to maintain parsing priorities.
296299 // `Interpolated` is currently used for such groups in rustc parser.
297300 marker. visit_span ( & mut sp) ;
301+ let use_span = nt. use_span ( ) ;
302+ with_metavar_spans_mut ( |mspans| mspans. insert ( use_span, sp) ) ;
298303 TokenTree :: token_alone ( token:: Interpolated ( Lrc :: clone ( nt) ) , sp)
299304 }
300305 MatchedSeq ( ..) => {
@@ -410,16 +415,16 @@ fn maybe_use_metavar_location(
410415 return orig_tt. clone ( ) ;
411416 }
412417
413- let insert = |mspans : & mut FxHashMap < _ , _ > , s, ms| match mspans. try_insert ( s, ms) {
418+ let insert = |mspans : & mut UnordMap < _ , _ > , s, ms| match mspans. try_insert ( s, ms) {
414419 Ok ( _) => true ,
415420 Err ( err) => * err. entry . get ( ) == ms, // Tried to insert the same span, still success
416421 } ;
417422 marker. visit_span ( & mut metavar_span) ;
418423 let no_collision = match orig_tt {
419424 TokenTree :: Token ( token, ..) => {
420- with_metavar_spans ( |mspans| insert ( mspans, token. span , metavar_span) )
425+ with_metavar_spans_mut ( |mspans| insert ( mspans, token. span , metavar_span) )
421426 }
422- TokenTree :: Delimited ( dspan, ..) => with_metavar_spans ( |mspans| {
427+ TokenTree :: Delimited ( dspan, ..) => with_metavar_spans_mut ( |mspans| {
423428 insert ( mspans, dspan. open , metavar_span)
424429 && insert ( mspans, dspan. close , metavar_span)
425430 && insert ( mspans, dspan. entire ( ) , metavar_span)
@@ -434,13 +439,13 @@ fn maybe_use_metavar_location(
434439 match orig_tt {
435440 TokenTree :: Token ( Token { kind, span } , spacing) => {
436441 let span = metavar_span. with_ctxt ( span. ctxt ( ) ) ;
437- with_metavar_spans ( |mspans| insert ( mspans, span, metavar_span) ) ;
442+ with_metavar_spans_mut ( |mspans| insert ( mspans, span, metavar_span) ) ;
438443 TokenTree :: Token ( Token { kind : kind. clone ( ) , span } , * spacing)
439444 }
440445 TokenTree :: Delimited ( dspan, dspacing, delimiter, tts) => {
441446 let open = metavar_span. with_ctxt ( dspan. open . ctxt ( ) ) ;
442447 let close = metavar_span. with_ctxt ( dspan. close . ctxt ( ) ) ;
443- with_metavar_spans ( |mspans| {
448+ with_metavar_spans_mut ( |mspans| {
444449 insert ( mspans, open, metavar_span) && insert ( mspans, close, metavar_span)
445450 } ) ;
446451 let dspan = DelimSpan :: from_pair ( open, close) ;
0 commit comments