Skip to content

Commit 73c17ef

Browse files
authored
Add support Uri of different document in inlineCompletionItem (microsoft#261376)
1 parent 9984cd9 commit 73c17ef

11 files changed

Lines changed: 44 additions & 9 deletions

File tree

src/vs/editor/common/languages.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -832,6 +832,10 @@ export interface InlineCompletion {
832832
readonly warning?: InlineCompletionWarning;
833833

834834
readonly displayLocation?: InlineCompletionDisplayLocation;
835+
/**
836+
* The Uri of the document this completion item is associated with.
837+
*/
838+
readonly uri?: UriComponents;
835839
}
836840

837841
export interface InlineCompletionWarning {

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ import { IInlineCompletionsService } from '../../../../browser/services/inlineCo
5050
import { TypingInterval } from './typingSpeed.js';
5151
import { StringReplacement } from '../../../../common/core/edits/stringEdit.js';
5252
import { OffsetRange } from '../../../../common/core/ranges/offsetRange.js';
53+
import { isEqual } from '../../../../../base/common/resources.js';
5354

5455
export class InlineCompletionsModel extends Disposable {
5556
private readonly _source;
@@ -837,7 +838,10 @@ export class InlineCompletionsModel extends Disposable {
837838

838839
try {
839840
editor.pushUndoStop();
840-
if (completion.snippetInfo) {
841+
const isCompletionInAnotherDocument = completion.uri && !isEqual(completion.uri, editor.getModel()?.uri);
842+
if (isCompletionInAnotherDocument) {
843+
// Do not apply the edits if they belong to another document.
844+
} else if (completion.snippetInfo) {
841845
const mainEdit = TextReplacement.delete(completion.editRange);
842846
const additionalEdits = completion.additionalTextEdits.map(e => new TextReplacement(Range.lift(e.range), e.text ?? ''));
843847
const edit = TextEdit.fromParallelReplacementsUnsorted([mainEdit, ...additionalEdits]);

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

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { IDisplayLocation, InlineSuggestData, InlineSuggestionList, PartialAccep
2525
import { singleTextRemoveCommonPrefix } from './singleTextEditHelpers.js';
2626
import { getPositionOffsetTransformerFromTextModel } from '../../../../common/core/text/getPositionOffsetTransformerFromTextModel.js';
2727
import { InlineCompletionViewData, InlineCompletionViewKind } from '../view/inlineEdits/inlineEditsViewInterface.js';
28+
import { URI } from '../../../../../base/common/uri.js';
2829

2930
export type InlineSuggestionItem = InlineEditItem | InlineCompletionItem;
3031

@@ -45,7 +46,8 @@ abstract class InlineSuggestionItemBase {
4546
constructor(
4647
protected readonly _data: InlineSuggestData,
4748
public readonly identity: InlineSuggestionIdentity,
48-
public readonly displayLocation: InlineSuggestDisplayLocation | undefined
49+
public readonly displayLocation: InlineSuggestDisplayLocation | undefined,
50+
public readonly uri: URI | undefined
4951
) { }
5052

5153
/**
@@ -201,7 +203,7 @@ export class InlineCompletionItem extends InlineSuggestionItemBase {
201203

202204
const displayLocation = data.displayLocation ? InlineSuggestDisplayLocation.create(data.displayLocation) : undefined;
203205

204-
return new InlineCompletionItem(edit, trimmedEdit, textEdit, textEdit.range, data.snippetInfo, data.additionalTextEdits, data, identity, displayLocation);
206+
return new InlineCompletionItem(edit, trimmedEdit, textEdit, textEdit.range, data.snippetInfo, data.additionalTextEdits, data, identity, displayLocation, data.uri);
205207
}
206208

207209
public readonly isInlineEdit = false;
@@ -217,8 +219,9 @@ export class InlineCompletionItem extends InlineSuggestionItemBase {
217219
data: InlineSuggestData,
218220
identity: InlineSuggestionIdentity,
219221
displayLocation: InlineSuggestDisplayLocation | undefined,
222+
uri: URI | undefined
220223
) {
221-
super(data, identity, displayLocation);
224+
super(data, identity, displayLocation, uri);
222225
}
223226

224227
override get hash(): string {
@@ -237,7 +240,8 @@ export class InlineCompletionItem extends InlineSuggestionItemBase {
237240
this.additionalTextEdits,
238241
this._data,
239242
identity,
240-
this.displayLocation
243+
this.displayLocation,
244+
this.uri
241245
);
242246
}
243247

@@ -269,7 +273,8 @@ export class InlineCompletionItem extends InlineSuggestionItemBase {
269273
this.additionalTextEdits,
270274
this._data,
271275
this.identity,
272-
newDisplayLocation
276+
newDisplayLocation,
277+
this.uri
273278
);
274279
}
275280

@@ -346,7 +351,7 @@ export class InlineEditItem extends InlineSuggestionItemBase {
346351
return SingleUpdatedNextEdit.create(edit, replacedText);
347352
});
348353
const displayLocation = data.displayLocation ? InlineSuggestDisplayLocation.create(data.displayLocation) : undefined;
349-
return new InlineEditItem(offsetEdit, singleTextEdit, data, identity, edits, displayLocation, false, textModel.getVersionId());
354+
return new InlineEditItem(offsetEdit, singleTextEdit, data, identity, edits, displayLocation, false, textModel.getVersionId(), data.uri);
350355
}
351356

352357
public readonly snippetInfo: SnippetInfo | undefined = undefined;
@@ -364,8 +369,9 @@ export class InlineEditItem extends InlineSuggestionItemBase {
364369
displayLocation: InlineSuggestDisplayLocation | undefined,
365370
private readonly _lastChangePartOfInlineEdit = false,
366371
private readonly _inlineEditModelVersion: number,
372+
uri: URI | undefined
367373
) {
368-
super(data, identity, displayLocation);
374+
super(data, identity, displayLocation, uri);
369375
}
370376

371377
public get updatedEditModelVersion(): number { return this._inlineEditModelVersion; }
@@ -385,6 +391,7 @@ export class InlineEditItem extends InlineSuggestionItemBase {
385391
this.displayLocation,
386392
this._lastChangePartOfInlineEdit,
387393
this._inlineEditModelVersion,
394+
this.uri
388395
);
389396
}
390397

@@ -443,6 +450,7 @@ export class InlineEditItem extends InlineSuggestionItemBase {
443450
newDisplayLocation,
444451
lastChangePartOfInlineEdit,
445452
inlineEditModelVersion,
453+
this.uri
446454
);
447455
}
448456
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { CachedFunction } from '../../../../../base/common/cache.js';
2828
import { InlineCompletionViewData, InlineCompletionViewKind } from '../view/inlineEdits/inlineEditsViewInterface.js';
2929
import { isDefined } from '../../../../../base/common/types.js';
3030
import { inlineCompletionIsVisible } from './inlineSuggestionItem.js';
31+
import { URI } from '../../../../../base/common/uri.js';
3132

3233
export type InlineCompletionContextWithoutUuid = Omit<InlineCompletionContext, 'requestUuid'>;
3334

@@ -241,6 +242,7 @@ function toInlineSuggestData(
241242
inlineCompletion.isInlineEdit ?? false,
242243
requestInfo,
243244
providerRequestInfo,
245+
URI.revive(inlineCompletion.uri)
244246
);
245247
}
246248

@@ -300,6 +302,7 @@ export class InlineSuggestData {
300302

301303
private readonly _requestInfo: InlineSuggestRequestInfo,
302304
private readonly _providerRequestInfo: InlineSuggestProviderRequestInfo,
305+
public readonly uri: URI | undefined
303306
) {
304307
this._viewData = { editorType: _requestInfo.editorType };
305308
}

src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { InlineCompletionsModel } from '../../model/inlineCompletionsModel.js';
1616
import { InlineCompletionItem } from '../../model/inlineSuggestionItem.js';
1717
import { IInlineEditHost, IInlineEditModel, InlineCompletionViewData, InlineCompletionViewKind, InlineEditTabAction } from './inlineEditsViewInterface.js';
1818
import { InlineEditWithChanges } from './inlineEditWithChanges.js';
19+
import { URI } from '../../../../../../base/common/uri.js';
1920

2021
export class InlineEditModel implements IInlineEditModel {
2122

@@ -25,6 +26,7 @@ export class InlineEditModel implements IInlineEditModel {
2526
readonly isInDiffEditor: boolean;
2627

2728
readonly displayLocation: InlineCompletionDisplayLocation | undefined;
29+
readonly uri: URI | undefined;
2830
readonly showCollapsed: IObservable<boolean>;
2931

3032
constructor(
@@ -39,6 +41,7 @@ export class InlineEditModel implements IInlineEditModel {
3941

4042
this.displayLocation = this.inlineEdit.inlineCompletion.displayLocation;
4143
this.showCollapsed = this._model.showCollapsed;
44+
this.uri = this.inlineEdit.inlineCompletion.uri;
4245
}
4346

4447
accept() {

src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import { IOriginalEditorInlineDiffViewState, OriginalEditorInlineDiffView } from
3636
import { applyEditToModifiedRangeMappings, createReindentEdit } from './utils/utils.js';
3737
import './view.css';
3838
import { $ } from '../../../../../../base/browser/dom.js';
39+
import { isEqual } from '../../../../../../base/common/resources.js';
3940

4041

4142
export class InlineEditsView extends Disposable {
@@ -393,7 +394,7 @@ export class InlineEditsView extends Disposable {
393394
return this._previousView!.view;
394395
}
395396

396-
if (model.displayLocation) {
397+
if (model.displayLocation || (model.uri && !isEqual(model.uri, this._editor.getModel()?.uri))) {
397398
return InlineCompletionViewKind.Custom;
398399
}
399400

src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewInterface.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import { IMouseEvent } from '../../../../../../base/browser/mouseEvent.js';
77
import { Event } from '../../../../../../base/common/event.js';
88
import { IObservable } from '../../../../../../base/common/observable.js';
9+
import { URI } from '../../../../../../base/common/uri.js';
910
import { Command, InlineCompletionCommand, InlineCompletionDisplayLocation } from '../../../../../common/languages.js';
1011
import { InlineEditWithChanges } from './inlineEditWithChanges.js';
1112

@@ -35,6 +36,7 @@ export interface IInlineEditModel {
3536
tabAction: IObservable<InlineEditTabAction>;
3637
showCollapsed: IObservable<boolean>;
3738
displayLocation: InlineCompletionDisplayLocation | undefined;
39+
uri: URI | undefined;
3840

3941
handleInlineEditShown(viewKind: string, viewData?: InlineCompletionViewData): void;
4042
accept(): void;

src/vs/monaco.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7527,6 +7527,10 @@ declare namespace monaco.languages {
75277527
readonly showRange?: IRange;
75287528
readonly warning?: InlineCompletionWarning;
75297529
readonly displayLocation?: InlineCompletionDisplayLocation;
7530+
/**
7531+
* The Uri of the document this completion item is associated with.
7532+
*/
7533+
readonly uri?: UriComponents;
75307534
}
75317535

75327536
export interface InlineCompletionWarning {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1428,6 +1428,7 @@ class InlineCompletionAdapter {
14281428
completeBracketPairs: this._isAdditionsProposedApiEnabled ? item.completeBracketPairs : false,
14291429
isInlineEdit: this._isAdditionsProposedApiEnabled ? item.isInlineEdit : false,
14301430
showInlineEditMenu: this._isAdditionsProposedApiEnabled ? item.showInlineEditMenu : false,
1431+
uri: item.uri ? URI.revive(item.uri) : undefined,
14311432
displayLocation: (item.displayLocation && this._isAdditionsProposedApiEnabled) ? {
14321433
range: typeConvert.Range.from(item.displayLocation.range),
14331434
label: item.displayLocation.label,

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1793,6 +1793,7 @@ export class CompletionItem implements vscode.CompletionItem {
17931793
textEdit?: TextEdit;
17941794
additionalTextEdits?: TextEdit[];
17951795
command?: vscode.Command;
1796+
uri?: vscode.Uri;
17961797

17971798
constructor(label: string | CompletionItemLabel, kind?: CompletionItemKind) {
17981799
this.label = label;

0 commit comments

Comments
 (0)