Skip to content

Commit ec0cb2f

Browse files
authored
Support excludes proposed API (microsoft#263459)
1 parent d4fa396 commit ec0cb2f

File tree

7 files changed

+35
-6
lines changed

7 files changed

+35
-6
lines changed

src/vs/editor/common/languages.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -927,6 +927,8 @@ export interface InlineCompletionsProvider<T extends InlineCompletions = InlineC
927927
*/
928928
yieldsToGroupIds?: InlineCompletionProviderGroupId[];
929929

930+
excludesGroupIds?: InlineCompletionProviderGroupId[];
931+
930932
displayName?: string;
931933

932934
debounceDelayMs?: number;

src/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.ts

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import { Selection } from '../../../../common/core/selection.js';
2525
import { TextReplacement, TextEdit } from '../../../../common/core/edits/textEdit.js';
2626
import { TextLength } from '../../../../common/core/text/textLength.js';
2727
import { ScrollType } from '../../../../common/editorCommon.js';
28-
import { InlineCompletionEndOfLifeReasonKind, InlineCompletion, InlineCompletionTriggerKind, PartialAcceptTriggerKind, InlineCompletionsProvider, InlineCompletionCommand } from '../../../../common/languages.js';
28+
import { InlineCompletionEndOfLifeReasonKind, InlineCompletion, InlineCompletionTriggerKind, PartialAcceptTriggerKind, InlineCompletionsProvider, InlineCompletionCommand, InlineCompletions } from '../../../../common/languages.js';
2929
import { ILanguageConfigurationService } from '../../../../common/languages/languageConfigurationRegistry.js';
3030
import { EndOfLinePreference, IModelDeltaDecoration, ITextModel } from '../../../../common/model.js';
3131
import { TextModelText } from '../../../../common/model/textModelText.js';
@@ -189,6 +189,7 @@ export class InlineCompletionsModel extends Disposable {
189189
}
190190
}));
191191

