Skip to content

Commit cbd026e

Browse files
committed
Add logs to help investigate performance in terminal suggest
Part of microsoft#258512
1 parent 3aef8be commit cbd026e

File tree

2 files changed

+22
-4
lines changed

2 files changed

+22
-4
lines changed

src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalCompletionService.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,14 @@ import { IConfigurationService } from '../../../../../platform/configuration/com
1212
import { IFileService } from '../../../../../platform/files/common/files.js';
1313
import { createDecorator } from '../../../../../platform/instantiation/common/instantiation.js';
1414
import { TerminalCapability, type ITerminalCapabilityStore } from '../../../../../platform/terminal/common/capabilities/capabilities.js';
15-
import { GeneralShellType, TerminalShellType, WindowsShellType } from '../../../../../platform/terminal/common/terminal.js';
15+
import { GeneralShellType, ITerminalLogService, TerminalShellType, WindowsShellType } from '../../../../../platform/terminal/common/terminal.js';
1616
import { TerminalSuggestSettingId } from '../common/terminalSuggestConfiguration.js';
1717
import { TerminalCompletionItemKind, type ITerminalCompletion } from './terminalCompletionItem.js';
1818
import { env as processEnv } from '../../../../../base/common/process.js';
1919
import type { IProcessEnvironment } from '../../../../../base/common/platform.js';
2020
import { timeout } from '../../../../../base/common/async.js';
2121
import { gitBashToWindowsPath } from './terminalGitBashHelpers.js';
2222
import { isEqual } from '../../../../../base/common/resources.js';
23-
import { ILogService } from '../../../../../platform/log/common/log.js';
2423

2524
export const ITerminalCompletionService = createDecorator<ITerminalCompletionService>('terminalCompletionService');
2625

@@ -104,7 +103,7 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
104103
constructor(
105104
@IConfigurationService private readonly _configurationService: IConfigurationService,
106105
@IFileService private readonly _fileService: IFileService,
107-
@ILogService private readonly _logService: ILogService
106+
@ITerminalLogService private readonly _logService: ITerminalLogService
108107
) {
109108
super();
110109
}
@@ -132,6 +131,7 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
132131
}
133132

134133
async provideCompletions(promptValue: string, cursorPosition: number, allowFallbackCompletions: boolean, shellType: TerminalShellType | undefined, capabilities: ITerminalCapabilityStore, token: CancellationToken, triggerCharacter?: boolean, skipExtensionCompletions?: boolean, explicitlyInvoked?: boolean): Promise<ITerminalCompletion[] | undefined> {
134+
this._logService.trace('TerminalCompletionService#provideCompletions');
135135
if (!this._providers || !this._providers.values || cursorPosition < 0) {
136136
return undefined;
137137
}
@@ -178,6 +178,7 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
178178
}
179179

