diff --git a/src/vs/base/common/map.ts b/src/vs/base/common/map.ts index e9b7a4c065ff2f..6f79e1e81402b0 100644 --- a/src/vs/base/common/map.ts +++ b/src/vs/base/common/map.ts @@ -770,6 +770,9 @@ export class BidirectionalMap { } set(key: K, value: V): void { + if (this._m1.has(key)) { + this._m2.delete(this._m1.get(key)!); + } this._m1.set(key, value); this._m2.set(value, key); } diff --git a/src/vs/base/test/common/map.test.ts b/src/vs/base/test/common/map.test.ts index dd7c4a1841a049..e5af65b3e982a2 100644 --- a/src/vs/base/test/common/map.test.ts +++ b/src/vs/base/test/common/map.test.ts @@ -609,6 +609,16 @@ suite('BidirectionalMap', () => { assert.strictEqual(map.delete('four'), false); }); + test('should not leave a stale reverse entry when a key value is updated', () => { + const map = new BidirectionalMap(); + map.set('one', 1); + map.set('one', 2); + + assert.strictEqual(map.get('one'), 2); + assert.strictEqual(map.getKey(2), 'one'); + assert.strictEqual(map.getKey(1), undefined); + }); + test('should handle forEach correctly', () => { const map = new BidirectionalMap(); map.set('one', 1);