From bae40168ae710efd2aacf7f97d5117d8ad10d828 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Thu, 5 May 2022 09:54:41 +0200 Subject: [PATCH] Fixes issues from code review --- .../api/browser/mainThreadLanguageFeatures.ts | 6 ++++-- .../workbench/api/common/extHost.api.impl.ts | 4 ++-- .../workbench/api/common/extHost.protocol.ts | 2 +- .../api/common/extHostLanguageFeatures.ts | 21 ++++++++++++------- src/vs/workbench/api/common/extHostTypes.ts | 1 + 5 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts index 3b5e9139ca3..452da8aeb8a 100644 --- a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts @@ -523,13 +523,15 @@ export class MainThreadLanguageFeatures extends Disposable implements MainThread this._registrations.set(handle, this._languageFeaturesService.completionProvider.register(selector, provider)); } - $registerInlineCompletionsSupport(handle: number, selector: IDocumentFilterDto[]): void { + $registerInlineCompletionsSupport(handle: number, selector: IDocumentFilterDto[], supportsHandleDidShowCompletionItem: boolean): void { const provider: languages.InlineCompletionsProvider = { provideInlineCompletions: async (model: ITextModel, position: EditorPosition, context: languages.InlineCompletionContext, token: CancellationToken): Promise => { return this._proxy.$provideInlineCompletions(handle, model.uri, position, context, token); }, handleItemDidShow: async (completions: IdentifiableInlineCompletions, item: IdentifiableInlineCompletion): Promise => { - return this._proxy.$handleInlineCompletionDidShow(handle, completions.pid, item.idx); + if (supportsHandleDidShowCompletionItem) { + await this._proxy.$handleInlineCompletionDidShow(handle, completions.pid, item.idx); + } }, freeInlineCompletions: (completions: IdentifiableInlineCompletions): void => { this._proxy.$freeInlineCompletionsList(handle, completions.pid); diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 1e5d381833e..3bad939759e 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -526,8 +526,8 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I }, registerInlineCompletionItemProvider(selector: vscode.DocumentSelector, provider: vscode.InlineCompletionItemProvider): vscode.Disposable { checkProposedApiEnabled(extension, 'inlineCompletions'); - if (provider.handleDidShowCompletionItem && !isProposedApiEnabled(extension, 'inlineCompletionsAdditions')) { - throw new Error(`When the method "handleDidShowCompletionItem" is implemented on a provider, the usage of the proposed api 'inlineCompletionsAdditions' must be declared!`); + if (provider.handleDidShowCompletionItem) { + checkProposedApiEnabled(extension, 'inlineCompletionsAdditions'); } return extHostLanguageFeatures.registerInlineCompletionsProvider(extension, checkSelector(selector), provider); }, diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 4787ccb401b..26596a407cd 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -379,7 +379,7 @@ export interface MainThreadLanguageFeaturesShape extends IDisposable { $emitDocumentSemanticTokensEvent(eventHandle: number): void; $registerDocumentRangeSemanticTokensProvider(handle: number, selector: IDocumentFilterDto[], legend: languages.SemanticTokensLegend): void; $registerCompletionsProvider(handle: number, selector: IDocumentFilterDto[], triggerCharacters: string[], supportsResolveDetails: boolean, displayName: string): void; - $registerInlineCompletionsSupport(handle: number, selector: IDocumentFilterDto[]): void; + $registerInlineCompletionsSupport(handle: number, selector: IDocumentFilterDto[], supportsHandleDidShowCompletionItem: boolean): void; $registerSignatureHelpProvider(handle: number, selector: IDocumentFilterDto[], metadata: ISignatureHelpProviderMetadataDto): void; $registerInlayHintsProvider(handle: number, selector: IDocumentFilterDto[], supportsResolve: boolean, eventHandle: number | undefined, displayName: string | undefined): void; $emitInlayHintsEvent(eventHandle: number): void; diff --git a/src/vs/workbench/api/common/extHostLanguageFeatures.ts b/src/vs/workbench/api/common/extHostLanguageFeatures.ts index bad4af0fba1..2c301cb0723 100644 --- a/src/vs/workbench/api/common/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/common/extHostLanguageFeatures.ts @@ -1037,10 +1037,10 @@ class InlineCompletionAdapter extends InlineCompletionAdapterBase { items: readonly vscode.InlineCompletionItem[]; }>(); - private readonly isAdditionProposedApiEnabled = isProposedApiEnabled(this.extension, 'inlineCompletionsAdditions'); + private readonly _isAdditionsProposedApiEnabled = isProposedApiEnabled(this._extension, 'inlineCompletionsAdditions'); constructor( - private readonly extension: IExtensionDescription, + private readonly _extension: IExtensionDescription, private readonly _documents: ExtHostDocuments, private readonly _provider: vscode.InlineCompletionItemProvider, private readonly _commands: CommandsConverter, @@ -1048,6 +1048,10 @@ class InlineCompletionAdapter extends InlineCompletionAdapterBase { super(); } + public get supportsHandleDidShowCompletionItem(): boolean { + return isProposedApiEnabled(this._extension, 'inlineCompletionsAdditions') && typeof this._provider.handleDidShowCompletionItem === 'function'; + } + private readonly languageTriggerKindToVSCodeTriggerKind: Record = { [languages.InlineCompletionTriggerKind.Automatic]: InlineCompletionTriggerKind.Automatic, [languages.InlineCompletionTriggerKind.Explicit]: InlineCompletionTriggerKind.Invoke, @@ -1080,7 +1084,7 @@ class InlineCompletionAdapter extends InlineCompletionAdapterBase { } const normalizedResult = isArray(result) ? result : result.items; - const commands = isArray(result) ? [] : result.commands || []; + const commands = this._isAdditionsProposedApiEnabled ? isArray(result) ? [] : result.commands || [] : []; let disposableStore: DisposableStore | undefined = undefined; const pid = this._references.createReferenceId({ @@ -1110,7 +1114,7 @@ class InlineCompletionAdapter extends InlineCompletionAdapterBase { range: item.range ? typeConvert.Range.from(item.range) : undefined, command, idx: idx, - completeBracketPairs: this.isAdditionProposedApiEnabled ? item.completeBracketPairs : false + completeBracketPairs: this._isAdditionsProposedApiEnabled ? item.completeBracketPairs : false }); }), commands: commands.map(c => { @@ -1130,7 +1134,7 @@ class InlineCompletionAdapter extends InlineCompletionAdapterBase { override handleDidShowCompletionItem(pid: number, idx: number): void { const completionItem = this._references.get(pid)?.items[idx]; if (completionItem) { - if (this._provider.handleDidShowCompletionItem && this.isAdditionProposedApiEnabled) { + if (this._provider.handleDidShowCompletionItem && this._isAdditionsProposedApiEnabled) { this._provider.handleDidShowCompletionItem(completionItem); } } @@ -2204,14 +2208,15 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF // --- ghost test registerInlineCompletionsProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.InlineCompletionItemProvider): vscode.Disposable { - const handle = this._addNewAdapter(new InlineCompletionAdapter(extension, this._documents, provider, this._commands.converter), extension); - this._proxy.$registerInlineCompletionsSupport(handle, this._transformDocumentSelector(selector)); + const adapter = new InlineCompletionAdapter(extension, this._documents, provider, this._commands.converter); + const handle = this._addNewAdapter(adapter, extension); + this._proxy.$registerInlineCompletionsSupport(handle, this._transformDocumentSelector(selector), adapter.supportsHandleDidShowCompletionItem); return this._createDisposable(handle); } registerInlineCompletionsProviderNew(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.InlineCompletionItemProviderNew): vscode.Disposable { const handle = this._addNewAdapter(new InlineCompletionAdapterNew(extension, this._documents, provider, this._commands.converter), extension); - this._proxy.$registerInlineCompletionsSupport(handle, this._transformDocumentSelector(selector)); + this._proxy.$registerInlineCompletionsSupport(handle, this._transformDocumentSelector(selector), true); return this._createDisposable(handle); } diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index e369c9b192e..4c4f3ffab54 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -1595,6 +1595,7 @@ export class CompletionList { @es5ClassCompat export class InlineSuggestion implements vscode.InlineCompletionItem { + filterText?: string; insertText: string; range?: Range; command?: vscode.Command;