@@ -28,7 +28,8 @@ import debounce = require('@theia/core/shared/lodash.debounce');
28
28
29
29
@injectable ( )
30
30
export class ProblemTree extends MarkerTree < Diagnostic > {
31
- protected markers : { node : MarkerInfoNode , markers : Marker < Diagnostic > [ ] } [ ] = [ ] ;
31
+
32
+ protected queuedMarkers = new Map < string , ProblemCompositeTreeNode . Child > ( ) ;
32
33
33
34
constructor (
34
35
@inject ( ProblemManager ) markerManager : ProblemManager ,
@@ -79,20 +80,28 @@ export class ProblemTree extends MarkerTree<Diagnostic> {
79
80
}
80
81
81
82
protected override insertNodeWithMarkers ( node : MarkerInfoNode , markers : Marker < Diagnostic > [ ] ) : void {
82
- this . markers . push ( { node, markers } ) ;
83
+ // Add the element to the queue.
84
+ // In case a diagnostics collection for the same file already exists, it will be replaced.
85
+ this . queuedMarkers . set ( node . id , { node, markers } ) ;
83
86
this . doInsertNodesWithMarkers ( ) ;
84
87
}
85
88
86
89
protected doInsertNodesWithMarkers = debounce ( ( ) => {
87
- ProblemCompositeTreeNode . addChildren ( this . root as MarkerRootNode , this . markers ) ;
90
+ const root = this . root ;
91
+ // Sanity check; This should always be of type `MarkerRootNode`
92
+ if ( ! MarkerRootNode . is ( root ) ) {
93
+ return ;
94
+ }
95
+ const queuedItems = Array . from ( this . queuedMarkers . values ( ) ) ;
96
+ ProblemCompositeTreeNode . addChildren ( root , queuedItems ) ;
88
97
89
- for ( const { node, markers } of this . markers ) {
98
+ for ( const { node, markers } of queuedItems ) {
90
99
const children = this . getMarkerNodes ( node , markers ) ;
91
100
node . numberOfMarkers = markers . length ;
92
101
this . setChildren ( node , children ) ;
93
102
}
94
103
95
- this . markers . length = 0 ;
104
+ this . queuedMarkers . clear ( ) ;
96
105
} , 50 ) ;
97
106
}
98
107
0 commit comments