Skip to content

Commit 1232a70

Browse files
authored
Merge pull request microsoft#211171 from microsoft/ulugbekna/rename
rename suggestions: new UI fixes
2 parents b4b87ff + 7e84479 commit 1232a70

File tree

8 files changed

+43
-17
lines changed

8 files changed

+43
-17
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: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ export class RenameWidget implements IRenameWidget, IContentWidget, IDisposable
241241
const border = theme.getColor(inputBorder);
242242

243243
this._inputWithButton.domNode.style.backgroundColor = String(theme.getColor(inputBackground) ?? '');
244+
this._inputWithButton.input.style.backgroundColor = String(theme.getColor(inputBackground) ?? '');
244245
this._inputWithButton.domNode.style.borderWidth = border ? '1px' : '0px';
245246
this._inputWithButton.domNode.style.borderStyle = border ? 'solid' : 'none';
246247
this._inputWithButton.domNode.style.borderColor = border?.toString() ?? 'none';
@@ -399,7 +400,7 @@ export class RenameWidget implements IRenameWidget, IContentWidget, IDisposable
399400
(e) => {
400401
const keyEvent = new StandardKeyboardEvent(e);
401402

402-
if (keyEvent.equals(KeyCode.Enter)) {
403+
if (keyEvent.equals(KeyCode.Enter) || keyEvent.equals(KeyCode.Space)) {
403404
keyEvent.stopPropagation();
404405
keyEvent.preventDefault();
405406
this._requestRenameCandidates(currentName, true);
@@ -520,17 +521,13 @@ export class RenameWidget implements IRenameWidget, IContentWidget, IDisposable
520521
const triggerKind = isManuallyTriggered ? NewSymbolNameTriggerKind.Invoke : NewSymbolNameTriggerKind.Automatic;
521522
const candidates = this._requestRenameCandidatesOnce(triggerKind, this._renameCandidateProvidersCts.token);
522523

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);
524+
if (candidates.length === 0) {
525+
return;
531526
}
532527

533-
this._updateRenameCandidates(candidates, currentName, delayHandle, this._renameCts.token);
528+
this._inputWithButton.setStopButton();
529+
530+
this._updateRenameCandidates(candidates, currentName, this._renameCts.token);
534531
}
535532
}
536533

@@ -569,7 +566,7 @@ export class RenameWidget implements IRenameWidget, IContentWidget, IDisposable
569566
}, 100);
570567
}
571568

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

575572
trace('start');
@@ -589,11 +586,6 @@ export class RenameWidget implements IRenameWidget, IContentWidget, IDisposable
589586
);
590587
trace(`received updateRenameCandidates results - total (unfiltered) ${newNames.length} candidates.`);
591588

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

599591
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)