55import { commands , Disposable , Event , EventEmitter , Uri } from 'vscode' ;
66import { traceError , traceLog } from './logging' ;
77import { PythonExtension , ResolvedEnvironment } from '@vscode/python-extension' ;
8+ import { PYTHON_MAJOR , PYTHON_MINOR , PYTHON_VERSION } from './constants' ;
9+ import { getProjectRoot } from './utilities' ;
810
911export interface IInterpreterDetails {
1012 path ?: string [ ] ;
1113 resource ?: Uri ;
1214}
1315
14- const onDidChangePythonInterpreterEvent = new EventEmitter < IInterpreterDetails > ( ) ;
15- export const onDidChangePythonInterpreter : Event < IInterpreterDetails > = onDidChangePythonInterpreterEvent . event ;
16+ const onDidChangePythonInterpreterEvent = new EventEmitter < void > ( ) ;
17+ export const onDidChangePythonInterpreter : Event < void > = onDidChangePythonInterpreterEvent . event ;
1618
1719let _api : PythonExtension | undefined ;
1820async function getPythonExtensionAPI ( ) : Promise < PythonExtension | undefined > {
@@ -23,21 +25,59 @@ async function getPythonExtensionAPI(): Promise<PythonExtension | undefined> {
2325 return _api ;
2426}
2527
28+ function sameInterpreter ( a : string [ ] , b : string [ ] ) : boolean {
29+ if ( a . length !== b . length ) {
30+ return false ;
31+ }
32+ for ( let i = 0 ; i < a . length ; i ++ ) {
33+ if ( a [ i ] !== b [ i ] ) {
34+ return false ;
35+ }
36+ }
37+ return true ;
38+ }
39+
40+ let serverPython : string [ ] | undefined ;
41+ function checkAndFireEvent ( interpreter : string [ ] | undefined ) : void {
42+ if ( interpreter === undefined ) {
43+ if ( serverPython ) {
44+ // Python was reset for this uri
45+ serverPython = undefined ;
46+ onDidChangePythonInterpreterEvent . fire ( ) ;
47+ return ;
48+ } else {
49+ return ; // No change in interpreter
50+ }
51+ }
52+
53+ if ( ! serverPython || ! sameInterpreter ( serverPython , interpreter ) ) {
54+ serverPython = interpreter ;
55+ onDidChangePythonInterpreterEvent . fire ( ) ;
56+ }
57+ }
58+
59+ async function refreshServerPython ( ) : Promise < void > {
60+ const projectRoot = await getProjectRoot ( ) ;
61+ const interpreter = await getInterpreterDetails ( projectRoot ?. uri ) ;
62+ checkAndFireEvent ( interpreter . path ) ;
63+ }
64+
2665export async function initializePython ( disposables : Disposable [ ] ) : Promise < void > {
2766 try {
2867 const api = await getPythonExtensionAPI ( ) ;
68+
2969 if ( api ) {
3070 disposables . push (
31- api . environments . onDidChangeActiveEnvironmentPath ( ( e ) => {
32- onDidChangePythonInterpreterEvent . fire ( { path : [ e . path ] , resource : e . resource ?. uri } ) ;
71+ api . environments . onDidChangeActiveEnvironmentPath ( async ( ) => {
72+ await refreshServerPython ( ) ;
3373 } ) ,
3474 ) ;
3575
36- traceLog ( 'Waiting for interpreter from python extension.' ) ;
37- onDidChangePythonInterpreterEvent . fire ( await getInterpreterDetails ( ) ) ;
76+ traceLog ( 'Waiting for interpreter from Python extension.' ) ;
77+ await refreshServerPython ( ) ;
3878 }
3979 } catch ( error ) {
40- traceError ( 'Error initializing python : ' , error ) ;
80+ traceError ( 'Error initializing Python : ' , error ) ;
4181 }
4282}
4383
@@ -69,11 +109,11 @@ export async function runPythonExtensionCommand(command: string, ...rest: any[])
69109
70110export function checkVersion ( resolved : ResolvedEnvironment | undefined ) : boolean {
71111 const version = resolved ?. version ;
72- if ( version ?. major === 3 && version ?. minor >= 8 ) {
112+ if ( version ?. major === PYTHON_MAJOR && version ?. minor >= PYTHON_MINOR ) {
73113 return true ;
74114 }
75115 traceError ( `Python version ${ version ?. major } .${ version ?. minor } is not supported.` ) ;
76116 traceError ( `Selected python path: ${ resolved ?. executable . uri ?. fsPath } ` ) ;
77- traceError ( ' Supported versions are 3.8 and above.' ) ;
117+ traceError ( ` Supported versions are ${ PYTHON_VERSION } and above.` ) ;
78118 return false ;
79119}
0 commit comments