11import * as vscode from 'vscode'
22import * as fs from 'fs'
33
4- interface ReplaceLine {
4+ type ReplaceLine = {
55 content : string
66 search_index : number | null
77}
88
9- class SearchBlock {
10- public search_lines : string [ ]
11- public replace_lines : ReplaceLine [ ]
12- public search_block_start_index : number
13- public actual_original_line_count : number = 0
14- public search_to_original_map : Map < number , number > = new Map ( )
15-
16- public constructor (
17- search_lines : string [ ] ,
18- replace_lines : ReplaceLine [ ] ,
19- search_block_start_index : number
20- ) {
21- this . search_lines = search_lines
22- this . replace_lines = replace_lines
23- this . search_block_start_index = search_block_start_index
24- }
25-
26- get_start_index ( ) {
27- return this . search_block_start_index
28- }
29- get_search_count ( ) {
30- return this . actual_original_line_count || this . search_lines . length
31- }
9+ type SearchBlock = {
10+ search_lines : string [ ]
11+ replace_lines : ReplaceLine [ ]
12+ search_block_start_index : number
13+ actual_original_line_count : number
14+ search_to_original_map : Map < number , number >
3215}
3316
3417export const process_diff = async ( params : {
@@ -109,11 +92,11 @@ export const apply_diff = (params: {
10992 continue
11093 }
11194
112- if ( line . trim ( ) === '' ) {
95+ if ( line . trim ( ) == '' ) {
11396 line = '~nnn'
114- } else if ( line . trim ( ) === '+' ) {
97+ } else if ( line . trim ( ) == '+' ) {
11598 line = '+~nnn'
116- } else if ( line . trim ( ) === '-' ) {
99+ } else if ( line . trim ( ) == '-' ) {
117100 line = '-~nnn'
118101 }
119102
@@ -154,9 +137,13 @@ export const apply_diff = (params: {
154137 const push_block = ( ) => {
155138 if ( search_chunks . length > 0 || replace_chunks . length > 0 ) {
156139 if ( current_block_has_changes ) {
157- search_replace_blocks . push (
158- new SearchBlock ( search_chunks , replace_chunks , - 1 )
159- )
140+ search_replace_blocks . push ( {
141+ search_lines : search_chunks ,
142+ replace_lines : replace_chunks ,
143+ search_block_start_index : - 1 ,
144+ actual_original_line_count : 0 ,
145+ search_to_original_map : new Map ( )
146+ } )
160147 }
161148 }
162149 search_chunks = [ ]
@@ -224,7 +211,7 @@ export const apply_diff = (params: {
224211
225212 if ( search_chunks . length > 0 || replace_chunks . length > 0 ) {
226213 if (
227- search_chunks [ search_chunks . length - 1 ] === '~nnn' &&
214+ search_chunks [ search_chunks . length - 1 ] == '~nnn' &&
228215 ! inside_replace_block
229216 ) {
230217 search_chunks . pop ( )
@@ -237,7 +224,7 @@ export const apply_diff = (params: {
237224 for ( let i = 0 ; i < search_replace_blocks . length ; i ++ ) {
238225 const block = search_replace_blocks [ i ]
239226
240- if ( block . search_lines . length === 0 && previous_found_index = == 0 ) {
227+ if ( block . search_lines . length == 0 && previous_found_index == 0 ) {
241228 block . search_block_start_index = - 1
242229 continue
243230 }
@@ -260,23 +247,25 @@ export const apply_diff = (params: {
260247 const s_val = block . search_lines [ search_ptr ]
261248 const o_val = original_code_lines_normalized [ original_ptr ] . value
262249
263- if ( s_val === o_val ) {
250+ if ( s_val == o_val ) {
264251 current_search_to_original . set (
265252 search_ptr ,
266253 original_code_lines_normalized [ original_ptr ] . key
267254 )
268255 matched_indices . push ( original_code_lines_normalized [ original_ptr ] . key )
269256 search_ptr ++
270257 original_ptr ++
271- } else if ( o_val === '~nnn' ) {
258+ } else if ( o_val == '~nnn' ) {
272259 matched_indices . push ( original_code_lines_normalized [ original_ptr ] . key )
273260 original_ptr ++
261+ } else if ( s_val == '~nnn' ) {
262+ search_ptr ++
274263 } else {
275264 break
276265 }
277266 }
278267
279- if ( search_ptr === block . search_lines . length ) {
268+ if ( search_ptr == block . search_lines . length ) {
280269 block . search_block_start_index = matched_indices [ 0 ]
281270 block . actual_original_line_count = matched_indices . length
282271 block . search_to_original_map = current_search_to_original
@@ -292,33 +281,36 @@ export const apply_diff = (params: {
292281 }
293282
294283 const valid_blocks = search_replace_blocks . filter (
295- ( block ) => block . get_start_index ( ) !== - 2
284+ ( block ) => block . search_block_start_index != - 2
285+ )
286+ valid_blocks . sort (
287+ ( a , b ) => b . search_block_start_index - a . search_block_start_index
296288 )
297- valid_blocks . sort ( ( a , b ) => b . get_start_index ( ) - a . get_start_index ( ) )
298289
299290 const result_lines = [ ...original_code_lines ]
300291
301292 for ( const block of valid_blocks ) {
302293 const start_index =
303- block . get_start_index ( ) === - 1 ? 0 : block . get_start_index ( )
294+ block . search_block_start_index == - 1 ? 0 : block . search_block_start_index
304295 const replacement_content : string [ ] = [ ]
305296 let last_original_idx = start_index - 1
306297
307298 for ( const line of block . replace_lines ) {
308- if ( line . search_index !== null ) {
299+ if ( line . search_index != null ) {
309300 const original_idx = block . search_to_original_map . get ( line . search_index )
310- if ( original_idx !== undefined ) {
301+ if ( original_idx != undefined ) {
311302 for ( let skip = last_original_idx + 1 ; skip < original_idx ; skip ++ ) {
312- if ( original_code_lines_normalized [ skip ] . value === '~nnn' ) {
303+ if ( original_code_lines_normalized [ skip ] . value == '~nnn' ) {
313304 replacement_content . push ( original_code_lines [ skip ] )
314305 }
315306 }
316307 let content = original_code_lines [ original_idx ]
317308 if (
318309 ! content . endsWith ( '\n' ) &&
319310 original_idx < original_code_lines . length - 1
320- )
311+ ) {
321312 content += '\n'
313+ }
322314 replacement_content . push ( content )
323315 last_original_idx = original_idx
324316 }
@@ -327,19 +319,17 @@ export const apply_diff = (params: {
327319 }
328320 }
329321
330- const end_original_idx = start_index + block . get_search_count ( ) - 1
322+ const search_count =
323+ block . actual_original_line_count || block . search_lines . length
324+ const end_original_idx = start_index + search_count - 1
331325 for ( let skip = last_original_idx + 1 ; skip <= end_original_idx ; skip ++ ) {
332- if ( original_code_lines_normalized [ skip ] . value === '~nnn' ) {
326+ if ( original_code_lines_normalized [ skip ] . value == '~nnn' ) {
333327 replacement_content . push ( original_code_lines [ skip ] )
334328 }
335329 }
336330
337331 if ( start_index >= 0 && start_index <= result_lines . length ) {
338- result_lines . splice (
339- start_index ,
340- block . get_search_count ( ) ,
341- ...replacement_content
342- )
332+ result_lines . splice ( start_index , search_count , ...replacement_content )
343333 }
344334 }
345335
0 commit comments