5
5
import { commands , Disposable , Event , EventEmitter , Uri } from 'vscode' ;
6
6
import { traceError , traceLog } from './logging' ;
7
7
import { PythonExtension , ResolvedEnvironment } from '@vscode/python-extension' ;
8
+ import { PYTHON_MAJOR , PYTHON_MINOR , PYTHON_VERSION } from './constants' ;
9
+ import { getProjectRoot } from './utilities' ;
8
10
9
11
export interface IInterpreterDetails {
10
12
path ?: string [ ] ;
11
13
resource ?: Uri ;
12
14
}
13
15
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 ;
16
18
17
19
let _api : PythonExtension | undefined ;
18
20
async function getPythonExtensionAPI ( ) : Promise < PythonExtension | undefined > {
@@ -23,21 +25,59 @@ async function getPythonExtensionAPI(): Promise<PythonExtension | undefined> {
23
25
return _api ;
24
26
}
25
27
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
+
26
65
export async function initializePython ( disposables : Disposable [ ] ) : Promise < void > {
27
66
try {
28
67
const api = await getPythonExtensionAPI ( ) ;
68
+
29
69
if ( api ) {
30
70
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 ( ) ;
33
73
} ) ,
34
74
) ;
35
75
36
- traceLog ( 'Waiting for interpreter from python extension.' ) ;
37
- onDidChangePythonInterpreterEvent . fire ( await getInterpreterDetails ( ) ) ;
76
+ traceLog ( 'Waiting for interpreter from Python extension.' ) ;
77
+ await refreshServerPython ( ) ;
38
78
}
39
79
} catch ( error ) {
40
- traceError ( 'Error initializing python : ' , error ) ;
80
+ traceError ( 'Error initializing Python : ' , error ) ;
41
81
}
42
82
}
43
83
@@ -69,11 +109,11 @@ export async function runPythonExtensionCommand(command: string, ...rest: any[])
69
109
70
110
export function checkVersion ( resolved : ResolvedEnvironment | undefined ) : boolean {
71
111
const version = resolved ?. version ;
72
- if ( version ?. major === 3 && version ?. minor >= 8 ) {
112
+ if ( version ?. major === PYTHON_MAJOR && version ?. minor >= PYTHON_MINOR ) {
73
113
return true ;
74
114
}
75
115
traceError ( `Python version ${ version ?. major } .${ version ?. minor } is not supported.` ) ;
76
116
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.` ) ;
78
118
return false ;
79
119
}
0 commit comments