Fixes issues from code review

This commit is contained in:
Henning Dieterichs
2022-05-05 09:54:41 +02:00
parent 3b08d52d0b
commit bae40168ae
5 changed files with 21 additions and 13 deletions

View File

@@ -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<IdentifiableInlineCompletions> = {
provideInlineCompletions: async (model: ITextModel, position: EditorPosition, context: languages.InlineCompletionContext, token: CancellationToken): Promise<IdentifiableInlineCompletions | undefined> => {
return this._proxy.$provideInlineCompletions(handle, model.uri, position, context, token);
},
handleItemDidShow: async (completions: IdentifiableInlineCompletions, item: IdentifiableInlineCompletion): Promise<void> => {
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);

View File

@@ -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);
},

View File

@@ -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;

View File

@@ -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, InlineCompletionTriggerKind> = {
[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);
}

View File

@@ -1595,6 +1595,7 @@ export class CompletionList {
@es5ClassCompat
export class InlineSuggestion implements vscode.InlineCompletionItem {
filterText?: string;
insertText: string;
range?: Range;
command?: vscode.Command;