@@ -11,12 +11,13 @@ import { ExtHostContext, MainThreadTreeViewsShape, ExtHostTreeViewsShape, MainCo
1111import { IMessageService , Severity } from 'vs/platform/message/common/message' ;
1212import { ITreeViewDataProvider , ITreeItem , ICustomViewsService } from 'vs/workbench/common/views' ;
1313import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers' ;
14- import { assign } from 'vs/base/common/objects ' ;
14+ import { distinct } from 'vs/base/common/arrays ' ;
1515
1616@extHostNamedCustomer ( MainContext . MainThreadTreeViews )
1717export class MainThreadTreeViews extends Disposable implements MainThreadTreeViewsShape {
1818
1919 private _proxy : ExtHostTreeViewsShape ;
20+ private _dataProviders : Map < string , TreeViewDataProvider > = new Map < string , TreeViewDataProvider > ( ) ;
2021
2122 constructor (
2223 extHostContext : IExtHostContext ,
@@ -29,15 +30,21 @@ export class MainThreadTreeViews extends Disposable implements MainThreadTreeVie
2930
3031 $registerTreeViewDataProvider ( treeViewId : string ) : void {
3132 const dataProvider = this . _register ( new TreeViewDataProvider ( treeViewId , this . _proxy , this . messageService ) ) ;
33+ this . _dataProviders . set ( treeViewId , dataProvider ) ;
3234 this . viewsService . registerTreeViewDataProvider ( treeViewId , dataProvider ) ;
3335 }
3436
3537 $refresh ( treeViewId : string , itemsToRefresh : { [ treeItemHandle : string ] : ITreeItem } ) : void {
36- const treeViewer = this . viewsService . getTreeItemViewer ( treeViewId ) ;
37- if ( treeViewer && treeViewer . dataProvider ) {
38- ( < TreeViewDataProvider > treeViewer . dataProvider ) . refresh ( itemsToRefresh ) ;
38+ const dataProvider = this . _dataProviders . get ( treeViewId ) ;
39+ if ( dataProvider ) {
40+ dataProvider . refresh ( itemsToRefresh ) ;
3941 }
4042 }
43+
44+ dispose ( ) : void {
45+ this . _dataProviders . clear ( ) ;
46+ super . dispose ( ) ;
47+ }
4148}
4249
4350type TreeItemHandle = string ;
@@ -58,23 +65,13 @@ class TreeViewDataProvider implements ITreeViewDataProvider {
5865 ) {
5966 }
6067
61- getElements ( ) : TPromise < ITreeItem [ ] > {
62- return this . _proxy . $getElements ( this . treeViewId )
63- . then ( elements => {
64- return this . postGetElements ( elements ) ;
65- } , err => {
66- this . messageService . show ( Severity . Error , err ) ;
67- return [ ] ;
68- } ) ;
69- }
70-
71- getChildren ( treeItem : ITreeItem ) : TPromise < ITreeItem [ ] > {
72- if ( treeItem . children ) {
68+ getChildren ( treeItem ?: ITreeItem ) : TPromise < ITreeItem [ ] > {
69+ if ( treeItem && treeItem . children ) {
7370 return TPromise . as ( treeItem . children ) ;
7471 }
75- return this . _proxy . $getChildren ( this . treeViewId , treeItem . handle )
72+ return this . _proxy . $getChildren ( this . treeViewId , treeItem ? treeItem . handle : void 0 )
7673 . then ( children => {
77- return this . postGetElements ( children ) ;
74+ return this . postGetChildren ( children ) ;
7875 } , err => {
7976 this . messageService . show ( Severity . Error , err ) ;
8077 return [ ] ;
@@ -108,19 +105,12 @@ class TreeViewDataProvider implements ITreeViewDataProvider {
108105 }
109106 }
110107
111- private postGetElements ( elements : ITreeItem [ ] ) : ITreeItem [ ] {
108+ private postGetChildren ( elements : ITreeItem [ ] ) : ITreeItem [ ] {
112109 const result = [ ] ;
113110 if ( elements ) {
114111 for ( const element of elements ) {
115- const currentTreeItem = this . itemsMap . get ( element . handle ) ;
116- if ( currentTreeItem ) {
117- // Update the current item with new item
118- this . updateTreeItem ( currentTreeItem , element ) ;
119- } else {
120- this . itemsMap . set ( element . handle , element ) ;
121- }
122- // Always use the existing items
123- result . push ( this . itemsMap . get ( element . handle ) ) ;
112+ this . itemsMap . set ( element . handle , element ) ;
113+ result . push ( element ) ;
124114 }
125115 }
126116 return result ;
@@ -129,7 +119,10 @@ class TreeViewDataProvider implements ITreeViewDataProvider {
129119 private updateTreeItem ( current : ITreeItem , treeItem : ITreeItem ) : void {
130120 treeItem . children = treeItem . children ? treeItem . children : null ;
131121 if ( current ) {
132- assign ( current , treeItem ) ;
122+ const properties = distinct ( [ ...Object . keys ( current ) , ...Object . keys ( treeItem ) ] ) ;
123+ for ( const property of properties ) {
124+ current [ property ] = treeItem [ property ] ;
125+ }
133126 }
134127 }
135128
0 commit comments