Skip to content

Commit db4f5a8

Browse files
authored
Debt - do not expose an unregister method from service (microsoft#158641)
* Debt - do not expose an unregister method from service * Add registration disposable to disposable store
1 parent af14c10 commit db4f5a8

File tree

5 files changed

+26
-16
lines changed

5 files changed

+26
-16
lines changed

src/vs/platform/workspace/common/editSessions.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation';
7+
import { IDisposable } from 'vs/base/common/lifecycle';
78
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
89
import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace';
910

@@ -17,7 +18,6 @@ export const IEditSessionIdentityService = createDecorator<IEditSessionIdentityS
1718
export interface IEditSessionIdentityService {
1819
readonly _serviceBrand: undefined;
1920

20-
registerEditSessionIdentityProvider(provider: IEditSessionIdentityProvider): void;
21-
unregisterEditSessionIdentityProvider(scheme: string): void;
21+
registerEditSessionIdentityProvider(provider: IEditSessionIdentityProvider): IDisposable;
2222
getEditSessionIdentifier(workspaceFolder: IWorkspaceFolder, cancellationTokenSource: CancellationTokenSource): Promise<string | undefined>;
2323
}

src/vs/workbench/api/browser/mainThreadWorkspace.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation';
77
import { isCancellationError } from 'vs/base/common/errors';
8-
import { DisposableStore } from 'vs/base/common/lifecycle';
8+
import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle';
99
import { isNative } from 'vs/base/common/platform';
1010
import { withNullAsUndefined } from 'vs/base/common/types';
1111
import { URI, UriComponents } from 'vs/base/common/uri';
@@ -224,16 +224,23 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape {
224224
}
225225

226226
// --- edit sessions ---
227-
$registerEditSessionIdentityProvider(scheme: string) {
228-
this._editSessionIdentityService.registerEditSessionIdentityProvider({
227+
private registeredEditSessionProviders = new Map<number, IDisposable>();
228+
229+
$registerEditSessionIdentityProvider(handle: number, scheme: string) {
230+
const disposable = this._editSessionIdentityService.registerEditSessionIdentityProvider({
229231
scheme: scheme,
230232
getEditSessionIdentifier: async (workspaceFolder: WorkspaceFolder, token: CancellationToken) => {
231233
return this._proxy.$getEditSessionIdentifier(workspaceFolder.uri, token);
232234
}
233235
});
236+
237+
this.registeredEditSessionProviders.set(handle, disposable);
238+
this._toDispose.add(disposable);
234239
}
235240

236-
$unregisterEditSessionIdentityProvider(scheme: string) {
237-
this._editSessionIdentityService.unregisterEditSessionIdentityProvider(scheme);
241+
$unregisterEditSessionIdentityProvider(handle: number) {
242+
const disposable = this.registeredEditSessionProviders.get(handle);
243+
disposable?.dispose();
244+
this.registeredEditSessionProviders.delete(handle);
238245
}
239246
}

src/vs/workbench/api/common/extHost.protocol.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1085,8 +1085,8 @@ export interface MainThreadWorkspaceShape extends IDisposable {
10851085
$updateWorkspaceFolders(extensionName: string, index: number, deleteCount: number, workspaceFoldersToAdd: { uri: UriComponents; name?: string }[]): Promise<void>;
10861086
$resolveProxy(url: string): Promise<string | undefined>;
10871087
$requestWorkspaceTrust(options?: WorkspaceTrustRequestOptions): Promise<boolean | undefined>;
1088-
$registerEditSessionIdentityProvider(scheme: string): void;
1089-
$unregisterEditSessionIdentityProvider(scheme: string): void;
1088+
$registerEditSessionIdentityProvider(handle: number, scheme: string): void;
1089+
$unregisterEditSessionIdentityProvider(handle: number): void;
10901090
}
10911091

10921092
export interface IFileChangeDto {

src/vs/workbench/api/common/extHostWorkspace.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,8 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape, IExtHostWorkspac
583583

584584
// --- edit sessions ---
585585

586+
private _providerHandlePool = 0;
587+
586588
// called by ext host
587589
registerEditSessionIdentityProvider(scheme: string, provider: vscode.EditSessionIdentityProvider) {
588590
if (this._editSessionIdentityProviders.has(scheme)) {
@@ -591,11 +593,12 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape, IExtHostWorkspac
591593

592594
this._editSessionIdentityProviders.set(scheme, provider);
593595
const outgoingScheme = this._uriTransformerService.transformOutgoingScheme(scheme);
594-
this._proxy.$registerEditSessionIdentityProvider(outgoingScheme);
596+
const handle = this._providerHandlePool++;
597+
this._proxy.$registerEditSessionIdentityProvider(handle, outgoingScheme);
595598

596599
return toDisposable(() => {
597600
this._editSessionIdentityProviders.delete(scheme);
598-
this._proxy.$unregisterEditSessionIdentityProvider(outgoingScheme);
601+
this._proxy.$unregisterEditSessionIdentityProvider(handle);
599602
});
600603
}
601604

src/vs/workbench/services/workspaces/common/editSessionIdentityService.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { CancellationTokenSource } from 'vs/base/common/cancellation';
7+
import { IDisposable, toDisposable } from 'vs/base/common/lifecycle';
78
import { registerSingleton } from 'vs/platform/instantiation/common/extensions';
89
import { ILogService } from 'vs/platform/log/common/log';
910
import { IEditSessionIdentityProvider, IEditSessionIdentityService } from 'vs/platform/workspace/common/editSessions';
@@ -20,16 +21,15 @@ export class EditSessionIdentityService implements IEditSessionIdentityService {
2021
@ILogService private readonly _logService: ILogService,
2122
) { }
2223

23-
registerEditSessionIdentityProvider(provider: IEditSessionIdentityProvider): void {
24+
registerEditSessionIdentityProvider(provider: IEditSessionIdentityProvider): IDisposable {
2425
if (this._editSessionIdentifierProviders.get(provider.scheme)) {
2526
throw new Error(`A provider has already been registered for scheme ${provider.scheme}`);
2627
}
2728

2829
this._editSessionIdentifierProviders.set(provider.scheme, provider);
29-
}
30-
31-
unregisterEditSessionIdentityProvider(scheme: string): void {
32-
this._editSessionIdentifierProviders.delete(scheme);
30+
return toDisposable(() => {
31+
this._editSessionIdentifierProviders.delete(provider.scheme);
32+
});
3333
}
3434

3535
async getEditSessionIdentifier(workspaceFolder: IWorkspaceFolder, cancellationTokenSource: CancellationTokenSource): Promise<string | undefined> {

0 commit comments

Comments
 (0)