diff --git a/extensions/void/src/extension/DiffProvider.ts b/extensions/void/src/extension/DiffProvider.ts index f641b637..853a544f 100644 --- a/extensions/void/src/extension/DiffProvider.ts +++ b/extensions/void/src/extension/DiffProvider.ts @@ -102,8 +102,9 @@ export class DiffProvider implements vscode.CodeLensProvider { const diffAreas = this._diffAreasOfDocument[docUriStr] || [] - let endLine - let startLine + let endLine: 'originalEndLine' | 'endLine' + let startLine: 'originalStartLine' | 'startLine' + if (changesTo === 'originalFile') { endLine = 'originalEndLine' as const startLine = 'originalStartLine' as const @@ -291,11 +292,6 @@ export class DiffProvider implements vscode.CodeLensProvider { const currentArea = currentLines.slice(diffArea.startLine, diffArea.endLine + 1).join('\n') const originalArea = newOriginalLines.slice(diffArea.originalStartLine, diffArea.originalEndLine + 1).join('\n') - console.log('ACCEPT change', changedLines.join('\n'), diff.originalRange.start.line, diff.originalRange.end.line) - console.log('ACCEPT area lines', diffArea.startLine, diffArea.endLine, diffArea.originalStartLine, diffArea.originalEndLine) - console.log('ACCEPT currentArea', currentArea) - console.log('ACCEPT originalArea', originalArea) - if (originalArea === currentArea) { const index = this._diffAreasOfDocument[docUriStr].findIndex(da => da.diffareaid === diffArea.diffareaid) this._diffAreasOfDocument[docUriStr].splice(index, 1) @@ -336,11 +332,6 @@ export class DiffProvider implements vscode.CodeLensProvider { const currentArea = currentLines.slice(diffArea.startLine, diffArea.endLine + 1).join('\n') const originalArea = originalLines.slice(diffArea.originalStartLine, diffArea.originalEndLine + 1).join('\n') - console.log('REJECT diff lines', diff.originalRange.start.line, diff.originalRange.end.line) - console.log('REJECT area lines', diffArea.startLine, diffArea.endLine, diffArea.originalStartLine, diffArea.originalEndLine) - console.log('REJECT currentArea', currentArea) - console.log('REJECT originalArea', originalArea) - if (originalArea === currentArea) { const index = this._diffAreasOfDocument[docUriStr].findIndex(da => da.diffareaid === diffArea.diffareaid) this._diffAreasOfDocument[docUriStr].splice(index, 1) @@ -349,8 +340,6 @@ export class DiffProvider implements vscode.CodeLensProvider { this.refreshStylesAndDiffs(docUriStr) } - - async startStreamingInDiffArea({ docUri, oldFileStr, diffRepr, diffArea, voidConfig, abortRef }: { docUri: vscode.Uri, oldFileStr: string, diffRepr: string, voidConfig: VoidConfig, diffArea: DiffArea, abortRef: AbortRef }) { @@ -369,9 +358,6 @@ INSTRUCTIONS Please finish writing the new file by applying the diff to the original file. Return ONLY the completion of the file, without any explanation. ` - // ask LLM to rewrite file with diff (if there is significant matchup with the original file, we stop rewriting) - const START = new Date().getTime() - // make LLM complete the file to include the diff await new Promise((resolve, reject) => { sendLLMMessage({ @@ -397,9 +383,6 @@ Please finish writing the new file by applying the diff to the original file. Re }) }) - const END = new Date().getTime() - console.log('EDIT CHUNK time: ', END - START); - } @@ -465,121 +448,3 @@ Please finish writing the new file by applying the diff to the original file. Re - -/* -import * as vscode from 'vscode'; -import { SuggestedEdit } from './findDiffs'; - -const greenDecoration = vscode.window.createTextEditorDecorationType({ - backgroundColor: 'rgba(0 255 51 / 0.2)', - isWholeLine: false, // after: { contentText: ' [original]', color: 'rgba(0 255 60 / 0.5)' } // hoverMessage: originalText // this applies to hovering over after:... -}) - - - - -export class DiffProvider { - - originalCodeOfDocument: { [docUri: string]: string } - - diffsOfDocument: { - [docUri: string]: { - startLine, - startCol, - endLine, - endCol, - originalText, - - inset, - diffid, - } - } - - // sweep - currentLine: { [docUri: string]: undefined | number } - weAreEditing: boolean = false - - - constructor() { - - vscode.workspace.onDidChangeTextDocument((e) => { - // on user change, grow/shrink/merge/delete diff AREAS - // you dont have to do anything to the diffs here bc they all get recomputed in refresh() - // user changes only get highlighted if theyre in a diffarea - - // go thru all diff areas and adjust line numbers based on the user's change - - - this.refreshStyles(e.document.uri.toString()) - }) - - } - - - - // refreshes styles on page - refreshStyles(docUriStr: string) { - - if (this.weAreEditing) return - - // recompute all diffs on the page - // run inset.dispose() on all diffs - - // original and current code -> diffs - // originalCodeOfDocument[docUriStr] - - // create new diffs - const inset = vscode.window.createWebviewTextEditorInset(editor, lineStart, height, {}) - inset.webview.html = ` - - Hello World! - - `; - - } - - // called on void.acceptDiff - public async acceptDiff({ diffid }: { diffid: number }) { - - // update original based on the diff - // refresh() - - } - - - // called on void.rejectDiff - public async rejectDiff({ diffid }: { diffid: number }) { - - // get diffs[diffid] - - // revert current file based on diff - // refresh() - - } - - - - - // sweep - initializeSweep({ startLine }) { - // reject all diffs on the page - // store original code - // currentLine=start of sweep - } - - onUpdateSweep(addedText) { - // update final - // refresh() ? - // currentLine += number of newlines in addedText - } - - onAbortSweep() { - - } - - - -} - - -*/ diff --git a/src/vs/editor/browser/services/codeEditorService.ts b/src/vs/editor/browser/services/codeEditorService.ts index 733018fa..b6d66c2c 100644 --- a/src/vs/editor/browser/services/codeEditorService.ts +++ b/src/vs/editor/browser/services/codeEditorService.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ + import { Event } from '../../../base/common/event.js'; import { ICodeEditor, IDiffEditor } from '../editorBrowser.js'; import { IDecorationRenderOptions } from '../../common/editorCommon.js'; diff --git a/src/vs/workbench/api/browser/mainThreadInlineDiff.ts b/src/vs/workbench/api/browser/mainThreadInlineDiff.ts index 4ca7731c..38c43bf6 100644 --- a/src/vs/workbench/api/browser/mainThreadInlineDiff.ts +++ b/src/vs/workbench/api/browser/mainThreadInlineDiff.ts @@ -8,6 +8,8 @@ import { IInlineDiffService } from '../../../editor/browser/services/inlineDiffS import { ICodeEditor } from '../../../editor/browser/editorBrowser.js'; import { IRange } from '../../../editor/common/core/range.js'; import { extHostNamedCustomer, IExtHostContext } from '../../services/extensions/common/extHostCustomers.js'; +import { IUndoRedoElement, IUndoRedoService, UndoRedoElementType, UndoRedoGroup } from '../../../platform/undoRedo/common/undoRedo.js'; +import { URI } from '../../../base/common/uri.js'; // import { IHistoryService } from '../../services/history/common/history.js'; @@ -22,12 +24,82 @@ export class MainThreadInlineDiff extends Disposable implements MainThreadInline context: IExtHostContext, @IInlineDiffService private readonly _inlineDiff: IInlineDiffService, @ICodeEditorService private readonly _editorService: ICodeEditorService, - // @IHistoryService private readonly _historyService: IHistoryService, + // @IHistoryService private readonly _historyService: IHistoryService, // history service is the history of pressing alt left/right + @IUndoRedoService private readonly _undoRedoService: IUndoRedoService, // undoRedo service is the history of pressing ctrl+z + ) { super(); + // this._proxy = context.getProxy(ExtHostContext.ExtHostEditorInsets); // this._wcHistoryService.addEntry() + } + _streamingState: 'streaming' | 'idle' = 'idle' + + startStreaming(editor: ICodeEditor) { + + this._streamingState = 'streaming' + + // count all changes towards the group + + + // const versionId = editor.getModel()?.getVersionId() + + this._register(editor.onDidChangeModelContent((e) => { + + + // user presses undo (and there is something to undo) + if (e.isUndoing) { + // cancel the stream, then undo normally + return + } + // user presses redo (and there is something to redo) + if (e.isRedoing) { + // cancel the stream, then redo normally + return + + } + + // for good measure + if (e.isEolChange) { + // cancel stream and apply change normally + return + } + + // ignore any other kind of change (make it not happen) + if (this._streamingState === 'streaming') { + // completely ignore the change + return + } + + + })); + + // streamChange(){ + + // } + + + + // all changes made when streaming should be a part of the group so we can undo them all together + const group = new UndoRedoGroup() + + const elt: IUndoRedoElement = { + type: UndoRedoElementType.Resource, + resource: URI.parse('file:///path/to/file.txt'), + label: 'Add Diffs', + code: 'undoredo.inlineDiff', + undo: () => { + + // reapply diffareas and diffs here + }, + redo: () => { + + // reapply diffareas and diffs here + } + } + + this._undoRedoService.pushElement(elt, group) }