@@ -653,25 +653,26 @@ pub fn walk_chain_collapsed(span: Span, to: Span) -> Span {
653
653
654
654
pub fn update_dollar_crate_names ( mut get_name : impl FnMut ( SyntaxContext ) -> Symbol ) {
655
655
// The new contexts that need updating are at the end of the list and have `$crate` as a name.
656
- let ( len, to_update) = HygieneData :: with ( |data| {
657
- (
658
- data. syntax_context_data . len ( ) ,
659
- data. syntax_context_data
660
- . iter ( )
661
- . rev ( )
662
- . take_while ( |scdata| scdata. dollar_crate_name == kw:: DollarCrate )
663
- . count ( ) ,
664
- )
656
+ // Also decoding placeholders can be encountered among both old and new contexts.
657
+ let mut to_update = vec ! [ ] ;
658
+ HygieneData :: with ( |data| {
659
+ for ( idx, scdata) in data. syntax_context_data . iter ( ) . enumerate ( ) . rev ( ) {
660
+ if scdata. dollar_crate_name == kw:: DollarCrate {
661
+ to_update. push ( ( idx, kw:: DollarCrate ) ) ;
662
+ } else if !scdata. is_decode_placeholder ( ) {
663
+ break ;
664
+ }
665
+ }
665
666
} ) ;
666
667
// The callback must be called from outside of the `HygieneData` lock,
667
668
// since it will try to acquire it too.
668
- let range_to_update = len - to_update..len ;
669
- let names : Vec < _ > =
670
- range_to_update . clone ( ) . map ( |idx| get_name ( SyntaxContext :: from_u32 ( idx as u32 ) ) ) . collect ( ) ;
669
+ for ( idx , name ) in & mut to_update {
670
+ * name = get_name ( SyntaxContext :: from_usize ( * idx ) ) ;
671
+ }
671
672
HygieneData :: with ( |data| {
672
- range_to_update . zip ( names ) . for_each ( | ( idx, name) | {
673
+ for ( idx, name) in to_update {
673
674
data. syntax_context_data [ idx] . dollar_crate_name = name;
674
- } )
675
+ }
675
676
} )
676
677
}
677
678
0 commit comments