Skip to content

Commit 819411f

Browse files
authored
Merge pull request microsoft#184994 from microsoft/joh/bright-felidae
joh/bright felidae
2 parents e82cbf8 + 6a805df commit 819411f

File tree

2 files changed

+32
-7
lines changed

2 files changed

+32
-7
lines changed

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

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,7 @@ export class SuggestController implements IEditorContribution {
332332
// keep item in memory
333333
this._memoryService.memorize(model, this.editor.getPosition(), item);
334334

335+
const isResolved = item.isResolved;
335336

336337
if (Array.isArray(item.completion.additionalTextEdits)) {
337338

@@ -346,7 +347,7 @@ export class SuggestController implements IEditorContribution {
346347
);
347348
scrollState.restoreRelativeVerticalPositionOfCursor(this.editor);
348349

349-
} else if (!item.isResolved) {
350+
} else if (!isResolved) {
350351
// async additional edits
351352
const sw = new StopWatch(true);
352353
let position: IPosition | undefined;
@@ -378,7 +379,7 @@ export class SuggestController implements IEditorContribution {
378379

379380
tasks.push(item.resolve(cts.token).then(() => {
380381
if (!item.completion.additionalTextEdits || cts.token.isCancellationRequested) {
381-
return false;
382+
return undefined;
382383
}
383384
if (position && item.completion.additionalTextEdits.some(edit => Position.isBefore(position!, Range.getStartPosition(edit.range)))) {
384385
return false;
@@ -398,6 +399,20 @@ export class SuggestController implements IEditorContribution {
398399
return true;
399400
}).then(applied => {
400401
this._logService.trace('[suggest] async resolving of edits DONE (ms, applied?)', sw.elapsed(), applied);
402+
type AsyncSuggestEdits = { providerId: string; applied: boolean };
403+
type AsyncSuggestEditsClassification = {
404+
owner: 'jrieken';
405+
comment: 'Information about async additional text edits';
406+
providerId: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight'; comment: 'Provider of the completions item' };
407+
applied: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'If async additional text edits could be applied' };
408+
};
409+
if (typeof applied === 'boolean') {
410+
this._telemetryService.publicLog2<AsyncSuggestEdits, AsyncSuggestEditsClassification>('suggest.asyncAdditionalEdits', {
411+
providerId: item.extensionId?.value ?? 'unknown',
412+
applied
413+
});
414+
}
415+
}).finally(() => {
401416
docListener.dispose();
402417
typeListener.dispose();
403418
}));
@@ -467,28 +482,29 @@ export class SuggestController implements IEditorContribution {
467482

468483
// clear only now - after all tasks are done
469484
Promise.all(tasks).finally(() => {
470-
this._reportSuggestionAcceptedTelemetry(item, model, event);
485+
this._reportSuggestionAcceptedTelemetry(item, model, event, isResolved);
471486

472487
this.model.clear();
473488
cts.dispose();
474489
});
475490
}
476491

477492
private _telemetryGate: number = 0;
478-
private _reportSuggestionAcceptedTelemetry(item: CompletionItem, model: ITextModel, acceptedSuggestion: ISelectedSuggestion) {
493+
private _reportSuggestionAcceptedTelemetry(item: CompletionItem, model: ITextModel, acceptedSuggestion: ISelectedSuggestion, itemResolved: boolean) {
479494
if (this._telemetryGate++ % 100 !== 0) {
480495
return;
481496
}
482497

483-
type AcceptedSuggestion = { providerId: string; fileExtension: string; languageId: string; basenameHash: string; kind: number };
498+
type AcceptedSuggestion = { providerId: string; fileExtension: string; languageId: string; basenameHash: string; kind: number; itemResolved: boolean };
484499
type AcceptedSuggestionClassification = {
485500
owner: 'jrieken';
486501
comment: 'Information accepting completion items';
487502
providerId: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight'; comment: 'Provider of the completions item' };
488503
basenameHash: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight'; comment: 'Hash of the basename of the file into which the completion was inserted' };
489504
fileExtension: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'File extension of the file into which the completion was inserted' };
490505
languageId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Language type of the file into which the completion was inserted' };
491-
kind: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The completion item kind' };
506+
kind: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'The completion item kind' };
507+
itemResolved: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'If the item was inserted before resolving was done' };
492508
};
493509
// _debugDisplayName looks like `vscode.css-language-features(/-:)`, where the last bit is the trigger chars
494510
// normalize it to just the extension ID and lowercase
@@ -499,6 +515,7 @@ export class SuggestController implements IEditorContribution {
499515
basenameHash: hash(basename(model.uri)).toString(16),
500516
languageId: model.getLanguageId(),
501517
fileExtension: extname(model.uri),
518+
itemResolved
502519
});
503520
}
504521

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1046,14 +1046,22 @@ class CompletionsAdapter {
10461046
additionalTextEdits: resolvedItem.additionalTextEdits
10471047
};
10481048

1049-
if (item.insertText !== resolvedItem.insertText) {
1049+
if (CompletionsAdapter._insertTextIdent(item.insertText) !== CompletionsAdapter._insertTextIdent(resolvedItem.insertText)) {
10501050
this._apiDeprecation.report('CompletionItem.insertText', this._extension, 'extension MAY NOT change \'insertText\' of a CompletionItem during resolve');
10511051
enforcedResolvedItem.insertText = resolvedItem.insertText;
10521052
}
10531053

10541054
return this._convertCompletionItem(enforcedResolvedItem, id);
10551055
}
10561056

1057+
private static _insertTextIdent(insertText: string | vscode.SnippetString | undefined) {
1058+
switch (typeof insertText) {
1059+
case 'string': return insertText;
1060+
case 'undefined': return undefined;
1061+
case 'object': return insertText.value;
1062+
}
1063+
}
1064+
10571065
releaseCompletionItems(id: number): any {
10581066
this._disposables.get(id)?.dispose();
10591067
this._disposables.delete(id);

0 commit comments

Comments
 (0)