From bcfc3e9269eb4a9edda25523a88673b4ebec2715 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 12 Dec 2018 15:08:04 +0100 Subject: [PATCH] #64755 Strict null check - MultiExtensionManagementService --- src/tsconfig.strictNullChecks.json | 3 +- .../common/extensionManagement.ts | 2 +- .../node/multiExtensionManagement.ts | 56 +++++++++++-------- src/vs/workbench/electron-browser/shell.ts | 4 +- .../electron-browser/extensionsViewlet.ts | 2 - .../extensionsActions.test.ts | 7 ++- .../electron-browser/extensionsViews.test.ts | 7 ++- .../node/extensionManagementServerService.ts | 24 -------- 8 files changed, 49 insertions(+), 56 deletions(-) diff --git a/src/tsconfig.strictNullChecks.json b/src/tsconfig.strictNullChecks.json index 16019fedab7..94d91bd875a 100644 --- a/src/tsconfig.strictNullChecks.json +++ b/src/tsconfig.strictNullChecks.json @@ -730,7 +730,8 @@ "./vs/workbench/services/themes/electron-browser/fileIconThemeStore.ts", "./vs/workbench/services/title/common/titleService.ts", "./vs/workbench/services/workspace/common/workspaceEditing.ts", - "./vs/workbench/test/electron-browser/api/mock.ts" + "./vs/workbench/test/electron-browser/api/mock.ts", + "./vs/platform/extensionManagement/node/multiExtensionManagement.ts" ], "exclude": [ "./typings/require-monaco.d.ts" diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index 28be7c64c59..a6548f8a6a2 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -342,7 +342,7 @@ export interface IExtensionManagementServer { export interface IExtensionManagementServerService { _serviceBrand: any; - readonly localExtensionManagementServer: IExtensionManagementServer | null; + readonly localExtensionManagementServer: IExtensionManagementServer; readonly remoteExtensionManagementServer: IExtensionManagementServer | null; getExtensionManagementServer(location: URI): IExtensionManagementServer | null; } diff --git a/src/vs/platform/extensionManagement/node/multiExtensionManagement.ts b/src/vs/platform/extensionManagement/node/multiExtensionManagement.ts index 1a626af33f4..c1057928ede 100644 --- a/src/vs/platform/extensionManagement/node/multiExtensionManagement.ts +++ b/src/vs/platform/extensionManagement/node/multiExtensionManagement.ts @@ -17,7 +17,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { IRemoteAuthorityResolverService, ResolvedAuthority } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { getManifest } from 'vs/platform/extensionManagement/node/extensionManagementUtil'; -export class MulitExtensionManagementService extends Disposable implements IExtensionManagementService { +export class MultiExtensionManagementService extends Disposable implements IExtensionManagementService { _serviceBrand: any; @@ -49,15 +49,27 @@ export class MulitExtensionManagementService extends Disposable implements IExte } uninstall(extension: ILocalExtension, force?: boolean): Promise { - return this.getServer(extension).extensionManagementService.uninstall(extension, force); + const server = this.getServer(extension); + if (server) { + return server.extensionManagementService.uninstall(extension, force); + } + return Promise.reject(`Invalid location ${extension.location.toString()}`); } reinstallFromGallery(extension: ILocalExtension): Promise { - return this.getServer(extension).extensionManagementService.reinstallFromGallery(extension); + const server = this.getServer(extension); + if (server) { + return server.extensionManagementService.reinstallFromGallery(extension); + } + return Promise.reject(`Invalid location ${extension.location.toString()}`); } updateMetadata(extension: ILocalExtension, metadata: IGalleryMetadata): Promise { - return this.getServer(extension).extensionManagementService.updateMetadata(extension, metadata); + const server = this.getServer(extension); + if (server) { + return server.extensionManagementService.updateMetadata(extension, metadata); + } + return Promise.reject(`Invalid location ${extension.location.toString()}`); } zip(extension: ILocalExtension): Promise { @@ -65,38 +77,38 @@ export class MulitExtensionManagementService extends Disposable implements IExte } unzip(zipLocation: URI, type: LocalExtensionType): Promise { - return Promise.all(this.servers.map(({ extensionManagementService }) => extensionManagementService.unzip(zipLocation, type))).then(() => null); + return Promise.all(this.servers.map(({ extensionManagementService }) => extensionManagementService.unzip(zipLocation, type))).then(([extensionIdentifier]) => extensionIdentifier); } install(vsix: URI): Promise { - if (!this.extensionManagementServerService.remoteExtensionManagementServer) { - return this.extensionManagementServerService.localExtensionManagementServer.extensionManagementService.install(vsix); + if (this.extensionManagementServerService.remoteExtensionManagementServer) { + return Promise.all([getManifest(vsix.fsPath), this.hasToSyncExtensions()]) + .then(([manifest, syncExtensions]) => { + const servers = isUIExtension(manifest, this.configurationService) ? [this.extensionManagementServerService.localExtensionManagementServer] : syncExtensions ? this.servers : [this.extensionManagementServerService.remoteExtensionManagementServer!]; + return Promise.all(servers.map(server => server.extensionManagementService.install(vsix))) + .then(([extensionIdentifier]) => extensionIdentifier); + }); } - return Promise.all([getManifest(vsix.fsPath), this.hasToSyncExtensions()]) - .then(([manifest, syncExtensions]) => { - const servers = isUIExtension(manifest, this.configurationService) ? [this.extensionManagementServerService.localExtensionManagementServer] : syncExtensions ? this.servers : [this.extensionManagementServerService.remoteExtensionManagementServer]; - return Promise.all(servers.map(server => server.extensionManagementService.install(vsix))) - .then(() => null); - }); + return this.extensionManagementServerService.localExtensionManagementServer.extensionManagementService.install(vsix); } installFromGallery(gallery: IGalleryExtension): Promise { - if (!this.extensionManagementServerService.remoteExtensionManagementServer) { - return this.extensionManagementServerService.localExtensionManagementServer.extensionManagementService.installFromGallery(gallery); + if (this.extensionManagementServerService.remoteExtensionManagementServer) { + return Promise.all([this.extensionGalleryService.getManifest(gallery, CancellationToken.None), this.hasToSyncExtensions()]) + .then(([manifest, syncExtensions]) => { + const servers = isUIExtension(manifest, this.configurationService) ? [this.extensionManagementServerService.localExtensionManagementServer] : syncExtensions ? this.servers : [this.extensionManagementServerService.remoteExtensionManagementServer!]; + return Promise.all(servers.map(server => server.extensionManagementService.installFromGallery(gallery))) + .then(() => void 0); + }); } - return Promise.all([this.extensionGalleryService.getManifest(gallery, CancellationToken.None), this.hasToSyncExtensions()]) - .then(([manifest, syncExtensions]) => { - const servers = isUIExtension(manifest, this.configurationService) ? [this.extensionManagementServerService.localExtensionManagementServer] : syncExtensions ? this.servers : [this.extensionManagementServerService.remoteExtensionManagementServer]; - return Promise.all(servers.map(server => server.extensionManagementService.installFromGallery(gallery))) - .then(() => null); - }); + return this.extensionManagementServerService.localExtensionManagementServer.extensionManagementService.installFromGallery(gallery); } getExtensionsReport(): Promise { return this.extensionManagementServerService.localExtensionManagementServer.extensionManagementService.getExtensionsReport(); } - private getServer(extension: ILocalExtension): IExtensionManagementServer { + private getServer(extension: ILocalExtension): IExtensionManagementServer | null { return this.extensionManagementServerService.getExtensionManagementServer(extension.location); } diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index 14bae36b787..f4ed2affdc0 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -101,7 +101,7 @@ import { IDownloadService } from 'vs/platform/download/common/download'; import { DownloadService } from 'vs/platform/download/node/downloadService'; import { DownloadServiceChannel } from 'vs/platform/download/node/downloadIpc'; import { TextResourcePropertiesService } from 'vs/workbench/services/textfile/electron-browser/textResourcePropertiesService'; -import { MulitExtensionManagementService } from 'vs/platform/extensionManagement/node/multiExtensionManagement'; +import { MultiExtensionManagementService } from 'vs/platform/extensionManagement/node/multiExtensionManagement'; import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { RemoteAuthorityResolverService } from 'vs/platform/remote/electron-browser/remoteAuthorityResolverService'; @@ -474,7 +474,7 @@ export class WorkbenchShell extends Disposable { const extensionManagementChannel = getDelayedChannel(sharedProcess.then(c => c.getChannel('extensions'))); const extensionManagementChannelClient = new ExtensionManagementChannelClient(extensionManagementChannel); serviceCollection.set(IExtensionManagementServerService, new SyncDescriptor(ExtensionManagementServerService, [extensionManagementChannelClient])); - serviceCollection.set(IExtensionManagementService, new SyncDescriptor(MulitExtensionManagementService)); + serviceCollection.set(IExtensionManagementService, new SyncDescriptor(MultiExtensionManagementService)); const extensionEnablementService = this._register(instantiationService.createInstance(ExtensionEnablementService)); serviceCollection.set(IExtensionEnablementService, extensionEnablementService); diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts index 54a9d1ba129..024c14b98b7 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts @@ -50,7 +50,6 @@ import { ViewletPanel } from 'vs/workbench/browser/parts/views/panelViewlet'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { ExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/node/extensionsWorkbenchService'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; -import { SingleServerExtensionManagementServerService } from 'vs/workbench/services/extensions/node/extensionManagementServerService'; import { Query } from 'vs/workbench/parts/extensions/common/extensionQuery'; import { SuggestEnabledInput, attachSuggestEnabledInputBoxStyler } from 'vs/workbench/parts/codeEditor/electron-browser/suggestEnabledInput'; import { alert } from 'vs/base/browser/ui/aria/aria'; @@ -510,7 +509,6 @@ export class ExtensionsViewlet extends ViewContainerViewlet implements IExtensio : viewDescriptor.id === `server.extensionsList.${this.extensionManagementServerService.remoteExtensionManagementServer.authority}` ? this.extensionManagementServerService.remoteExtensionManagementServer : null; if (extensionManagementServer) { const servicesCollection: ServiceCollection = new ServiceCollection(); - servicesCollection.set(IExtensionManagementServerService, new SingleServerExtensionManagementServerService(extensionManagementServer)); servicesCollection.set(IExtensionManagementService, extensionManagementServer.extensionManagementService); servicesCollection.set(IExtensionsWorkbenchService, new SyncDescriptor(ExtensionsWorkbenchService)); const instantiationService = this.instantiationService.createChild(servicesCollection); diff --git a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts index a607088a715..d539fda2c37 100644 --- a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts +++ b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts @@ -32,8 +32,10 @@ import { ILogService, NullLogService } from 'vs/platform/log/common/log'; import { IWindowService } from 'vs/platform/windows/common/windows'; import { URLService } from 'vs/platform/url/common/urlService'; import { URI } from 'vs/base/common/uri'; -import { SingleServerExtensionManagementServerService } from 'vs/workbench/services/extensions/node/extensionManagementServerService'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; +import { ExtensionManagementServerService } from 'vs/workbench/services/extensions/node/extensionManagementServerService'; +import { IRemoteAgentService } from 'vs/workbench/services/remote/node/remoteAgentService'; +import { RemoteAgentService } from 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl'; suite('ExtensionsActions Test', () => { @@ -67,8 +69,9 @@ suite('ExtensionsActions Test', () => { instantiationService.stub(IExtensionManagementService, 'onDidInstallExtension', didInstallEvent.event); instantiationService.stub(IExtensionManagementService, 'onUninstallExtension', uninstallEvent.event); instantiationService.stub(IExtensionManagementService, 'onDidUninstallExtension', didUninstallEvent.event); + instantiationService.stub(IRemoteAgentService, RemoteAgentService); - instantiationService.stub(IExtensionManagementServerService, instantiationService.createInstance(SingleServerExtensionManagementServerService, { authority: 'vscode-local', extensionManagementService: instantiationService.get(IExtensionManagementService), label: 'local' })); + instantiationService.stub(IExtensionManagementServerService, instantiationService.createInstance(ExtensionManagementServerService, { authority: 'vscode-local', extensionManagementService: instantiationService.get(IExtensionManagementService), label: 'local' })); instantiationService.stub(IExtensionEnablementService, new TestExtensionEnablementService(instantiationService)); diff --git a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsViews.test.ts b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsViews.test.ts index 6f3ea74bee1..cec002787a7 100644 --- a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsViews.test.ts +++ b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsViews.test.ts @@ -32,10 +32,12 @@ import { ILogService, NullLogService } from 'vs/platform/log/common/log'; import { IWindowService } from 'vs/platform/windows/common/windows'; import { URLService } from 'vs/platform/url/common/urlService'; import { URI } from 'vs/base/common/uri'; -import { SingleServerExtensionManagementServerService } from 'vs/workbench/services/extensions/node/extensionManagementServerService'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { SinonStub } from 'sinon'; import { IExperimentService, ExperimentService, ExperimentState, ExperimentActionType } from 'vs/workbench/parts/experiments/node/experimentService'; +import { IRemoteAgentService } from 'vs/workbench/services/remote/node/remoteAgentService'; +import { RemoteAgentService } from 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl'; +import { ExtensionManagementServerService } from 'vs/workbench/services/extensions/node/extensionManagementServerService'; suite('ExtensionsListView Tests', () => { @@ -83,8 +85,9 @@ suite('ExtensionsListView Tests', () => { instantiationService.stub(IExtensionManagementService, 'onDidInstallExtension', didInstallEvent.event); instantiationService.stub(IExtensionManagementService, 'onUninstallExtension', uninstallEvent.event); instantiationService.stub(IExtensionManagementService, 'onDidUninstallExtension', didUninstallEvent.event); + instantiationService.stub(IRemoteAgentService, RemoteAgentService); - instantiationService.stub(IExtensionManagementServerService, instantiationService.createInstance(SingleServerExtensionManagementServerService, { authority: 'vscode-local', extensionManagementService: instantiationService.get(IExtensionManagementService), label: 'local' })); + instantiationService.stub(IExtensionManagementServerService, instantiationService.createInstance(ExtensionManagementServerService, { authority: 'vscode-local', extensionManagementService: instantiationService.get(IExtensionManagementService), label: 'local' })); instantiationService.stub(IExtensionEnablementService, new TestExtensionEnablementService(instantiationService)); diff --git a/src/vs/workbench/services/extensions/node/extensionManagementServerService.ts b/src/vs/workbench/services/extensions/node/extensionManagementServerService.ts index a04693e8a47..723d711cac8 100644 --- a/src/vs/workbench/services/extensions/node/extensionManagementServerService.ts +++ b/src/vs/workbench/services/extensions/node/extensionManagementServerService.ts @@ -42,28 +42,4 @@ export class ExtensionManagementServerService implements IExtensionManagementSer } return null; } -} - -export class SingleServerExtensionManagementServerService implements IExtensionManagementServerService { - - _serviceBrand: any; - - - constructor( - private readonly extensionManagementServer: IExtensionManagementServer - ) { - } - - getExtensionManagementServer(location: URI): IExtensionManagementServer | null { - const authority = location.scheme === Schemas.file ? localExtensionManagementServerAuthority : location.authority; - return this.extensionManagementServer.authority === authority ? this.extensionManagementServer : null; - } - - get localExtensionManagementServer(): IExtensionManagementServer | null { - return this.extensionManagementServer.authority === localExtensionManagementServerAuthority ? this.extensionManagementServer : null; - } - - get remoteExtensionManagementServer(): IExtensionManagementServer | null { - return this.extensionManagementServer.authority !== localExtensionManagementServerAuthority ? this.extensionManagementServer : null; - } } \ No newline at end of file