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()))