From 9e324be81b12630c44e79771e6955ffd06730511 Mon Sep 17 00:00:00 2001 From: Don Jayamanne Date: Mon, 14 Nov 2022 15:15:57 +1100 Subject: [PATCH 1/3] Ensure we cache `extensions.all` --- src/client/common/application/extensions.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/client/common/application/extensions.ts b/src/client/common/application/extensions.ts index 9d62e76d5da4..26add9f2828d 100644 --- a/src/client/common/application/extensions.ts +++ b/src/client/common/application/extensions.ts @@ -17,6 +17,8 @@ import { EXTENSION_ROOT_DIR } from '../constants'; */ @injectable() export class Extensions implements IExtensions { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private _cachedExtensions?: readonly Extension[]; constructor(@inject(IFileSystem) private readonly fs: IFileSystem) {} // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -32,6 +34,16 @@ export class Extensions implements IExtensions { return extensions.getExtension(extensionId); } + private get cachedExtensions() { + if (!this._cachedExtensions) { + this._cachedExtensions = this._cachedExtensions || extensions.all; + extensions.onDidChange(() => { + this._cachedExtensions = this._cachedExtensions || extensions.all; + }); + } + return this._cachedExtensions!; + } + /** * Code borrowed from: * https://github.com/microsoft/vscode-jupyter/blob/67fe33d072f11d6443cf232a06bed0ac5e24682c/src/platform/common/application/extensions.node.ts @@ -51,7 +63,7 @@ export class Extensions implements IExtensions { }) .filter((item) => item && !item.toLowerCase().startsWith(pythonExtRoot)) .filter((item) => - this.all.some( + this.cachedExtensions.some( (ext) => item!.includes(ext.extensionUri.path) || item!.includes(ext.extensionUri.fsPath), ), ) as string[]; From ea4eab7f2e105ae3adafebb59959dc380c008c30 Mon Sep 17 00:00:00 2001 From: Kartik Raj Date: Mon, 14 Nov 2022 03:17:02 -0800 Subject: [PATCH 2/3] Fixes --- src/client/common/application/extensions.ts | 4 +++- src/client/proposedApi.ts | 24 ++++++++++++--------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/client/common/application/extensions.ts b/src/client/common/application/extensions.ts index 26add9f2828d..29e127979c64 100644 --- a/src/client/common/application/extensions.ts +++ b/src/client/common/application/extensions.ts @@ -19,6 +19,7 @@ import { EXTENSION_ROOT_DIR } from '../constants'; export class Extensions implements IExtensions { // eslint-disable-next-line @typescript-eslint/no-explicit-any private _cachedExtensions?: readonly Extension[]; + constructor(@inject(IFileSystem) private readonly fs: IFileSystem) {} // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -41,7 +42,7 @@ export class Extensions implements IExtensions { this._cachedExtensions = this._cachedExtensions || extensions.all; }); } - return this._cachedExtensions!; + return this._cachedExtensions; } /** @@ -63,6 +64,7 @@ export class Extensions implements IExtensions { }) .filter((item) => item && !item.toLowerCase().startsWith(pythonExtRoot)) .filter((item) => + // Use cached list of extensions as we need this to be fast. this.cachedExtensions.some( (ext) => item!.includes(ext.extensionUri.path) || item!.includes(ext.extensionUri.fsPath), ), diff --git a/src/client/proposedApi.ts b/src/client/proposedApi.ts index 38fdc130bba0..93f6270d104f 100644 --- a/src/client/proposedApi.ts +++ b/src/client/proposedApi.ts @@ -125,16 +125,20 @@ export function buildProposedApi( const extensions = serviceContainer.get(IExtensions); const envVarsProvider = serviceContainer.get(IEnvironmentVariablesProvider); function sendApiTelemetry(apiName: string, args?: unknown) { - extensions - .determineExtensionFromCallStack() - .then((info) => { - sendTelemetryEvent(EventName.PYTHON_ENVIRONMENTS_API, undefined, { - apiName, - extensionId: info.extensionId, - }); - traceVerbose(`Extension ${info.extensionId} accessed ${apiName} with args: ${JSON.stringify(args)}`); - }) - .ignoreErrors(); + setTimeout(() => + extensions + .determineExtensionFromCallStack() + .then((info) => { + sendTelemetryEvent(EventName.PYTHON_ENVIRONMENTS_API, undefined, { + apiName, + extensionId: info.extensionId, + }); + traceVerbose( + `Extension ${info.extensionId} accessed ${apiName} with args: ${JSON.stringify(args)}`, + ); + }) + .ignoreErrors(), + ); } disposables.push( discoveryApi.onChanged((e) => { From e93f54f4e14aa079501feae69174147ca97a6464 Mon Sep 17 00:00:00 2001 From: Kartik Raj Date: Mon, 14 Nov 2022 03:26:53 -0800 Subject: [PATCH 3/3] Fix test --- src/test/proposedApi.unit.test.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/test/proposedApi.unit.test.ts b/src/test/proposedApi.unit.test.ts index 1a834d62a6a5..80db62f4814b 100644 --- a/src/test/proposedApi.unit.test.ts +++ b/src/test/proposedApi.unit.test.ts @@ -99,8 +99,6 @@ suite('Proposed Extension API', () => { }); teardown(() => { - // Verify each API method sends telemetry regarding who called the API. - extensions.verifyAll(); sinon.restore(); });