Skip to content

Commit ae2e4de

Browse files
committed
1 parent 220bff2 commit ae2e4de

3 files changed

Lines changed: 37 additions & 27 deletions

File tree

src/vs/base/browser/ui/list/listView.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,18 @@ export class ListView<T> implements ISpliceable<T>, IDisposable {
169169
row: null
170170
}));
171171

172-
this.rangeMap.splice(start, deleteCount, ...inserted);
173-
const deleted = this.items.splice(start, deleteCount, ...inserted);
172+
let deleted: IItem<T>[];
173+
174+
// TODO@joao: improve this optimization to catch even more cases
175+
if (start === 0 && deleteCount >= this.items.length) {
176+
this.rangeMap = new RangeMap();
177+
this.rangeMap.splice(0, 0, inserted);
178+
this.items = inserted;
179+
deleted = [];
180+
} else {
181+
this.rangeMap.splice(start, deleteCount, inserted);
182+
deleted = this.items.splice(start, deleteCount, ...inserted);
183+
}
174184

175185
const delta = elements.length - deleteCount;
176186
const renderRange = this.getRenderRange(this.lastRenderTop, this.lastRenderHeight);

src/vs/base/browser/ui/list/rangeMap.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ export class RangeMap {
9292
private groups: IRangedGroup[] = [];
9393
private _size = 0;
9494

95-
splice(index: number, deleteCount: number, ...items: IItem[]): void {
95+
splice(index: number, deleteCount: number, items: IItem[] = []): void {
9696
const diff = items.length - deleteCount;
9797
const before = groupIntersect({ start: 0, end: index }, this.groups);
9898
const after = groupIntersect({ start: index + deleteCount, end: Number.POSITIVE_INFINITY }, this.groups)

src/vs/base/test/browser/ui/list/rangeMap.test.ts

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -156,52 +156,52 @@ suite('RangeMap', () => {
156156
const ten = { size: 10 };
157157

158158
test('length & count', () => {
159-
rangeMap.splice(0, 0, one);
159+
rangeMap.splice(0, 0, [one]);
160160
assert.equal(rangeMap.size, 1);
161161
assert.equal(rangeMap.count, 1);
162162
});
163163

164164
test('length & count #2', () => {
165-
rangeMap.splice(0, 0, one, one, one, one, one);
165+
rangeMap.splice(0, 0, [one, one, one, one, one]);
166166
assert.equal(rangeMap.size, 5);
167167
assert.equal(rangeMap.count, 5);
168168
});
169169

170170
test('length & count #3', () => {
171-
rangeMap.splice(0, 0, five);
171+
rangeMap.splice(0, 0, [five]);
172172
assert.equal(rangeMap.size, 5);
173173
assert.equal(rangeMap.count, 1);
174174
});
175175

176176
test('length & count #4', () => {
177-
rangeMap.splice(0, 0, five, five, five, five, five);
177+
rangeMap.splice(0, 0, [five, five, five, five, five]);
178178
assert.equal(rangeMap.size, 25);
179179
assert.equal(rangeMap.count, 5);
180180
});
181181

182182
test('insert', () => {
183-
rangeMap.splice(0, 0, five, five, five, five, five);
183+
rangeMap.splice(0, 0, [five, five, five, five, five]);
184184
assert.equal(rangeMap.size, 25);
185185
assert.equal(rangeMap.count, 5);
186186

187-
rangeMap.splice(0, 0, five, five, five, five, five);
187+
rangeMap.splice(0, 0, [five, five, five, five, five]);
188188
assert.equal(rangeMap.size, 50);
189189
assert.equal(rangeMap.count, 10);
190190

191-
rangeMap.splice(5, 0, ten, ten);
191+
rangeMap.splice(5, 0, [ten, ten]);
192192
assert.equal(rangeMap.size, 70);
193193
assert.equal(rangeMap.count, 12);
194194

195-
rangeMap.splice(12, 0, { size: 200 });
195+
rangeMap.splice(12, 0, [{ size: 200 }]);
196196
assert.equal(rangeMap.size, 270);
197197
assert.equal(rangeMap.count, 13);
198198
});
199199

200200
test('delete', () => {
201-
rangeMap.splice(0, 0, five, five, five, five, five,
201+
rangeMap.splice(0, 0, [five, five, five, five, five,
202202
five, five, five, five, five,
203203
five, five, five, five, five,
204-
five, five, five, five, five);
204+
five, five, five, five, five]);
205205
assert.equal(rangeMap.size, 100);
206206
assert.equal(rangeMap.count, 20);
207207

@@ -226,7 +226,7 @@ suite('RangeMap', () => {
226226
assert.equal(rangeMap.size, 0);
227227
assert.equal(rangeMap.count, 0);
228228

229-
rangeMap.splice(0, 0, one);
229+
rangeMap.splice(0, 0, [one]);
230230
assert.equal(rangeMap.size, 1);
231231
assert.equal(rangeMap.count, 1);
232232

@@ -236,29 +236,29 @@ suite('RangeMap', () => {
236236
});
237237

238238
test('insert & delete #2', () => {
239-
rangeMap.splice(0, 0, one, one, one, one, one,
240-
one, one, one, one, one);
239+
rangeMap.splice(0, 0, [one, one, one, one, one,
240+
one, one, one, one, one]);
241241
rangeMap.splice(2, 6);
242242
assert.equal(rangeMap.count, 4);
243243
assert.equal(rangeMap.size, 4);
244244
});
245245

246246
test('insert & delete #3', () => {
247-
rangeMap.splice(0, 0, one, one, one, one, one,
247+
rangeMap.splice(0, 0, [one, one, one, one, one,
248248
one, one, one, one, one,
249249
two, two, two, two, two,
250-
two, two, two, two, two);
250+
two, two, two, two, two]);
251251
rangeMap.splice(8, 4);
252252
assert.equal(rangeMap.count, 16);
253253
assert.equal(rangeMap.size, 24);
254254
});
255255

256256
test('insert & delete #3', () => {
257-
rangeMap.splice(0, 0, one, one, one, one, one,
257+
rangeMap.splice(0, 0, [one, one, one, one, one,
258258
one, one, one, one, one,
259259
two, two, two, two, two,
260-
two, two, two, two, two);
261-
rangeMap.splice(5, 0, three, three, three, three, three);
260+
two, two, two, two, two]);
261+
rangeMap.splice(5, 0, [three, three, three, three, three]);
262262
assert.equal(rangeMap.count, 25);
263263
assert.equal(rangeMap.size, 45);
264264

@@ -278,15 +278,15 @@ suite('RangeMap', () => {
278278
});
279279

280280
test('simple', () => {
281-
rangeMap.splice(0, 0, one);
281+
rangeMap.splice(0, 0, [one]);
282282
assert.equal(rangeMap.indexAt(0), 0);
283283
assert.equal(rangeMap.indexAt(1), 1);
284284
assert.equal(rangeMap.positionAt(0), 0);
285285
assert.equal(rangeMap.positionAt(1), -1);
286286
});
287287

288288
test('simple #2', () => {
289-
rangeMap.splice(0, 0, ten);
289+
rangeMap.splice(0, 0, [ten]);
290290
assert.equal(rangeMap.indexAt(0), 0);
291291
assert.equal(rangeMap.indexAt(5), 0);
292292
assert.equal(rangeMap.indexAt(9), 0);
@@ -296,15 +296,15 @@ suite('RangeMap', () => {
296296
});
297297

298298
test('insert', () => {
299-
rangeMap.splice(0, 0, one, one, one, one, one, one, one, one, one, one);
299+
rangeMap.splice(0, 0, [one, one, one, one, one, one, one, one, one, one]);
300300
assert.equal(rangeMap.indexAt(0), 0);
301301
assert.equal(rangeMap.indexAt(1), 1);
302302
assert.equal(rangeMap.indexAt(5), 5);
303303
assert.equal(rangeMap.indexAt(9), 9);
304304
assert.equal(rangeMap.indexAt(10), 10);
305305
assert.equal(rangeMap.indexAt(11), 10);
306306

307-
rangeMap.splice(10, 0, one, one, one, one, one, one, one, one, one, one);
307+
rangeMap.splice(10, 0, [one, one, one, one, one, one, one, one, one, one]);
308308
assert.equal(rangeMap.indexAt(10), 10);
309309
assert.equal(rangeMap.indexAt(19), 19);
310310
assert.equal(rangeMap.indexAt(20), 20);
@@ -316,7 +316,7 @@ suite('RangeMap', () => {
316316
});
317317

318318
test('delete', () => {
319-
rangeMap.splice(0, 0, one, one, one, one, one, one, one, one, one, one);
319+
rangeMap.splice(0, 0, [one, one, one, one, one, one, one, one, one, one]);
320320
rangeMap.splice(2, 6);
321321

322322
assert.equal(rangeMap.indexAt(0), 0);
@@ -331,7 +331,7 @@ suite('RangeMap', () => {
331331
});
332332

333333
test('delete #2', () => {
334-
rangeMap.splice(0, 0, ten, ten, ten, ten, ten, ten, ten, ten, ten, ten);
334+
rangeMap.splice(0, 0, [ten, ten, ten, ten, ten, ten, ten, ten, ten, ten]);
335335
rangeMap.splice(2, 6);
336336

337337
assert.equal(rangeMap.indexAt(0), 0);

0 commit comments

Comments
 (0)