From 0e375d4cc1f6778797e75b59d6ab71156207e2e8 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Tue, 11 May 2021 10:44:37 -0700 Subject: [PATCH 1/3] Allow Pylance to be used with Python 2 if explicitly chosen --- src/client/activation/activationService.ts | 17 +++++++++++++---- src/client/common/configSettings.ts | 12 ++++++------ src/client/common/types.ts | 1 + 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/client/activation/activationService.ts b/src/client/activation/activationService.ts index 7f8b86300fb6..0a99bbdd202a 100644 --- a/src/client/activation/activationService.ts +++ b/src/client/activation/activationService.ts @@ -212,6 +212,11 @@ export class LanguageServerExtensionActivationService return configurationService.getSettings(this.resource).languageServer; } + private getCurrentLanguageServerTypeIsDefault(): boolean { + const configurationService = this.serviceContainer.get(IConfigurationService); + return configurationService.getSettings(this.resource).languageServerIsDefault; + } + private async createRefCountedServer( resource: Resource, interpreter: PythonEnvironment | undefined, @@ -240,10 +245,14 @@ export class LanguageServerExtensionActivationService } } - if (serverType === LanguageServerType.Node && interpreter && interpreter.version) { - if (interpreter.version.major < 3) { - sendTelemetryEvent(EventName.JEDI_FALLBACK); - serverType = LanguageServerType.Jedi; + // If "Pylance" was explicitly chosen, use it even though it's not guaranteed to work + // properly with Python 2. + if (!this.getCurrentLanguageServerTypeIsDefault()) { + if (serverType === LanguageServerType.Node && interpreter && interpreter.version) { + if (interpreter.version.major < 3) { + sendTelemetryEvent(EventName.JEDI_FALLBACK); + serverType = LanguageServerType.Jedi; + } } } diff --git a/src/client/common/configSettings.ts b/src/client/common/configSettings.ts index c937147c72cb..dd3f628a2d4c 100644 --- a/src/client/common/configSettings.ts +++ b/src/client/common/configSettings.ts @@ -144,6 +144,8 @@ export class PythonSettings implements IPythonSettings { public languageServer: LanguageServerType = LanguageServerType.Microsoft; + public languageServerIsDefault = true; + public logging: ILoggingSettings = { level: LogLevel.Error }; public useIsolation = true; @@ -288,21 +290,19 @@ export class PythonSettings implements IPythonSettings { let userLS = pythonSettings.get('languageServer'); userLS = systemVariables.resolveAny(userLS); - let ls: LanguageServerType; - // Validate the user's input; if invalid, set it to the default. if ( !userLS || userLS === 'Default' || !Object.values(LanguageServerType).includes(userLS as LanguageServerType) ) { - ls = this.defaultLS?.defaultLSType ?? LanguageServerType.Jedi; + this.languageServer = this.defaultLS?.defaultLSType ?? LanguageServerType.Jedi; + this.languageServerIsDefault = true; } else { - ls = userLS as LanguageServerType; + this.languageServer = userLS as LanguageServerType; + this.languageServerIsDefault = false; } - this.languageServer = ls; - this.jediPath = systemVariables.resolveAny(pythonSettings.get('jediPath'))!; if (typeof this.jediPath === 'string' && this.jediPath.length > 0) { this.jediPath = getAbsolutePath(systemVariables.resolveAny(this.jediPath), workspaceRoot); diff --git a/src/client/common/types.ts b/src/client/common/types.ts index 3d9badf7eb8c..09b23b3856f0 100644 --- a/src/client/common/types.ts +++ b/src/client/common/types.ts @@ -200,6 +200,7 @@ export interface IPythonSettings { readonly onDidChange: Event; readonly experiments: IExperiments; readonly languageServer: LanguageServerType; + readonly languageServerIsDefault: boolean; readonly defaultInterpreterPath: string; readonly logging: ILoggingSettings; readonly useIsolation: boolean; From 4ab93d48089acb17e01e1b4ea7b2bd7e56275341 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Tue, 11 May 2021 10:47:21 -0700 Subject: [PATCH 2/3] Add news --- news/2 Fixes/16204.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 news/2 Fixes/16204.md diff --git a/news/2 Fixes/16204.md b/news/2 Fixes/16204.md new file mode 100644 index 000000000000..2bc1f787e983 --- /dev/null +++ b/news/2 Fixes/16204.md @@ -0,0 +1 @@ +Allow Pylance to be used with Python 2 if "Pylance" is explicitly set as the language server. From d1aa8cdaef44da02bf4cbfd687c23e79dce18646 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Tue, 11 May 2021 10:52:16 -0700 Subject: [PATCH 3/3] Add a basic test --- .../common/configSettings/configSettings.unit.test.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/test/common/configSettings/configSettings.unit.test.ts b/src/test/common/configSettings/configSettings.unit.test.ts index 8f5236695095..b1cd6e47cc60 100644 --- a/src/test/common/configSettings/configSettings.unit.test.ts +++ b/src/test/common/configSettings/configSettings.unit.test.ts @@ -187,7 +187,11 @@ suite('Python Settings', async () => { config.verifyAll(); }); - function testLanguageServer(languageServer: LanguageServerType, expectedValue: LanguageServerType) { + function testLanguageServer( + languageServer: LanguageServerType, + expectedValue: LanguageServerType, + isDefault: boolean, + ) { test(languageServer, () => { expected.pythonPath = 'python3'; expected.languageServer = languageServer; @@ -200,16 +204,17 @@ suite('Python Settings', async () => { settings.update(config.object); expect(settings.languageServer).to.be.equal(expectedValue); + expect(settings.languageServerIsDefault).to.be.equal(isDefault); config.verifyAll(); }); } suite('languageServer settings', async () => { Object.values(LanguageServerType).forEach(async (languageServer) => { - testLanguageServer(languageServer, languageServer); + testLanguageServer(languageServer, languageServer, false); }); - testLanguageServer('invalid' as LanguageServerType, LanguageServerType.Jedi); + testLanguageServer('invalid' as LanguageServerType, LanguageServerType.Jedi, true); }); function testExperiments(enabled: boolean) {