diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/SoftWrapEngine.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/SoftWrapEngine.java index 7c36a57ee28d..6805f8df4360 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/SoftWrapEngine.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/SoftWrapEngine.java @@ -79,7 +79,8 @@ public final class SoftWrapEngine { var customWraps = myEditor.getCustomWrapModel().getWrapsInRange(startOffset, maxEndOffset); var grid = myEditor.getCharacterGrid(); - if (grid != null && inlineInlays.isEmpty() && afterLineEndInlays.isEmpty() && customWraps.isEmpty()) { + if (grid != null && inlineInlays.isEmpty() && afterLineEndInlays.isEmpty() && customWraps.isEmpty() + && !SoftWrapHelper.hasCollapsedOffsetsIn(myEditor.getFoldingModel(), startOffset, maxEndOffset)) { generateGridSoftWraps(grid, startOffset, minEndOffset, maxEndOffset); return; } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/SoftWrapHelper.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/SoftWrapHelper.java index 1fc175da3ab6..584e6f5bea7f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/SoftWrapHelper.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/SoftWrapHelper.java @@ -4,11 +4,13 @@ package com.intellij.openapi.editor.impl.softwrap; import com.intellij.openapi.editor.CustomWrapModel; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.FoldRegion; import com.intellij.openapi.editor.SoftWrap; import com.intellij.openapi.editor.SoftWrapModel; import com.intellij.openapi.editor.VisualPosition; import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.editor.event.DocumentListener; +import com.intellij.openapi.editor.ex.FoldingModelEx; import com.intellij.openapi.editor.ex.util.EditorUtil; import com.intellij.openapi.editor.impl.CaretImpl; import com.intellij.openapi.editor.impl.EditorImpl; @@ -131,4 +133,18 @@ public final class SoftWrapHelper { storage.removeCustomWrapsInRange(srcOffset, srcOffset + event.getNewLength() + /* end-inclusive */ 1); } } + + /** + * Answers whether there are any offsets collapsed by fold regions inside {@code [startOffset; endOffset)}. + *
+ * Since soft-wraps may be placed at either edge of a collapsed fold region, + * this method will not return {@code true} due to a collapsed fold region + * where {@code region.endOffset == startOffset} or where {@code region.startOffset == endOffset}. + */ + public static boolean hasCollapsedOffsetsIn(@NotNull FoldingModelEx foldingModel, int startOffset, int endOffset) { + FoldRegion[] topLevel = foldingModel.fetchTopLevel(); + if (topLevel == null) return false; + int idx = foldingModel.getLastCollapsedRegionBefore(startOffset) + 1; + return idx < topLevel.length && topLevel[idx].getStartOffset() < endOffset; + } } diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorCharacterGridSizeTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorCharacterGridSizeTest.java index 161352614f91..4e548fcacf0d 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorCharacterGridSizeTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorCharacterGridSizeTest.java @@ -37,4 +37,14 @@ public class EditorCharacterGridSizeTest extends AbstractEditorTest { assertTrue("preferred=" + preferredWidth(), preferredWidth() < CONTENT_WIDTH); } + + // IJPL-251582: The grid mode optimized soft-wrapping must not place soft-wraps inside collapsed fold regions. + public void testGridEditorWithSoftWrapOptimizationsDoesNotWrapInsideCollapsedFoldRegion() { + initText(LONG_LINE.substring(0, 20)); + configureSoftWraps(10, false); + addCollapsedFoldRegion(8, 14, "..."); // covers the grid column boundary at offset 11 + enableGridMode(); + + verifySoftWrapPositions(8); + } }