Skip to content

Commit 2a07156

Browse files
committed
rename suggestions: fix: remove delay that was causing bad UX
fixes microsoft/vscode-copilot#5259
1 parent 2d947d1 commit 2a07156

File tree

8 files changed

+41
-16
lines changed

8 files changed

+41
-16
lines changed

src/vs/editor/common/languages.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1740,6 +1740,7 @@ export interface NewSymbolName {
17401740
}
17411741

17421742
export interface NewSymbolNamesProvider {
1743+
supportsAutomaticNewSymbolNamesTriggerKind?: Promise<boolean | undefined>;
17431744
provideNewSymbolNames(model: model.ITextModel, range: IRange, triggerKind: NewSymbolNameTriggerKind, token: CancellationToken): ProviderResult<NewSymbolName[]>;
17441745
}
17451746

src/vs/editor/contrib/rename/browser/rename.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,17 @@ class RenameController implements IEditorContribution {
231231

232232
const newSymbolNamesProviders = this._languageFeaturesService.newSymbolNamesProvider.all(model);
233233

234-
const requestRenameSuggestions = (triggerKind: NewSymbolNameTriggerKind, cts: CancellationToken) => newSymbolNamesProviders.map(p => p.provideNewSymbolNames(model, loc.range, triggerKind, cts));
234+
const resolvedNewSymbolnamesProviders = await Promise.all(newSymbolNamesProviders.map(async p => [p, await p.supportsAutomaticNewSymbolNamesTriggerKind ?? false] as const));
235+
236+
const requestRenameSuggestions = (triggerKind: NewSymbolNameTriggerKind, cts: CancellationToken) => {
237+
let providers = resolvedNewSymbolnamesProviders.slice();
238+
239+
if (triggerKind === NewSymbolNameTriggerKind.Automatic) {
240+
providers = providers.filter(([_, supportsAutomatic]) => supportsAutomatic);
241+
}
242+
243+
return providers.map(([p,]) => p.provideNewSymbolNames(model, loc.range, triggerKind, cts));
244+
};
235245

236246
trace('creating rename input field and awaiting its result');
237247
const supportPreview = this._bulkEditService.hasPreviewHandler() && this._configService.getValue<boolean>(this.editor.getModel().uri, 'editor.rename.enablePreview');

src/vs/editor/contrib/rename/browser/renameWidget.ts

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -520,17 +520,13 @@ export class RenameWidget implements IRenameWidget, IContentWidget, IDisposable
520520
const triggerKind = isManuallyTriggered ? NewSymbolNameTriggerKind.Invoke : NewSymbolNameTriggerKind.Automatic;
521521
const candidates = this._requestRenameCandidatesOnce(triggerKind, this._renameCandidateProvidersCts.token);
522522

523-
const window = dom.getActiveWindow();
524-
525-
let delayHandle: (() => void) | undefined;
526-
if (isManuallyTriggered) {
527-
this._inputWithButton.setStopButton();
528-
} else {
529-
const handle = window.setTimeout(() => this._inputWithButton.setStopButton(), 600);
530-
delayHandle = () => window.clearTimeout(handle);
523+
if (candidates.length === 0) {
524+
return;
531525
}
532526

533-
this._updateRenameCandidates(candidates, currentName, delayHandle, this._renameCts.token);
527+
this._inputWithButton.setStopButton();
528+
529+
this._updateRenameCandidates(candidates, currentName, this._renameCts.token);
534530
}
535531
}
536532

@@ -569,7 +565,7 @@ export class RenameWidget implements IRenameWidget, IContentWidget, IDisposable
569565
}, 100);
570566
}
571567