180180
private async _collectCompletions(providers: ITerminalCompletionProvider[], shellType: TerminalShellType | undefined, promptValue: string, cursorPosition: number, allowFallbackCompletions: boolean, capabilities: ITerminalCapabilityStore, token: CancellationToken, explicitlyInvoked?: boolean): Promise<ITerminalCompletion[] | undefined> {
181+
this._logService.trace('TerminalCompletionService#_collectCompletions');
181182
const completionPromises = providers.map(async provider => {
182183
if (provider.shellTypes && shellType && !provider.shellTypes.includes(shellType)) {
183184
return undefined;
@@ -187,7 +188,10 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
187188
let completions;
188189
try {
189190
completions = await Promise.race([
190-
provider.provideCompletions(promptValue, cursorPosition, allowFallbackCompletions, token),
191+
provider.provideCompletions(promptValue, cursorPosition, allowFallbackCompletions, token).then(result => {
192+
this._logService.trace(`TerminalCompletionService#_collectCompletions provider ${provider.id} finished`);
193+
return result;
194+
}),
191195
(async () => { await timeout(timeoutMs); timedOut = true; return undefined; })()
192196
]);
193197
} catch (e) {
@@ -202,6 +206,7 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
202206
return undefined;
203207
}
204208
const completionItems = Array.isArray(completions) ? completions : completions.items ?? [];
209+
this._logService.trace(`TerminalCompletionService#_collectCompletions amend ${completionItems.length} completion items`);
205210
if (shellType === GeneralShellType.PowerShell) {
206211
for (const completion of completionItems) {
207212
completion.isFileOverride ??= completion.kind === TerminalCompletionItemKind.Method && completion.replacementIndex === 0;
@@ -236,6 +241,8 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
236241
}
237242

238243
async resolveResources(resourceRequestConfig: TerminalResourceRequestConfig, promptValue: string, cursorPosition: number, provider: string, capabilities: ITerminalCapabilityStore, shellType?: TerminalShellType): Promise<ITerminalCompletion[] | undefined> {
244+
this._logService.trace(`TerminalCompletionService#resolveResources`);
245+
239246
const useWindowsStylePath = resourceRequestConfig.pathSeparator === '\\';
240247
if (useWindowsStylePath) {
241248
// for tests, make sure the right path separator is used

src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,8 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest
249249
}
250250

251251
private async _handleCompletionProviders(terminal: Terminal | undefined, token: CancellationToken, explicitlyInvoked?: boolean): Promise<void> {
252+
this._logService.trace('SuggestAddon#_handleCompletionProviders');
253+
252254
// Nothing to handle if the terminal is not attached
253255
if (!terminal?.element || !this._enableWidget || !this._promptInputModel) {
254256
return;
@@ -273,6 +275,7 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest
273275
}
274276

275277
if (!doNotRequestExtensionCompletions) {
278+
this._logService.trace('SuggestAddon#_handleCompletionProviders onTerminalCompletionsRequested');
276279
await this._extensionService.activateByEvent('onTerminalCompletionsRequested');
277280
}
278281
this._currentPromptInputState = {
@@ -295,7 +298,9 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest
295298

296299
const quickSuggestionsConfig = this._configurationService.getValue<ITerminalSuggestConfiguration>(terminalSuggestConfigSection).quickSuggestions;
297300
const allowFallbackCompletions = explicitlyInvoked || quickSuggestionsConfig.unknown === 'on';
301+
this._logService.trace('SuggestAddon#_handleCompletionProviders provideCompletions');
298302
const providedCompletions = await this._terminalCompletionService.provideCompletions(this._currentPromptInputState.prefix, this._currentPromptInputState.cursorIndex, allowFallbackCompletions, this.shellType, this._capabilities, token, false, doNotRequestExtensionCompletions, explicitlyInvoked);
303+
this._logService.trace('SuggestAddon#_handleCompletionProviders provideCompletions done');
299304

300305
if (token.isCancellationRequested) {
301306
return;
@@ -388,6 +393,7 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest
388393
}
389394

390395
async requestCompletions(explicitlyInvoked?: boolean): Promise<void> {
396+
this._logService.trace('SuggestAddon#requestCompletions');
391397
if (!this._promptInputModel) {
392398
this._shouldSyncWhenReady = true;
393399
return;
@@ -707,11 +713,15 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest
707713
}
708714

709715
private _showCompletions(model: TerminalCompletionModel, explicitlyInvoked?: boolean): void {
716+
this._logService.trace('SuggestAddon#_showCompletions');
710717
if (!this._terminal?.element) {
711718
return;
712719
}
713720
const suggestWidget = this._ensureSuggestWidget(this._terminal);
721+
722+
this._logService.trace('SuggestAddon#_showCompletions setCompletionModel');
714723
suggestWidget.setCompletionModel(model);
724+
715725
this._register(suggestWidget.onDidFocus(() => this._terminal?.focus()));
716726
if (!this._promptInputModel || !explicitlyInvoked && model.items.length === 0) {
717727
return;
@@ -731,6 +741,7 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest
731741
}
732742
this._completionRequestTimestamp = undefined;
733743
}
744+
this._logService.trace('SuggestAddon#_showCompletions suggestWidget.showSuggestions');
734745
suggestWidget.showSuggestions(0, false, !explicitlyInvoked, cursorPosition);
735746
}
736747

0 commit comments

Comments
 (0)