Add DisposableMap helper (#163006)

Adds `DisposableMap` to help manage the lifecycle of maps of  disposable values. This is useful for a few reasons:

- `DisposableMap` is itself disposable, so you can use it with `_register` or add it to a `DisposableStore`
- The implementation of `set` on `DisposableMap` prevents leaking values on override
- The `delete` implementation also makes sure it disposes of the deleted values
This commit is contained in:
Matt Bierner
2022-10-07 15:28:36 -07:00
committed by GitHub
parent 125898b774
commit 1d45633795
13 changed files with 110 additions and 128 deletions
@@ -8,7 +8,7 @@ import { CancellationToken } from 'vs/base/common/cancellation';
import { createStringDataTransferItem, VSDataTransfer } from 'vs/base/common/dataTransfer';
import { CancellationError } from 'vs/base/common/errors';
import { Emitter, Event } from 'vs/base/common/event';
import { combinedDisposable, Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle';
import { combinedDisposable, Disposable, DisposableMap, toDisposable } from 'vs/base/common/lifecycle';
import { revive } from 'vs/base/common/marshalling';
import { mixin } from 'vs/base/common/objects';
import { URI } from 'vs/base/common/uri';
@@ -38,7 +38,7 @@ import { ExtHostContext, ExtHostLanguageFeaturesShape, ICallHierarchyItemDto, IC
export class MainThreadLanguageFeatures extends Disposable implements MainThreadLanguageFeaturesShape {
private readonly _proxy: ExtHostLanguageFeaturesShape;
private readonly _registrations = new Map<number, IDisposable>();
private readonly _registrations = this._register(new DisposableMap<number>());
constructor(
extHostContext: IExtHostContext,
@@ -80,21 +80,8 @@ export class MainThreadLanguageFeatures extends Disposable implements MainThread
}
}
override dispose(): void {
for (const registration of this._registrations.values()) {
registration.dispose();
}
this._registrations.clear();
super.dispose();
}
$unregister(handle: number): void {
const registration = this._registrations.get(handle);
if (registration) {
registration.dispose();
this._registrations.delete(handle);
}
this._registrations.deleteAndDispose(handle);
}
//#region --- revive functions