@@ -12,7 +12,7 @@ import {
12
12
errToStr ,
13
13
} from "./api-helper"
14
14
import { Storage } from "./storage"
15
- import { getMemoryLogger , MemoryLogger } from "./memoryLogger"
15
+ import { getMemoryLogger } from "./memoryLogger"
16
16
17
17
export enum WorkspaceQuery {
18
18
Mine = "owner:me" ,
@@ -57,10 +57,21 @@ export class WorkspaceProvider implements vscode.TreeDataProvider<vscode.TreeIte
57
57
// Calling this while already refreshing or not visible is a no-op and will
58
58
// return immediately.
59
59
async fetchAndRefresh ( ) {
60
- if ( this . fetching || ! this . visible ) {
60
+ const logger = getMemoryLogger ( )
61
+
62
+ if ( this . fetching ) {
63
+ logger . debug ( `WorkspaceProvider(${ this . getWorkspacesQuery } ): Already fetching, ignoring refresh request` )
64
+ return
65
+ }
66
+
67
+ if ( ! this . visible ) {
68
+ logger . debug ( `WorkspaceProvider(${ this . getWorkspacesQuery } ): Not visible, ignoring refresh request` )
61
69
return
62
70
}
71
+
72
+ logger . info ( `WorkspaceProvider(${ this . getWorkspacesQuery } ): Starting workspace fetch` )
63
73
this . fetching = true
74
+ let fetchStart = Date . now ( )
64
75
65
76
// It is possible we called fetchAndRefresh() manually (through the button
66
77
// for example), in which case we might still have a pending refresh that
@@ -70,12 +81,17 @@ export class WorkspaceProvider implements vscode.TreeDataProvider<vscode.TreeIte
70
81
let hadError = false
71
82
try {
72
83
this . workspaces = await this . fetch ( )
84
+ logger . info (
85
+ `WorkspaceProvider(${ this . getWorkspacesQuery } ): Fetch completed in ${ Date . now ( ) - fetchStart } ms, found ${ this . workspaces . length } workspaces` ,
86
+ )
73
87
} catch ( error ) {
74
88
hadError = true
89
+ logger . error ( `WorkspaceProvider(${ this . getWorkspacesQuery } ): Fetch failed` , error )
75
90
this . workspaces = [ ]
76
91
}
77
92
78
93
this . fetching = false
94
+ logger . logMemoryUsage ( "WORKSPACE_PROVIDER_FETCH" )
79
95
80
96
this . refresh ( )
81
97
@@ -158,45 +174,83 @@ export class WorkspaceProvider implements vscode.TreeDataProvider<vscode.TreeIte
158
174
* If we have never fetched workspaces and are visible, fetch immediately.
159
175
*/
160
176
setVisibility ( visible : boolean ) {
177
+ const logger = getMemoryLogger ( )
178
+
179
+ if ( this . visible !== visible ) {
180
+ logger . info ( `WorkspaceProvider(${ this . getWorkspacesQuery } ): Visibility changed to ${ visible } ` )
181
+ }
182
+
161
183
this . visible = visible
184
+
162
185
if ( ! visible ) {
163
186
this . cancelPendingRefresh ( )
164
187
} else if ( ! this . workspaces ) {
188
+ logger . info ( `WorkspaceProvider(${ this . getWorkspacesQuery } ): Initial fetch required` )
165
189
this . fetchAndRefresh ( )
166
190
} else {
167
191
this . maybeScheduleRefresh ( )
168
192
}
169
193
}
170
194
171
195
private cancelPendingRefresh ( ) {
196
+ const logger = getMemoryLogger ( )
197
+
172
198
if ( this . timeout ) {
199
+ logger . debug ( `WorkspaceProvider(${ this . getWorkspacesQuery } ): Canceling pending refresh` )
173
200
clearTimeout ( this . timeout )
174
201
this . timeout = undefined
175
202
}
176
203
}
177
-
178
204
/**
179
205
* Schedule a refresh if one is not already scheduled or underway and a
180
206
* timeout length was provided.
181
207
*/
182
208
private maybeScheduleRefresh ( ) {
209
+ const logger = getMemoryLogger ( )
210
+
183
211
if ( this . timerSeconds && ! this . timeout && ! this . fetching ) {
212
+ logger . debug ( `WorkspaceProvider(${ this . getWorkspacesQuery } ): Scheduling refresh in ${ this . timerSeconds } seconds` )
213
+
184
214
this . timeout = setTimeout ( ( ) => {
215
+ logger . debug ( `WorkspaceProvider(${ this . getWorkspacesQuery } ): Executing scheduled refresh` )
185
216
this . fetchAndRefresh ( )
186
217
} , this . timerSeconds * 1000 )
187
218
}
188
219
}
189
-
190
220
private _onDidChangeTreeData : vscode . EventEmitter < vscode . TreeItem | undefined | null | void > =
191
221
new vscode . EventEmitter < vscode . TreeItem | undefined | null | void > ( )
192
222
readonly onDidChangeTreeData : vscode . Event < vscode . TreeItem | undefined | null | void > =
193
223
this . _onDidChangeTreeData . event
194
224
195
225
// refresh causes the tree to re-render. It does not fetch fresh workspaces.
196
226
refresh ( item : vscode . TreeItem | undefined | null | void ) : void {
227
+ const logger = getMemoryLogger ( )
228
+ logger . debug (
229
+ `WorkspaceProvider(${ this . getWorkspacesQuery } ): Refreshing tree view${ item ? " for specific item" : "" } ` ,
230
+ )
231
+
197
232
this . _onDidChangeTreeData . fire ( item )
198
233
}
199
234
235
+ dispose ( ) : void {
236
+ const logger = getMemoryLogger ( )
237
+ logger . info ( `WorkspaceProvider(${ this . getWorkspacesQuery } ): Disposing` )
238
+
239
+ // Cancel any pending refreshes
240
+ this . cancelPendingRefresh ( )
241
+
242
+ // Dispose all watchers
243
+ Object . keys ( this . agentWatchers ) . forEach ( ( id ) => {
244
+ logger . debug ( `WorkspaceProvider(${ this . getWorkspacesQuery } ): Disposing agent watcher ${ id } ` )
245
+ this . agentWatchers [ id ] . dispose ( )
246
+ } )
247
+
248
+ this . agentWatchers = { }
249
+ this . workspaces = undefined
250
+
251
+ logger . logMemoryUsage ( "WORKSPACE_PROVIDER_DISPOSE" )
252
+ }
253
+
200
254
async getTreeItem ( element : vscode . TreeItem ) : Promise < vscode . TreeItem > {
201
255
return element
202
256
}
0 commit comments