From 030d26e61b040a274a74f49750ec891298f0dbd7 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 23 Aug 2018 11:36:35 +0200 Subject: [PATCH] tweak node update/resue logic and add more info when errors happen, #56634, #57005, #57006 --- .../ui/breadcrumbs/breadcrumbsWidget.ts | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget.ts b/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget.ts index 2ba476b8464..6028ef92c35 100644 --- a/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget.ts +++ b/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget.ts @@ -244,11 +244,20 @@ export class BreadcrumbsWidget { } setItems(items: BreadcrumbsItem[]): void { - let prefix = commonPrefixLength(this._items, items, (a, b) => a.equals(b)); - let removed = this._items.splice(prefix, this._items.length - prefix, ...items.slice(prefix)); - this._render(prefix); - dispose(removed); - this._focus(-1, undefined); + let prefix: number; + let removed: BreadcrumbsItem[]; + try { + prefix = commonPrefixLength(this._items, items, (a, b) => a.equals(b)); + removed = this._items.splice(prefix, this._items.length - prefix, ...items.slice(prefix)); + this._render(prefix); + dispose(removed); + this._focus(-1, undefined); + } catch (e) { + let newError = new Error(`BreadcrumbsItem#setItems: newItems: ${items.length}, prefix: ${prefix}, removed: ${removed.length}`); + newError.name = e.name; + newError.stack = e.stack; + throw newError; + } } private _render(start: number): void { @@ -258,11 +267,11 @@ export class BreadcrumbsWidget { this._renderItem(item, node); } // case a: more nodes -> remove them - for (; start < this._nodes.length; start++) { - this._nodes[start].remove(); - this._freeNodes.push(this._nodes[start]); + while (start < this._nodes.length) { + const free = this._nodes.pop(); + this._freeNodes.push(free); + free.remove(); } - this._nodes.length = this._items.length; // case b: more items -> render them for (; start < this._items.length; start++) { @@ -270,7 +279,7 @@ export class BreadcrumbsWidget { let node = this._freeNodes.length > 0 ? this._freeNodes.pop() : document.createElement('div'); this._renderItem(item, node); this._domNode.appendChild(node); - this._nodes[start] = node; + this._nodes.push(node); } this.layout(undefined); }