From 3dcca830e652b47f80991b400a269cd4d1b3e9e7 Mon Sep 17 00:00:00 2001 From: Benjamin Christopher Simmonds <44439583+benibenj@users.noreply.github.com> Date: Fri, 28 Mar 2025 13:28:05 +0100 Subject: [PATCH] Remove Inline Edit accept partial flow (#244968) --- .../browser/controller/commands.ts | 19 ----- .../browser/inlineCompletions.contribution.ts | 3 +- .../browser/model/inlineCompletionsModel.ts | 71 +------------------ .../view/inlineEdits/inlineEditsModel.ts | 2 - .../view/inlineEdits/inlineEditsView.ts | 7 +- .../inlineEdits/inlineEditsViewInterface.ts | 1 - .../inlineEdits/inlineEditsViewProducer.ts | 3 +- 7 files changed, 4 insertions(+), 102 deletions(-) diff --git a/src/vs/editor/contrib/inlineCompletions/browser/controller/commands.ts b/src/vs/editor/contrib/inlineCompletions/browser/controller/commands.ts index cb1b72e2125..501d1fcb6f1 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/controller/commands.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/controller/commands.ts @@ -261,25 +261,6 @@ export class JumpToNextInlineEdit extends EditorAction { } } -export class AcceptNextInlineEditPart extends EditorAction { - constructor() { - super({ - id: 'editor.action.inlineSuggest.acceptNextInlineEditPart', - label: nls.localize2('action.inlineSuggest.acceptNextInlineEditPart', "Accept Next Inline Edit Part"), - precondition: ContextKeyExpr.and(EditorContextKeys.writable, InlineCompletionContextKeys.inlineEditVisible), - kbOpts: { - weight: KeybindingWeight.EditorContrib + 1, - kbExpr: ContextKeyExpr.and(EditorContextKeys.writable, InlineCompletionContextKeys.inlineEditVisible), - }, - }); - } - - public async run(accessor: ServicesAccessor | undefined, editor: ICodeEditor): Promise { - const controller = InlineCompletionsController.get(editor); - await controller?.model.get()?.acceptNextInlineEditPart(controller.editor); - } -} - export class HideInlineCompletion extends EditorAction { public static ID = hideInlineCompletionId; diff --git a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.ts b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.ts index 5bf486b8775..06a0b9d9204 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.ts @@ -8,7 +8,7 @@ import { registerAction2 } from '../../../../platform/actions/common/actions.js' import { wrapInHotClass1 } from '../../../../platform/observable/common/wrapInHotClass.js'; import { EditorContributionInstantiation, registerEditorAction, registerEditorCommand, registerEditorContribution } from '../../../browser/editorExtensions.js'; import { HoverParticipantRegistry } from '../../hover/browser/hoverTypes.js'; -import { AcceptInlineCompletion, AcceptNextLineOfInlineCompletion, AcceptNextWordOfInlineCompletion, DevExtractReproSample, HideInlineCompletion, JumpToNextInlineEdit, ShowNextInlineSuggestionAction, ShowPreviousInlineSuggestionAction, ToggleAlwaysShowInlineSuggestionToolbar, ExplicitTriggerInlineEditAction, TriggerInlineSuggestionAction, TriggerInlineEditAction, ToggleInlineCompletionShowCollapsed, AcceptNextInlineEditPart } from './controller/commands.js'; +import { AcceptInlineCompletion, AcceptNextLineOfInlineCompletion, AcceptNextWordOfInlineCompletion, DevExtractReproSample, HideInlineCompletion, JumpToNextInlineEdit, ShowNextInlineSuggestionAction, ShowPreviousInlineSuggestionAction, ToggleAlwaysShowInlineSuggestionToolbar, ExplicitTriggerInlineEditAction, TriggerInlineSuggestionAction, TriggerInlineEditAction, ToggleInlineCompletionShowCollapsed } from './controller/commands.js'; import { InlineCompletionsController } from './controller/inlineCompletionsController.js'; import { InlineCompletionsHoverParticipant } from './hintsWidget/hoverParticipant.js'; import { InlineCompletionsAccessibleView } from './inlineCompletionsAccessibleView.js'; @@ -29,7 +29,6 @@ registerEditorAction(AcceptNextLineOfInlineCompletion); registerEditorAction(AcceptInlineCompletion); registerEditorAction(ToggleInlineCompletionShowCollapsed); registerEditorAction(HideInlineCompletion); -registerEditorAction(AcceptNextInlineEditPart); registerEditorAction(JumpToNextInlineEdit); registerAction2(ToggleAlwaysShowInlineSuggestionToolbar); registerEditorAction(DevExtractReproSample); diff --git a/src/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.ts b/src/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.ts index 43be28ea2d5..a477c82c54e 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.ts @@ -33,7 +33,7 @@ import { TextModelText } from '../../../../common/model/textModelText.js'; import { IFeatureDebounceInformation } from '../../../../common/services/languageFeatureDebounce.js'; import { IModelContentChangedEvent } from '../../../../common/textModelEvents.js'; import { SnippetController2 } from '../../../snippet/browser/snippetController2.js'; -import { addPositions, getEndPositionsAfterApplying, getModifiedRangesAfterApplying, substringPos, subtractPositions } from '../utils.js'; +import { addPositions, getEndPositionsAfterApplying, substringPos, subtractPositions } from '../utils.js'; import { AnimatedValue, easeOutCubic, ObservableAnimatedValue } from './animation.js'; import { computeGhostText } from './computeGhostText.js'; import { GhostText, GhostTextOrReplacement, ghostTextOrReplacementEquals, ghostTextsOrReplacementsEqual } from './ghostText.js'; @@ -339,7 +339,6 @@ export class InlineCompletionsModel extends Disposable { } } - this._inAcceptPartialFlow.set(false, tx); this._isActive.set(false, tx); this._source.clear(tx); }); @@ -674,12 +673,6 @@ export class InlineCompletionsModel extends Disposable { throw new BugIndicatingError(); } - if (this._inAcceptPartialFlow.get()) { - this._inAcceptPartialFlow.set(false, undefined); - this.jump(); - return; - } - let completionWithUpdatedRange: InlineCompletionWithUpdatedRange; const state = this.state.get(); @@ -851,68 +844,6 @@ export class InlineCompletionsModel extends Disposable { } } - // TODO: clean this up if we keep it - private readonly _inAcceptPartialFlow = observableValue(this, false); - public readonly inPartialAcceptFlow: IObservable = this._inAcceptPartialFlow; - public async acceptNextInlineEditPart(editor: ICodeEditor): Promise { - if (editor.getModel() !== this.textModel) { - throw new BugIndicatingError(); - } - - const state = this.inlineEditState.get(); - const updatedEdit = state?.inlineCompletion.updatedEdit.get(); - const completion = state?.inlineCompletion.toInlineCompletion(undefined); - if (!updatedEdit || updatedEdit.isEmpty || !completion) { - return; - } - - const nextPart = updatedEdit.edits[0]; - - const edit = new SingleTextEdit(Range.fromPositions( - this.textModel.getPositionAt(nextPart.replaceRange.start), - this.textModel.getPositionAt(nextPart.replaceRange.endExclusive) - ), nextPart.newText); - - const cursorAtStartPosition = this._editor.getSelection()?.getStartPosition().equals(edit.range.getStartPosition()); - if (!cursorAtStartPosition || !this._inAcceptPartialFlow.get()) { - this._inAcceptPartialFlow.set(true, undefined); - this.jump(); - return; - } - - const partToJumpToNext = updatedEdit.edits[1] ?? undefined; - const editToJumpToNext = partToJumpToNext ? new SingleTextEdit(Range.fromPositions( - this.textModel.getPositionAt(partToJumpToNext.replaceRange.start), - this.textModel.getPositionAt(partToJumpToNext.replaceRange.endExclusive) - ), partToJumpToNext.newText) : undefined; - - // Executing the edit might free the completion, so we have to hold a reference on it. - completion.source.addRef(); - try { - this._isAcceptingPartially = true; - try { - editor.pushUndoStop(); - - let selections; - if (editToJumpToNext) { - const [_, rangeOfEditToJumpTo] = getModifiedRangesAfterApplying([edit, editToJumpToNext]); - selections = [Selection.fromPositions(rangeOfEditToJumpTo.getStartPosition())]; - } else { - selections = getEndPositionsAfterApplying([edit]).map(p => Selection.fromPositions(p)); - } - - const edits = [edit]; - editor.executeEdits('inlineSuggestion.accept', edits.map(edit => EditOperation.replace(edit.range, edit.text))); - editor.setSelections(selections, 'inlineCompletionPartialAccept'); - editor.revealPositionInCenterIfOutsideViewport(editor.getPosition()!, ScrollType.Immediate); - } finally { - this._isAcceptingPartially = false; - } - } finally { - completion.source.removeRef(); - } - } - public handleSuggestAccepted(item: SuggestItemInfo) { const itemEdit = singleTextRemoveCommonPrefix(item.toSingleTextEdit(), this.textModel); const augmentedCompletion = this._computeAugmentation(itemEdit, undefined); diff --git a/src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.ts b/src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.ts index 0a07f09a151..ca1ab94310a 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.ts @@ -57,14 +57,12 @@ export class InlineEditModel implements IInlineEditModel { export class InlineEditHost implements IInlineEditHost { readonly onDidAccept: Event; readonly inAcceptFlow: IObservable; - readonly inPartialAcceptFlow: IObservable; constructor( private readonly _model: InlineCompletionsModel, ) { this.onDidAccept = this._model.onDidAccept; this.inAcceptFlow = this._model.inAcceptFlow; - this.inPartialAcceptFlow = this._model.inPartialAcceptFlow; } } diff --git a/src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.ts b/src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.ts index 7931a86e959..522c4df304e 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.ts @@ -296,12 +296,7 @@ export class InlineEditsView extends Disposable { )); private getCacheId(model: IInlineEditModel) { - const inlineEdit = model.inlineEdit; - if (this._host.get()?.inPartialAcceptFlow.get()) { - return `${inlineEdit.inlineCompletion.id}_${inlineEdit.edit.edits.map(innerEdit => innerEdit.range.toString() + innerEdit.text).join(',')}`; - } - - return inlineEdit.inlineCompletion.id; + return model.inlineEdit.inlineCompletion.id; } private determineView(model: IInlineEditModel, reader: IReader, diff: DetailedLineRangeMapping[], newText: StringText, originalDisplayRange: LineRange): string { diff --git a/src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewInterface.ts b/src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewInterface.ts index dae493157af..ec950b38e5b 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewInterface.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewInterface.ts @@ -22,7 +22,6 @@ export interface IInlineEditsView { export interface IInlineEditHost { inAcceptFlow: IObservable; - inPartialAcceptFlow: IObservable; } export interface IInlineEditModel { diff --git a/src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.ts b/src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.ts index 39b6acae41f..4e26c887227 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.ts @@ -36,8 +36,7 @@ export class InlineEditsViewAndDiffProducer extends Disposable { // TODO: This c const editOffset = model.inlineEditState.get()?.inlineCompletion.updatedEdit.read(reader); if (!editOffset) { return undefined; } - const offsetEdits = model.inPartialAcceptFlow.read(reader) ? [editOffset.edits[0]] : editOffset.edits; - const edits = offsetEdits.map(e => { + const edits = editOffset.edits.map(e => { const innerEditRange = Range.fromPositions( textModel.getPositionAt(e.replaceRange.start), textModel.getPositionAt(e.replaceRange.endExclusive)