@@ -431,17 +431,20 @@ impl Stream for ReplaceSourceStream<'_> {
431431 on_name : crate :: helpers:: OnName < ' _ , ' a > ,
432432 ) -> crate :: helpers:: GeneratedInfo {
433433 let on_name = RefCell :: new ( on_name) ;
434- let repls = & self . replacements ;
434+ let replacements = & self . replacements ;
435435 let mut pos: u32 = 0 ;
436436 let mut i: usize = 0 ;
437437 let mut replacement_end: Option < u32 > = None ;
438- let mut next_replacement = ( i < repls . len ( ) ) . then ( || repls [ i] . start ) ;
438+ let mut next_replacement = ( i < replacements . len ( ) ) . then ( || replacements [ i] . start ) ;
439439 let mut generated_line_offset: i64 = 0 ;
440440 let mut generated_column_offset: i64 = 0 ;
441441 let mut generated_column_offset_line = 0 ;
442442 let source_content_lines: RefCell < LinearMap < Option < SourceContent > > > =
443443 RefCell :: new ( LinearMap :: default ( ) ) ;
444- let name_mapping: RefCell < HashMap < Cow < str > , u32 > > =
444+
445+ // if has named replacements, we need to map the name to the global name index
446+ let has_named_replacements = replacements. iter ( ) . any ( |repl| repl. name . is_some ( ) ) ;
447+ let name_mapping: RefCell < HashMap < & str , u32 > > =
445448 RefCell :: new ( HashMap :: default ( ) ) ;
446449 let name_index_mapping: RefCell < LinearMap < u32 > > =
447450 RefCell :: new ( LinearMap :: default ( ) ) ;
@@ -585,9 +588,13 @@ impl Stream for ReplaceSourceStream<'_> {
585588 source_index : original. source_index ,
586589 original_line : original. original_line ,
587590 original_column : original. original_column ,
588- name_index : original. name_index . and_then ( |name_index| {
589- name_index_mapping. borrow ( ) . get ( & name_index) . copied ( )
590- } ) ,
591+ name_index : if !has_named_replacements {
592+ original. name_index
593+ } else {
594+ original. name_index . and_then ( |name_index| {
595+ name_index_mapping. borrow ( ) . get ( & name_index) . copied ( )
596+ } )
597+ } ,
591598 }
592599 } ) ,
593600 } ,
@@ -612,7 +619,7 @@ impl Stream for ReplaceSourceStream<'_> {
612619 // Insert replacement content split into chunks by lines
613620 #[ allow( unsafe_code) ]
614621 // SAFETY: The safety of this operation relies on the fact that the `ReplaceSource` type will not delete the `replacements` during its entire lifetime.
615- let repl = & repls [ i] ;
622+ let repl = & replacements [ i] ;
616623
617624 let lines =
618625 split_into_lines ( repl. content . as_str ( ) ) . collect :: < Vec < _ > > ( ) ;
@@ -627,8 +634,8 @@ impl Stream for ReplaceSourceStream<'_> {
627634 let mut global_index = name_mapping. get ( name. as_str ( ) ) . copied ( ) ;
628635 if global_index. is_none ( ) {
629636 let len = name_mapping. len ( ) as u32 ;
630- name_mapping. insert ( Cow :: Borrowed ( name) , len) ;
631- on_name. borrow_mut ( ) ( len, Cow :: Borrowed ( name) ) ;
637+ name_mapping. insert ( name, len) ;
638+ on_name. borrow_mut ( ) ( len, name) ;
632639 global_index = Some ( len) ;
633640 }
634641 replacement_name_index = global_index;
@@ -683,8 +690,8 @@ impl Stream for ReplaceSourceStream<'_> {
683690
684691 // Move to next replacement
685692 i += 1 ;
686- next_replacement = if i < repls . len ( ) {
687- Some ( repls [ i] . start )
693+ next_replacement = if i < replacements . len ( ) {
694+ Some ( replacements [ i] . start )
688695 } else {
689696 None
690697 } ;
@@ -792,24 +799,28 @@ impl Stream for ReplaceSourceStream<'_> {
792799 on_source ( source_index, source, source_content) ;
793800 } ,
794801 & mut |name_index, name| {
795- let mut name_mapping = name_mapping. borrow_mut ( ) ;
796- let mut global_index = name_mapping. get ( & name) . copied ( ) ;
797- if global_index. is_none ( ) {
798- let len = name_mapping. len ( ) as u32 ;
799- name_mapping. insert ( name. clone ( ) , len) ;
800- on_name. borrow_mut ( ) ( len, name) ;
801- global_index = Some ( len) ;
802+ if !has_named_replacements {
803+ on_name. borrow_mut ( ) ( name_index, name) ;
804+ } else {
805+ let mut name_mapping = name_mapping. borrow_mut ( ) ;
806+ let mut global_index = name_mapping. get ( & name) . copied ( ) ;
807+ if global_index. is_none ( ) {
808+ let len = name_mapping. len ( ) as u32 ;
809+ name_mapping. insert ( name, len) ;
810+ on_name. borrow_mut ( ) ( len, name) ;
811+ global_index = Some ( len) ;
812+ }
813+ name_index_mapping
814+ . borrow_mut ( )
815+ . insert ( name_index, global_index. unwrap ( ) ) ;
802816 }
803- name_index_mapping
804- . borrow_mut ( )
805- . insert ( name_index, global_index. unwrap ( ) ) ;
806817 } ,
807818 ) ;
808819
809820 // Handle remaining replacements one by one
810821 let mut line = result. generated_line as i64 + generated_line_offset;
811- while i < repls . len ( ) {
812- let content = & repls [ i] . content ;
822+ while i < replacements . len ( ) {
823+ let content = & replacements [ i] . content ;
813824 let lines: Vec < & str > = split_into_lines ( content) . collect ( ) ;
814825
815826 for ( line_idx, content_line) in lines. iter ( ) . enumerate ( ) {
0 commit comments