Skip to content

Commit bbf6eae

Browse files
committed
includes extension version
1 parent d37ee81 commit bbf6eae

File tree

9 files changed

+70
-17
lines changed

9 files changed

+70
-17
lines changed

src/vs/editor/common/languages.ts

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -905,7 +905,8 @@ export interface InlineCompletionsProvider<T extends InlineCompletions = InlineC
905905
*/
906906
groupId?: InlineCompletionProviderGroupId;
907907

908-
providerId?: string;
908+
/** @internal */
909+
providerId?: ProviderId;
909910

910911
/**
911912
* Returns a list of preferred provider {@link groupId}s.
@@ -920,6 +921,38 @@ export interface InlineCompletionsProvider<T extends InlineCompletions = InlineC
920921
toString?(): string;
921922
}
922923

924+
925+
/** @internal */
926+
export class ProviderId {
927+
public static fromExtensionId(extensionId: string | undefined): ProviderId {
928+
return new ProviderId(extensionId, undefined, undefined);
929+
}
930+
931+
constructor(
932+
public readonly extensionId: string | undefined,
933+
public readonly extensionVersion: string | undefined,
934+
public readonly providerId: string | undefined
935+
) {
936+
}
937+
938+
toString(): string {
939+
let result = '';
940+
if (this.extensionId) {
941+
result += this.extensionId;
942+
}
943+
if (this.extensionVersion) {
944+
result += `@${this.extensionVersion}`;
945+
}
946+
if (this.providerId) {
947+
result += `:${this.providerId}`;
948+
}
949+
if (result.length === 0) {
950+
result = 'unknown';
951+
}
952+
return result;
953+
}
954+
}
955+
923956
/** @internal */
924957
export class VersionedExtensionId {
925958
constructor(

src/vs/editor/common/standalone/standaloneEnums.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -991,4 +991,4 @@ export enum WrappingIndent {
991991
* DeepIndent => wrapped lines get +2 indentation toward the parent.
992992
*/
993993
DeepIndent = 3
994-
}
994+
}

src/vs/editor/common/textModelEditReason.ts

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6+
import { ProviderId } from './languages.js';
7+
68
const privateSymbol = Symbol('TextModelEditReason');
79

810
export class TextModelEditReason {
@@ -33,9 +35,14 @@ export class TextModelEditReason {
3335
* Converts the metadata to a key string.
3436
* Only includes properties/values that have `level` many `$` prefixes or less.
3537
*/
36-
public toKey(level: number): string {
38+
public toKey(level: number, filter: { [TKey in keyof ITextModelEditReasonMetadata]?: boolean } = {}): string {
3739
const metadata = this.metadata;
3840
const keys = Object.entries(metadata).filter(([key, value]) => {
41+
const filterVal = (filter as Record<string, boolean>)[key];
42+
if (filterVal !== undefined) {
43+
return filterVal;
44+
}
45+
3946
const prefixCount = (key.match(/\$/g) || []).length;
4047
return prefixCount <= level && value !== undefined && value !== null && value !== '';
4148
}).map(([key, value]) => `${key}:${value}`);
@@ -68,21 +75,21 @@ export const EditReasons = {
6875
} as const);
6976
},
7077

71-
inlineCompletionAccept(data: { nes: boolean; requestUuid: string; extensionId: string }) {
78+
inlineCompletionAccept(data: { nes: boolean; requestUuid: string; providerId?: ProviderId }) {
7279
return createEditReason({
7380
source: 'inlineCompletionAccept',
7481
$nes: data.nes,
75-
$extensionId: data.extensionId,
82+
...toProperties(data.providerId),
7683
$$requestUuid: data.requestUuid,
7784
} as const);
7885
},
7986

80-
inlineCompletionPartialAccept(data: { nes: boolean; requestUuid: string; extensionId: string; type: 'word' | 'line' }) {
87+
inlineCompletionPartialAccept(data: { nes: boolean; requestUuid: string; providerId?: ProviderId; type: 'word' | 'line' }) {
8188
return createEditReason({
8289
source: 'inlineCompletionPartialAccept',
8390
type: data.type,
8491
$nes: data.nes,
85-
$extensionId: data.extensionId,
92+
...toProperties(data.providerId),
8693
$$requestUuid: data.requestUuid,
8794
} as const);
8895
},
@@ -108,11 +115,22 @@ export const EditReasons = {
108115
eolChange: () => createEditReason({ source: 'eolChange' } as const),
109116
applyEdits: () => createEditReason({ source: 'applyEdits' } as const),
110117
snippet: () => createEditReason({ source: 'snippet' } as const),
111-
suggest: (data: { extensionId: string | undefined }) => createEditReason({ source: 'suggest', $extensionId: data.extensionId } as const),
118+
suggest: (data: { providerId: ProviderId | undefined }) => createEditReason({ source: 'suggest', ...toProperties(data.providerId) } as const),
112119

113-
codeAction: (data: { kind: string | undefined; extensionId: string | undefined }) => createEditReason({ source: 'codeAction', $kind: data.kind, $extensionId: data.extensionId } as const)
120+
codeAction: (data: { kind: string | undefined; providerId: ProviderId | undefined }) => createEditReason({ source: 'codeAction', $kind: data.kind, ...toProperties(data.providerId) } as const)
114121
};
115122

123+
function toProperties(version: ProviderId | undefined) {
124+
if (!version) {
125+
return {};
126+
}
127+
return {
128+
$extensionId: version.extensionId,
129+
$extensionVersion: version.extensionVersion,
130+
$providerId: version.providerId,
131+
};
132+
}
133+
116134
type Values<T> = T[keyof T];
117135
type ITextModelEditReasonMetadata = Values<{ [TKey in keyof typeof EditReasons]: ReturnType<typeof EditReasons[TKey]>['metadataT'] }>;
118136

src/vs/editor/contrib/codeAction/browser/codeAction.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ export async function applyCodeAction(
310310
code: 'undoredo.codeAction',
311311
respectAutoSaveConfig: codeActionReason !== ApplyCodeActionReason.OnSave,
312312
showPreview: options?.preview,
313-
reason: EditReasons.codeAction({ kind: item.action.kind, extensionId: item.provider?.extensionId }),
313+
reason: EditReasons.codeAction({ kind: item.action.kind, providerId: languages.ProviderId.fromExtensionId(item.provider?.extensionId) }),
314314
});
315315

316316
if (!result.isApplied) {

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ export class InlineCompletionsModel extends Disposable {
392392
const userJumpedToActiveCompletion = this._jumpedToId.map(jumpedTo => !!jumpedTo && jumpedTo === this._inlineCompletionItems.get()?.inlineEdit?.semanticId);
393393

394394
const providers = changeSummary.provider
395-
? { providers: [changeSummary.provider], label: 'single:' + changeSummary.provider.providerId }
395+
? { providers: [changeSummary.provider], label: 'single:' + changeSummary.provider.providerId?.toString() }
396396
: { providers: this._languageFeaturesService.inlineCompletionsProvider.all(this.textModel), label: undefined };
397397
const suppressedProviderGroupIds = this._suppressedInlineCompletionGroupIds.get();
398398
const availableProviders = providers.providers.filter(provider => !(provider.groupId && suppressedProviderGroupIds.has(provider.groupId)));
@@ -776,14 +776,14 @@ export class InlineCompletionsModel extends Disposable {
776776
return EditReasons.inlineCompletionPartialAccept({
777777
nes: completion.isInlineEdit,
778778
requestUuid: completion.requestUuid,
779-
extensionId: completion.source.provider.groupId ?? 'unknown',
779+
providerId: completion.source.provider.providerId,
780780
type,
781781
});
782782
} else {
783783
return EditReasons.inlineCompletionAccept({
784784
nes: completion.isInlineEdit,
785785
requestUuid: completion.requestUuid,
786-
extensionId: completion.source.provider.groupId ?? 'unknown',
786+
providerId: completion.source.provider.providerId,
787787
});
788788
}
789789
}

src/vs/editor/contrib/suggest/browser/suggestController.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import { Range } from '../../../common/core/range.js';
2424
import { IEditorContribution, ScrollType } from '../../../common/editorCommon.js';
2525
import { EditorContextKeys } from '../../../common/editorContextKeys.js';
2626
import { ITextModel, TrackedRangeStickiness } from '../../../common/model.js';
27-
import { CompletionItemInsertTextRule, CompletionItemProvider, CompletionTriggerKind } from '../../../common/languages.js';
27+
import { CompletionItemInsertTextRule, CompletionItemProvider, CompletionTriggerKind, ProviderId } from '../../../common/languages.js';
2828
import { SnippetController2 } from '../../snippet/browser/snippetController2.js';
2929
import { SnippetParser } from '../../snippet/browser/snippetParser.js';
3030
import { ISuggestMemoryService } from './suggestMemory.js';
@@ -459,7 +459,7 @@ export class SuggestController implements IEditorContribution {
459459
adjustWhitespace: !(item.completion.insertTextRules! & CompletionItemInsertTextRule.KeepWhitespace),
460460
clipboardText: event.model.clipboardText,
461461
overtypingCapturer: this._overtypingCapturer.value,
462-
reason: EditReasons.suggest({ extensionId: item.extensionId?.value }),
462+
reason: EditReasons.suggest({ providerId: ProviderId.fromExtensionId(item.extensionId?.value) }),
463463
});
464464

465465
if (!(flags & InsertFlags.NoAfterUndoStop)) {

src/vs/monaco.d.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7512,7 +7512,6 @@ declare namespace monaco.languages {
75127512
* Multiple providers can have the same group id.
75137513
*/
75147514
groupId?: InlineCompletionProviderGroupId;
7515-
providerId?: string;
75167515
/**
75177516
* Returns a list of preferred provider {@link groupId}s.
75187517
* The current provider is only requested for completions if no provider with a preferred group id returned a result.

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -685,7 +685,7 @@ export class MainThreadLanguageFeatures extends Disposable implements MainThread
685685
}
686686
},
687687
groupId: groupId ?? extensionId,
688-
providerId: new languages.VersionedExtensionId(extensionId, extensionVersion).toString(),
688+
providerId: new languages.ProviderId(extensionId, extensionVersion, groupId),
689689
yieldsToGroupIds: yieldsToExtensionIds,
690690
debounceDelayMs,
691691
displayName,

src/vs/workbench/contrib/editTelemetry/browser/editSourceTrackingImpl.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,7 @@ class ArcTelemetrySender extends Disposable {
344344

345345
res.telemetryService.publicLog2<{
346346
extensionId: string;
347+
extensionVersion: string;
347348
opportunityId: string;
348349
didBranchChange: number;
349350
timeDelayMs: number;
@@ -354,6 +355,7 @@ class ArcTelemetrySender extends Disposable {
354355
comment: 'Reports the accepted and retained character count for an inline completion/edit.';
355356

356357
extensionId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The extension id (copilot or copilot-chat); which provided this inline completion.' };
358+
extensionVersion: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The version of the extension.' };
357359
opportunityId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Unique identifier for an opportunity to show an inline completion or NES.' };
358360

359361
didBranchChange: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Indicates if the branch changed in the meantime. If the branch changed (value is 1); this event should probably be ignored.' };
@@ -362,6 +364,7 @@ class ArcTelemetrySender extends Disposable {
362364
originalCharCount: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The original character count before any edits.' };
363365
}>('editTelemetry.reportInlineEditArc', {
364366
extensionId: data.$extensionId ?? '',
367+
extensionVersion: data.$extensionVersion ?? '',
365368
opportunityId: data.$$requestUuid ?? 'unknown',
366369
didBranchChange: res.didBranchChange ? 1 : 0,
367370
timeDelayMs: res.timeDelayMs,

0 commit comments

Comments
 (0)