@@ -32,6 +32,7 @@ import {
32
32
Resource ,
33
33
} from './api/types' ;
34
34
import { buildEnvironmentCreationApi } from './pythonEnvironments/creation/createEnvApi' ;
35
+ import { EnvironmentKnownCache } from './environmentKnownCache' ;
35
36
36
37
type ActiveEnvironmentChangeEvent = {
37
38
resource : WorkspaceFolder | undefined ;
@@ -120,6 +121,15 @@ export function buildEnvironmentApi(
120
121
const disposables = serviceContainer . get < IDisposableRegistry > ( IDisposableRegistry ) ;
121
122
const extensions = serviceContainer . get < IExtensions > ( IExtensions ) ;
122
123
const envVarsProvider = serviceContainer . get < IEnvironmentVariablesProvider > ( IEnvironmentVariablesProvider ) ;
124
+ let knownCache : EnvironmentKnownCache ;
125
+
126
+ function initKnownCache ( ) {
127
+ const knownEnvs = discoveryApi
128
+ . getEnvs ( )
129
+ . filter ( ( e ) => filterUsingVSCodeContext ( e ) )
130
+ . map ( ( e ) => updateReference ( e ) ) ;
131
+ return new EnvironmentKnownCache ( knownEnvs ) ;
132
+ }
123
133
function sendApiTelemetry ( apiName : string , args ?: unknown ) {
124
134
extensions
125
135
. determineExtensionFromCallStack ( )
@@ -139,19 +149,26 @@ export function buildEnvironmentApi(
139
149
// Filter out environments that are not in the current workspace.
140
150
return ;
141
151
}
152
+ if ( ! knownCache ) {
153
+ knownCache = initKnownCache ( ) ;
154
+ }
142
155
if ( e . old ) {
143
156
if ( e . new ) {
157
+ const newEnv = updateReference ( e . new ) ;
158
+ knownCache . updateEnv ( convertEnvInfo ( e . old ) , newEnv ) ;
144
159
traceVerbose ( 'Python API env change detected' , env . id , 'update' ) ;
145
- onEnvironmentsChanged . fire ( { type : 'update' , env : convertEnvInfoAndGetReference ( e . new ) } ) ;
160
+ onEnvironmentsChanged . fire ( { type : 'update' , env : newEnv } ) ;
146
161
reportInterpretersChanged ( [
147
162
{
148
163
path : getEnvPath ( e . new . executable . filename , e . new . location ) . path ,
149
164
type : 'update' ,
150
165
} ,
151
166
] ) ;
152
167
} else {
168
+ const oldEnv = updateReference ( e . old ) ;
169
+ knownCache . updateEnv ( oldEnv , undefined ) ;
153
170
traceVerbose ( 'Python API env change detected' , env . id , 'remove' ) ;
154
- onEnvironmentsChanged . fire ( { type : 'remove' , env : convertEnvInfoAndGetReference ( e . old ) } ) ;
171
+ onEnvironmentsChanged . fire ( { type : 'remove' , env : oldEnv } ) ;
155
172
reportInterpretersChanged ( [
156
173
{
157
174
path : getEnvPath ( e . old . executable . filename , e . old . location ) . path ,
@@ -160,8 +177,10 @@ export function buildEnvironmentApi(
160
177
] ) ;
161
178
}
162
179
} else if ( e . new ) {
180
+ const newEnv = updateReference ( e . new ) ;
181
+ knownCache . addEnv ( newEnv ) ;
163
182
traceVerbose ( 'Python API env change detected' , env . id , 'add' ) ;
164
- onEnvironmentsChanged . fire ( { type : 'add' , env : convertEnvInfoAndGetReference ( e . new ) } ) ;
183
+ onEnvironmentsChanged . fire ( { type : 'add' , env : newEnv } ) ;
165
184
reportInterpretersChanged ( [
166
185
{
167
186
path : getEnvPath ( e . new . executable . filename , e . new . location ) . path ,
@@ -179,6 +198,9 @@ export function buildEnvironmentApi(
179
198
onEnvironmentsChanged ,
180
199
onEnvironmentVariablesChanged ,
181
200
) ;
201
+ if ( ! knownCache ! ) {
202
+ knownCache = initKnownCache ( ) ;
203
+ }
182
204
183
205
const environmentApi : PythonExtension [ 'environments' ] = {
184
206
getEnvironmentVariables : ( resource ?: Resource ) => {
@@ -234,11 +256,9 @@ export function buildEnvironmentApi(
234
256
return resolveEnvironment ( path , discoveryApi ) ;
235
257
} ,
236
258
get known ( ) : Environment [ ] {
237
- sendApiTelemetry ( 'known' ) ;
238
- return discoveryApi
239
- . getEnvs ( )
240
- . filter ( ( e ) => filterUsingVSCodeContext ( e ) )
241
- . map ( ( e ) => convertEnvInfoAndGetReference ( e ) ) ;
259
+ // Do not send telemetry for "known", as this may be called 1000s of times so it can significant:
260
+ // sendApiTelemetry('known');
261
+ return knownCache . envs ;
242
262
} ,
243
263
async refreshEnvironments ( options ?: RefreshOptions ) {
244
264
if ( ! workspace . isTrusted ) {
@@ -351,7 +371,7 @@ export function convertEnvInfo(env: PythonEnvInfo): Environment {
351
371
return convertedEnv as Environment ;
352
372
}
353
373
354
- function convertEnvInfoAndGetReference ( env : PythonEnvInfo ) : Environment {
374
+ function updateReference ( env : PythonEnvInfo ) : Environment {
355
375
return getEnvReference ( convertEnvInfo ( env ) ) ;
356
376
}
357
377
0 commit comments