From f8391ef992585c8cb9ed3e8e0bbabe5082d73c09 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 22 Oct 2020 14:06:36 +0000 Subject: [PATCH] measure duration for completion provider from extensions, #109167 --- .../api/browser/mainThreadLanguageFeatures.ts | 29 +++++++++---------- .../workbench/api/common/extHost.protocol.ts | 4 ++- .../api/common/extHostLanguageFeatures.ts | 5 +++- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts index 9cbb21d567f..30fcbb79938 100644 --- a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts @@ -445,22 +445,21 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha const provider: modes.CompletionItemProvider = { triggerCharacters, _debugDisplayName: extensionId.value, - provideCompletionItems: (model: ITextModel, position: EditorPosition, context: modes.CompletionContext, token: CancellationToken): Promise => { - return this._proxy.$provideCompletionItems(handle, model.uri, position, context, token).then(result => { - if (!result) { - return result; - } - - return { - suggestions: result[ISuggestResultDtoField.completions].map(d => MainThreadLanguageFeatures._inflateSuggestDto(result[ISuggestResultDtoField.defaultRanges], d)), - incomplete: result[ISuggestResultDtoField.isIncomplete] || false, - dispose: () => { - if (typeof result.x === 'number') { - this._proxy.$releaseCompletionItems(handle, result.x); - } + provideCompletionItems: async (model: ITextModel, position: EditorPosition, context: modes.CompletionContext, token: CancellationToken): Promise => { + const result = await this._proxy.$provideCompletionItems(handle, model.uri, position, context, token); + if (!result) { + return result; + } + return { + suggestions: result[ISuggestResultDtoField.completions].map(d => MainThreadLanguageFeatures._inflateSuggestDto(result[ISuggestResultDtoField.defaultRanges], d)), + incomplete: result[ISuggestResultDtoField.isIncomplete] || false, + duration: result[ISuggestResultDtoField.duration], + dispose: () => { + if (typeof result.x === 'number') { + this._proxy.$releaseCompletionItems(handle, result.x); } - }; - }); + } + }; } }; if (supportsResolveDetails) { diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index dd64b66a1ac..971c108a0a0 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1215,13 +1215,15 @@ export interface ISuggestDataDto { export const enum ISuggestResultDtoField { defaultRanges = 'a', completions = 'b', - isIncomplete = 'c' + isIncomplete = 'c', + duration = 'd', } export interface ISuggestResultDto { [ISuggestResultDtoField.defaultRanges]: { insert: IRange, replace: IRange; }; [ISuggestResultDtoField.completions]: ISuggestDataDto[]; [ISuggestResultDtoField.isIncomplete]: undefined | true; + [ISuggestResultDtoField.duration]: number; x?: number; } diff --git a/src/vs/workbench/api/common/extHostLanguageFeatures.ts b/src/vs/workbench/api/common/extHostLanguageFeatures.ts index 8e65422a946..e3ac4d5ee41 100644 --- a/src/vs/workbench/api/common/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/common/extHostLanguageFeatures.ts @@ -31,6 +31,7 @@ import { encodeSemanticTokensDto } from 'vs/workbench/api/common/shared/semantic import { IdGenerator } from 'vs/base/common/idGenerator'; import { IExtHostApiDeprecationService } from 'vs/workbench/api/common/extHostApiDeprecationService'; import { Cache } from './cache'; +import { StopWatch } from 'vs/base/common/stopwatch'; // --- adapter @@ -896,6 +897,7 @@ class SuggestAdapter { const replaceRange = doc.getWordRangeAtPosition(pos) || new Range(pos, pos); const insertRange = replaceRange.with({ end: pos }); + const sw = new StopWatch(true); const itemsOrList = await asPromise(() => this._provider.provideCompletionItems(doc, pos, token, typeConvert.CompletionContext.to(context))); if (!itemsOrList) { @@ -921,7 +923,8 @@ class SuggestAdapter { x: pid, [extHostProtocol.ISuggestResultDtoField.completions]: completions, [extHostProtocol.ISuggestResultDtoField.defaultRanges]: { replace: typeConvert.Range.from(replaceRange), insert: typeConvert.Range.from(insertRange) }, - [extHostProtocol.ISuggestResultDtoField.isIncomplete]: list.isIncomplete || undefined + [extHostProtocol.ISuggestResultDtoField.isIncomplete]: list.isIncomplete || undefined, + [extHostProtocol.ISuggestResultDtoField.duration]: sw.elapsed() }; for (let i = 0; i < list.items.length; i++) { -- GitLab