@@ -9,9 +9,10 @@ import { Emitter, Event, EventBufferer } from 'vs/base/common/event';
99import { ISequence , Iterator } from 'vs/base/common/iterator' ;
1010import { ISpliceable } from 'vs/base/common/sequence' ;
1111
12- interface IMutableTreeNode < T , TFilterData > extends ITreeNode < T , TFilterData > {
13- readonly parent : IMutableTreeNode < T , TFilterData > | undefined ;
14- readonly children : IMutableTreeNode < T , TFilterData > [ ] ;
12+ // Exported for tests
13+ export interface IIndexTreeNode < T , TFilterData = void > extends ITreeNode < T , TFilterData > {
14+ readonly parent : IIndexTreeNode < T , TFilterData > | undefined ;
15+ readonly children : IIndexTreeNode < T , TFilterData > [ ] ;
1516 visibleChildrenCount : number ;
1617 visibleChildIndex : number ;
1718 collapsible : boolean ;
@@ -43,7 +44,7 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
4344
4445 readonly rootRef = [ ] ;
4546
46- private root : IMutableTreeNode < T , TFilterData > ;
47+ private root : IIndexTreeNode < T , TFilterData > ;
4748 private eventBufferer = new EventBufferer ( ) ;
4849
4950 private _onDidChangeCollapseState = new Emitter < ICollapseStateChangeEvent < T , TFilterData > > ( ) ;
@@ -109,7 +110,7 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
109110 }
110111 }
111112
112- const nodesToInsert : IMutableTreeNode < T , TFilterData > [ ] = [ ] ;
113+ const nodesToInsert : IIndexTreeNode < T , TFilterData > [ ] = [ ] ;
113114 let insertedVisibleChildrenCount = 0 ;
114115 let renderNodeCount = 0 ;
115116
@@ -234,7 +235,7 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
234235 return result ;
235236 }
236237
237- private _setListNodeCollapsed ( node : IMutableTreeNode < T , TFilterData > , listIndex : number , revealed : boolean , collapsed : boolean , recursive : boolean ) : boolean {
238+ private _setListNodeCollapsed ( node : IIndexTreeNode < T , TFilterData > , listIndex : number , revealed : boolean , collapsed : boolean , recursive : boolean ) : boolean {
238239 const result = this . _setNodeCollapsed ( node , collapsed , recursive , false ) ;
239240
240241 if ( ! revealed || ! node . visible ) {
@@ -249,7 +250,7 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
249250 return result ;
250251 }
251252
252- private _setNodeCollapsed ( node : IMutableTreeNode < T , TFilterData > , collapsed : boolean , recursive : boolean , deep : boolean ) : boolean {
253+ private _setNodeCollapsed ( node : IIndexTreeNode < T , TFilterData > , collapsed : boolean , recursive : boolean , deep : boolean ) : boolean {
253254 let result = node . collapsible && node . collapsed !== collapsed ;
254255
255256 if ( node . collapsible ) {
@@ -292,13 +293,13 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
292293
293294 private createTreeNode (
294295 treeElement : ITreeElement < T > ,
295- parent : IMutableTreeNode < T , TFilterData > ,
296+ parent : IIndexTreeNode < T , TFilterData > ,
296297 parentVisibility : TreeVisibility ,
297298 revealed : boolean ,
298299 treeListElements : ITreeNode < T , TFilterData > [ ] ,
299300 onDidCreateNode ?: ( node : ITreeNode < T , TFilterData > ) => void
300- ) : IMutableTreeNode < T , TFilterData > {
301- const node : IMutableTreeNode < T , TFilterData > = {
301+ ) : IIndexTreeNode < T , TFilterData > {
302+ const node : IIndexTreeNode < T , TFilterData > = {
302303 parent,
303304 element : treeElement . element ,
304305 children : [ ] ,
@@ -355,7 +356,7 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
355356 return node ;
356357 }
357358
358- private updateNodeAfterCollapseChange ( node : IMutableTreeNode < T , TFilterData > ) : ITreeNode < T , TFilterData > [ ] {
359+ private updateNodeAfterCollapseChange ( node : IIndexTreeNode < T , TFilterData > ) : ITreeNode < T , TFilterData > [ ] {
359360 const previousRenderNodeCount = node . renderNodeCount ;
360361 const result : ITreeNode < T , TFilterData > [ ] = [ ] ;
361362
@@ -365,7 +366,7 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
365366 return result ;
366367 }
367368
368- private _updateNodeAfterCollapseChange ( node : IMutableTreeNode < T , TFilterData > , result : ITreeNode < T , TFilterData > [ ] ) : number {
369+ private _updateNodeAfterCollapseChange ( node : IIndexTreeNode < T , TFilterData > , result : ITreeNode < T , TFilterData > [ ] ) : number {
369370 if ( node . visible === false ) {
370371 return 0 ;
371372 }
@@ -383,7 +384,7 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
383384 return node . renderNodeCount ;
384385 }
385386
386- private updateNodeAfterFilterChange ( node : IMutableTreeNode < T , TFilterData > ) : ITreeNode < T , TFilterData > [ ] {
387+ private updateNodeAfterFilterChange ( node : IIndexTreeNode < T , TFilterData > ) : ITreeNode < T , TFilterData > [ ] {
387388 const previousRenderNodeCount = node . renderNodeCount ;
388389 const result : ITreeNode < T , TFilterData > [ ] = [ ] ;
389390
@@ -393,7 +394,7 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
393394 return result ;
394395 }
395396
396- private _updateNodeAfterFilterChange ( node : IMutableTreeNode < T , TFilterData > , parentVisibility : TreeVisibility , result : ITreeNode < T , TFilterData > [ ] , revealed = true ) : boolean {
397+ private _updateNodeAfterFilterChange ( node : IIndexTreeNode < T , TFilterData > , parentVisibility : TreeVisibility , result : ITreeNode < T , TFilterData > [ ] , revealed = true ) : boolean {
397398 let visibility : TreeVisibility ;
398399
399400 if ( node !== this . root ) {
@@ -447,7 +448,7 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
447448 return node . visible ;
448449 }
449450
450- private _updateAncestorsRenderNodeCount ( node : IMutableTreeNode < T , TFilterData > | undefined , diff : number ) : void {
451+ private _updateAncestorsRenderNodeCount ( node : IIndexTreeNode < T , TFilterData > | undefined , diff : number ) : void {
451452 if ( diff === 0 ) {
452453 return ;
453454 }
@@ -459,7 +460,7 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
459460 }
460461 }
461462
462- private _filterNode ( node : IMutableTreeNode < T , TFilterData > , parentVisibility : TreeVisibility ) : TreeVisibility {
463+ private _filterNode ( node : IIndexTreeNode < T , TFilterData > , parentVisibility : TreeVisibility ) : TreeVisibility {
463464 const result = this . filter ? this . filter . filter ( node . element , parentVisibility ) : TreeVisibility . Visible ;
464465
465466 if ( typeof result === 'boolean' ) {
@@ -475,7 +476,7 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
475476 }
476477
477478 // cheap
478- private getTreeNode ( location : number [ ] , node : IMutableTreeNode < T , TFilterData > = this . root ) : IMutableTreeNode < T , TFilterData > {
479+ private getTreeNode ( location : number [ ] , node : IIndexTreeNode < T , TFilterData > = this . root ) : IIndexTreeNode < T , TFilterData > {
479480 if ( ! location || location . length === 0 ) {
480481 return node ;
481482 }
@@ -490,7 +491,7 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
490491 }
491492
492493 // expensive
493- private getTreeNodeWithListIndex ( location : number [ ] ) : { node : IMutableTreeNode < T , TFilterData > , listIndex : number , revealed : boolean , visible : boolean } {
494+ private getTreeNodeWithListIndex ( location : number [ ] ) : { node : IIndexTreeNode < T , TFilterData > , listIndex : number , revealed : boolean , visible : boolean } {
494495 if ( location . length === 0 ) {
495496 return { node : this . root , listIndex : - 1 , revealed : true , visible : false } ;
496497 }
@@ -507,7 +508,7 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
507508 return { node, listIndex, revealed, visible : visible && node . visible } ;
508509 }
509510
510- private getParentNodeWithListIndex ( location : number [ ] , node : IMutableTreeNode < T , TFilterData > = this . root , listIndex : number = 0 , revealed = true , visible = true ) : { parentNode : IMutableTreeNode < T , TFilterData > ; listIndex : number ; revealed : boolean ; visible : boolean ; } {
511+ private getParentNodeWithListIndex ( location : number [ ] , node : IIndexTreeNode < T , TFilterData > = this . root , listIndex : number = 0 , revealed = true , visible = true ) : { parentNode : IIndexTreeNode < T , TFilterData > ; listIndex : number ; revealed : boolean ; visible : boolean ; } {
511512 const [ index , ...rest ] = location ;
512513
513514 if ( index < 0 || index > node . children . length ) {
@@ -536,27 +537,24 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
536537 // TODO@joao perf!
537538 getNodeLocation ( node : ITreeNode < T , TFilterData > ) : number [ ] {
538539 const location : number [ ] = [ ] ;
540+ let indexTreeNode = node as IIndexTreeNode < T , TFilterData > ; // typing woes
539541
540- while ( node . parent ) {
541- location . push ( node . parent . children . indexOf ( node ) ) ;
542- node = node . parent ;
542+ while ( indexTreeNode . parent ) {
543+ location . push ( indexTreeNode . parent . children . indexOf ( indexTreeNode ) ) ;
544+ indexTreeNode = indexTreeNode . parent ;
543545 }
544546
545547 return location . reverse ( ) ;
546548 }
547549
548- getParentNodeLocation ( location : number [ ] ) : number [ ] {
549- if ( location . length <= 1 ) {
550+ getParentNodeLocation ( location : number [ ] ) : number [ ] | undefined {
551+ if ( location . length === 0 ) {
552+ return undefined ;
553+ } else if ( location . length === 1 ) {
550554 return [ ] ;
555+ } else {
556+ return tail2 ( location ) [ 0 ] ;
551557 }
552-
553- return tail2 ( location ) [ 0 ] ;
554- }
555-
556- getParentElement ( location : number [ ] ) : T {
557- const parentLocation = this . getParentNodeLocation ( location ) ;
558- const node = this . getTreeNode ( parentLocation ) ;
559- return node . element ;
560558 }
561559
562560 getFirstElementChild ( location : number [ ] ) : T | undefined {
0 commit comments