@@ -10,11 +10,17 @@ import { OpenMigrationFileCommand } from '../commands/OpenMigrationFileCommand';
10
10
import type { Logger } from '../util/Logger' ;
11
11
import { getProjectsConfig } from '../config/config' ;
12
12
import { ProjectFilesProvider } from '../solution/ProjectFilesProvider' ;
13
+ import { TreeItemCache } from './TreeItemCache' ;
14
+ import { clearTreeCache } from './treeCache' ;
15
+
16
+ export const treeDataProviderCache = new TreeItemCache < ProjectTreeItem [ ] > ( ) ;
13
17
14
18
export class TreeDataProvider
15
19
extends Disposable
16
20
implements vscode . TreeDataProvider < vscode . TreeItem >
17
21
{
22
+ private readonly cacheId : string ;
23
+
18
24
private _onDidChangeTreeData : vscode . EventEmitter <
19
25
TreeItem | undefined | null | void
20
26
> = new vscode . EventEmitter < TreeItem | undefined | null | void > ( ) ;
@@ -28,14 +34,19 @@ export class TreeDataProvider
28
34
private readonly cli : CLI ,
29
35
) {
30
36
super ( ) ;
37
+ this . cacheId = 'TreeDataProvider' ;
31
38
const view = vscode . window . createTreeView ( `${ EXTENSION_NAMESPACE } Tree` , {
32
39
treeDataProvider : this ,
33
40
} ) ;
34
41
view . onDidChangeSelection ( this . handleTreeItemSelection . bind ( this ) ) ;
35
42
this . subscriptions . push ( view ) ;
36
43
37
44
var onDidChangeConfiguration = vscode . workspace . onDidChangeConfiguration (
38
- ( ) => this . refresh ( ) ,
45
+ e => {
46
+ if ( e . affectsConfiguration ( EXTENSION_NAMESPACE ) ) {
47
+ this . refresh ( ) ;
48
+ }
49
+ } ,
39
50
) ;
40
51
this . subscriptions . push ( onDidChangeConfiguration ) ;
41
52
}
@@ -55,6 +66,7 @@ export class TreeDataProvider
55
66
}
56
67
57
68
public refresh ( ) : void {
69
+ clearTreeCache ( ) ;
58
70
this . _onDidChangeTreeData . fire ( ) ;
59
71
}
60
72
@@ -66,15 +78,24 @@ export class TreeDataProvider
66
78
if ( element ) {
67
79
return element . getChildren ( ) ;
68
80
} else {
81
+ const cachedChildren = treeDataProviderCache . get ( this . cacheId ) ;
82
+
83
+ if ( cachedChildren ) {
84
+ return cachedChildren ;
85
+ }
86
+
69
87
const { project } = getProjectsConfig ( ) ;
70
88
const { projectFiles } = await ProjectFilesProvider . getProjectFiles ( ) ;
71
89
72
- return projectFiles
90
+ const projectItems = projectFiles
73
91
. filter ( projectFile => ! project || projectFile . name === project )
74
92
. map (
75
93
projectFile =>
76
94
new ProjectTreeItem ( this . logger , projectFile , this . cli ) ,
77
95
) ;
96
+
97
+ treeDataProviderCache . set ( this . cacheId , projectItems ) ;
98
+ return projectItems ;
78
99
}
79
100
}
80
101
}
0 commit comments