diff --git a/packages/markers/src/browser/problem/problem-composite-tree-node.ts b/packages/markers/src/browser/problem/problem-composite-tree-node.ts index a5b20be14516b..5cdd426d05bde 100644 --- a/packages/markers/src/browser/problem/problem-composite-tree-node.ts +++ b/packages/markers/src/browser/problem/problem-composite-tree-node.ts @@ -23,6 +23,11 @@ import { ProblemUtils } from './problem-utils'; export namespace ProblemCompositeTreeNode { + export interface Child { + node: MarkerInfoNode; + markers: Marker[]; + } + export function setSeverity(parent: MarkerInfoNode, markers: Marker[]): void { let maxSeverity: DiagnosticSeverity | undefined; markers.forEach(marker => { @@ -33,7 +38,7 @@ export namespace ProblemCompositeTreeNode { parent.severity = maxSeverity; }; - export function addChildren(parent: CompositeTreeNode, insertChildren: { node: MarkerInfoNode, markers: Marker[] }[]): void { + export function addChildren(parent: CompositeTreeNode, insertChildren: ProblemCompositeTreeNode.Child[]): void { for (const { node, markers } of insertChildren) { ProblemCompositeTreeNode.setSeverity(node, markers); } diff --git a/packages/markers/src/browser/problem/problem-tree-model.ts b/packages/markers/src/browser/problem/problem-tree-model.ts index 152feb7a33408..d4eab7184bd83 100644 --- a/packages/markers/src/browser/problem/problem-tree-model.ts +++ b/packages/markers/src/browser/problem/problem-tree-model.ts @@ -28,7 +28,8 @@ import debounce = require('@theia/core/shared/lodash.debounce'); @injectable() export class ProblemTree extends MarkerTree { - protected markers: { node: MarkerInfoNode, markers: Marker[] }[] = []; + + protected queuedMarkers = new Map(); constructor( @inject(ProblemManager) markerManager: ProblemManager, @@ -79,20 +80,28 @@ export class ProblemTree extends MarkerTree { } protected override insertNodeWithMarkers(node: MarkerInfoNode, markers: Marker[]): void { - this.markers.push({ node, markers }); + // Add the element to the queue. + // In case a diagnostics collection for the same file already exists, it will be replaced. + this.queuedMarkers.set(node.id, { node, markers }); this.doInsertNodesWithMarkers(); } protected doInsertNodesWithMarkers = debounce(() => { - ProblemCompositeTreeNode.addChildren(this.root as MarkerRootNode, this.markers); + const root = this.root; + // Sanity check; This should always be of type `MarkerRootNode` + if (!MarkerRootNode.is(root)) { + return; + } + const queuedItems = Array.from(this.queuedMarkers.values()); + ProblemCompositeTreeNode.addChildren(root, queuedItems); - for (const { node, markers } of this.markers) { + for (const { node, markers } of queuedItems) { const children = this.getMarkerNodes(node, markers); node.numberOfMarkers = markers.length; this.setChildren(node, children); } - this.markers.length = 0; + this.queuedMarkers.clear(); }, 50); }