Skip to content

Commit 50de35a

Browse files
committed
1 parent 71700e7 commit 50de35a

File tree

8 files changed

+63
-5
lines changed

8 files changed

+63
-5
lines changed

src/vs/editor/common/languages.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,11 @@ export interface InlineCompletionsProvider<T extends InlineCompletions = InlineC
655655
*/
656656
handleItemDidShow?(completions: T, item: T['items'][number]): void;
657657

658+
/**
659+
* Will be called when an item is partially accepted.
660+
*/
661+
handlePartialAccept?(completions: T, item: T['items'][number], acceptedCharacters: number): void;
662+
658663
/**
659664
* Will be called when a completions list is no longer in use and can be garbage-collected.
660665
*/

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,20 @@ export class InlineCompletionsSession extends BaseGhostTextWidgetModel {
562562
]
563563
);
564564
this.editor.setPosition(position.delta(0, partialText.length));
565+
566+
if (completion.sourceProvider.handlePartialAccept) {
567+
const acceptedRange = Range.fromPositions(completion.range.getStartPosition(), position.delta(0, acceptUntilIndexExclusive));
568+
569+
// This assumes that the inline completion and the model use the same EOL style.
570+
// This is not a problem at the moment, because partial acceptance only works for the first line of an
571+
// inline completion.
572+
const text = this.editor.getModel()!.getValueInRange(acceptedRange);
573+
completion.sourceProvider.handlePartialAccept(
574+
completion.sourceInlineCompletions,
575+
completion.sourceInlineCompletion,
576+
text.length,
577+
);
578+
}
565579
}
566580

