Bug 538876: catch exceptions thrown in AsyncCompletionProposalPopup

Change-Id: I456288d4e02824673ac4731ec8d54a436e3cf560
Signed-off-by: Tobias Melcher <Tobias.Melcher@sap.com>
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AsyncCompletionProposalPopup.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AsyncCompletionProposalPopup.java
index 77ed304..9bcb4ef 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AsyncCompletionProposalPopup.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AsyncCompletionProposalPopup.java
@@ -33,6 +33,9 @@
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Display;
 
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.SafeRunner;
+
 import org.eclipse.jface.contentassist.IContentAssistSubjectControl;
 
 import org.eclipse.jface.text.BadLocationException;
@@ -341,11 +344,18 @@
 		List<CompletableFuture<List<ICompletionProposal>>> futures = new ArrayList<>(processors.size());
 		for (IContentAssistProcessor processor : processors) {
 			futures.add(CompletableFuture.supplyAsync(() -> {
-				ICompletionProposal[] proposals= processor.computeCompletionProposals(fViewer, invocationOffset);
-				if (proposals == null) {
-					return Collections.emptyList();
-				}
-				return Arrays.asList(proposals);
+				final List<ICompletionProposal>[] result= new List[] { null };
+				SafeRunner.run(new ISafeRunnable() {
+					@Override
+					public void run() throws Exception {
+						ICompletionProposal[] proposals= processor.computeCompletionProposals(fViewer, invocationOffset);
+						if (proposals == null) {
+							result[0]= Collections.emptyList();
+						}
+						result[0]= Arrays.asList(proposals);
+					}
+				});
+				return result[0];
 			}));
 		}
 		return futures;