@@ -12,7 +12,7 @@ import * as vscode from 'vscode';
1212import * as crypto from 'crypto' ;
1313import { Disposable , DocumentFilter , LanguageClientOptions } from 'vscode-languageclient/node' ;
1414
15- import { compare } from 'semver' ;
15+ import * as semver from 'semver' ;
1616import { EXTENSION_ROOT_DIR , PYTHON_LANGUAGE } from '../../common/constants' ;
1717import { IConfigurationService , IDisposableRegistry , IInstaller , InstallerResponse , Product , Resource } from '../../common/types' ;
1818import { InstallOptions } from '../../common/installer/types' ;
@@ -49,6 +49,8 @@ export class PositronJediLanguageServerProxy implements ILanguageServerProxy {
4949
5050 private registered = false ;
5151
52+ private readonly minimumSupportedVersion = '3.8.0' ;
53+
5254 constructor (
5355 private readonly serviceContainer : IServiceContainer ,
5456 private readonly interpreterService : IInterpreterService ,
@@ -161,20 +163,26 @@ export class PositronJediLanguageServerProxy implements ILanguageServerProxy {
161163 let debugPort ;
162164 for ( const interpreter of interpreters ) {
163165
164- // If required, also locate an available port for the debugger
165- if ( debug ) {
166- if ( debugPort === undefined ) {
167- debugPort = 5678 ; // Default port for debugpy
166+ // Only register runtimes for supported versions
167+ if ( this . isVersionSupported ( interpreter ?. version ) ) {
168+
169+ // If required, also locate an available port for the debugger
170+ if ( debug ) {
171+ if ( debugPort === undefined ) {
172+ debugPort = 5678 ; // Default port for debugpy
173+ }
174+ debugPort = await portfinder . getPortPromise ( { port : debugPort } ) ;
168175 }
169- debugPort = await portfinder . getPortPromise ( { port : debugPort } ) ;
170- }
171176
172- const runtime : vscode . Disposable = await this . registerLanguageRuntime (
173- jupyterAdapterApi , interpreter , debugPort , logLevel , options ) ;
174- this . disposables . push ( runtime ) ;
177+ const runtime : vscode . Disposable = await this . registerLanguageRuntime (
178+ jupyterAdapterApi , interpreter , debugPort , logLevel , options ) ;
179+ this . disposables . push ( runtime ) ;
175180
176- if ( debugPort !== undefined ) {
177- debugPort += 1 ;
181+ if ( debugPort !== undefined ) {
182+ debugPort += 1 ;
183+ }
184+ } else {
185+ traceVerbose ( `Not registering runtime due to unsupported interpreter version ${ interpreter . displayName } ` ) ;
178186 }
179187 }
180188 }
@@ -257,11 +265,20 @@ export class PositronJediLanguageServerProxy implements ILanguageServerProxy {
257265 // Compare versions in descending order
258266 const av : string = this . getVersionString ( a . version ) ;
259267 const bv : string = this . getVersionString ( b . version ) ;
260- return - compare ( av , bv ) ;
268+ return - semver . compare ( av , bv ) ;
261269 } ) ;
262270 return copy ;
263271 }
264272
273+ /**
274+ * Check if a version is supported (i.e. >= the minimum supported version).
275+ * Also returns true if the version could not be determined.
276+ */
277+ private isVersionSupported ( version : PythonVersion | undefined ) : boolean {
278+ const versionString = version && this . getVersionString ( version ) ;
279+ return ! versionString || semver . gte ( versionString , this . minimumSupportedVersion ) ;
280+ }
281+
265282 /**
266283 * Formats python version info as a semver string, adapted from
267284 * common/utils/version to work with PythonVersion instances.
0 commit comments