Skip to content

Commit a54912c

Browse files
committed
1 parent 656920b commit a54912c

3 files changed

Lines changed: 32 additions & 18 deletions

File tree

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,9 @@ class ViewsExtensionHandler implements IWorkbenchContribution {
368368
}
369369

370370
private addViews(extensions: readonly IExtensionPointUser<ViewExtensionPointType>[]): void {
371+
const viewIds: Set<string> = new Set<string>();
372+
const allViewDescriptors: { views: IViewDescriptor[], viewContainer: ViewContainer }[] = [];
373+
371374
for (const extension of extensions) {
372375
const { value, collector } = extension;
373376

@@ -386,10 +389,9 @@ class ViewsExtensionHandler implements IWorkbenchContribution {
386389
collector.warn(localize('ViewContainerDoesnotExist', "View container '{0}' does not exist and all views registered to it will be added to 'Explorer'.", entry.key));
387390
}
388391
const container = viewContainer || this.getDefaultViewContainer();
389-
const viewIds: string[] = [];
390392
const viewDescriptors = coalesce(entry.value.map((item, index) => {
391393
// validate
392-
if (viewIds.indexOf(item.id) !== -1) {
394+
if (viewIds.has(item.id)) {
393395
collector.error(localize('duplicateView1', "Cannot register multiple views with same id `{0}`", item.id));
394396
return null;
395397
}
@@ -421,12 +423,16 @@ class ViewsExtensionHandler implements IWorkbenchContribution {
421423
remoteAuthority: item.remoteName || (<any>item).remoteAuthority // TODO@roblou - delete after remote extensions are updated
422424
};
423425

424-
viewIds.push(viewDescriptor.id);
426+
viewIds.add(viewDescriptor.id);
425427
return viewDescriptor;
426428
}));
427-
this.viewsRegistry.registerViews(viewDescriptors, container);
429+
430+
allViewDescriptors.push({ viewContainer: container, views: viewDescriptors });
431+
428432
});
429433
}
434+
435+
this.viewsRegistry.registerViews2(allViewDescriptors);
430436
}
431437

432438
private getDefaultViewContainer(): ViewContainer {

src/vs/workbench/common/views.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -282,14 +282,16 @@ export interface IViewContentDescriptor {
282282

283283
export interface IViewsRegistry {
284284

285-
readonly onViewsRegistered: Event<{ views: IViewDescriptor[], viewContainer: ViewContainer }>;
285+
readonly onViewsRegistered: Event<{ views: IViewDescriptor[], viewContainer: ViewContainer }[]>;
286286

287287
readonly onViewsDeregistered: Event<{ views: IViewDescriptor[], viewContainer: ViewContainer }>;
288288

289289
readonly onDidChangeContainer: Event<{ views: IViewDescriptor[], from: ViewContainer, to: ViewContainer }>;
290290

291291
registerViews(views: IViewDescriptor[], viewContainer: ViewContainer): void;
292292

293+
registerViews2(views: { views: IViewDescriptor[], viewContainer: ViewContainer }[]): void;
294+
293295
deregisterViews(views: IViewDescriptor[], viewContainer: ViewContainer): void;
294296

295297
moveViews(views: IViewDescriptor[], viewContainer: ViewContainer): void;
@@ -319,8 +321,8 @@ function compareViewContentDescriptors(a: IViewContentDescriptor, b: IViewConten
319321

320322
class ViewsRegistry extends Disposable implements IViewsRegistry {
321323

322-
private readonly _onViewsRegistered: Emitter<{ views: IViewDescriptor[], viewContainer: ViewContainer }> = this._register(new Emitter<{ views: IViewDescriptor[], viewContainer: ViewContainer }>());
323-
readonly onViewsRegistered: Event<{ views: IViewDescriptor[], viewContainer: ViewContainer }> = this._onViewsRegistered.event;
324+
private readonly _onViewsRegistered = this._register(new Emitter<{ views: IViewDescriptor[], viewContainer: ViewContainer }[]>());
325+
readonly onViewsRegistered = this._onViewsRegistered.event;
324326

325327
private readonly _onViewsDeregistered: Emitter<{ views: IViewDescriptor[], viewContainer: ViewContainer }> = this._register(new Emitter<{ views: IViewDescriptor[], viewContainer: ViewContainer }>());
326328
readonly onViewsDeregistered: Event<{ views: IViewDescriptor[], viewContainer: ViewContainer }> = this._onViewsDeregistered.event;
@@ -336,8 +338,12 @@ class ViewsRegistry extends Disposable implements IViewsRegistry {
336338
private _viewWelcomeContents = new SetMap<string, IViewContentDescriptor>();
337339

338340
registerViews(views: IViewDescriptor[], viewContainer: ViewContainer): void {
339-
this.addViews(views, viewContainer);
340-
this._onViewsRegistered.fire({ views: views, viewContainer });
341+
this.registerViews2([{ views, viewContainer }]);
342+
}
343+
344+
registerViews2(views: { views: IViewDescriptor[], viewContainer: ViewContainer }[]): void {
345+
views.forEach(({ views, viewContainer }) => this.addViews(views, viewContainer));
346+
this._onViewsRegistered.fire(views);
341347
}
342348

343349
deregisterViews(viewDescriptors: IViewDescriptor[], viewContainer: ViewContainer): void {

src/vs/workbench/services/views/browser/viewDescriptorService.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor
119119
// Try generating all generated containers that don't need extensions
120120
this.tryGenerateContainers();
121121

122-
this._register(this.viewsRegistry.onViewsRegistered(({ views, viewContainer }) => this.onDidRegisterViews(views, viewContainer)));
122+
this._register(this.viewsRegistry.onViewsRegistered(views => this.onDidRegisterViews(views)));
123123
this._register(this.viewsRegistry.onViewsDeregistered(({ views, viewContainer }) => this.onDidDeregisterViews(views, viewContainer)));
124124

125125
this._register(this.viewsRegistry.onDidChangeContainer(({ views, from, to }) => this.moveViews(views, from, to)));
@@ -212,16 +212,18 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor
212212
this.tryGenerateContainers(true);
213213
}
214214

215-
private onDidRegisterViews(views: IViewDescriptor[], viewContainer: ViewContainer): void {
216-
// When views are registered, we need to regroup them based on the cache
217-
const regroupedViews = this.regroupViews(viewContainer.id, views);
215+
private onDidRegisterViews(views: { views: IViewDescriptor[], viewContainer: ViewContainer }[]): void {
216+
views.forEach(({ views, viewContainer }) => {
217+
// When views are registered, we need to regroup them based on the cache
218+
const regroupedViews = this.regroupViews(viewContainer.id, views);
218219

219-
// Once they are grouped, try registering them which occurs
220-
// if the container has already been registered within this service
221-
// or we can generate the container from the source view id
222-
this.registerGroupedViews(regroupedViews);
220+
// Once they are grouped, try registering them which occurs
221+
// if the container has already been registered within this service
222+
// or we can generate the container from the source view id
223+
this.registerGroupedViews(regroupedViews);
223224

224-
views.forEach(viewDescriptor => this.getOrCreateMovableViewContextKey(viewDescriptor).set(!!viewDescriptor.canMoveView));
225+
views.forEach(viewDescriptor => this.getOrCreateMovableViewContextKey(viewDescriptor).set(!!viewDescriptor.canMoveView));
226+
});
225227
}
226228

227229
private shouldGenerateContainer(containerInfo: ICachedViewContainerInfo): boolean {

0 commit comments

Comments
 (0)