From bd4d43d79091622931bac3c81e6cede1809355cf Mon Sep 17 00:00:00 2001 From: Bartosz Janusz Date: Thu, 29 Jan 2026 15:07:20 +0100 Subject: [PATCH] [collab]: Adjust `lineToLocation` for unified diff to return null when exact matching is not possible (#IJPL-82603) GitOrigin-RevId: d68988bb49157c84f4d49af1f3cd12ec0648dd9d --- .../ui/codereview/diff/viewer/diffViewerUtil.kt | 2 +- platform/diff-impl/api-dump.txt | 1 + .../diff/tools/fragmented/UnifiedDiffViewer.java | 12 ++++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/platform/collaboration-tools/src/com/intellij/collaboration/ui/codereview/diff/viewer/diffViewerUtil.kt b/platform/collaboration-tools/src/com/intellij/collaboration/ui/codereview/diff/viewer/diffViewerUtil.kt index 8b3a432022e2..e17c33b54f79 100644 --- a/platform/collaboration-tools/src/com/intellij/collaboration/ui/codereview/diff/viewer/diffViewerUtil.kt +++ b/platform/collaboration-tools/src/com/intellij/collaboration/ui/codereview/diff/viewer/diffViewerUtil.kt @@ -221,7 +221,7 @@ suspend fun DiffViewerBase.showCodeReview(editorRenderer: EditorCodeReviewRender null, { (side, lineIdx) -> viewer.transferLineToOnesideStrict(side, lineIdx).takeIf { it >= 0 } }, { lineIdx -> - val (indices, side) = viewer.transferLineFromOneside(lineIdx) + val (indices, side) = viewer.transferLineFromOnesideStrict(lineIdx) ?: return@editorRenderer null side.select(indices).takeIf { it >= 0 }?.let { side to it } }, { line -> diff --git a/platform/diff-impl/api-dump.txt b/platform/diff-impl/api-dump.txt index 7353fc077eb8..20366e7baac2 100644 --- a/platform/diff-impl/api-dump.txt +++ b/platform/diff-impl/api-dump.txt @@ -841,6 +841,7 @@ c:com.intellij.diff.tools.fragmented.UnifiedDiffViewer - scrollToLine(com.intellij.diff.util.Side,I):V - transferLineFromOneside(I):com.intellij.openapi.util.Pair - transferLineFromOneside(com.intellij.diff.util.Side,I):I +- transferLineFromOnesideStrict(I):com.intellij.openapi.util.Pair - transferLineFromOnesideStrict(com.intellij.diff.util.Side,I):I - transferLineToOneside(com.intellij.diff.util.Side,I):I - transferLineToOnesideStrict(com.intellij.diff.util.Side,I):I diff --git a/platform/diff-impl/src/com/intellij/diff/tools/fragmented/UnifiedDiffViewer.java b/platform/diff-impl/src/com/intellij/diff/tools/fragmented/UnifiedDiffViewer.java index dfc53d8b6b5c..a8b82839849d 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/fragmented/UnifiedDiffViewer.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/fragmented/UnifiedDiffViewer.java @@ -582,6 +582,17 @@ public class UnifiedDiffViewer extends ListenerDiffViewerBase implements EditorD * This convertor returns 'good enough' position, even if exact matching is impossible */ public @NotNull Pair transferLineFromOneside(int line) { + return Objects.requireNonNull(transferLineFromOneside(line, false)); + } + + /* + * This convertor returns position strictly. Returns null if exact matching is not possible + */ + public @Nullable Pair transferLineFromOnesideStrict(int line) { + return transferLineFromOneside(line, true); + } + + private @Nullable Pair transferLineFromOneside(int line, boolean strictConversion) { int[] lines = new int[2]; ChangedBlockData blockData = myModel.getData(); @@ -599,6 +610,7 @@ public class UnifiedDiffViewer extends ListenerDiffViewerBase implements EditorD lines[1] = lineConvertor2.convert(line); if (lines[0] == -1 && lines[1] == -1) { + if(strictConversion) return null; lines[0] = lineConvertor1.convertApproximate(line); lines[1] = lineConvertor2.convertApproximate(line); }