Change:
While working on I noticed that some of the UI elements (and maybe other things?) are not registered as disposable, and thus may leak when the merge editor is freed from an editor group that closes. For example the and all input views seem to not dispose.
Hm, I think also the merge model, I suggest to do a pass and register as appropiate.

Discussion:
constructor() { super({ id: 'merge.goToNextConflict', <del> title: localize('merge.goToNextConflict', "Merge Editor: Go to Next Conflict"), </del> <ins> category: localize('mergeEditor', "Merge Editor"), title: localize('merge.goToNextConflict', "Go to Next Conflict"), </ins> icon: Codicon.arrowDown, menu: [{ id: MenuId.EditorTitle,

constructor() { super({ id: 'merge.goToPreviousConflict', <del> title: localize('merge.goToPreviousConflict', "Merge Editor: Go to Previous Conflict"), </del> <ins> category: localize('mergeEditor', "Merge Editor"), title: localize('merge.goToPreviousConflict', "Go to Previous Conflict"), </ins> icon: Codicon.arrowUp, menu: [{ id: MenuId.EditorTitle,

constructor() { super({ id: 'merge.toggleActiveConflictInput1', <del> title: localize('merge.toggleActiveConflictInput1', "Merge Editor: Toggle Active Conflict In Input 1"), </del> <ins> category: localize('mergeEditor', "Merge Editor"), title: localize('merge.toggleActiveConflictInput1', "Toggle Active Conflict In Input 1"), </ins> f1: true, }); }

constructor() { super({ id: 'merge.toggleActiveConflictInput2', <del> title: localize('merge.toggleActiveConflictInput2', "Merge Editor: Toggle Active Conflict In Input 2"), </del> <ins> category: localize('mergeEditor', "Merge Editor"), title: localize('merge.toggleActiveConflictInput2', "Toggle Active Conflict In Input 2"), </ins> f1: true, }); }

constructor() { super({ id: 'mergeEditor.compareInput1WithBase', <del> title: localize('mergeEditor.compareInput1WithBase', "Merge Editor: Compare Input 1 With Base"), </del> <ins> category: localize('mergeEditor', "Merge Editor"), title: localize('mergeEditor.compareInput1WithBase', "Compare Input 1 With Base"), </ins> f1: true, }); }

constructor() { super({ id: 'mergeEditor.compareInput2WithBase', <del> title: localize('mergeEditor.compareInput2WithBase', "Merge Editor: Compare Input 2 With Base"), </del> <ins> category: localize('mergeEditor', "Merge Editor"), title: localize('mergeEditor.compareInput2WithBase', "Compare Input 2 With Base"), </ins> f1: true, }); }

private _grid!: Grid<IView>; <del> private readonly input1View = this.instantiation.createInstance(InputCodeEditorView, 1, { readonly: !this.inputsWritable }); private readonly input2View = this.instantiation.createInstance(InputCodeEditorView, 2, { readonly: !this.inputsWritable }); private readonly inputResultView = this.instantiation.createInstance(ResultCodeEditorView, { readonly: false }); </del> <ins> private readonly input1View = this._register(this.instantiation.createInstance(InputCodeEditorView, 1, { readonly: !this.inputsWritable })); private readonly input2View = this._register(this.instantiation.createInstance(InputCodeEditorView, 2, { readonly: !this.inputsWritable })); private readonly inputResultView = this._register(this.instantiation.createInstance(ResultCodeEditorView, { readonly: false })); </ins> private readonly _ctxIsMergeEditor: IContextKey<boolean>; private readonly _ctxUsesColumnLayout: IContextKey<boolean>;

}); reset(parent, this._grid.element); <ins> this._register(this._grid); </ins> this._ctxUsesColumnLayout.set(false); this.applyOptions(initialOptions);