From a54912ca1214297ee7c73d378e8a54059d340f15 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 6 May 2020 10:56:12 +0200 Subject: [PATCH] Fix #96695 --- .../api/browser/viewsExtensionPoint.ts | 14 +++++++++---- src/vs/workbench/common/views.ts | 16 ++++++++++----- .../views/browser/viewDescriptorService.ts | 20 ++++++++++--------- 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/api/browser/viewsExtensionPoint.ts b/src/vs/workbench/api/browser/viewsExtensionPoint.ts index 6234e8eb6bb..46bf7934fd0 100644 --- a/src/vs/workbench/api/browser/viewsExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsExtensionPoint.ts @@ -368,6 +368,9 @@ class ViewsExtensionHandler implements IWorkbenchContribution { } private addViews(extensions: readonly IExtensionPointUser[]): void { + const viewIds: Set = new Set(); + const allViewDescriptors: { views: IViewDescriptor[], viewContainer: ViewContainer }[] = []; + for (const extension of extensions) { const { value, collector } = extension; @@ -386,10 +389,9 @@ class ViewsExtensionHandler implements IWorkbenchContribution { collector.warn(localize('ViewContainerDoesnotExist', "View container '{0}' does not exist and all views registered to it will be added to 'Explorer'.", entry.key)); } const container = viewContainer || this.getDefaultViewContainer(); - const viewIds: string[] = []; const viewDescriptors = coalesce(entry.value.map((item, index) => { // validate - if (viewIds.indexOf(item.id) !== -1) { + if (viewIds.has(item.id)) { collector.error(localize('duplicateView1', "Cannot register multiple views with same id `{0}`", item.id)); return null; } @@ -421,12 +423,16 @@ class ViewsExtensionHandler implements IWorkbenchContribution { remoteAuthority: item.remoteName || (item).remoteAuthority // TODO@roblou - delete after remote extensions are updated }; - viewIds.push(viewDescriptor.id); + viewIds.add(viewDescriptor.id); return viewDescriptor; })); - this.viewsRegistry.registerViews(viewDescriptors, container); + + allViewDescriptors.push({ viewContainer: container, views: viewDescriptors }); + }); } + + this.viewsRegistry.registerViews2(allViewDescriptors); } private getDefaultViewContainer(): ViewContainer { diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index a7622d558c8..c8bffe666da 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -282,7 +282,7 @@ export interface IViewContentDescriptor { export interface IViewsRegistry { - readonly onViewsRegistered: Event<{ views: IViewDescriptor[], viewContainer: ViewContainer }>; + readonly onViewsRegistered: Event<{ views: IViewDescriptor[], viewContainer: ViewContainer }[]>; readonly onViewsDeregistered: Event<{ views: IViewDescriptor[], viewContainer: ViewContainer }>; @@ -290,6 +290,8 @@ export interface IViewsRegistry { registerViews(views: IViewDescriptor[], viewContainer: ViewContainer): void; + registerViews2(views: { views: IViewDescriptor[], viewContainer: ViewContainer }[]): void; + deregisterViews(views: IViewDescriptor[], viewContainer: ViewContainer): void; moveViews(views: IViewDescriptor[], viewContainer: ViewContainer): void; @@ -319,8 +321,8 @@ function compareViewContentDescriptors(a: IViewContentDescriptor, b: IViewConten class ViewsRegistry extends Disposable implements IViewsRegistry { - private readonly _onViewsRegistered: Emitter<{ views: IViewDescriptor[], viewContainer: ViewContainer }> = this._register(new Emitter<{ views: IViewDescriptor[], viewContainer: ViewContainer }>()); - readonly onViewsRegistered: Event<{ views: IViewDescriptor[], viewContainer: ViewContainer }> = this._onViewsRegistered.event; + private readonly _onViewsRegistered = this._register(new Emitter<{ views: IViewDescriptor[], viewContainer: ViewContainer }[]>()); + readonly onViewsRegistered = this._onViewsRegistered.event; private readonly _onViewsDeregistered: Emitter<{ views: IViewDescriptor[], viewContainer: ViewContainer }> = this._register(new Emitter<{ views: IViewDescriptor[], viewContainer: ViewContainer }>()); readonly onViewsDeregistered: Event<{ views: IViewDescriptor[], viewContainer: ViewContainer }> = this._onViewsDeregistered.event; @@ -336,8 +338,12 @@ class ViewsRegistry extends Disposable implements IViewsRegistry { private _viewWelcomeContents = new SetMap(); registerViews(views: IViewDescriptor[], viewContainer: ViewContainer): void { - this.addViews(views, viewContainer); - this._onViewsRegistered.fire({ views: views, viewContainer }); + this.registerViews2([{ views, viewContainer }]); + } + + registerViews2(views: { views: IViewDescriptor[], viewContainer: ViewContainer }[]): void { + views.forEach(({ views, viewContainer }) => this.addViews(views, viewContainer)); + this._onViewsRegistered.fire(views); } deregisterViews(viewDescriptors: IViewDescriptor[], viewContainer: ViewContainer): void { diff --git a/src/vs/workbench/services/views/browser/viewDescriptorService.ts b/src/vs/workbench/services/views/browser/viewDescriptorService.ts index 5312e6b9c2c..6875ce28b08 100644 --- a/src/vs/workbench/services/views/browser/viewDescriptorService.ts +++ b/src/vs/workbench/services/views/browser/viewDescriptorService.ts @@ -119,7 +119,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor // Try generating all generated containers that don't need extensions this.tryGenerateContainers(); - this._register(this.viewsRegistry.onViewsRegistered(({ views, viewContainer }) => this.onDidRegisterViews(views, viewContainer))); + this._register(this.viewsRegistry.onViewsRegistered(views => this.onDidRegisterViews(views))); this._register(this.viewsRegistry.onViewsDeregistered(({ views, viewContainer }) => this.onDidDeregisterViews(views, viewContainer))); this._register(this.viewsRegistry.onDidChangeContainer(({ views, from, to }) => this.moveViews(views, from, to))); @@ -212,16 +212,18 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor this.tryGenerateContainers(true); } - private onDidRegisterViews(views: IViewDescriptor[], viewContainer: ViewContainer): void { - // When views are registered, we need to regroup them based on the cache - const regroupedViews = this.regroupViews(viewContainer.id, views); + private onDidRegisterViews(views: { views: IViewDescriptor[], viewContainer: ViewContainer }[]): void { + views.forEach(({ views, viewContainer }) => { + // When views are registered, we need to regroup them based on the cache + const regroupedViews = this.regroupViews(viewContainer.id, views); - // Once they are grouped, try registering them which occurs - // if the container has already been registered within this service - // or we can generate the container from the source view id - this.registerGroupedViews(regroupedViews); + // Once they are grouped, try registering them which occurs + // if the container has already been registered within this service + // or we can generate the container from the source view id + this.registerGroupedViews(regroupedViews); - views.forEach(viewDescriptor => this.getOrCreateMovableViewContextKey(viewDescriptor).set(!!viewDescriptor.canMoveView)); + views.forEach(viewDescriptor => this.getOrCreateMovableViewContextKey(viewDescriptor).set(!!viewDescriptor.canMoveView)); + }); } private shouldGenerateContainer(containerInfo: ICachedViewContainerInfo): boolean { -- GitLab