@@ -164,16 +164,9 @@ async function doChange(
164164 { range, replacement } : ChildToParent [ 'commitChange' ] ,
165165) {
166166 const bytes = await workspace . fs . readFile ( fileUri )
167- const replaceBytes = new TextEncoder ( ) . encode ( replacement )
168- const newBytes = new Uint8Array ( bytes . byteLength + replaceBytes . byteLength )
169- newBytes . set ( bytes . slice ( 0 , range . byteOffset . start ) , 0 )
170- newBytes . set ( replaceBytes , range . byteOffset . start )
171- const slice = bytes . slice ( range . byteOffset . end )
172- newBytes . set ( slice , range . byteOffset . start + replaceBytes . byteLength )
173- const final = newBytes . slice (
174- 0 ,
175- range . byteOffset . start + replaceBytes . byteLength + slice . byteLength ,
176- )
167+ const { receiveResult, conclude } = bufferMaker ( bytes )
168+ receiveResult ( replacement , range . byteOffset )
169+ const final = conclude ( )
177170 await workspace . fs . writeFile ( fileUri , final )
178171}
179172
@@ -197,7 +190,7 @@ async function refreshSearchResult(
197190 searchResult : results . map ( splitByHighLightToken ) ,
198191 } )
199192 for ( const r of results ) {
200- receiveResult ( r )
193+ receiveResult ( r . replacement ! , r . range . byteOffset )
201194 }
202195 } )
203196 const final = conclude ( )
@@ -232,13 +225,16 @@ function bufferMaker(bytes: Uint8Array) {
232225 temp . set ( newBuffer )
233226 newBuffer = temp
234227 }
235- function receiveResult ( r : SgSearch ) {
228+ function receiveResult (
229+ replace : string ,
230+ byteOffset : { start : number ; end : number } ,
231+ ) {
236232 // skip overlapping replacement
237- if ( r . range . byteOffset . start < srcOffset ) {
233+ if ( byteOffset . start < srcOffset ) {
238234 return
239235 }
240- const slice = bytes . slice ( srcOffset , r . range . byteOffset . start )
241- const replacement = encoder . encode ( r . replacement ! )
236+ const slice = bytes . slice ( srcOffset , byteOffset . start )
237+ const replacement = encoder . encode ( replace )
242238 const expectedLength =
243239 destOffset + slice . byteLength + replacement . byteLength
244240 while ( expectedLength > newBuffer . byteLength ) {
@@ -248,7 +244,7 @@ function bufferMaker(bytes: Uint8Array) {
248244 destOffset += slice . byteLength
249245 newBuffer . set ( replacement , destOffset )
250246 destOffset += replacement . byteLength
251- srcOffset = r . range . byteOffset . end
247+ srcOffset = byteOffset . end
252248 }
253249 function conclude ( ) {
254250 const slice = bytes . slice ( srcOffset , bytes . byteLength )
@@ -273,7 +269,7 @@ async function haveReplace({ bytes, uri, inputValue, rewrite }: ReplaceArg) {
273269 const { receiveResult, conclude } = bufferMaker ( bytes )
274270 await streamedPromise ( command ! , ( results : SgSearch [ ] ) => {
275271 for ( const r of results ) {
276- receiveResult ( r )
272+ receiveResult ( r . replacement ! , r . range . byteOffset )
277273 }
278274 } )
279275 const final = conclude ( )
0 commit comments