Bug 575909 - AIOOBE in StyledText.setSelection via StructuredTextViewer.handleDispose Change-Id: Ie3c704137368372a720abab4ff49710e29844d3b Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.text/+/185296 Tested-by: Platform Bot <platform-bot@eclipse.org> Reviewed-by: Mickael Istria <mistria@redhat.com>
diff --git a/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/TextViewerTest.java b/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/TextViewerTest.java index e07f094..c9d83eb 100644 --- a/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/TextViewerTest.java +++ b/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/TextViewerTest.java
@@ -59,6 +59,7 @@ import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.Region; +import org.eclipse.jface.text.TextSelection; import org.eclipse.jface.text.TextViewer; import org.eclipse.jface.text.hyperlink.IHyperlink; import org.eclipse.jface.text.hyperlink.URLHyperlink; @@ -446,4 +447,12 @@ textViewer.doOperation(ITextOperationTarget.PASTE); assertEquals("a\na", textViewer.getTextWidget().getText()); } + + @Test + public void testSetSelectionNoDoc() { + Shell shell= new Shell(); + TextViewer textViewer= new TextViewer(shell, SWT.NONE); + textViewer.setSelection(TextSelection.emptySelection()); + // assert no exception is thrown + } }
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewer.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewer.java index 9af2c0a..58768f9 100644 --- a/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewer.java +++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewer.java
@@ -2299,6 +2299,9 @@ .map(rangeAsArray -> new Region(rangeAsArray[0], rangeAsArray[1])) .filter(widgetRange -> widgetRange.getOffset() >= 0) .toArray(IRegion[]::new); + if (widgetSelection.length == 0) { + return; + } int[] widgetRanges= new int[2 * widgetSelection.length]; for (int i= 0; i < widgetSelection.length; i++) { widgetRanges[2 * i]= widgetSelection[i].getOffset(); @@ -2434,7 +2437,7 @@ } if (reveal) revealRange(s.getOffset(), s.getLength()); - } else if (selection instanceof IMultiTextSelection) { + } else if (selection instanceof IMultiTextSelection && ((IMultiTextSelection) selection).getRegions().length > 1) { IMultiTextSelection multiSelection= (IMultiTextSelection) selection; setSelectedRanges(Arrays.stream(multiSelection.getRegions()) .map(region -> new Region(region.getOffset(), region.getLength()))