@@ -2,6 +2,7 @@ use std::{
22 borrow:: Cow ,
33 cell:: RefCell ,
44 hash:: { Hash , Hasher } ,
5+ sync:: Arc ,
56} ;
67
78use rustc_hash:: FxHashMap as HashMap ;
@@ -12,7 +13,7 @@ use crate::{
1213 } ,
1314 linear_map:: LinearMap ,
1415 rope:: Rope ,
15- with_indices :: WithIndices ,
16+ source_content_lines :: SourceContentLines ,
1617 BoxSource , MapOptions , Mapping , OriginalLocation , Source , SourceExt ,
1718 SourceMap , SourceValue ,
1819} ;
@@ -318,21 +319,22 @@ impl std::fmt::Debug for ReplaceSource {
318319 }
319320}
320321
321- enum SourceContent < ' a > {
322- Raw ( Rope < ' a > ) ,
323- Lines ( Vec < WithIndices < ' a , Rope < ' a > > > ) ,
322+ enum SourceContent {
323+ Raw ( Arc < str > ) ,
324+ Lines ( SourceContentLines ) ,
324325}
325326
326- fn check_content_at_position < ' a > (
327- lines : & [ WithIndices < ' a , Rope < ' a > > ] ,
327+ fn check_content_at_position (
328+ lines : & SourceContentLines ,
328329 line : u32 ,
329330 column : u32 ,
330- expected : Rope , // FIXME: memory
331+ expected : & Rope ,
331332) -> bool {
332333 if let Some ( line) = lines. get ( line as usize - 1 ) {
333334 line
334335 . substring ( column as usize , usize:: MAX )
335- . starts_with ( & expected)
336+ . into_rope ( )
337+ . starts_with ( expected)
336338 } else {
337339 false
338340 }
@@ -389,15 +391,13 @@ impl StreamChunks for ReplaceSource {
389391 // In this case, we can't split this mapping.
390392 // webpack-sources also have this function, refer https://github.com/webpack/webpack-sources/blob/main/lib/ReplaceSource.js#L158
391393 let check_original_content =
392- |source_index : u32 , line : u32 , column : u32 , expected_chunk : Rope | {
394+ |source_index : u32 , line : u32 , column : u32 , expected_chunk : & Rope | {
393395 if let Some ( Some ( source_content) ) =
394396 source_content_lines. borrow_mut ( ) . get_mut ( & source_index)
395397 {
396398 match source_content {
397399 SourceContent :: Raw ( source) => {
398- let lines = split_into_lines ( source)
399- . map ( WithIndices :: new)
400- . collect :: < Vec < _ > > ( ) ;
400+ let lines = SourceContentLines :: from ( & * source) ;
401401 let matched =
402402 check_content_at_position ( & lines, line, column, expected_chunk) ;
403403 * source_content = SourceContent :: Lines ( lines) ;
@@ -451,7 +451,7 @@ impl StreamChunks for ReplaceSource {
451451 original. source_index ,
452452 original. original_line ,
453453 original. original_column ,
454- chunk. byte_slice ( 0 ..chunk_pos as usize ) ,
454+ & chunk. byte_slice ( 0 ..chunk_pos as usize ) ,
455455 )
456456 } ) {
457457 original. original_column += chunk_pos;
@@ -508,7 +508,7 @@ impl StreamChunks for ReplaceSource {
508508 original. source_index ,
509509 original. original_line ,
510510 original. original_column ,
511- chunk_slice. clone ( ) ,
511+ & chunk_slice,
512512 )
513513 } )
514514 {
@@ -628,7 +628,7 @@ impl StreamChunks for ReplaceSource {
628628 original. source_index ,
629629 original. original_line ,
630630 original. original_column ,
631- chunk. byte_slice (
631+ & chunk. byte_slice (
632632 chunk_pos as usize ..( chunk_pos + offset as u32 ) as usize ,
633633 ) ,
634634 )
@@ -683,9 +683,8 @@ impl StreamChunks for ReplaceSource {
683683 } ,
684684 & mut |source_index, source, source_content| {
685685 let mut source_content_lines = source_content_lines. borrow_mut ( ) ;
686- let lines = source_content. map ( |source_content| {
687- SourceContent :: Raw ( source_content. as_ref ( ) . into ( ) )
688- } ) ;
686+ let lines = source_content
687+ . map ( |source_content| SourceContent :: Raw ( source_content. clone ( ) ) ) ;
689688 source_content_lines. insert ( source_index, lines) ;
690689 on_source ( source_index, source, source_content) ;
691690 } ,
0 commit comments