add logic to clean up providers when appropriate (#1824)

This commit is contained in:
Anthony Dresser
2018-07-03 11:49:57 -07:00
committed by GitHub
parent 4f864fd5bd
commit 014bca031c
2 changed files with 40 additions and 15 deletions

View File

@@ -20,6 +20,9 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'
import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle';
import { IStorageService } from 'vs/platform/storage/common/storage';
import { Registry } from 'vs/platform/registry/common/platform';
import { IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement';
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
import { getIdFromLocalExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
export const SERVICE_ID = 'capabilitiesService';
export const HOST_NAME = 'sqlops';
@@ -101,7 +104,9 @@ export class CapabilitiesService extends Disposable implements ICapabilitiesServ
public readonly onCapabilitiesRegistered = this._onCapabilitiesRegistered.event;
constructor(
@IStorageService private _storageService: IStorageService
@IStorageService private _storageService: IStorageService,
@IExtensionService extensionService: IExtensionService,
@IExtensionManagementService extentionManagementService: IExtensionManagementService
) {
super();
@@ -114,12 +119,35 @@ export class CapabilitiesService extends Disposable implements ICapabilitiesServ
this.handleConnectionProvider({ id: v[0], properties: v[1] });
});
// register for when new extensions are added
connectionRegistry.onNewProvider(this.handleConnectionProvider, this);
this._register(connectionRegistry.onNewProvider(this.handleConnectionProvider, this));
// handle adding already known capabilities (could have caching problems)
Object.entries(this.capabilities.connectionProviderCache).map(v => {
this.handleConnectionProvider({ id: v[0], properties: v[1] }, false);
});
extensionService.whenInstalledExtensionsRegistered().then(() => {
this.cleanupProviders();
});
this._register(extentionManagementService.onDidUninstallExtension(({ identifier }) => {
let extensionid = getIdFromLocalExtensionId(identifier.id);
extensionService.getExtensions().then(i => {
let extension = i.find(c => c.id === extensionid);
let id = extension.contributes['connectionProvider'].providerId;
delete this.capabilities.connectionProviderCache[id];
});
}));
}
private cleanupProviders(): void {
let knownProviders = Object.keys(connectionRegistry.providers);
for (let key in this.capabilities.connectionProviderCache) {
if (!knownProviders.includes(key)) {
this._providers.delete(key);
delete this.capabilities.connectionProviderCache[key];
}
}
}
private handleConnectionProvider(e: { id: string, properties: ConnectionProviderProperties }, isNew = true): void {