572-
private async _updateRenameCandidates(candidates: ProviderResult<NewSymbolName[]>[], currentName: string, cancelSetStopButton: (() => void) | undefined, token: CancellationToken) {
568+
private async _updateRenameCandidates(candidates: ProviderResult<NewSymbolName[]>[], currentName: string, token: CancellationToken) {
573569
const trace = (...args: any[]) => this._trace('_updateRenameCandidates', ...args);
574570

575571
trace('start');
@@ -589,11 +585,6 @@ export class RenameWidget implements IRenameWidget, IContentWidget, IDisposable
589585
);
590586
trace(`received updateRenameCandidates results - total (unfiltered) ${newNames.length} candidates.`);
591587

592-
if (newNames.length < 1) {
593-
cancelSetStopButton?.();
594-
return;
595-
}
596-
597588
// deduplicate and filter out the current value
598589

599590
const distinctNames = arrays.distinct(newNames, v => v.newSymbolName);

src/vs/monaco.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7903,6 +7903,7 @@ declare namespace monaco.languages {
79037903
}
79047904

79057905
export interface NewSymbolNamesProvider {
7906+
supportsAutomaticNewSymbolNamesTriggerKind?: Promise<boolean | undefined>;
79067907
provideNewSymbolNames(model: editor.ITextModel, range: IRange, triggerKind: NewSymbolNameTriggerKind, token: CancellationToken): ProviderResult<NewSymbolName[]>;
79077908
}
79087909

src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,7 @@ export class MainThreadLanguageFeatures extends Disposable implements MainThread
505505

506506
$registerNewSymbolNamesProvider(handle: number, selector: IDocumentFilterDto[]): void {
507507
this._registrations.set(handle, this._languageFeaturesService.newSymbolNamesProvider.register(selector, {
508+
supportsAutomaticNewSymbolNamesTriggerKind: this._proxy.$supportsAutomaticNewSymbolNamesTriggerKind(handle),
508509
provideNewSymbolNames: (model: ITextModel, range: IRange, triggerKind: languages.NewSymbolNameTriggerKind, token: CancellationToken): Promise<languages.NewSymbolName[] | undefined> => {
509510
return this._proxy.$provideNewSymbolNames(handle, model.uri, range, triggerKind, token);
510511
}

src/vs/workbench/api/common/extHost.protocol.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2142,6 +2142,7 @@ export interface ExtHostLanguageFeaturesShape {
21422142
$releaseWorkspaceSymbols(handle: number, id: number): void;
21432143
$provideRenameEdits(handle: number, resource: UriComponents, position: IPosition, newName: string, token: CancellationToken): Promise<IWorkspaceEditDto & { rejectReason?: string } | undefined>;
21442144
$resolveRenameLocation(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise<languages.RenameLocation | undefined>;
2145+
$supportsAutomaticNewSymbolNamesTriggerKind(handle: number): Promise<boolean | undefined>;
21452146
$provideNewSymbolNames(handle: number, resource: UriComponents, range: IRange, triggerKind: languages.NewSymbolNameTriggerKind, token: CancellationToken): Promise<languages.NewSymbolName[] | undefined>;
21462147
$provideDocumentSemanticTokens(handle: number, resource: UriComponents, previousResultId: number, token: CancellationToken): Promise<VSBuffer | null>;
21472148
$releaseDocumentSemanticTokens(handle: number, semanticColoringResultId: number): void;

src/vs/workbench/api/common/extHostLanguageFeatures.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -880,6 +880,10 @@ class NewSymbolNamesAdapter {
880880
private readonly _logService: ILogService
881881
) { }
882882

883+
async supportsAutomaticNewSymbolNamesTriggerKind() {
884+
return this._provider.supportsAutomaticTriggerKind;
885+
}
886+
883887
async provideNewSymbolNames(resource: URI, range: IRange, triggerKind: languages.NewSymbolNameTriggerKind, token: CancellationToken): Promise<languages.NewSymbolName[] | undefined> {
884888

885889
const doc = this._documents.getDocument(resource);
@@ -2489,6 +2493,16 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF
24892493
return this._createDisposable(handle);
24902494
}
24912495

2496+
$supportsAutomaticNewSymbolNamesTriggerKind(handle: number): Promise<boolean | undefined> {
2497+
return this._withAdapter(
2498+
handle,
2499+
NewSymbolNamesAdapter,
2500+
adapter => adapter.supportsAutomaticNewSymbolNamesTriggerKind(),
2501+
false,
2502+
undefined
2503+
);
2504+
}
2505+
24922506
$provideNewSymbolNames(handle: number, resource: UriComponents, range: IRange, triggerKind: languages.NewSymbolNameTriggerKind, token: CancellationToken): Promise<languages.NewSymbolName[] | undefined> {
24932507
return this._withAdapter(handle, NewSymbolNamesAdapter, adapter => adapter.provideNewSymbolNames(URI.revive(resource), range, triggerKind, token), undefined, token);
24942508
}

src/vscode-dts/vscode.proposed.newSymbolNamesProvider.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ declare module 'vscode' {
2424
}
2525

2626
export interface NewSymbolNamesProvider {
27+
28+
/**
29+
* @default false
30+
*/
31+
readonly supportsAutomaticTriggerKind?: Thenable<boolean>;
32+
2733
/**
2834
* Provide possible new names for the symbol at the given range.
2935
*

0 commit comments

Comments
 (0)