567581
public commitCurrentCompletion(): void {

src/vs/monaco.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6733,6 +6733,10 @@ declare namespace monaco.languages {
67336733
* Will be called when an item is shown.
67346734
*/
67356735
handleItemDidShow?(completions: T, item: T['items'][number]): void;
6736+
/**
6737+
* Will be called when an item is partially accepted.
6738+
*/
6739+
handlePartialAccept?(completions: T, item: T['items'][number], acceptedCharacters: number): void;
67366740
/**
67376741
* Will be called when a completions list is no longer in use and can be garbage-collected.
67386742
*/

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -537,16 +537,21 @@ export class MainThreadLanguageFeatures extends Disposable implements MainThread
537537
this._registrations.set(handle, this._languageFeaturesService.completionProvider.register(selector, provider));
538538
}
539539

540-
$registerInlineCompletionsSupport(handle: number, selector: IDocumentFilterDto[], supportsHandleDidShowCompletionItem: boolean): void {
540+
$registerInlineCompletionsSupport(handle: number, selector: IDocumentFilterDto[], supportsHandleEvents: boolean): void {
541541
const provider: languages.InlineCompletionsProvider<IdentifiableInlineCompletions> = {
542542
provideInlineCompletions: async (model: ITextModel, position: EditorPosition, context: languages.InlineCompletionContext, token: CancellationToken): Promise<IdentifiableInlineCompletions | undefined> => {
543543
return this._proxy.$provideInlineCompletions(handle, model.uri, position, context, token);
544544
},
545545
handleItemDidShow: async (completions: IdentifiableInlineCompletions, item: IdentifiableInlineCompletion): Promise<void> => {
546-
if (supportsHandleDidShowCompletionItem) {
546+
if (supportsHandleEvents) {
547547
await this._proxy.$handleInlineCompletionDidShow(handle, completions.pid, item.idx);
548548
}
549549
},
550+
handlePartialAccept: async (completions, item, acceptedCharacters): Promise<void> => {
551+
if (supportsHandleEvents) {
552+
await this._proxy.$handleInlineCompletionPartialAccept(handle, completions.pid, item.idx, acceptedCharacters);
553+
}
554+
},
550555
freeInlineCompletions: (completions: IdentifiableInlineCompletions): void => {
551556
this._proxy.$freeInlineCompletionsList(handle, completions.pid);
552557
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -551,6 +551,9 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I
551551
if (provider.handleDidShowCompletionItem) {
552552
checkProposedApiEnabled(extension, 'inlineCompletionsAdditions');
553553
}
554+
if (provider.handleDidPartiallyAcceptCompletionItem) {
555+
checkProposedApiEnabled(extension, 'inlineCompletionsAdditions');
556+
}
554557
return extHostLanguageFeatures.registerInlineCompletionsProvider(extension, checkSelector(selector), provider);
555558
},
556559
registerDocumentLinkProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentLinkProvider): vscode.Disposable {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1784,6 +1784,7 @@ export interface ExtHostLanguageFeaturesShape {
17841784
$releaseCompletionItems(handle: number, id: number): void;
17851785
$provideInlineCompletions(handle: number, resource: UriComponents, position: IPosition, context: languages.InlineCompletionContext, token: CancellationToken): Promise<IdentifiableInlineCompletions | undefined>;
17861786
$handleInlineCompletionDidShow(handle: number, pid: number, idx: number): void;
1787+
$handleInlineCompletionPartialAccept(handle: number, pid: number, idx: number, acceptedCharacters: number): void;
17871788
$freeInlineCompletionsList(handle: number, pid: number): void;
17881789
$provideSignatureHelp(handle: number, resource: UriComponents, position: IPosition, context: languages.SignatureHelpContext, token: CancellationToken): Promise<ISignatureHelpDto | undefined>;
17891790
$releaseSignatureHelp(handle: number, id: number): void;

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

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1074,6 +1074,8 @@ class InlineCompletionAdapterBase {
10741074
disposeCompletions(pid: number): void { }
10751075

10761076
handleDidShowCompletionItem(pid: number, idx: number): void { }
1077+
1078+
handlePartialAccept(pid: number, idx: number, acceptedCharacters: number): void { }
10771079
}
10781080

10791081
class InlineCompletionAdapter extends InlineCompletionAdapterBase {
@@ -1093,8 +1095,10 @@ class InlineCompletionAdapter extends InlineCompletionAdapterBase {
10931095
super();
10941096
}
10951097

1096-
public get supportsHandleDidShowCompletionItem(): boolean {
1097-
return isProposedApiEnabled(this._extension, 'inlineCompletionsAdditions') && typeof this._provider.handleDidShowCompletionItem === 'function';
1098+
public get supportsHandleEvents(): boolean {
1099+
return isProposedApiEnabled(this._extension, 'inlineCompletionsAdditions')
1100+
&& (typeof this._provider.handleDidShowCompletionItem === 'function'
1101+
|| typeof this._provider.handleDidPartiallyAcceptCompletionItem === 'function');
10981102
}
10991103

11001104
private readonly languageTriggerKindToVSCodeTriggerKind: Record<languages.InlineCompletionTriggerKind, InlineCompletionTriggerKind> = {
@@ -1182,6 +1186,15 @@ class InlineCompletionAdapter extends InlineCompletionAdapterBase {
11821186
}
11831187
}
11841188
}
1189+
1190+
override handlePartialAccept(pid: number, idx: number, acceptedCharacters: number): void {
1191+
const completionItem = this._references.get(pid)?.items[idx];
1192+
if (completionItem) {
1193+
if (this._provider.handleDidPartiallyAcceptCompletionItem && this._isAdditionsProposedApiEnabled) {
1194+
this._provider.handleDidPartiallyAcceptCompletionItem(completionItem, acceptedCharacters);
1195+
}
1196+
}
1197+
}
11851198
}
11861199

11871200
class ReferenceMap<T> {
@@ -2145,7 +2158,7 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF
21452158
registerInlineCompletionsProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.InlineCompletionItemProvider): vscode.Disposable {
21462159
const adapter = new InlineCompletionAdapter(extension, this._documents, provider, this._commands.converter);
21472160
const handle = this._addNewAdapter(adapter, extension);
2148-
this._proxy.$registerInlineCompletionsSupport(handle, this._transformDocumentSelector(selector), adapter.supportsHandleDidShowCompletionItem);
2161+
this._proxy.$registerInlineCompletionsSupport(handle, this._transformDocumentSelector(selector), adapter.supportsHandleEvents);
21492162
return this._createDisposable(handle);
21502163
}
21512164

@@ -2159,6 +2172,12 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF
21592172
}, undefined, undefined);
21602173
}
21612174

2175+
$handleInlineCompletionPartialAccept(handle: number, pid: number, idx: number, acceptedCharacters: number): void {
2176+
this._withAdapter(handle, InlineCompletionAdapterBase, async adapter => {
2177+
adapter.handlePartialAccept(pid, idx, acceptedCharacters);
2178+
}, undefined, undefined);
2179+
}
2180+
21622181
$freeInlineCompletionsList(handle: number, pid: number): void {
21632182
this._withAdapter(handle, InlineCompletionAdapterBase, async adapter => { adapter.disposeCompletions(pid); }, undefined, undefined);
21642183
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@ declare module 'vscode' {
1818
export interface InlineCompletionItemProvider {
1919
// eslint-disable-next-line local/vscode-dts-provider-naming
2020
handleDidShowCompletionItem?(completionItem: InlineCompletionItem): void;
21+
22+
/**
23+
* Is called when an inline completion item was accepted partially.
24+
* @param acceptedLength The length of the substring of the inline completion that was accepted already.
25+
*/
26+
// eslint-disable-next-line local/vscode-dts-provider-naming
27+
handleDidPartiallyAcceptCompletionItem?(completionItem: InlineCompletionItem, acceptedLength: number): void;
2128
}
2229

2330
// When finalizing `commands`, make sure to add a corresponding constructor parameter.

0 commit comments

Comments
 (0)