diff --git a/src/vs/base/browser/ui/list/listView.ts b/src/vs/base/browser/ui/list/listView.ts index 2c8e3bf772ed87e26e3485dc1aec489d845cb1ee..68c626750080fa1a8e0c470598aeca824551dad0 100644 --- a/src/vs/base/browser/ui/list/listView.ts +++ b/src/vs/base/browser/ui/list/listView.ts @@ -70,6 +70,7 @@ export class ListView implements ISpliceable, IDisposable { private gesture: Gesture; private rowsContainer: HTMLElement; private scrollableElement: ScrollableElement; + private splicing = false; private disposables: IDisposable[]; constructor( @@ -121,6 +122,20 @@ export class ListView implements ISpliceable, IDisposable { } splice(start: number, deleteCount: number, elements: T[] = []): T[] { + if (this.splicing) { + throw new Error('Can\'t run recursive splices.'); + } + + this.splicing = true; + + try { + return this._splice(start, deleteCount, elements); + } finally { + this.splicing = false; + } + } + + private _splice(start: number, deleteCount: number, elements: T[] = []): T[] { const previousRenderRange = this.getRenderRange(this.lastRenderTop, this.lastRenderHeight); const deleteRange = { start, end: start + deleteCount }; const removeRange = intersect(previousRenderRange, deleteRange);