Change:
Maybe even just typing in the result. Having this definitely is a point for though... Verification steps: Use the Load Merge Editor State From JSON command to load the provided JSON Go to an unresolved conflict and type in the editor Check that the conflict is resolved (the conflict counter decremented) json { "languageId": "typescript", "base": "/
--------------n Copyright (c) Microsoft Corporation. All rights reserved.n Licensed under the MIT License. See in the project root for license information.n *
-------------/nnimport { toErrorMessage } from 'vs/base/common/errorMessage';nimport { Disposable, MutableDisposable } from 'vs/base/common/lifecycle';nimport { SimpleIconLabel } from 'vs/base/browser/ui/iconLabel/simpleIconLabel';nimport { ICommandService } from 'vs/platform/commands/common/commands';nimport { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';nimport { IStatusbarEntry, ShowTooltipCommand } from 'vs/workbench/services/statusbar/browser/statusbar';nimport { WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions';nimport { IThemeService, ThemeColor } from 'vs/platform/theme/common/themeService';nimport { isThemeColor } from 'vs/editor/common/editorCommon';nimport { addDisposableListener, EventType, hide, show, append, EventHelper } from 'vs/base/browser/dom';nimport { INotificationService } from 'vs/platform/notification/common/notification';nimport { assertIsDefined } from 'vs/base/common/types';nimport { Command } from 'vs/editor/common/languages';nimport { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';nimport { KeyCode } from 'vs/base/common/keyCodes';nimport { renderIcon, renderLabelWithIcons } from 'vs/base/browser/ui/iconLabel/iconLabels';nimport { spinningLoading, syncing } from 'vs/platform/theme/common/iconRegistry';nimport { ICustomHover, setupCustomHover } from 'vs/base/browser/ui/iconLabel/iconLabelHover';nimport { isMarkdownString, markdownStringEqual } from 'vs/base/common/htmlContent';nimport { IHoverDelegate } from 'vs/base/browser/ui/iconLabel/iconHoverDelegate';nimport { Gesture, EventType as TouchEventType } from 'vs/base/browser/touch';nnexport class StatusbarEntryItem extends Disposable {nntprivate readonly label: StatusBarCodiconLabel;nntprivate entry: IStatusbarEntry 'loading') {nttif (this.currentShowProgress !== showProgress) {ntttthis.currentShowProgress = !!showProgress;ntttthis.progressCodicon = renderIcon(showProgress === 'loading' ? spinningLoading : syncing);ntt = this.currentText;ntt}nt}nntoverride set text(text: string) {nntt// Progress: insert progress codicon as first element as neededntt// but keep it stable so that the animation does not resetnttif (this.currentShowProgress) {nnttt// Append as neededntttif (this.container.firstChild !== this.progressCodicon) {nttttthis.container.appendChild(this.progressCodicon);nttt}nnttt// Remove othersntttfor (const node of (this.container.childNodes)) {nttttif (node !== this.progressCodicon) {ntttt();ntttt}nttt}nnttt// If we have text to show, add a space to separate from progressntttlet textContent = text ?? '';ntttif (textContent) {ntttttextContent = ;nttt}nnttt// Append new elementsntttappend(this.container, ...renderLabelWithIcons(textContent));ntt}nntt// No Progress: no special handlingnttelse {ntt = text;ntt}nt}n}n", "input1": "/
--------------n Copyright (c) Microsoft Corporation. All rights reserved.n Licensed under the MIT License. See in the project root for license information.n *
-------------/nnimport { toErrorMessage } from 'vs/base/common/errorMessage';nimport { toErrorMessage2 } from 'vs/base/common/errorMessage2';nimport { Disposable, MutableDisposable } from 'vs/base/common/lifecycle';nimport { SimpleIconLabel } from 'vs/base/browser/ui/iconLabel/simpleIconLabel';nimport { ICommandService } from 'vs/platform/commands/common/commands';nimport { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';nimport { IStatusbarEntry, ShowTooltipCommand } from 'vs/workbench/services/statusbar/browser/statusbar';nimport { WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions';nimport { IThemeService, ThemeColor } from 'vs/platform/theme/common/themeService';nimport { isThemeColor } from 'vs/editor/common/editorCommon';nimport { addDisposableListener, EventType, hide, show, append, EventHelper } from 'vs/base/browser/dom';nimport { INotificationService } from 'vs/platform/notification/common/notification';nimport { assertIsDefined } from 'vs/base/common/types';nimport { Command } from 'vs/editor/common/languages';nimport { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';nimport { KeyCode } from 'vs/base/common/keyCodes';nimport { renderIcon, renderLabelWithIcons } from 'vs/base/browser/ui/iconLabel/iconLabels';nimport { spinningLoading, syncing } from 'vs/platform/theme/common/iconRegistry';nimport { ICustomHover, setupCustomHover } from 'vs/base/browser/ui/iconLabel/iconLabelHover';nimport { isMarkdownString, markdownStringEqual } from 'vs/base/common/htmlContent';nimport { IHoverDelegate } from 'vs/base/browser/ui/iconLabel/iconHoverDelegate';nimport { Gesture, EventType as TouchEventType } from 'vs/base/browser/touch';nnexport class StatusbarEntryItem extends Disposable {nntprivate readonly label: StatusBarCodiconLabel;nntprivate entry: IStatusbarEntry 'loading') {nttif (this.currentShowProgress !== showProgress) {ntttthis.currentShowProgress = !!showProgress;ntttthis.progressCodicon = renderIcon(showProgress === 'loading' ? spinningLoading : syncing);ntt = this.currentText;ntt}nt}nntoverride set text(text: string) {nntt// Progress: insert progress codicon as first element as neededntt// but keep it stable so that the animation does not resetnttif (this.currentShowProgress) {nnttt// Append as neededntttif (this.container.firstChild !== this.progressCodicon) {nttttthis.container.appendChild(this.progressCodicon);nttt}nnttt// Remove othersntttfor (const node of (this.container.childNodes)) {nttttif (node !== this.progressCodicon) {ntttt();ntttt}nttt}nnttt// If we have text to show, add a space to separate from progressntttlet textContent = text ?? '';ntttif (textContent) {ntttttextContent = ;nttt}nnttt// Append new elementsntttappend(this.container, ...renderLabelWithIcons(textContent));ntt}nntt// No Progress: no special handlingnttelse {ntt = text;ntt}nt}n}n", "input2": "/
--------------n Copyright (c) Microsoft Corporation. All rights reserved.n Licensed under the MIT License. See in the project root for license information.n *
-------------/nnimport { toErrorMessage } from 'vs/base/common/errorMessage';nimport { Disposable, MutableDisposable } from 'vs/base/common/lifecycle';nimport { SimpleIconLabel } from 'vs/base/browser/ui/iconLabel/simpleIconLabel';nimport { ICommandService } from 'vs/platform/commands/common/commands';nimport { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';nimport { IStatusbarEntry, ShowTooltipCommand } from 'vs/workbench/services/statusbar/browser/statusbar';nimport { WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions';nimport { IThemeService, ThemeColor } from 'vs/platform/theme/common/themeService';nimport { isThemeColor } from 'vs/editor/common/editorCommon';nimport { addDisposableListener, EventType, hide, show, append, EventHelper } from 'vs/base/browser/dom';nimport { INotificationService } from 'vs/platform/notification/common/notification';nimport { assertIsDefined } from 'vs/base/common/types';nimport { Command } from 'vs/editor/common/languages';nimport { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';nimport { KeyCode } from 'vs/base/common/keyCodes';nimport { renderIcon, renderLabelWithIcons } from 'vs/base/browser/ui/iconLabel/iconLabels';nimport { spinningLoading, syncing } from 'vs/platform/theme/common/iconRegistry';nimport { ICustomHover, setupCustomHover } from 'vs/base/browser/ui/iconLabel/iconLabelHover';nimport { isMarkdownString, markdownStringEqual } from 'vs/base/common/htmlContent';nimport { IHoverDelegate } from 'vs/base/browser/ui/iconLabel/iconHoverDelegate';nimport { Gesture, EventType as TouchEventType } from 'vs/base/browser/touch';nnexport class StatusbarEntryItem extends Disposable {nntprivate readonly label: StatusBarCodiconLabel;nntprivate entry: IStatusbarEntry 'loading') {nttif (this.currentShowProgress !== showProgress) {ntttthis.currentShowProgress = !!showProgress;ntttthis.progressCodicon = renderIcon(showProgress === 'loading' ? spinningLoading : syncing);ntt = this.currentText;ntt}nt}nntoverride set text(text: string) {nntt// Progress: insert progress codicon as first element as neededntt// but keep it stable so that the animation does not resetnttif (this.currentShowProgress) {nnttt// Append as neededntttif (this.container.firstChild !== this.progressCodicon) {nttttthis.container.appendChild(this.progressCodicon);nttt}nnttt// Remove othersntttfor (const node of (this.container.childNodes)) {nttttif (node !== this.progressCodicon) {ntttt();ntttt}nttt}nnttt// If we have text to show, add a space to separate from progressntttlet textContent = text ?? '';ntttif (textContent) {ntttttextContent = ;nttt}nnttt// Append new elementsntttappend(this.container, ...renderLabelWithIcons(textContent));ntt}nntt// No Progress: no special handlingnttelse {ntt = text;ntt}nt}n}n", "result": "/
--------------n Copyright (c) Microsoft Corporation. All rights reserved.n Licensed under the MIT License. See in the project root for license information.n *
-------------/nnimport { toErrorMessage } from 'vs/base/common/errorMessage';nimport { toErrorMessage2 } from 'vs/base/common/errorMessage2';nimport { Disposable, MutableDisposable } from 'vs/base/common/lifecycle';nimport { SimpleIconLabel } from 'vs/base/browser/ui/iconLabel/simpleIconLabel';nimport { ICommandService } from 'vs/platform/commands/common/commands';nimport { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';nimport { IStatusbarEntry, ShowTooltipCommand } from 'vs/workbench/services/statusbar/browser/statusbar';nimport { WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions';nimport { IThemeService, ThemeColor } from 'vs/platform/theme/common/themeService';nimport { isThemeColor } from 'vs/editor/common/editorCommon';nimport { addDisposableListener, EventType, hide, show, append, EventHelper } from 'vs/base/browser/dom';nimport { INotificationService } from 'vs/platform/notification/common/notification';nimport { assertIsDefined } from 'vs/base/common/types';nimport { Command } from 'vs/editor/common/languages';nimport { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';nimport { KeyCode } from 'vs/base/common/keyCodes';nimport { renderIcon, renderLabelWithIcons } from 'vs/base/browser/ui/iconLabel/iconLabels';nimport { spinningLoading, syncing } from 'vs/platform/theme/common/iconRegistry';nimport { ICustomHover, setupCustomHover } from 'vs/base/browser/ui/iconLabel/iconLabelHover';nimport { isMarkdownString, markdownStringEqual } from 'vs/base/common/htmlContent';nimport { IHoverDelegate } from 'vs/base/browser/ui/iconLabel/iconHoverDelegate';nimport { Gesture, EventType as TouchEventType } from 'vs/base/browser/touch';nnexport class StatusbarEntryItem extends Disposable {nntprivate readonly label: StatusBarCodiconLabel;nntprivate entry: IStatusbarEntry 'loading') {nttif (this.currentShowProgress !== showProgress) {ntttthis.currentShowProgress = !!showProgress;ntttthis.progressCodicon = renderIcon(showProgress === 'loading' ? spinningLoading : syncing);ntt = this.currentText;ntt}nt}nntoverride set text(text: string) {nntt// Progress: insert progress codicon as first element as neededntt// but keep it stable so that the animation does not resetnttif (this.currentShowProgress) {nnttt// Append as neededntttif (this.container.firstChild !== this.progressCodicon) {nttttthis.container.appendChild(this.progressCodicon);nttt}nnttt// Remove othersntttfor (const node of (this.container.childNodes)) {nttttif (node !== this.progressCodicon) {ntttt();ntttt}nttt}nnttt// If we have text to show, add a space to separate from progressntttlet textContent = text ?? '';ntttif (textContent) {ntttttextContent = ;nttt}nnttt// Append new elementsntttappend(this.container, ...renderLabelWithIcons(textContent));ntt}nntt// No Progress: no special handlingnttelse {ntt = text;ntt}nt}n}n", "initialResult": "/
--------------n Copyright (c) Microsoft Corporation. All rights reserved.n Licensed under the MIT License. See in the project root for license information.n *
-------------/nnimport { toErrorMessage } from 'vs/base/common/errorMessage';nimport { Disposable, MutableDisposable } from 'vs/base/common/lifecycle';nimport { SimpleIconLabel } from 'vs/base/browser/ui/iconLabel/simpleIconLabel';nimport { ICommandService } from 'vs/platform/commands/common/commands';nimport { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';nimport { IStatusbarEntry, ShowTooltipCommand } from 'vs/workbench/services/statusbar/browser/statusbar';nimport { WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions';nimport { IThemeService, ThemeColor } from 'vs/platform/theme/common/themeService';nimport { isThemeColor } from 'vs/editor/common/editorCommon';nimport { addDisposableListener, EventType, hide, show, append, EventHelper } from 'vs/base/browser/dom';nimport { INotificationService } from 'vs/platform/notification/common/notification';nimport { assertIsDefined } from 'vs/base/common/types';nimport { Command } from 'vs/editor/common/languages';nimport { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';nimport { KeyCode } from 'vs/base/common/keyCodes';nimport { renderIcon, renderLabelWithIcons } from 'vs/base/browser/ui/iconLabel/iconLabels';nimport { spinningLoading, syncing } from 'vs/platform/theme/common/iconRegistry';nimport { ICustomHover, setupCustomHover } from 'vs/base/browser/ui/iconLabel/iconLabelHover';nimport { isMarkdownString, markdownStringEqual } from 'vs/base/common/htmlContent';nimport { IHoverDelegate } from 'vs/base/browser/ui/iconLabel/iconHoverDelegate';nimport { Gesture, EventType as TouchEventType } from 'vs/base/browser/touch';nnexport class StatusbarEntryItem extends Disposable {nntprivate readonly label: StatusBarCodiconLabel;nntprivate entry: IStatusbarEntry 'loading') {nttif (this.currentShowProgress !== showProgress) {ntttthis.currentShowProgress = !!showProgress;ntttthis.progressCodicon = renderIcon(showProgress === 'loading' ? spinningLoading : syncing);ntt = this.currentText;ntt}nt}nntoverride set text(text: string) {nntt// Progress: insert progress codicon as first element as neededntt// but keep it stable so that the animation does not resetnttif (this.currentShowProgress) {nnttt// Append as neededntttif (this.container.firstChild !== this.progressCodicon) {nttttthis.container.appendChild(this.progressCodicon);nttt}nnttt// Remove othersntttfor (const node of (this.container.childNodes)) {nttttif (node !== this.progressCodicon) {ntttt();ntttt}nttt}nnttt// If we have text to show, add a space to separate from progressntttlet textContent = text ?? '';ntttif (textContent) {ntttttextContent = ;nttt}nnttt// Append new elementsntttappend(this.container, ...renderLabelWithIcons(textContent));ntt}nntt// No Progress: no special handlingnttelse {ntt = text;ntt}nt}n}n" }

Discussion:
this.domNode.appendChild(block); } const top = ctx.getVerticalOffsetForLineNumber(decoration.range.startLineNumber, true); <del> const bottom = ctx.getVerticalOffsetAfterLineNumber(decoration.range.endLineNumber, true); </del> <ins> const bottom = decoration.range.isEmpty() ? ctx.getVerticalOffsetForLineNumber(decoration.range.startLineNumber, false) : ctx.getVerticalOffsetAfterLineNumber(decoration.range.endLineNumber, true); </ins> block.setClassName('blockDecorations-block ' + decoration.options.blockClassName); block.setLeft(ctx.scrollLeft);

return new Range(this.startLineNumber, 1, this.endLineNumberExclusive - 1, Constants.MAX_SAFE_SMALL_INTEGER); } <ins> public toInclusiveRangeOrEmpty(): Range { if (this.isEmpty) { return new Range(this.startLineNumber, 1, this.startLineNumber, 1); } return new Range(this.startLineNumber, 1, this.endLineNumberExclusive - 1, Constants.MAX_SAFE_SMALL_INTEGER); } </ins> intersects(lineRange: LineRange) { return this.startLineNumber <= lineRange.endLineNumberExclusive && lineRange.startLineNumber <= this.endLineNumberExclusive;

const activeModifiedBaseRange = viewModel.activeModifiedBaseRange.read(reader); <del> const result = new Array<IModelDeltaDecoration>(); </del> <ins> const result: IModelDeltaDecoration[] = []; </ins> for (const modifiedBaseRange of model.modifiedBaseRanges.read(reader)) { const range = modifiedBaseRange.baseRange; <del> if (range && !range.isEmpty) { const blockClassNames = ['merge-editor-block']; const isHandled = model.isHandled(modifiedBaseRange).read(reader); if (isHandled) { blockClassNames.push('handled'); } if (modifiedBaseRange === activeModifiedBaseRange) { blockClassNames.push('focused'); } blockClassNames.push('base'); </del> <ins> if (!range) { continue; } </ins> <del> result.push({ range: range.toInclusiveRange()!, options: { isWholeLine: true, blockClassName: blockClassNames.join(' '), description: 'Merge Editor', minimap: { position: MinimapPosition.Gutter, color: { id: isHandled ? handledConflictMinimapOverViewRulerColor : unhandledConflictMinimapOverViewRulerColor }, }, overviewRuler: modifiedBaseRange.isConflicting ? { position: OverviewRulerLane.Center, color: { id: isHandled ? handledConflictMinimapOverViewRulerColor : unhandledConflictMinimapOverViewRulerColor }, } : undefined } }); </del> <ins> const blockClassNames = ['merge-editor-block']; const isHandled = model.isHandled(modifiedBaseRange).read(reader); if (isHandled) { blockClassNames.push('handled'); </ins> } <ins> if (modifiedBaseRange === activeModifiedBaseRange) { blockClassNames.push('focused'); } blockClassNames.push('base'); result.push({ range: range.toInclusiveRangeOrEmpty(), options: { showIfCollapsed: true, blockClassName: blockClassNames.join(' '), description: 'Merge Editor', minimap: { position: MinimapPosition.Gutter, color: { id: isHandled ? handledConflictMinimapOverViewRulerColor : unhandledConflictMinimapOverViewRulerColor }, }, overviewRuler: modifiedBaseRange.isConflicting ? { position: OverviewRulerLane.Center, color: { id: isHandled ? handledConflictMinimapOverViewRulerColor : unhandledConflictMinimapOverViewRulerColor }, } : undefined } }); </ins> } return result; });

for (const modifiedBaseRange of model.modifiedBaseRanges.read(reader)) { const range = modifiedBaseRange.getInputRange(this.inputNumber); <del> if (!range || range.isEmpty) { </del> <ins> if (!range) { </ins> continue; }

blockClassNames.push(inputClassName); result.push({ <del> range: range.toInclusiveRange()!, </del> <ins> range: range.toInclusiveRangeOrEmpty(), </ins> options: { <del> isWholeLine: true, </del> <ins> showIfCollapsed: true, </ins> blockClassName: blockClassNames.join(' '), description: 'Merge Editor', minimap: {

const modifiedBaseRange = m.left; if (modifiedBaseRange) { <del> const range = model.getLineRangeInResult(modifiedBaseRange.baseRange, reader).toInclusiveRange(); if (range) { const blockClassNames = ['merge-editor-block']; const isHandled = model.isHandled(modifiedBaseRange).read(reader); if (isHandled) { blockClassNames.push('handled'); } if (modifiedBaseRange === activeModifiedBaseRange) { blockClassNames.push('focused'); } if (modifiedBaseRange.isConflicting) { blockClassNames.push('conflicting'); } blockClassNames.push('result'); result.push({ range, options: { isWholeLine: true, blockClassName: blockClassNames.join(' '), description: 'Result Diff', minimap: { position: MinimapPosition.Gutter, color: { id: isHandled ? handledConflictMinimapOverViewRulerColor : unhandledConflictMinimapOverViewRulerColor }, }, overviewRuler: modifiedBaseRange.isConflicting ? { position: OverviewRulerLane.Center, color: { id: isHandled ? handledConflictMinimapOverViewRulerColor : unhandledConflictMinimapOverViewRulerColor }, } : undefined } }); </del> <ins> const blockClassNames = ['merge-editor-block']; const isHandled = model.isHandled(modifiedBaseRange).read(reader); if (isHandled) { blockClassNames.push('handled'); </ins> } <ins> if (modifiedBaseRange === activeModifiedBaseRange) { blockClassNames.push('focused'); } if (modifiedBaseRange.isConflicting) { blockClassNames.push('conflicting'); } blockClassNames.push('result'); result.push({ range: model.getLineRangeInResult(modifiedBaseRange.baseRange, reader).toInclusiveRangeOrEmpty(), options: { showIfCollapsed: true, blockClassName: blockClassNames.join(' '), description: 'Result Diff', minimap: { position: MinimapPosition.Gutter, color: { id: isHandled ? handledConflictMinimapOverViewRulerColor : unhandledConflictMinimapOverViewRulerColor }, }, overviewRuler: modifiedBaseRange.isConflicting ? { position: OverviewRulerLane.Center, color: { id: isHandled ? handledConflictMinimapOverViewRulerColor : unhandledConflictMinimapOverViewRulerColor }, } : undefined } }); </ins> }