close
Skip to content

Commit 0e4c00a

Browse files
committed
rename widget fixes
1 parent 3684079 commit 0e4c00a

File tree

9 files changed

+113
-73
lines changed

9 files changed

+113
-73
lines changed

‎src/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -922,8 +922,9 @@ export class InlineCompletionsModel extends Disposable {
922922
} else if (completion.action?.kind === 'edit') {
923923
const action = completion.action;
924924
if (action.alternativeAction && alternativeAction) {
925+
const altCommand = action.alternativeAction.command;
925926
await this._commandService
926-
.executeCommand(action.alternativeAction?.id, ...(action.alternativeAction?.arguments || []))
927+
.executeCommand(altCommand.id, ...(altCommand.arguments || []))
927928
.then(undefined, onUnexpectedExternalError);
928929
} else if (action.snippetInfo) {
929930
const mainEdit = TextReplacement.delete(action.textReplacement.range);

‎src/vs/editor/contrib/inlineCompletions/browser/model/inlineSuggestionItem.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import { EndOfLinePreference, ITextModel } from '../../../../common/model.js';
2525
import { TextModelText } from '../../../../common/model/textModelText.js';
2626
import { InlineCompletionViewData, InlineCompletionViewKind } from '../view/inlineEdits/inlineEditsViewInterface.js';
2727
import { computeEditKind, InlineSuggestionEditKind } from './editKind.js';
28-
import { IInlineSuggestDataAction, IInlineSuggestDataActionEdit, InlineSuggestData, InlineSuggestionList, PartialAcceptance, RenameInfo, SnippetInfo } from './provideInlineCompletions.js';
28+
import { IInlineSuggestDataAction, IInlineSuggestDataActionEdit, InlineSuggestAlternativeAction, InlineSuggestData, InlineSuggestionList, PartialAcceptance, RenameInfo, SnippetInfo } from './provideInlineCompletions.js';
2929
import { singleTextRemoveCommonPrefix } from './singleTextEditHelpers.js';
3030

3131
export type InlineSuggestionItem = InlineEditItem | InlineCompletionItem;
@@ -51,7 +51,7 @@ export interface IInlineSuggestionActionEdit {
5151
snippetInfo: SnippetInfo | undefined;
5252
stringEdit: StringEdit;
5353
uri: URI | undefined;
54-
alternativeAction: Command | undefined;
54+
alternativeAction: InlineSuggestAlternativeAction | undefined;
5555
}
5656

5757
export interface IInlineSuggestionActionJumpTo {
@@ -62,7 +62,7 @@ export interface IInlineSuggestionActionJumpTo {
6262
}
6363

6464
function hashInlineSuggestionAction(action: InlineSuggestionAction | undefined): string {
65-
const obj = action?.kind === 'edit' ? { ...action, alternativeAction: action.alternativeAction?.id } : action;
65+
const obj = action?.kind === 'edit' ? { ...action, alternativeAction: InlineSuggestAlternativeAction.toString(action.alternativeAction) } : action;
6666
return JSON.stringify(obj);
6767
}
6868

‎src/vs/editor/contrib/inlineCompletions/browser/model/provideInlineCompletions.ts‎

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import { inlineCompletionIsVisible } from './inlineSuggestionItem.js';
3131
import { EditDeltaInfo } from '../../../../common/textModelEditSource.js';
3232
import { URI } from '../../../../../base/common/uri.js';
3333
import { InlineSuggestionEditKind } from './editKind.js';
34+
import { ThemeIcon } from '../../../../../base/common/themables.js';
3435

3536
export type InlineCompletionContextWithoutUuid = Omit<InlineCompletionContext, 'requestUuid'>;
3637

@@ -313,6 +314,19 @@ export type InlineSuggestViewData = {
313314
viewKind?: InlineCompletionViewKind;
314315
};
315316

317+
export type InlineSuggestAlternativeAction = {
318+
label: string;
319+
icon?: ThemeIcon;
320+
command: Command;
321+
count: Promise<number>;
322+
};
323+
324+
export namespace InlineSuggestAlternativeAction {
325+
export function toString(action: InlineSuggestAlternativeAction | undefined): string | undefined {
326+
return action?.command.id ?? undefined;
327+
}
328+
}
329+
316330
export type IInlineSuggestDataAction = IInlineSuggestDataActionEdit | IInlineSuggestDataActionJumpTo;
317331

318332
export interface IInlineSuggestDataActionEdit {
@@ -321,7 +335,7 @@ export interface IInlineSuggestDataActionEdit {
321335
insertText: string;
322336
snippetInfo: SnippetInfo | undefined;
323337
uri: URI | undefined;
324-
alternativeAction: Command | undefined;
338+
alternativeAction: InlineSuggestAlternativeAction | undefined;
325339
}
326340

327341
export interface IInlineSuggestDataActionJumpTo {

‎src/vs/editor/contrib/inlineCompletions/browser/model/renameSymbolProcessor.ts‎

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import { EditSources, TextModelEditSource } from '../../../../common/textModelEd
2323
import { hasProvider, rawRename } from '../../../rename/browser/rename.js';
2424
import { renameSymbolCommandId } from '../controller/commandIds.js';
2525
import { InlineSuggestionItem } from './inlineSuggestionItem.js';
26-
import { IInlineSuggestDataActionEdit } from './provideInlineCompletions.js';
26+
import { IInlineSuggestDataActionEdit, InlineSuggestAlternativeAction } from './provideInlineCompletions.js';
2727

2828
enum RenameKind {
2929
no = 'no',
@@ -227,7 +227,7 @@ class RenameSymbolRunnable {
227227
private readonly _promise: Promise<WorkspaceEdit & Rejection>;
228228
private _result: WorkspaceEdit & Rejection | undefined = undefined;
229229

230-
constructor(languageFeaturesService: ILanguageFeaturesService, textModel: ITextModel, position: Position, newName: string, source: TextModelEditSource) {
230+
constructor(languageFeaturesService: ILanguageFeaturesService, textModel: ITextModel, position: Position, newName: string) {
231231
this._cancellationTokenSource = new CancellationTokenSource();
232232
this._promise = rawRename(languageFeaturesService.renameProvider, textModel, position, newName, this._cancellationTokenSource.token);
233233
}
@@ -282,7 +282,7 @@ export class RenameSymbolProcessor extends Disposable {
282282
if (self._renameRunnable.id !== id) {
283283
self._renameRunnable.runnable.cancel();
284284
self._renameRunnable = undefined;
285-
const runnable = new RenameSymbolRunnable(self._languageFeaturesService, textModel, position, newName, source);
285+
const runnable = new RenameSymbolRunnable(self._languageFeaturesService, textModel, position, newName);
286286
workspaceEdit = await runnable.getWorkspaceEdit();
287287
} else {
288288
workspaceEdit = await self._renameRunnable.runnable.getWorkspaceEdit();
@@ -304,19 +304,19 @@ export class RenameSymbolProcessor extends Disposable {
304304
return suggestItem;
305305
}
306306

307-
const edit = suggestItem.action.textReplacement;
308-
309307
const start = Date.now();
310-
308+
const edit = suggestItem.action.textReplacement;
311309
const languageConfiguration = this._languageConfigurationService.getLanguageConfiguration(textModel.getLanguageId());
312310

311+
// Check synchronously if a rename is possible
313312
const edits = this._renameInferenceEngine.inferRename(textModel, edit.range, edit.text, languageConfiguration.wordDefinition);
314313
if (edits === undefined || edits.renames.edits.length === 0) {
315314
return suggestItem;
316315
}
317316

318317
const { oldName, newName, position, edits: renameEdits } = edits.renames;
319318

319+
// Check asynchronously if a rename is possible
320320
let timedOut = false;
321321
const check = await raceTimeout<RenameKind>(this.checkRenamePrecondition(suggestItem, textModel, position, oldName, newName), 1000, () => { timedOut = true; });
322322
const renamePossible = check === RenameKind.yes || check === RenameKind.maybe;
@@ -333,7 +333,16 @@ export class RenameSymbolProcessor extends Disposable {
333333
return suggestItem;
334334
}
335335

336+
// Prepare the rename edits
336337
const id = suggestItem.identity.id;
338+
if (this._renameRunnable !== undefined) {
339+
this._renameRunnable.runnable.cancel();
340+
this._renameRunnable = undefined;
341+
}
342+
const runnable = new RenameSymbolRunnable(this._languageFeaturesService, textModel, position, newName);
343+
this._renameRunnable = { id, runnable };
344+
345+
// Create alternative action
337346
const source = EditSources.inlineCompletionAccept({
338347
nes: suggestItem.isInlineEdit,
339348
requestUuid: suggestItem.requestUuid,
@@ -345,23 +354,21 @@ export class RenameSymbolProcessor extends Disposable {
345354
title: localize('rename', "Rename"),
346355
arguments: [textModel, position, newName, source, id],
347356
};
348-
const textReplacement = renameEdits[0];
357+
const alternativeAction: InlineSuggestAlternativeAction = {
358+
label: localize('rename', "Rename"),
359+
//icon: Codicon.replaceAll,
360+
command,
361+
count: runnable.getCount(),
362+
};
349363
const renameAction: IInlineSuggestDataActionEdit = {
350364
kind: 'edit',
351-
range: textReplacement.range,
352-
insertText: textReplacement.text,
365+
range: renameEdits[0].range,
366+
insertText: renameEdits[0].text,
353367
snippetInfo: suggestItem.snippetInfo,
354-
alternativeAction: command,
368+
alternativeAction,
355369
uri: textModel.uri
356370
};
357371

358-
if (this._renameRunnable !== undefined) {
359-
this._renameRunnable.runnable.cancel();
360-
this._renameRunnable = undefined;
361-
}
362-
const runnable = new RenameSymbolRunnable(this._languageFeaturesService, textModel, position, newName, source);
363-
this._renameRunnable = { id, runnable };
364-
365372
return InlineSuggestionItem.create(suggestItem.withAction(renameAction), textModel);
366373
}
367374

‎src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorView.ts‎

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { n, trackFocus } from '../../../../../../../base/browser/dom.js';
6+
import { ModifierKeyEmitter, n, trackFocus } from '../../../../../../../base/browser/dom.js';
77
import { renderIcon } from '../../../../../../../base/browser/ui/iconLabel/iconLabels.js';
88
import { Codicon } from '../../../../../../../base/common/codicons.js';
99
import { BugIndicatingError } from '../../../../../../../base/common/errors.js';
@@ -33,12 +33,14 @@ import { Command, InlineCompletionCommand, IInlineCompletionModelInfo } from '..
3333
import { InlineSuggestionItem } from '../../../model/inlineSuggestionItem.js';
3434
import { localize } from '../../../../../../../nls.js';
3535
import { InlineCompletionsModel } from '../../../model/inlineCompletionsModel.js';
36+
import { InlineSuggestAlternativeAction } from '../../../model/provideInlineCompletions.js';
3637

3738
export class InlineEditsGutterIndicatorData {
3839
constructor(
3940
readonly gutterMenuData: InlineSuggestionGutterMenuData,
4041
readonly originalRange: LineRange,
4142
readonly model: SimpleInlineSuggestModel,
43+
readonly altAction: InlineSuggestAlternativeAction | undefined,
4244
) { }
4345
}
4446

@@ -144,8 +146,17 @@ export class InlineEditsGutterIndicator extends Disposable {
144146

145147
private readonly _isHoveredOverInlineEditDebounced: IObservable<boolean>;
146148

149+
private readonly _modifierPressed = observableFromEvent(this, ModifierKeyEmitter.getInstance().event, () => ModifierKeyEmitter.getInstance().keyStatus.shiftKey);
147150
private readonly _gutterIndicatorStyles = derived(this, reader => {
148-
const v = this._tabAction.read(reader);
151+
let v = this._tabAction.read(reader);
152+
153+
// TODO: add source of truth for alt action active and key pressed
154+
const altAction = this._data.read(reader)?.altAction;
155+
const modifiedPressed = this._modifierPressed.read(reader);
156+
if (altAction && modifiedPressed) {
157+
v = InlineEditTabAction.Inactive;
158+
}
159+
149160
switch (v) {
150161
case InlineEditTabAction.Inactive: return {
151162
background: getEditorBlendedColor(inlineEditIndicatorSecondaryBackground, this._themeService).read(reader).toString(),
@@ -509,7 +520,7 @@ export class InlineEditsGutterIndicator extends Disposable {
509520
borderRadius: '4px',
510521
display: 'flex',
511522
justifyContent: 'flex-end',
512-
transition: 'background-color 0.2s ease-in-out, width 0.2s ease-in-out',
523+
transition: this._modifierPressed.map(m => m ? '' : 'background-color 0.2s ease-in-out, width 0.2s ease-in-out'),
513524
...rectToProps(reader => layout.read(reader).pillRect),
514525
}
515526
}, [

0 commit comments

Comments
 (0)