Skip to content

Commit

Permalink
Revert "debt/es6 - make LinkedMap a ES6 map"
Browse files Browse the repository at this point in the history
This reverts commit fb19601.

That commit causes a hard freeze in tasks. Reverting for now.
  • Loading branch information
alexr00 committed May 7, 2020
1 parent 5fb930d commit d487078
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 70 deletions.
63 changes: 29 additions & 34 deletions src/vs/base/common/map.ts
Original file line number Diff line number Diff line change
Expand Up @@ -580,9 +580,7 @@ export const enum Touch {
AsNew = 2
}

export class LinkedMap<K, V> implements Map<K, V>{

readonly [Symbol.toStringTag] = 'LinkedMap';
export class LinkedMap<K, V> {

private _map: Map<K, Item<K, V>>;
private _head: Item<K, V> | undefined;
Expand Down Expand Up @@ -634,7 +632,7 @@ export class LinkedMap<K, V> implements Map<K, V>{
return item.value;
}

set(key: K, value: V, touch: Touch = Touch.None): this {
set(key: K, value: V, touch: Touch = Touch.None): void {
let item = this._map.get(key);
if (item) {
item.value = value;
Expand All @@ -660,7 +658,6 @@ export class LinkedMap<K, V> implements Map<K, V>{
this._map.set(key, item);
this._size++;
}
return this;
}

delete(key: K): boolean {
Expand Down Expand Up @@ -704,13 +701,34 @@ export class LinkedMap<K, V> implements Map<K, V>{
}
}

keys(): IterableIterator<K> {
values(): V[] {
const result: V[] = [];
let current = this._head;
while (current) {
result.push(current.value);
current = current.next;
}
return result;
}

keys(): K[] {
const result: K[] = [];
let current = this._head;
while (current) {
result.push(current.key);
current = current.next;
}
return result;
}

/* VS Code / Monaco editor runs on es5 which has no Symbol.iterator
keys(): IterableIterator<K> {
const current = this._head;
const iterator: IterableIterator<K> = {
[Symbol.iterator]() {
return iterator;
},
next(): IteratorResult<K> {
next():IteratorResult<K> {
if (current) {
const result = { value: current.key, done: false };
current = current.next;
Expand All @@ -724,12 +742,12 @@ export class LinkedMap<K, V> implements Map<K, V>{
}
values(): IterableIterator<V> {
let current = this._head;
const current = this._head;
const iterator: IterableIterator<V> = {
[Symbol.iterator]() {
return iterator;
},
next(): IteratorResult<V> {
next():IteratorResult<V> {
if (current) {
const result = { value: current.value, done: false };
current = current.next;
Expand All @@ -741,29 +759,7 @@ export class LinkedMap<K, V> implements Map<K, V>{
};
return iterator;
}

entries(): IterableIterator<[K, V]> {
let current = this._head;
const iterator: IterableIterator<[K, V]> = {
[Symbol.iterator]() {
return iterator;
},
next(): IteratorResult<[K, V]> {
if (current) {
const result: IteratorResult<[K, V]> = { value: [current.key, current.value], done: false };
current = current.next;
return result;
} else {
return { value: undefined, done: true };
}
}
};
return iterator;
}

[Symbol.iterator](): IterableIterator<[K, V]> {
return this.entries();
}
*/

protected trimOld(newSize: number) {
if (newSize >= this.size) {
Expand Down Expand Up @@ -965,10 +961,9 @@ export class LRUCache<K, V> extends LinkedMap<K, V> {
return super.get(key, Touch.None);
}

set(key: K, value: V): this {
set(key: K, value: V): void {
super.set(key, value, Touch.AsNew);
this.checkTrim();
return this;
}

private checkTrim() {
Expand Down
60 changes: 29 additions & 31 deletions src/vs/base/test/common/map.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ suite('Map', () => {
let map = new LinkedMap<string, string>();
map.set('ak', 'av');
map.set('bk', 'bv');
assert.deepStrictEqual([...map.keys()], ['ak', 'bk']);
assert.deepStrictEqual([...map.values()], ['av', 'bv']);
assert.deepStrictEqual(map.keys(), ['ak', 'bk']);
assert.deepStrictEqual(map.values(), ['av', 'bv']);
assert.equal(map.first, 'av');
assert.equal(map.last, 'bv');
});
Expand All @@ -23,34 +23,34 @@ suite('Map', () => {
let map = new LinkedMap<string, string>();
map.set('ak', 'av');
map.set('ak', 'av', Touch.AsOld);
assert.deepStrictEqual([...map.keys()], ['ak']);
assert.deepStrictEqual([...map.values()], ['av']);
assert.deepStrictEqual(map.keys(), ['ak']);
assert.deepStrictEqual(map.values(), ['av']);
});

test('LinkedMap - Touch New one', () => {
let map = new LinkedMap<string, string>();
map.set('ak', 'av');
map.set('ak', 'av', Touch.AsNew);
assert.deepStrictEqual([...map.keys()], ['ak']);
assert.deepStrictEqual([...map.values()], ['av']);
assert.deepStrictEqual(map.keys(), ['ak']);
assert.deepStrictEqual(map.values(), ['av']);
});

test('LinkedMap - Touch Old two', () => {
let map = new LinkedMap<string, string>();
map.set('ak', 'av');
map.set('bk', 'bv');
map.set('bk', 'bv', Touch.AsOld);
assert.deepStrictEqual([...map.keys()], ['bk', 'ak']);
assert.deepStrictEqual([...map.values()], ['bv', 'av']);
assert.deepStrictEqual(map.keys(), ['bk', 'ak']);
assert.deepStrictEqual(map.values(), ['bv', 'av']);
});

test('LinkedMap - Touch New two', () => {
let map = new LinkedMap<string, string>();
map.set('ak', 'av');
map.set('bk', 'bv');
map.set('ak', 'av', Touch.AsNew);
assert.deepStrictEqual([...map.keys()], ['bk', 'ak']);
assert.deepStrictEqual([...map.values()], ['bv', 'av']);
assert.deepStrictEqual(map.keys(), ['bk', 'ak']);
assert.deepStrictEqual(map.values(), ['bv', 'av']);
});

test('LinkedMap - Touch Old from middle', () => {
Expand All @@ -59,8 +59,8 @@ suite('Map', () => {
map.set('bk', 'bv');
map.set('ck', 'cv');
map.set('bk', 'bv', Touch.AsOld);
assert.deepStrictEqual([...map.keys()], ['bk', 'ak', 'ck']);
assert.deepStrictEqual([...map.values()], ['bv', 'av', 'cv']);
assert.deepStrictEqual(map.keys(), ['bk', 'ak', 'ck']);
assert.deepStrictEqual(map.values(), ['bv', 'av', 'cv']);
});

test('LinkedMap - Touch New from middle', () => {
Expand All @@ -69,8 +69,8 @@ suite('Map', () => {
map.set('bk', 'bv');
map.set('ck', 'cv');
map.set('bk', 'bv', Touch.AsNew);
assert.deepStrictEqual([...map.keys()], ['ak', 'ck', 'bk']);
assert.deepStrictEqual([...map.values()], ['av', 'cv', 'bv']);
assert.deepStrictEqual(map.keys(), ['ak', 'ck', 'bk']);
assert.deepStrictEqual(map.values(), ['av', 'cv', 'bv']);
});

test('LinkedMap - basics', function () {
Expand Down Expand Up @@ -136,27 +136,25 @@ suite('Map', () => {
assert.strictEqual(cache.size, 5);
cache.set(6, 6);
assert.strictEqual(cache.size, 5);
assert.deepStrictEqual([...cache.keys()], [2, 3, 4, 5, 6]);
assert.deepStrictEqual(cache.keys(), [2, 3, 4, 5, 6]);
cache.set(7, 7);
assert.strictEqual(cache.size, 5);
assert.deepStrictEqual([...cache.keys()], [3, 4, 5, 6, 7]);
assert.deepStrictEqual(cache.keys(), [3, 4, 5, 6, 7]);
let values: number[] = [];
[3, 4, 5, 6, 7].forEach(key => values.push(cache.get(key)!));
assert.deepStrictEqual(values, [3, 4, 5, 6, 7]);

assert.deepEqual([...cache.entries()], [[3, 3], [4, 4], [5, 5], [6, 6], [7, 7]]);
});

test('LinkedMap - LRU Cache get', () => {
const cache = new LRUCache<number, number>(5);

[1, 2, 3, 4, 5].forEach(value => cache.set(value, value));
assert.strictEqual(cache.size, 5);
assert.deepStrictEqual([...cache.keys()], [1, 2, 3, 4, 5]);
assert.deepStrictEqual(cache.keys(), [1, 2, 3, 4, 5]);
cache.get(3);
assert.deepStrictEqual([...cache.keys()], [1, 2, 4, 5, 3]);
assert.deepStrictEqual(cache.keys(), [1, 2, 4, 5, 3]);
cache.peek(4);
assert.deepStrictEqual([...cache.keys()], [1, 2, 4, 5, 3]);
assert.deepStrictEqual(cache.keys(), [1, 2, 4, 5, 3]);
let values: number[] = [];
[1, 2, 3, 4, 5].forEach(key => values.push(cache.get(key)!));
assert.deepStrictEqual(values, [1, 2, 3, 4, 5]);
Expand All @@ -171,7 +169,7 @@ suite('Map', () => {
assert.strictEqual(cache.size, 10);
cache.limit = 5;
assert.strictEqual(cache.size, 5);
assert.deepStrictEqual([...cache.keys()], [6, 7, 8, 9, 10]);
assert.deepStrictEqual(cache.keys(), [6, 7, 8, 9, 10]);
cache.limit = 20;
assert.strictEqual(cache.size, 5);
for (let i = 11; i <= 20; i++) {
Expand All @@ -183,7 +181,7 @@ suite('Map', () => {
values.push(cache.get(i)!);
assert.strictEqual(cache.get(i), i);
}
assert.deepStrictEqual([...cache.values()], values);
assert.deepStrictEqual(cache.values(), values);
});

test('LinkedMap - LRU Cache limit with ratio', () => {
Expand All @@ -195,11 +193,11 @@ suite('Map', () => {
assert.strictEqual(cache.size, 10);
cache.set(11, 11);
assert.strictEqual(cache.size, 5);
assert.deepStrictEqual([...cache.keys()], [7, 8, 9, 10, 11]);
assert.deepStrictEqual(cache.keys(), [7, 8, 9, 10, 11]);
let values: number[] = [];
[...cache.keys()].forEach(key => values.push(cache.get(key)!));
cache.keys().forEach(key => values.push(cache.get(key)!));
assert.deepStrictEqual(values, [7, 8, 9, 10, 11]);
assert.deepStrictEqual([...cache.values()], values);
assert.deepStrictEqual(cache.values(), values);
});

test('LinkedMap - toJSON / fromJSON', () => {
Expand Down Expand Up @@ -239,7 +237,7 @@ suite('Map', () => {
map.delete('1');
assert.equal(map.get('1'), undefined);
assert.equal(map.size, 0);
assert.equal([...map.keys()].length, 0);
assert.equal(map.keys().length, 0);
});

test('LinkedMap - delete Head', function () {
Expand All @@ -253,8 +251,8 @@ suite('Map', () => {
map.delete('1');
assert.equal(map.get('2'), 2);
assert.equal(map.size, 1);
assert.equal([...map.keys()].length, 1);
assert.equal([...map.keys()][0], 2);
assert.equal(map.keys().length, 1);
assert.equal(map.keys()[0], 2);
});

test('LinkedMap - delete Tail', function () {
Expand All @@ -268,8 +266,8 @@ suite('Map', () => {
map.delete('2');
assert.equal(map.get('1'), 1);
assert.equal(map.size, 1);
assert.equal([...map.keys()].length, 1);
assert.equal([...map.keys()][0], 1);
assert.equal(map.keys().length, 1);
assert.equal(map.keys()[0], 1);
});


Expand Down
6 changes: 3 additions & 3 deletions src/vs/workbench/browser/parts/editor/editorsObserver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ export class EditorsObserver extends Disposable {
}

get editors(): IEditorIdentifier[] {
return [...this.mostRecentEditorsMap.values()];
return this.mostRecentEditorsMap.values();
}

hasEditor(resource: URI): boolean {
Expand Down Expand Up @@ -283,7 +283,7 @@ export class EditorsObserver extends Disposable {

// Across all editor groups
else {
await this.doEnsureOpenedEditorsLimit(limit, [...this.mostRecentEditorsMap.values()], exclude);
await this.doEnsureOpenedEditorsLimit(limit, this.mostRecentEditorsMap.values(), exclude);
}
}

Expand Down Expand Up @@ -346,7 +346,7 @@ export class EditorsObserver extends Disposable {
private serialize(): ISerializedEditorsList {
const registry = Registry.as<IEditorInputFactoryRegistry>(Extensions.EditorInputFactories);

const entries = [...this.mostRecentEditorsMap.values()];
const entries = this.mostRecentEditorsMap.values();
const mapGroupToSerializableEditorsOfGroup = new Map<IEditorGroup, IEditorInput[]>();

return {
Expand Down
4 changes: 2 additions & 2 deletions src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -791,7 +791,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
if (quickOpenHistoryLimit === 0) {
return;
}
let keys = [...this._recentlyUsedTasks.keys()];
let keys = this._recentlyUsedTasks.keys();
if (keys.length > quickOpenHistoryLimit) {
keys = keys.slice(0, quickOpenHistoryLimit);
}
Expand Down Expand Up @@ -2325,7 +2325,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
taskMap[key] = task;
}
});
const reversed = [...recentlyUsedTasks.keys()].reverse();
const reversed = recentlyUsedTasks.keys().reverse();
for (const key in reversed) {
let task = taskMap[key];
if (task) {
Expand Down

0 comments on commit d487078

Please sign in to comment.