From 641cbea24b3dafe62cf29cefb077f39d29690aaa Mon Sep 17 00:00:00 2001 From: Bhavya U Date: Mon, 20 Apr 2026 15:26:08 -0700 Subject: [PATCH] Fix create_file duplicating content when file deleted but doc in memory (#311500) --- .../src/extension/tools/node/createFileTool.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/extensions/copilot/src/extension/tools/node/createFileTool.tsx b/extensions/copilot/src/extension/tools/node/createFileTool.tsx index 80577db3b92..e9559f86892 100644 --- a/extensions/copilot/src/extension/tools/node/createFileTool.tsx +++ b/extensions/copilot/src/extension/tools/node/createFileTool.tsx @@ -21,7 +21,7 @@ import { extname } from '../../../util/vs/base/common/resources'; import { count } from '../../../util/vs/base/common/strings'; import { URI } from '../../../util/vs/base/common/uri'; import { IInstantiationService } from '../../../util/vs/platform/instantiation/common/instantiation'; -import { Position as ExtPosition, LanguageModelPromptTsxPart, LanguageModelTextPart, LanguageModelToolResult, MarkdownString, TextEdit } from '../../../vscodeTypes'; +import { Position as ExtPosition, Range as ExtRange, LanguageModelPromptTsxPart, LanguageModelTextPart, LanguageModelToolResult, MarkdownString, TextEdit } from '../../../vscodeTypes'; import { CodeBlockProcessor } from '../../codeBlocks/node/codeBlockProcessor'; import { IBuildPromptContext } from '../../prompt/common/intents'; import { renderPromptElementJSON } from '../../prompts/node/base/promptRenderer'; @@ -114,7 +114,15 @@ export class CreateFileTool implements ICopilotTool { this.sendTelemetry(options.chatRequestId, modelId, fileExtension); } else { const content = removeLeadingFilepathComment(options.input.content, languageId, options.input.filePath); - this._promptContext.stream.textEdit(uri, TextEdit.insert(new ExtPosition(0, 0), content)); + // When the file has been deleted from disk but VS Code still holds a stale + // in-memory doc with content, use a full-document replace so the old buffer + // is overwritten rather than prepended to (https://github.com/microsoft/vscode/issues/311043). + if (!fileExists && doc && doc.getText().length > 0) { + const lastLine = doc.lineCount - 1; + this._promptContext.stream.textEdit(uri, TextEdit.replace(new ExtRange(0, 0, lastLine, doc.lineAt(lastLine).text.length), content)); + } else { + this._promptContext.stream.textEdit(uri, TextEdit.insert(new ExtPosition(0, 0), content)); + } this._promptContext.stream.textEdit(uri, true); this.sendTelemetry(options.chatRequestId, modelId, fileExtension); return new LanguageModelToolResult([