@@ -6,6 +6,7 @@ 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 ;
@@ -282,13 +283,17 @@ pub(super) fn transcribe<'a>(
282283 }
283284 MatchedSingle ( ParseNtResult :: Ident ( ident, is_raw) ) => {
284285 marker. visit_span ( & mut sp) ;
285- with_metavar_spans ( |mspans| mspans. insert ( ident. span , sp) ) ;
286+ with_metavar_spans ( |mspans| {
287+ mspans. write ( ) . insert ( ident. span , ( sp, false ) )
288+ } ) ;
286289 let kind = token:: NtIdent ( * ident, * is_raw) ;
287290 TokenTree :: token_alone ( kind, sp)
288291 }
289292 MatchedSingle ( ParseNtResult :: Lifetime ( ident, is_raw) ) => {
290293 marker. visit_span ( & mut sp) ;
291- with_metavar_spans ( |mspans| mspans. insert ( ident. span , sp) ) ;
294+ with_metavar_spans ( |mspans| {
295+ mspans. write ( ) . insert ( ident. span , ( sp, false ) )
296+ } ) ;
292297 let kind = token:: NtLifetime ( * ident, * is_raw) ;
293298 TokenTree :: token_alone ( kind, sp)
294299 }
@@ -298,7 +303,9 @@ pub(super) fn transcribe<'a>(
298303 // `Interpolated` is currently used for such groups in rustc parser.
299304 marker. visit_span ( & mut sp) ;
300305 let use_span = nt. use_span ( ) ;
301- with_metavar_spans ( |mspans| mspans. insert ( use_span, sp) ) ;
306+ with_metavar_spans ( |mspans| {
307+ mspans. write ( ) . insert ( use_span, ( sp, false ) )
308+ } ) ;
302309 TokenTree :: token_alone ( token:: Interpolated ( Lrc :: clone ( nt) ) , sp)
303310 }
304311 MatchedSeq ( ..) => {
@@ -414,16 +421,17 @@ fn maybe_use_metavar_location(
414421 return orig_tt. clone ( ) ;
415422 }
416423
417- let insert = |mspans : & mut FxHashMap < _ , _ > , s, ms| match mspans. try_insert ( s, ms ) {
424+ let insert = |mspans : & mut UnordMap < _ , _ > , s, ms| match mspans. try_insert ( s, ( ms , false ) ) {
418425 Ok ( _) => true ,
419- Err ( err) => * err. entry . get ( ) == ms, // Tried to insert the same span, still success
426+ Err ( err) => err. entry . get ( ) . 0 == ms, // Tried to insert the same span, still success
420427 } ;
421428 marker. visit_span ( & mut metavar_span) ;
422429 let no_collision = match orig_tt {
423430 TokenTree :: Token ( token, ..) => {
424- with_metavar_spans ( |mspans| insert ( mspans, token. span , metavar_span) )
431+ with_metavar_spans ( |mspans| insert ( & mut mspans. write ( ) , token. span , metavar_span) )
425432 }
426433 TokenTree :: Delimited ( dspan, ..) => with_metavar_spans ( |mspans| {
434+ let mspans = & mut mspans. write ( ) ;
427435 insert ( mspans, dspan. open , metavar_span)
428436 && insert ( mspans, dspan. close , metavar_span)
429437 && insert ( mspans, dspan. entire ( ) , metavar_span)
@@ -438,13 +446,14 @@ fn maybe_use_metavar_location(
438446 match orig_tt {
439447 TokenTree :: Token ( Token { kind, span } , spacing) => {
440448 let span = metavar_span. with_ctxt ( span. ctxt ( ) ) ;
441- with_metavar_spans ( |mspans| insert ( mspans, span, metavar_span) ) ;
449+ with_metavar_spans ( |mspans| insert ( & mut mspans. write ( ) , span, metavar_span) ) ;
442450 TokenTree :: Token ( Token { kind : kind. clone ( ) , span } , * spacing)
443451 }
444452 TokenTree :: Delimited ( dspan, dspacing, delimiter, tts) => {
445453 let open = metavar_span. with_ctxt ( dspan. open . ctxt ( ) ) ;
446454 let close = metavar_span. with_ctxt ( dspan. close . ctxt ( ) ) ;
447455 with_metavar_spans ( |mspans| {
456+ let mspans = & mut mspans. write ( ) ;
448457 insert ( mspans, open, metavar_span) && insert ( mspans, close, metavar_span)
449458 } ) ;
450459 let dspan = DelimSpan :: from_pair ( open, close) ;
0 commit comments