From 59a5aa197ca8fccfeebc135a6921f20c698516cd Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 5 May 2020 11:29:49 +0200 Subject: [PATCH] add trace logging to extHostDiagnostics, #96837 --- .../workbench/api/common/extHost.api.impl.ts | 2 +- .../api/common/extHostDiagnostics.ts | 28 +++++++++++++++---- .../browser/api/extHostDiagnostics.test.ts | 13 +++++---- 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index d6b5f28da87..db72957372c 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -324,7 +324,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I // namespace: languages const languages: typeof vscode.languages = { createDiagnosticCollection(name?: string): vscode.DiagnosticCollection { - return extHostDiagnostics.createDiagnosticCollection(name); + return extHostDiagnostics.createDiagnosticCollection(extension.identifier, name); }, get onDidChangeDiagnostics() { return extHostDiagnostics.onDidChangeDiagnostics; diff --git a/src/vs/workbench/api/common/extHostDiagnostics.ts b/src/vs/workbench/api/common/extHostDiagnostics.ts index 9097e5960ab..0612d41754f 100644 --- a/src/vs/workbench/api/common/extHostDiagnostics.ts +++ b/src/vs/workbench/api/common/extHostDiagnostics.ts @@ -14,6 +14,7 @@ import { mergeSort } from 'vs/base/common/arrays'; import { Event, Emitter } from 'vs/base/common/event'; import { ILogService } from 'vs/platform/log/common/log'; import { ResourceMap } from 'vs/base/common/map'; +import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; export class DiagnosticCollection implements vscode.DiagnosticCollection { @@ -25,7 +26,7 @@ export class DiagnosticCollection implements vscode.DiagnosticCollection { private readonly _owner: string, private readonly _maxDiagnosticsPerFile: number, private readonly _proxy: MainThreadDiagnosticsShape | undefined, - private readonly _onDidChangeDiagnostics: Emitter<(vscode.Uri | string)[]> + private readonly _onDidChangeDiagnostics: Emitter ) { } dispose(): void { @@ -215,7 +216,7 @@ export class ExtHostDiagnostics implements ExtHostDiagnosticsShape { private readonly _proxy: MainThreadDiagnosticsShape; private readonly _collections = new Map(); - private readonly _onDidChangeDiagnostics = new Emitter<(vscode.Uri | string)[]>(); + private readonly _onDidChangeDiagnostics = new Emitter(); static _debouncer(last: (vscode.Uri | string)[] | undefined, current: (vscode.Uri | string)[]): (vscode.Uri | string)[] { if (!last) { @@ -251,8 +252,25 @@ export class ExtHostDiagnostics implements ExtHostDiagnosticsShape { this._proxy = mainContext.getProxy(MainContext.MainThreadDiagnostics); } - createDiagnosticCollection(name?: string): vscode.DiagnosticCollection { - let { _collections, _proxy, _onDidChangeDiagnostics } = this; + createDiagnosticCollection(extensionId: ExtensionIdentifier, name?: string): vscode.DiagnosticCollection { + + const { _collections, _proxy, _onDidChangeDiagnostics, _logService } = this; + + const loggingProxy = new class implements MainThreadDiagnosticsShape { + $changeMany(owner: string, entries: [UriComponents, IMarkerData[] | undefined][]): void { + _proxy.$changeMany(owner, entries); + _logService.trace('[DiagnosticCollection] change many (extension, owner, uris)', extensionId.value, owner, entries.length === 0 ? 'CLEARING' : entries); + } + $clear(owner: string): void { + _proxy.$clear(owner); + _logService.trace('[DiagnosticCollection] remove all (extension, owner)', extensionId.value, owner); + } + dispose(): void { + _proxy.dispose(); + } + }; + + let owner: string; if (!name) { name = '_generated_diagnostic_collection_name_#' + ExtHostDiagnostics._idPool++; @@ -268,7 +286,7 @@ export class ExtHostDiagnostics implements ExtHostDiagnosticsShape { const result = new class extends DiagnosticCollection { constructor() { - super(name!, owner, ExtHostDiagnostics._maxDiagnosticsPerFile, _proxy, _onDidChangeDiagnostics); + super(name!, owner, ExtHostDiagnostics._maxDiagnosticsPerFile, loggingProxy, _onDidChangeDiagnostics); _collections.set(owner, this); } dispose() { diff --git a/src/vs/workbench/test/browser/api/extHostDiagnostics.test.ts b/src/vs/workbench/test/browser/api/extHostDiagnostics.test.ts index f0b4a8edc25..b4050bd6f27 100644 --- a/src/vs/workbench/test/browser/api/extHostDiagnostics.test.ts +++ b/src/vs/workbench/test/browser/api/extHostDiagnostics.test.ts @@ -13,6 +13,7 @@ import { mock } from 'vs/workbench/test/browser/api/mock'; import { Emitter, Event } from 'vs/base/common/event'; import { NullLogService } from 'vs/platform/log/common/log'; import type * as vscode from 'vscode'; +import { nullExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; suite('ExtHostDiagnostics', () => { @@ -286,7 +287,7 @@ suite('ExtHostDiagnostics', () => { }); test('diagnostic eventing', async function () { - let emitter = new Emitter>(); + let emitter = new Emitter>(); let collection = new DiagnosticCollection('ddd', 'test', 100, new DiagnosticsShape(), emitter); let diag1 = new Diagnostic(new Range(1, 1, 2, 3), 'diag1'); @@ -316,15 +317,15 @@ suite('ExtHostDiagnostics', () => { p = Event.toPromise(emitter.event).then(e => { assert.equal(e.length, 2); - assert.ok(typeof e[0] === 'string'); - assert.ok(typeof e[1] === 'string'); + assert.ok(URI.isUri(e[0])); + assert.ok(URI.isUri(e[1])); }); collection.clear(); await p; }); test('vscode.languages.onDidChangeDiagnostics Does Not Provide Document URI #49582', async function () { - let emitter = new Emitter>(); + let emitter = new Emitter>(); let collection = new DiagnosticCollection('ddd', 'test', 100, new DiagnosticsShape(), emitter); let diag1 = new Diagnostic(new Range(1, 1, 2, 3), 'diag1'); @@ -390,8 +391,8 @@ suite('ExtHostDiagnostics', () => { } }, new NullLogService()); - let collection1 = diags.createDiagnosticCollection('foo'); - let collection2 = diags.createDiagnosticCollection('foo'); // warns, uses a different owner + let collection1 = diags.createDiagnosticCollection(nullExtensionDescription.identifier, 'foo'); + let collection2 = diags.createDiagnosticCollection(nullExtensionDescription.identifier, 'foo'); // warns, uses a different owner collection1.clear(); collection2.clear(); -- GitLab