192+
// TODO: should use getAvailableProviders and update on _suppressedInlineCompletionGroupIds change
192193
const inlineCompletionProviders = observableFromEvent(this._languageFeaturesService.inlineCompletionsProvider.onDidChange, () => this._languageFeaturesService.inlineCompletionsProvider.all(textModel));
193194
mapObservableArrayCached(this, inlineCompletionProviders, (provider, store) => {
194195
if (!provider.onDidChangeInlineCompletions) {
@@ -423,13 +424,34 @@ export class InlineCompletionsModel extends Disposable {
423424

424425
const providers = changeSummary.provider
425426
? { providers: [changeSummary.provider], label: 'single:' + changeSummary.provider.providerId?.toString() }
426-
: { providers: this._languageFeaturesService.inlineCompletionsProvider.all(this.textModel), label: undefined };
427-
const suppressedProviderGroupIds = this._suppressedInlineCompletionGroupIds.get();
428-
const availableProviders = providers.providers.filter(provider => !(provider.groupId && suppressedProviderGroupIds.has(provider.groupId)));
427+
: { providers: this._languageFeaturesService.inlineCompletionsProvider.all(this.textModel), label: undefined }; // TODO: should use inlineCompletionProviders
428+
const availableProviders = this.getAvailableProviders(providers.providers);
429429

430430
return this._source.fetch(availableProviders, providers.label, context, itemToPreserve?.identity, changeSummary.shouldDebounce, userJumpedToActiveCompletion, requestInfo);
431431
});
432432

433+
// TODO: This is not an ideal implementation of excludesGroupIds, however as this is currently still behind proposed API
434+
// and due to the time constraints, we are using a simplified approach
435+
private getAvailableProviders(providers: InlineCompletionsProvider<InlineCompletions<InlineCompletion>>[]): InlineCompletionsProvider[] {
436+
const suppressedProviderGroupIds = this._suppressedInlineCompletionGroupIds.get();
437+
const unsuppressedProviders = providers.filter(provider => !(provider.groupId && suppressedProviderGroupIds.has(provider.groupId)));
438+
439+
const excludedGroupIds = new Set<string>();
440+
for (const provider of unsuppressedProviders) {
441+
provider.excludesGroupIds?.forEach(p => excludedGroupIds.add(p));
442+
}
443+
444+
const availableProviders: InlineCompletionsProvider<InlineCompletions<InlineCompletion>>[] = [];
445+
for (const provider of unsuppressedProviders) {
446+
if (provider.groupId && excludedGroupIds.has(provider.groupId)) {
447+
continue;
448+
}
449+
availableProviders.push(provider);
450+
}
451+
452+
return availableProviders;
453+
}
454+
433455
public async trigger(tx?: ITransaction, options?: { onlyFetchInlineEdits?: boolean; noDelay?: boolean }): Promise<void> {
434456
subtransaction(tx, tx => {
435457
if (options?.onlyFetchInlineEdits) {

src/vs/monaco.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7610,6 +7610,7 @@ declare namespace monaco.languages {
76107610
* The current provider is only requested for completions if no provider with a preferred group id returned a result.
76117611
*/
76127612
yieldsToGroupIds?: InlineCompletionProviderGroupId[];
7613+
excludesGroupIds?: InlineCompletionProviderGroupId[];
76137614
displayName?: string;
76147615
debounceDelayMs?: number;
76157616
toString?(): string;

src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,7 @@ export class MainThreadLanguageFeatures extends Disposable implements MainThread
619619
this._registrations.set(handle, this._languageFeaturesService.completionProvider.register(selector, provider));
620620
}
621621

622-
$registerInlineCompletionsSupport(handle: number, selector: IDocumentFilterDto[], supportsHandleEvents: boolean, extensionId: string, extensionVersion: string, groupId: string | undefined, yieldsToExtensionIds: string[], displayName: string | undefined, debounceDelayMs: number | undefined, eventHandle: number | undefined): void {
622+
$registerInlineCompletionsSupport(handle: number, selector: IDocumentFilterDto[], supportsHandleEvents: boolean, extensionId: string, extensionVersion: string, groupId: string | undefined, yieldsToExtensionIds: string[], displayName: string | undefined, debounceDelayMs: number | undefined, excludesExtensionIds: string[], eventHandle: number | undefined): void {
623623
const provider: languages.InlineCompletionsProvider<IdentifiableInlineCompletions> = {
624624
provideInlineCompletions: async (model: ITextModel, position: EditorPosition, context: languages.InlineCompletionContext, token: CancellationToken): Promise<IdentifiableInlineCompletions | undefined> => {
625625
return this._proxy.$provideInlineCompletions(handle, model.uri, position, context, token);
@@ -702,6 +702,7 @@ export class MainThreadLanguageFeatures extends Disposable implements MainThread
702702
groupId: groupId ?? extensionId,
703703
providerId: new languages.ProviderId(extensionId, extensionVersion, groupId),
704704
yieldsToGroupIds: yieldsToExtensionIds,
705+
excludesGroupIds: excludesExtensionIds,
705706
debounceDelayMs,
706707
displayName,
707708
toString() {

src/vs/workbench/api/common/extHost.protocol.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,7 @@ export interface MainThreadLanguageFeaturesShape extends IDisposable {
498498
$emitDocumentSemanticTokensEvent(eventHandle: number): void;
499499
$registerDocumentRangeSemanticTokensProvider(handle: number, selector: IDocumentFilterDto[], legend: languages.SemanticTokensLegend): void;
500500
$registerCompletionsProvider(handle: number, selector: IDocumentFilterDto[], triggerCharacters: string[], supportsResolveDetails: boolean, extensionId: ExtensionIdentifier): void;
501-
$registerInlineCompletionsSupport(handle: number, selector: IDocumentFilterDto[], supportsHandleDidShowCompletionItem: boolean, extensionId: string, extensionVersion: string, yieldToId: string | undefined, yieldsToExtensionIds: string[], displayName: string | undefined, debounceDelayMs: number | undefined, eventHandle: number | undefined): void;
501+
$registerInlineCompletionsSupport(handle: number, selector: IDocumentFilterDto[], supportsHandleDidShowCompletionItem: boolean, extensionId: string, extensionVersion: string, yieldToId: string | undefined, yieldsToExtensionIds: string[], displayName: string | undefined, debounceDelayMs: number | undefined, excludesExtensionIds: string[], eventHandle: number | undefined): void;
502502
$emitInlineCompletionsChange(handle: number): void;
503503
$registerSignatureHelpProvider(handle: number, selector: IDocumentFilterDto[], metadata: ISignatureHelpProviderMetadataDto): void;
504504
$registerInlayHintsProvider(handle: number, selector: IDocumentFilterDto[], supportsResolve: boolean, eventHandle: number | undefined, displayName: string | undefined): void;

src/vs/workbench/api/common/extHostLanguageFeatures.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2577,6 +2577,7 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF
25772577
metadata?.yieldTo?.map(extId => ExtensionIdentifier.toKey(extId)) || [],
25782578
metadata?.displayName,
25792579
metadata?.debounceDelayMs,
2580+
metadata?.excludes?.map(extId => ExtensionIdentifier.toKey(extId)) || [],
25802581
eventHandle,
25812582
);
25822583
return result;

src/vscode-dts/vscode.proposed.inlineCompletionsAdditions.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ declare module 'vscode' {
8181
debounceDelayMs?: number;
8282

8383
displayName?: string;
84+
85+
excludes?: string[];
8486
}
8587

8688
export interface InlineCompletionItemProvider {

0 commit comments

Comments
 (0)