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