@@ -4,7 +4,7 @@ use std::{
44 hash:: { Hash , Hasher } ,
55 sync:: {
66 atomic:: { AtomicBool , Ordering } ,
7- Arc , Mutex , MutexGuard , OnceLock ,
7+ Mutex , MutexGuard , OnceLock ,
88 } ,
99} ;
1010
@@ -13,7 +13,8 @@ use rustc_hash::FxHashMap as HashMap;
1313use crate :: {
1414 helpers:: { get_map, split_into_lines, GeneratedInfo , StreamChunks } ,
1515 linear_map:: LinearMap ,
16- MapOptions , Mapping , OriginalLocation , Source , SourceMap ,
16+ BoxSource , MapOptions , Mapping , OriginalLocation , Source , SourceExt ,
17+ SourceMap ,
1718} ;
1819
1920/// Decorates a Source with replacements and insertions of source code,
@@ -35,8 +36,8 @@ use crate::{
3536///
3637/// assert_eq!(source.source(), "start1\nstart2\nreplaced!\nend1\nend2");
3738/// ```
38- pub struct ReplaceSource < T > {
39- inner : Arc < T > ,
39+ pub struct ReplaceSource {
40+ inner : BoxSource ,
4041 inner_source_code : OnceLock < Box < str > > ,
4142 replacements : Mutex < Vec < Replacement > > ,
4243 /// Whether `replacements` is sorted.
@@ -82,20 +83,20 @@ impl Replacement {
8283 }
8384}
8485
85- impl < T > ReplaceSource < T > {
86+ impl ReplaceSource {
8687 /// Create a [ReplaceSource].
87- pub fn new ( source : T ) -> Self {
88+ pub fn new < T : Source + ' static > ( source : T ) -> Self {
8889 Self {
89- inner : Arc :: new ( source) ,
90+ inner : SourceExt :: boxed ( source) ,
9091 inner_source_code : OnceLock :: new ( ) ,
9192 replacements : Mutex :: new ( Vec :: new ( ) ) ,
9293 is_sorted : AtomicBool :: new ( true ) ,
9394 }
9495 }
9596
9697 /// Get the original [Source].
97- pub fn original ( & self ) -> & T {
98- & self . inner
98+ pub fn original ( & self ) -> BoxSource {
99+ self . inner . clone ( )
99100 }
100101
101102 fn replacements ( & self ) -> MutexGuard < Vec < Replacement > > {
@@ -113,7 +114,7 @@ impl<T> ReplaceSource<T> {
113114 }
114115}
115116
116- impl < T : Source > ReplaceSource < T > {
117+ impl ReplaceSource {
117118 fn get_inner_source_code ( & self ) -> & str {
118119 self
119120 . inner_source_code
@@ -174,7 +175,7 @@ impl<T: Source> ReplaceSource<T> {
174175 }
175176}
176177
177- impl < T : Source + Hash + PartialEq + Eq + ' static > Source for ReplaceSource < T > {
178+ impl Source for ReplaceSource {
178179 fn source ( & self ) -> Cow < str > {
179180 self . sort_replacement ( ) ;
180181
@@ -233,13 +234,13 @@ impl<T: Source + Hash + PartialEq + Eq + 'static> Source for ReplaceSource<T> {
233234 }
234235}
235236
236- impl < T : std:: fmt:: Debug > std :: fmt :: Debug for ReplaceSource < T > {
237+ impl std:: fmt:: Debug for ReplaceSource {
237238 fn fmt (
238239 & self ,
239240 f : & mut std:: fmt:: Formatter < ' _ > ,
240241 ) -> Result < ( ) , std:: fmt:: Error > {
241242 f. debug_struct ( "ReplaceSource" )
242- . field ( "inner" , self . inner . as_ref ( ) )
243+ . field ( "inner" , & self . inner )
243244 . field (
244245 "inner_source_code" ,
245246 & self
@@ -283,7 +284,7 @@ fn check_content_at_position(
283284 }
284285}
285286
286- impl < ' a , T : Source > StreamChunks < ' a > for ReplaceSource < T > {
287+ impl < ' a > StreamChunks < ' a > for ReplaceSource {
287288 fn stream_chunks (
288289 & ' a self ,
289290 options : & crate :: MapOptions ,
@@ -698,7 +699,7 @@ impl<'a, T: Source> StreamChunks<'a> for ReplaceSource<T> {
698699 }
699700}
700701
701- impl < T : Source > Clone for ReplaceSource < T > {
702+ impl Clone for ReplaceSource {
702703 fn clone ( & self ) -> Self {
703704 Self {
704705 inner : self . inner . clone ( ) ,
@@ -709,7 +710,7 @@ impl<T: Source> Clone for ReplaceSource<T> {
709710 }
710711}
711712
712- impl < T : Hash > Hash for ReplaceSource < T > {
713+ impl Hash for ReplaceSource {
713714 fn hash < H : Hasher > ( & self , state : & mut H ) {
714715 self . sort_replacement ( ) ;
715716 "ReplaceSource" . hash ( state) ;
@@ -720,13 +721,14 @@ impl<T: Hash> Hash for ReplaceSource<T> {
720721 }
721722}
722723
723- impl < T : PartialEq > PartialEq for ReplaceSource < T > {
724+ impl PartialEq for ReplaceSource {
724725 fn eq ( & self , other : & Self ) -> bool {
725- self . inner == other. inner && * self . replacements ( ) == * other. replacements ( )
726+ self . inner . as_ref ( ) == other. inner . as_ref ( )
727+ && * self . replacements ( ) == * other. replacements ( )
726728 }
727729}
728730
729- impl < T : Eq > Eq for ReplaceSource < T > { }
731+ impl Eq for ReplaceSource { }
730732
731733#[ cfg( test) ]
732734mod tests {
0 commit comments