3
3
4
4
// eslint-disable-next-line max-classes-per-file
5
5
import { Uri } from 'vscode' ;
6
+ import { ILocatorClass } from '../../../apiTypes' ;
6
7
import { IDisposable } from '../../../common/types' ;
7
8
import { iterEmpty } from '../../../common/utils/async' ;
8
9
import { getURIFilter } from '../../../common/utils/misc' ;
9
10
import { Disposables } from '../../../common/utils/resourceLifecycle' ;
11
+ import { CustomLocator } from '../../converter' ;
10
12
import { PythonEnvInfo } from '../info' ;
11
- import { ILocator , IPythonEnvsIterator , PythonLocatorQuery } from '../locator' ;
13
+ import { BasicEnvInfo , ILocator , IPythonEnvsIterator , PythonLocatorQuery } from '../locator' ;
12
14
import { combineIterators , Locators } from '../locators' ;
13
15
import { LazyResourceBasedLocator } from './common/resourceBasedLocator' ;
14
16
15
17
/**
16
18
* A wrapper around all locators used by the extension.
17
19
*/
18
20
19
- export class ExtensionLocators < I = PythonEnvInfo > extends Locators < I > {
21
+ export class ExtensionLocators extends Locators < BasicEnvInfo > {
20
22
constructor (
21
23
// These are expected to be low-level locators (e.g. system).
22
- private readonly nonWorkspace : ILocator < I > [ ] ,
24
+ private nonWorkspace : ILocator < BasicEnvInfo > [ ] ,
23
25
// This is expected to be a locator wrapping any found in
24
26
// the workspace (i.e. WorkspaceLocators).
25
- private readonly workspace : ILocator < I > ,
27
+ private workspace : WorkspaceLocators ,
26
28
) {
27
29
super ( [ ...nonWorkspace , workspace ] ) ;
28
30
}
29
31
30
- public iterEnvs ( query ?: PythonLocatorQuery ) : IPythonEnvsIterator < I > {
31
- const iterators : IPythonEnvsIterator < I > [ ] = [ this . workspace . iterEnvs ( query ) ] ;
32
+ public iterEnvs ( query ?: PythonLocatorQuery ) : IPythonEnvsIterator < BasicEnvInfo > {
33
+ const iterators : IPythonEnvsIterator < BasicEnvInfo > [ ] = [ this . workspace . iterEnvs ( query ) ] ;
32
34
if ( ! query ?. searchLocations ?. doNotIncludeNonRooted ) {
33
35
iterators . push ( ...this . nonWorkspace . map ( ( loc ) => loc . iterEnvs ( query ) ) ) ;
34
36
}
35
37
return combineIterators ( iterators ) ;
36
38
}
39
+
40
+ public addNewLocator ( LocatorClass : ILocatorClass , isWorkspace : boolean ) : void {
41
+ if ( isWorkspace ) {
42
+ this . workspace . addNewLocator ( LocatorClass ) ;
43
+ }
44
+ if ( ! isWorkspace ) {
45
+ this . nonWorkspace = [ ...this . nonWorkspace , new CustomLocator ( new LocatorClass ( ) ) ] ;
46
+ }
47
+ }
37
48
}
38
49
type WorkspaceLocatorFactoryResult < I > = ILocator < I > & Partial < IDisposable > ;
39
50
type WorkspaceLocatorFactory < I = PythonEnvInfo > = ( root : Uri ) => WorkspaceLocatorFactoryResult < I > [ ] ;
@@ -52,12 +63,15 @@ type WatchRootsFunc = (args: WatchRootsArgs) => IDisposable;
52
63
* The factories are used to produce the locators for each workspace folder.
53
64
*/
54
65
55
- export class WorkspaceLocators < I = PythonEnvInfo > extends LazyResourceBasedLocator < I > {
56
- private readonly locators : Record < RootURI , [ ILocator < I > , IDisposable ] > = { } ;
66
+ export class WorkspaceLocators extends LazyResourceBasedLocator < BasicEnvInfo > {
67
+ private readonly locators : Record < RootURI , [ Locators < BasicEnvInfo > , IDisposable ] > = { } ;
57
68
58
69
private readonly roots : Record < RootURI , Uri > = { } ;
59
70
60
- constructor ( private readonly watchRoots : WatchRootsFunc , private readonly factories : WorkspaceLocatorFactory < I > [ ] ) {
71
+ constructor (
72
+ private readonly watchRoots : WatchRootsFunc ,
73
+ private readonly factory : WorkspaceLocatorFactory < BasicEnvInfo > ,
74
+ ) {
61
75
super ( ) ;
62
76
}
63
77
@@ -69,7 +83,7 @@ export class WorkspaceLocators<I = PythonEnvInfo> extends LazyResourceBasedLocat
69
83
roots . forEach ( ( root ) => this . removeRoot ( root ) ) ;
70
84
}
71
85
72
- protected doIterEnvs ( query ?: PythonLocatorQuery ) : IPythonEnvsIterator < I > {
86
+ protected doIterEnvs ( query ?: PythonLocatorQuery ) : IPythonEnvsIterator < BasicEnvInfo > {
73
87
const iterators = Object . keys ( this . locators ) . map ( ( key ) => {
74
88
if ( query ?. searchLocations !== undefined ) {
75
89
const root = this . roots [ key ] ;
@@ -78,7 +92,7 @@ export class WorkspaceLocators<I = PythonEnvInfo> extends LazyResourceBasedLocat
78
92
// Ignore any requests for global envs.
79
93
if ( ! query . searchLocations . roots . some ( filter ) ) {
80
94
// This workspace folder did not match the query, so skip it!
81
- return iterEmpty < I > ( ) ;
95
+ return iterEmpty < BasicEnvInfo > ( ) ;
82
96
}
83
97
}
84
98
// The query matches or was not location-specific.
@@ -107,15 +121,13 @@ export class WorkspaceLocators<I = PythonEnvInfo> extends LazyResourceBasedLocat
107
121
108
122
private addRoot ( root : Uri ) : void {
109
123
// Create the root's locator, wrapping each factory-generated locator.
110
- const locators : ILocator < I > [ ] = [ ] ;
124
+ const locators : ILocator < BasicEnvInfo > [ ] = [ ] ;
111
125
const disposables = new Disposables ( ) ;
112
- this . factories . forEach ( ( create ) => {
113
- create ( root ) . forEach ( ( loc ) => {
114
- locators . push ( loc ) ;
115
- if ( loc . dispose !== undefined ) {
116
- disposables . push ( loc as IDisposable ) ;
117
- }
118
- } ) ;
126
+ this . factory ( root ) . forEach ( ( loc ) => {
127
+ locators . push ( loc ) ;
128
+ if ( loc . dispose !== undefined ) {
129
+ disposables . push ( loc as IDisposable ) ;
130
+ }
119
131
} ) ;
120
132
const locator = new Locators ( locators ) ;
121
133
// Cache it.
@@ -133,6 +145,16 @@ export class WorkspaceLocators<I = PythonEnvInfo> extends LazyResourceBasedLocat
133
145
) ;
134
146
}
135
147
148
+ public addNewLocator ( LocatorClass : ILocatorClass ) : void {
149
+ Object . keys ( this . roots ) . forEach ( ( key ) => {
150
+ const root = this . roots [ key ] ;
151
+ const newLocator = new LocatorClass ( root . fsPath ) ;
152
+ const convertedLocator : ILocator < BasicEnvInfo > = new CustomLocator ( newLocator ) ;
153
+ const [ locators ] = this . locators [ key ] ;
154
+ locators . addLocator ( convertedLocator ) ;
155
+ } ) ;
156
+ }
157
+
136
158
private removeRoot ( root : Uri ) : void {
137
159
const key = root . toString ( ) ;
138
160
const found = this . locators [ key ] ;
0 commit comments