From eb376d232c2d228b4579f957ea90f26fe77ea61e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 22 Oct 2020 14:25:55 +0000 Subject: [PATCH] add CompletionItemModel#durations, #109167 --- src/vs/editor/contrib/suggest/suggest.ts | 32 ++++++++++++++++++------ 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/vs/editor/contrib/suggest/suggest.ts b/src/vs/editor/contrib/suggest/suggest.ts index 1e855db7505..7ac41b789f7 100644 --- a/src/vs/editor/contrib/suggest/suggest.ts +++ b/src/vs/editor/contrib/suggest/suggest.ts @@ -17,6 +17,7 @@ import { FuzzyScore } from 'vs/base/common/filters'; import { isDisposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { MenuId } from 'vs/platform/actions/common/actions'; import { SnippetParser } from 'vs/editor/contrib/snippet/snippetParser'; +import { StopWatch } from 'vs/base/common/stopwatch'; export const Context = { Visible: new RawContextKey('suggestWidgetVisible', false), @@ -164,10 +165,22 @@ export function setSnippetSuggestSupport(support: modes.CompletionItemProvider): return old; } -class CompletionItemModel { +export interface CompletionDurationEntry { + readonly provider: modes.CompletionItemProvider; + readonly elapsedProvider: number; + readonly elapsedOverall: number; +} + +export interface CompletionDurations { + readonly entries: readonly CompletionDurationEntry[]; + readonly elapsed: number; +} + +export class CompletionItemModel { constructor( readonly items: CompletionItem[], readonly needsClipboard: boolean, + readonly durations: CompletionDurations, readonly disposable: IDisposable, ) { } } @@ -180,7 +193,7 @@ export async function provideSuggestionItems( token: CancellationToken = CancellationToken.None ): Promise { - // const t1 = Date.now(); + const sw = new StopWatch(true); position = position.clone(); const word = model.getWordAtPosition(position); @@ -189,9 +202,10 @@ export async function provideSuggestionItems( const result: CompletionItem[] = []; const disposables = new DisposableStore(); + const durations: CompletionDurationEntry[] = []; let needsClipboard = false; - const onCompletionList = (provider: modes.CompletionItemProvider, container: modes.CompletionList | null | undefined) => { + const onCompletionList = (provider: modes.CompletionItemProvider, container: modes.CompletionList | null | undefined, sw: StopWatch) => { if (!container) { return; } @@ -214,6 +228,7 @@ export async function provideSuggestionItems( if (isDisposable(container)) { disposables.add(container); } + durations.push({ provider, elapsedProvider: container.duration ?? -1, elapsedOverall: sw.elapsed() }); }; // ask for snippets in parallel to asking "real" providers. Only do something if configured to @@ -225,8 +240,9 @@ export async function provideSuggestionItems( if (options.providerFilter.size > 0 && !options.providerFilter.has(_snippetSuggestSupport)) { return; } + const sw = new StopWatch(true); const list = await _snippetSuggestSupport.provideCompletionItems(model, position, context, token); - onCompletionList(_snippetSuggestSupport, list); + onCompletionList(_snippetSuggestSupport, list, sw); })(); // add suggestions from contributed providers - providers are ordered in groups of @@ -242,8 +258,9 @@ export async function provideSuggestionItems( return; } try { + const sw = new StopWatch(true); const list = await provider.provideCompletionItems(model, position, context, token); - onCompletionList(provider, list); + onCompletionList(provider, list, sw); } catch (err) { onUnexpectedExternalError(err); } @@ -260,11 +277,12 @@ export async function provideSuggestionItems( disposables.dispose(); return Promise.reject(canceled()); } - // console.log(`${result.length} items AFTER ${Date.now() - t1}ms`); + return new CompletionItemModel( result.sort(getSuggestionComparator(options.snippetSortOrder)), needsClipboard, - disposables + { entries: durations, elapsed: sw.elapsed() }, + disposables, ); }