11// Copyright (c) Microsoft Corporation. All rights reserved.
22// Licensed under the MIT License.
33
4- import { Terminal , Uri } from 'vscode' ;
4+ import { EventEmitter , Terminal , Uri , Disposable , ConfigurationTarget } from 'vscode' ;
55import { getExtension } from '../common/vscodeApis/extensionsApi' ;
66import {
77 GetEnvironmentScope ,
@@ -10,8 +10,10 @@ import {
1010 PythonEnvironmentApi ,
1111 PythonProcess ,
1212 RefreshEnvironmentsScope ,
13+ DidChangeEnvironmentEventArgs ,
1314} from './types' ;
1415import { executeCommand } from '../common/vscodeApis/commandApis' ;
16+ import { IInterpreterPathService } from '../common/types' ;
1517
1618export const ENVS_EXTENSION_ID = 'ms-python.vscode-python-envs' ;
1719
@@ -24,6 +26,17 @@ export function useEnvExtension(): boolean {
2426 return _useExt ;
2527}
2628
29+ const onDidChangeEnvironmentEnvExtEmitter : EventEmitter < DidChangeEnvironmentEventArgs > = new EventEmitter <
30+ DidChangeEnvironmentEventArgs
31+ > ( ) ;
32+ export function onDidChangeEnvironmentEnvExt (
33+ listener : ( e : DidChangeEnvironmentEventArgs ) => unknown ,
34+ thisArgs ?: unknown ,
35+ disposables ?: Disposable [ ] ,
36+ ) : Disposable {
37+ return onDidChangeEnvironmentEnvExtEmitter . event ( listener , thisArgs , disposables ) ;
38+ }
39+
2740let _extApi : PythonEnvironmentApi | undefined ;
2841export async function getEnvExtApi ( ) : Promise < PythonEnvironmentApi > {
2942 if ( _extApi ) {
@@ -33,14 +46,15 @@ export async function getEnvExtApi(): Promise<PythonEnvironmentApi> {
3346 if ( ! extension ) {
3447 throw new Error ( 'Python Environments extension not found.' ) ;
3548 }
36- if ( extension ?. isActive ) {
37- _extApi = extension . exports as PythonEnvironmentApi ;
38- return _extApi ;
49+ if ( ! extension ?. isActive ) {
50+ await extension . activate ( ) ;
3951 }
4052
41- await extension . activate ( ) ;
42-
4353 _extApi = extension . exports as PythonEnvironmentApi ;
54+ _extApi . onDidChangeEnvironment ( ( e ) => {
55+ onDidChangeEnvironmentEnvExtEmitter . fire ( e ) ;
56+ } ) ;
57+
4458 return _extApi ;
4559}
4660
@@ -106,3 +120,32 @@ export async function clearCache(): Promise<void> {
106120 await executeCommand ( 'python-envs.clearCache' ) ;
107121 }
108122}
123+
124+ export function registerEnvExtFeatures (
125+ disposables : Disposable [ ] ,
126+ interpreterPathService : IInterpreterPathService ,
127+ ) : void {
128+ if ( useEnvExtension ( ) ) {
129+ disposables . push (
130+ onDidChangeEnvironmentEnvExt ( async ( e : DidChangeEnvironmentEventArgs ) => {
131+ const previousPath = interpreterPathService . get ( e . uri ) ;
132+
133+ if ( previousPath !== e . new ?. environmentPath . fsPath ) {
134+ if ( e . uri ) {
135+ await interpreterPathService . update (
136+ e . uri ,
137+ ConfigurationTarget . WorkspaceFolder ,
138+ e . new ?. environmentPath . fsPath ,
139+ ) ;
140+ } else {
141+ await interpreterPathService . update (
142+ undefined ,
143+ ConfigurationTarget . Global ,
144+ e . new ?. environmentPath . fsPath ,
145+ ) ;
146+ }
147+ }
148+ } ) ,
149+ ) ;
150+ }
151+ }
0 commit comments