Skip to content

Commit a6caeca

Browse files
authored
Allow Pylance to be used with Python 2 if explicitly chosen (#16210) (#16214)
1 parent b2d8ea1 commit a6caeca

File tree

5 files changed

+29
-13
lines changed

5 files changed

+29
-13
lines changed

news/2 Fixes/16204.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Allow Pylance to be used with Python 2 if "Pylance" is explicitly set as the language server.

src/client/activation/activationService.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,11 @@ export class LanguageServerExtensionActivationService
212212
return configurationService.getSettings(this.resource).languageServer;
213213
}
214214

215+
private getCurrentLanguageServerTypeIsDefault(): boolean {
216+
const configurationService = this.serviceContainer.get<IConfigurationService>(IConfigurationService);
217+
return configurationService.getSettings(this.resource).languageServerIsDefault;
218+
}
219+
215220
private async createRefCountedServer(
216221
resource: Resource,
217222
interpreter: PythonEnvironment | undefined,
@@ -240,10 +245,14 @@ export class LanguageServerExtensionActivationService
240245
}
241246
}
242247

243-
if (serverType === LanguageServerType.Node && interpreter && interpreter.version) {
244-
if (interpreter.version.major < 3) {
245-
sendTelemetryEvent(EventName.JEDI_FALLBACK);
246-
serverType = LanguageServerType.Jedi;
248+
// If "Pylance" was explicitly chosen, use it even though it's not guaranteed to work
249+
// properly with Python 2.
250+
if (!this.getCurrentLanguageServerTypeIsDefault()) {
251+
if (serverType === LanguageServerType.Node && interpreter && interpreter.version) {
252+
if (interpreter.version.major < 3) {
253+
sendTelemetryEvent(EventName.JEDI_FALLBACK);
254+
serverType = LanguageServerType.Jedi;
255+
}
247256
}
248257
}
249258

src/client/common/configSettings.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ export class PythonSettings implements IPythonSettings {
144144

145145
public languageServer: LanguageServerType = LanguageServerType.Microsoft;
146146

147+
public languageServerIsDefault = true;
148+
147149
public logging: ILoggingSettings = { level: LogLevel.Error };
148150

149151
public useIsolation = true;
@@ -288,21 +290,19 @@ export class PythonSettings implements IPythonSettings {
288290
let userLS = pythonSettings.get<string>('languageServer');
289291
userLS = systemVariables.resolveAny(userLS);
290292

291-
let ls: LanguageServerType;
292-
293293
// Validate the user's input; if invalid, set it to the default.
294294
if (
295295
!userLS ||
296296
userLS === 'Default' ||
297297
!Object.values(LanguageServerType).includes(userLS as LanguageServerType)
298298
) {
299-
ls = this.defaultLS?.defaultLSType ?? LanguageServerType.Jedi;
299+
this.languageServer = this.defaultLS?.defaultLSType ?? LanguageServerType.Jedi;
300+
this.languageServerIsDefault = true;
300301
} else {
301-
ls = userLS as LanguageServerType;
302+
this.languageServer = userLS as LanguageServerType;
303+
this.languageServerIsDefault = false;
302304
}
303305

304-
this.languageServer = ls;
305-
306306
this.jediPath = systemVariables.resolveAny(pythonSettings.get<string>('jediPath'))!;
307307
if (typeof this.jediPath === 'string' && this.jediPath.length > 0) {
308308
this.jediPath = getAbsolutePath(systemVariables.resolveAny(this.jediPath), workspaceRoot);

src/client/common/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ export interface IPythonSettings {
200200
readonly onDidChange: Event<void>;
201201
readonly experiments: IExperiments;
202202
readonly languageServer: LanguageServerType;
203+
readonly languageServerIsDefault: boolean;
203204
readonly defaultInterpreterPath: string;
204205
readonly logging: ILoggingSettings;
205206
readonly useIsolation: boolean;

src/test/common/configSettings/configSettings.unit.test.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,11 @@ suite('Python Settings', async () => {
187187
config.verifyAll();
188188
});
189189

190-
function testLanguageServer(languageServer: LanguageServerType, expectedValue: LanguageServerType) {
190+
function testLanguageServer(
191+
languageServer: LanguageServerType,
192+
expectedValue: LanguageServerType,
193+
isDefault: boolean,
194+
) {
191195
test(languageServer, () => {
192196
expected.pythonPath = 'python3';
193197
expected.languageServer = languageServer;
@@ -200,16 +204,17 @@ suite('Python Settings', async () => {
200204
settings.update(config.object);
201205

202206
expect(settings.languageServer).to.be.equal(expectedValue);
207+
expect(settings.languageServerIsDefault).to.be.equal(isDefault);
203208
config.verifyAll();
204209
});
205210
}
206211

207212
suite('languageServer settings', async () => {
208213
Object.values(LanguageServerType).forEach(async (languageServer) => {
209-
testLanguageServer(languageServer, languageServer);
214+
testLanguageServer(languageServer, languageServer, false);
210215
});
211216

212-
testLanguageServer('invalid' as LanguageServerType, LanguageServerType.Jedi);
217+
testLanguageServer('invalid' as LanguageServerType, LanguageServerType.Jedi, true);
213218
});
214219

215220
function testExperiments(enabled: boolean) {

0 commit comments

Comments
 (0)