From e3aef5260b129bbe93700f8e944243bcf0d2f859 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Mon, 15 Jun 2020 16:37:28 -0700 Subject: [PATCH 1/2] Manually send didConfigurationChange on interpreter change --- .../activation/node/languageServerProxy.ts | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/client/activation/node/languageServerProxy.ts b/src/client/activation/node/languageServerProxy.ts index 777e5b11b5c9..0188d6d9b9b5 100644 --- a/src/client/activation/node/languageServerProxy.ts +++ b/src/client/activation/node/languageServerProxy.ts @@ -3,13 +3,19 @@ import '../../common/extensions'; import { inject, injectable } from 'inversify'; -import { Disposable, LanguageClient, LanguageClientOptions } from 'vscode-languageclient'; +import { + DidChangeConfigurationNotification, + Disposable, + LanguageClient, + LanguageClientOptions +} from 'vscode-languageclient'; import { traceDecorators, traceError } from '../../common/logger'; -import { IConfigurationService, Resource } from '../../common/types'; +import { IConfigurationService, IInterpreterPathService, Resource } from '../../common/types'; import { createDeferred, Deferred, sleep } from '../../common/utils/async'; import { swallowExceptions } from '../../common/utils/decorators'; import { noop } from '../../common/utils/misc'; +import { IServiceContainer } from '../../ioc/types'; import { LanguageServerSymbolProvider } from '../../providers/symbolProvider'; import { PythonInterpreter } from '../../pythonEnvironments/discovery/types'; import { captureTelemetry, sendTelemetryEvent } from '../../telemetry'; @@ -29,6 +35,7 @@ export class NodeLanguageServerProxy implements ILanguageServerProxy { private lsVersion: string | undefined; constructor( + @inject(IServiceContainer) private readonly serviceContainer: IServiceContainer, @inject(ILanguageClientFactory) private readonly factory: ILanguageClientFactory, @inject(ITestManagementService) private readonly testManager: ITestManagementService, @inject(IConfigurationService) private readonly configurationService: IConfigurationService, @@ -95,6 +102,23 @@ export class NodeLanguageServerProxy implements ILanguageServerProxy { const progressReporting = new ProgressReporting(this.languageClient!); this.disposables.push(progressReporting); + const interpreterPathService = this.serviceContainer.tryGet( + IInterpreterPathService + ); + if (interpreterPathService) { + this.disposables.push( + interpreterPathService.onDidChange(() => { + // Manually send didChangeConfiguration in order to get the server to requery + // the workspace configurations (to then pick up pythonPath set in the middleware). + // This is needed as interpreter changes via the interpreter path service happen + // outside of VS Code's settings (which would mean VS Code sends the config updates itself). + this.languageClient!.sendNotification(DidChangeConfigurationNotification.type, { + settings: null + }); + }) + ); + } + const settings = this.configurationService.getSettings(resource); if (settings.downloadLanguageServer) { this.languageClient.onTelemetry((telemetryEvent) => { From 8fdc31633088dd53fb172a6a414b64e8822f30dd Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Tue, 16 Jun 2020 11:34:34 -0700 Subject: [PATCH 2/2] Use DI --- .../activation/node/languageServerProxy.ts | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/client/activation/node/languageServerProxy.ts b/src/client/activation/node/languageServerProxy.ts index 0188d6d9b9b5..971d128480aa 100644 --- a/src/client/activation/node/languageServerProxy.ts +++ b/src/client/activation/node/languageServerProxy.ts @@ -10,12 +10,12 @@ import { LanguageClientOptions } from 'vscode-languageclient'; +import { DeprecatePythonPath } from '../../common/experiments/groups'; import { traceDecorators, traceError } from '../../common/logger'; -import { IConfigurationService, IInterpreterPathService, Resource } from '../../common/types'; +import { IConfigurationService, IExperimentsManager, IInterpreterPathService, Resource } from '../../common/types'; import { createDeferred, Deferred, sleep } from '../../common/utils/async'; import { swallowExceptions } from '../../common/utils/decorators'; import { noop } from '../../common/utils/misc'; -import { IServiceContainer } from '../../ioc/types'; import { LanguageServerSymbolProvider } from '../../providers/symbolProvider'; import { PythonInterpreter } from '../../pythonEnvironments/discovery/types'; import { captureTelemetry, sendTelemetryEvent } from '../../telemetry'; @@ -35,11 +35,12 @@ export class NodeLanguageServerProxy implements ILanguageServerProxy { private lsVersion: string | undefined; constructor( - @inject(IServiceContainer) private readonly serviceContainer: IServiceContainer, @inject(ILanguageClientFactory) private readonly factory: ILanguageClientFactory, @inject(ITestManagementService) private readonly testManager: ITestManagementService, @inject(IConfigurationService) private readonly configurationService: IConfigurationService, - @inject(ILanguageServerFolderService) private readonly folderService: ILanguageServerFolderService + @inject(ILanguageServerFolderService) private readonly folderService: ILanguageServerFolderService, + @inject(IExperimentsManager) private readonly experiments: IExperimentsManager, + @inject(IInterpreterPathService) private readonly interpreterPathService: IInterpreterPathService ) { this.startupCompleted = createDeferred(); } @@ -102,12 +103,9 @@ export class NodeLanguageServerProxy implements ILanguageServerProxy { const progressReporting = new ProgressReporting(this.languageClient!); this.disposables.push(progressReporting); - const interpreterPathService = this.serviceContainer.tryGet( - IInterpreterPathService - ); - if (interpreterPathService) { + if (this.experiments.inExperiment(DeprecatePythonPath.experiment)) { this.disposables.push( - interpreterPathService.onDidChange(() => { + this.interpreterPathService.onDidChange(() => { // Manually send didChangeConfiguration in order to get the server to requery // the workspace configurations (to then pick up pythonPath set in the middleware). // This is needed as interpreter changes via the interpreter path service happen