diff --git a/src/core/diff/strategies/__tests__/multi-search-replace.test.ts b/src/core/diff/strategies/__tests__/multi-search-replace.test.ts index 37edcccb62..dc971d3a10 100644 --- a/src/core/diff/strategies/__tests__/multi-search-replace.test.ts +++ b/src/core/diff/strategies/__tests__/multi-search-replace.test.ts @@ -2332,6 +2332,54 @@ function two() { function three() { return "three"; +}`) + } + }) + + it("should deduce start_line when include line number in search and replace content", async () => { + const originalContent = ` +function one() { + return 1; +} + +function process() { + return "target"; +} + +function process() { + return "target"; +} + +function two() { + return 2; +} +`.trim() + const diffContent = `test.ts +<<<<<<< SEARCH +9 | function process() { +10 | return "target"; +======= +9 | function process2() { +10 | return "target222"; +>>>>>>> REPLACE` + + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe(`function one() { + return 1; +} + +function process() { + return "target"; +} + +function process2() { + return "target222"; +} + +function two() { + return 2; }`) } }) diff --git a/src/core/diff/strategies/multi-search-replace.ts b/src/core/diff/strategies/multi-search-replace.ts index 7c07f06ba0..144b794f75 100644 --- a/src/core/diff/strategies/multi-search-replace.ts +++ b/src/core/diff/strategies/multi-search-replace.ts @@ -380,6 +380,10 @@ Only use a single line of '=======' between search and replacement content, beca (everyLineHasLineNumbers(searchContent) && everyLineHasLineNumbers(replaceContent)) || (everyLineHasLineNumbers(searchContent) && replaceContent.trim() === "") + if (hasAllLineNumbers && startLine === 0) { + startLine = parseInt(searchContent.split("\n")[0].split("|")[0]) + } + if (hasAllLineNumbers) { searchContent = stripLineNumbers(searchContent) replaceContent = stripLineNumbers(replaceContent)