Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/extension/inlineChat/node/diagnosticsTelemetry.ts
13399 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import type * as vscode from 'vscode';
7
8
9
export interface DiagnosticsTelemetryData {
10
problems: string;
11
problemsCount: number;
12
diagnosticCodes: string;
13
diagnosticsCount: number;
14
}
15
16
export function findDiagnosticsTelemetry(selection: vscode.Selection, fileDiagnostics: vscode.Diagnostic[]): { fileDiagnosticsTelemetry: DiagnosticsTelemetryData; selectionDiagnosticsTelemetry: DiagnosticsTelemetryData; diagnosticsProvider: string } {
17
const selectionDiagnostics = fileDiagnostics.filter(d => selection.intersection(d.range));
18
const fileDiagnosticsTelemetry: DiagnosticsTelemetryData = {
19
problems: fileDiagnostics.map(d => d.message).join(', '),
20
problemsCount: fileDiagnostics.length,
21
diagnosticCodes: '',
22
diagnosticsCount: 0
23
};
24
const selectionDiagnosticsTelemetry: DiagnosticsTelemetryData = {
25
problems: selectionDiagnostics.map(d => d.message).join(', '),
26
problemsCount: selectionDiagnostics.length,
27
diagnosticCodes: '',
28
diagnosticsCount: 0
29
};
30
const fileDiagnosticCodesMap = new Map<string, number>();
31
const selectionDiagnosticCodesMap = new Map<string, number>();
32
fileDiagnostics.forEach((d) => {
33
const code = d.code;
34
const codeValue = typeof code === 'string' || typeof code === 'number' ? code.toString() : (code ? code.value.toString() : '');
35
const errorId = d.source ? `${d.source}@${codeValue}` : codeValue;
36
fileDiagnosticCodesMap.set(errorId, (fileDiagnosticCodesMap.get(errorId) || 0) + 1);
37
if (selection.intersection(d.range)) {
38
selectionDiagnosticCodesMap.set(errorId, (selectionDiagnosticCodesMap.get(errorId) || 0) + 1);
39
}
40
});
41
const findDiagnosticCodes = (errorMap: Map<string, number>): string => {
42
let diagnosticsCodes = '';
43
errorMap.forEach((value, key) => {
44
diagnosticsCodes += `${key}:${value},`;
45
});
46
return diagnosticsCodes;
47
};
48
fileDiagnosticsTelemetry.diagnosticCodes = findDiagnosticCodes(fileDiagnosticCodesMap);
49
fileDiagnosticsTelemetry.diagnosticsCount = fileDiagnosticCodesMap.size;
50
selectionDiagnosticsTelemetry.diagnosticCodes = findDiagnosticCodes(selectionDiagnosticCodesMap);
51
selectionDiagnosticsTelemetry.diagnosticsCount = selectionDiagnosticCodesMap.size;
52
const diagnosticsProvider = fileDiagnostics.length > 0 ? (fileDiagnostics[0].source ?? '') : '';
53
return { fileDiagnosticsTelemetry, selectionDiagnosticsTelemetry, diagnosticsProvider };
54
}
55
56