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