@@ -10,11 +10,17 @@ import { OpenMigrationFileCommand } from '../commands/OpenMigrationFileCommand';
1010import type { Logger } from '../util/Logger' ;
1111import { getProjectsConfig } from '../config/config' ;
1212import { ProjectFilesProvider } from '../solution/ProjectFilesProvider' ;
13+ import { TreeItemCache } from './TreeItemCache' ;
14+ import { clearTreeCache } from './treeCache' ;
15+
16+ export const treeDataProviderCache = new TreeItemCache < ProjectTreeItem [ ] > ( ) ;
1317
1418export class TreeDataProvider
1519 extends Disposable
1620 implements vscode . TreeDataProvider < vscode . TreeItem >
1721{
22+ private readonly cacheId : string ;
23+
1824 private _onDidChangeTreeData : vscode . EventEmitter <
1925 TreeItem | undefined | null | void
2026 > = new vscode . EventEmitter < TreeItem | undefined | null | void > ( ) ;
@@ -28,14 +34,19 @@ export class TreeDataProvider
2834 private readonly cli : CLI ,
2935 ) {
3036 super ( ) ;
37+ this . cacheId = 'TreeDataProvider' ;
3138 const view = vscode . window . createTreeView ( `${ EXTENSION_NAMESPACE } Tree` , {
3239 treeDataProvider : this ,
3340 } ) ;
3441 view . onDidChangeSelection ( this . handleTreeItemSelection . bind ( this ) ) ;
3542 this . subscriptions . push ( view ) ;
3643
3744 var onDidChangeConfiguration = vscode . workspace . onDidChangeConfiguration (
38- ( ) => this . refresh ( ) ,
45+ e => {
46+ if ( e . affectsConfiguration ( EXTENSION_NAMESPACE ) ) {
47+ this . refresh ( ) ;
48+ }
49+ } ,
3950 ) ;
4051 this . subscriptions . push ( onDidChangeConfiguration ) ;
4152 }
@@ -55,6 +66,7 @@ export class TreeDataProvider
5566 }
5667
5768 public refresh ( ) : void {
69+ clearTreeCache ( ) ;
5870 this . _onDidChangeTreeData . fire ( ) ;
5971 }
6072
@@ -66,15 +78,24 @@ export class TreeDataProvider
6678 if ( element ) {
6779 return element . getChildren ( ) ;
6880 } else {
81+ const cachedChildren = treeDataProviderCache . get ( this . cacheId ) ;
82+
83+ if ( cachedChildren ) {
84+ return cachedChildren ;
85+ }
86+
6987 const { project } = getProjectsConfig ( ) ;
7088 const { projectFiles } = await ProjectFilesProvider . getProjectFiles ( ) ;
7189
72- return projectFiles
90+ const projectItems = projectFiles
7391 . filter ( projectFile => ! project || projectFile . name === project )
7492 . map (
7593 projectFile =>
7694 new ProjectTreeItem ( this . logger , projectFile , this . cli ) ,
7795 ) ;
96+
97+ treeDataProviderCache . set ( this . cacheId , projectItems ) ;
98+ return projectItems ;
7899 }
79100 }
80101}
0 commit comments