diff --git a/extensions/typescript-language-features/src/languageFeatures/diagnostics.ts b/extensions/typescript-language-features/src/languageFeatures/diagnostics.ts index aeb4491872e..5981e63ea6e 100644 --- a/extensions/typescript-language-features/src/languageFeatures/diagnostics.ts +++ b/extensions/typescript-language-features/src/languageFeatures/diagnostics.ts @@ -8,6 +8,7 @@ import { DiagnosticLanguage } from '../configuration/languageDescription'; import * as arrays from '../utils/arrays'; import { Disposable } from '../utils/dispose'; import { ResourceMap } from '../utils/resourceMap'; +import { TelemetryReporter } from '../logging/telemetry'; function diagnosticsEquals(a: vscode.Diagnostic, b: vscode.Diagnostic): boolean { if (a === b) { @@ -153,11 +154,13 @@ export class DiagnosticsManager extends Disposable { private readonly _settings = new DiagnosticSettings(); private readonly _currentDiagnostics: vscode.DiagnosticCollection; private readonly _pendingUpdates: ResourceMap; + private readonly _telemetryReporter: TelemetryReporter; private readonly _updateDelay = 50; constructor( owner: string, + telemetryReporter: TelemetryReporter, onCaseInsensitiveFileSystem: boolean ) { super(); @@ -165,6 +168,7 @@ export class DiagnosticsManager extends Disposable { this._pendingUpdates = new ResourceMap(undefined, { onCaseInsensitiveFileSystem }); this._currentDiagnostics = this._register(vscode.languages.createDiagnosticCollection(owner)); + this._telemetryReporter = telemetryReporter; } public override dispose() { @@ -238,7 +242,29 @@ export class DiagnosticsManager extends Disposable { } public getDiagnostics(file: vscode.Uri): ReadonlyArray { - return this._currentDiagnostics.get(file) || []; + const diagnostics = this._currentDiagnostics.get(file) || []; + const diagnoticCodes = diagnostics.reduce(function (result: number[], d: vscode.Diagnostic) { + const code = d.code; + if (typeof code === 'string' || typeof code === 'number') { + result.push(Number(code)); + } else if (code !== undefined) { + result.push(Number(code.value)); + } + return result; + }, []).sort(); + /* __GDPR__ + "typescript.diagnostics" : { + "owner": "@aiday-mar", + "diagnosticCodes" : { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" }, + "${include}": [ + "${TypeScriptCommonProperties}" + ] + } + */ + this._telemetryReporter.logTelemetry('typescript.diagnostics', { + diagnoticCodes: diagnoticCodes.join(', ') + }); + return diagnostics; } private scheduleDiagnosticsUpdate(file: vscode.Uri) { diff --git a/extensions/typescript-language-features/src/typescriptServiceClient.ts b/extensions/typescript-language-features/src/typescriptServiceClient.ts index 86c6bb8d9f1..c165f82db40 100644 --- a/extensions/typescript-language-features/src/typescriptServiceClient.ts +++ b/extensions/typescript-language-features/src/typescriptServiceClient.ts @@ -176,7 +176,6 @@ export default class TypeScriptServiceClient extends Disposable implements IType this.bufferSyncSupport = new BufferSyncSupport(this, allModeIds, onCaseInsenitiveFileSystem); this.onReady(() => { this.bufferSyncSupport.listen(); }); - this.diagnosticsManager = new DiagnosticsManager('typescript', onCaseInsenitiveFileSystem); this.bufferSyncSupport.onDelete(resource => { this.cancelInflightRequestsForResource(resource); this.diagnosticsManager.deleteAllDiagnosticsInFile(resource); @@ -213,7 +212,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType } return this.apiVersion.fullVersionString; }); - + this.diagnosticsManager = new DiagnosticsManager('typescript', this.telemetryReporter, onCaseInsenitiveFileSystem); this.typescriptServerSpawner = new TypeScriptServerSpawner(this.versionProvider, this._versionManager, this.logDirectoryProvider, this.pluginPathsProvider, this.logger, this.telemetryReporter, this.tracer, this.processFactory); this._register(this.pluginManager.onDidUpdateConfig(update => {