diff options
author | Mickael Istria | 2020-01-09 14:55:24 +0000 |
---|---|---|
committer | Mickael Istria | 2020-01-13 11:23:01 +0000 |
commit | a3110fbed8b66c72a375fe1f219af881f7cd9586 (patch) | |
tree | 77e90edbeb006d32541ed936f625a9f69a4e20dc | |
parent | ccfc9dd2865f142e45c13562bdca365ebb2c8861 (diff) | |
download | eclipse.platform.text-a3110fbed8b66c72a375fe1f219af881f7cd9586.tar.gz eclipse.platform.text-a3110fbed8b66c72a375fe1f219af881f7cd9586.tar.xz eclipse.platform.text-a3110fbed8b66c72a375fe1f219af881f7cd9586.zip |
Bug 558921 - NPE in async content assist with insert common prefix
Change-Id: Ibcfea620c5c7c5a8cdad2d00322403523cad7201
Signed-off-by: Mickael Istria <mistria@redhat.com>
2 files changed, 58 insertions, 2 deletions
diff --git a/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/contentassist/AsyncContentAssistTest.java b/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/contentassist/AsyncContentAssistTest.java index 010726589ff..5976c1b4290 100644 --- a/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/contentassist/AsyncContentAssistTest.java +++ b/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/contentassist/AsyncContentAssistTest.java @@ -15,13 +15,24 @@ package org.eclipse.jface.text.tests.contentassist; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableItem; +import org.eclipse.swt.widgets.Widget; import org.eclipse.core.runtime.ILogListener; import org.eclipse.core.runtime.IStatus; @@ -84,4 +95,49 @@ public class AsyncContentAssistTest { DisplayHelper.sleep(shell.getDisplay(), 1000); assertNull(errorStatus); } + + @Test + public void testCompletePrefix() { + Shell shell = new Shell(); + shell.setLayout(new FillLayout()); + shell.setSize(500, 300); + SourceViewer viewer = new SourceViewer(shell, null, SWT.NONE); + Document document = new Document("b"); + viewer.setDocument(document); + viewer.setSelectedRange(1, 0); + ContentAssistant contentAssistant = new ContentAssistant(true); + contentAssistant.addContentAssistProcessor(new BarContentAssistProcessor(), IDocument.DEFAULT_CONTENT_TYPE); + contentAssistant.enablePrefixCompletion(true); + contentAssistant.install(viewer); + shell.open(); + Display display = shell.getDisplay(); + final Set<Shell> beforeShells = Arrays.stream(display.getShells()).filter(Shell::isVisible).collect(Collectors.toSet()); + contentAssistant.showPossibleCompletions(); + assertTrue("Completion item not shown", new DisplayHelper() { + @Override + protected boolean condition() { + Set<Shell> newShells = Arrays.stream(display.getShells()).filter(Shell::isVisible).collect(Collectors.toSet()); + newShells.removeAll(beforeShells); + if (!newShells.isEmpty()) { + Table completionTable = findCompletionSelectionControl(newShells.iterator().next()); + return Arrays.stream(completionTable.getItems()).map(TableItem::getText).anyMatch(item -> item.contains(BarContentAssistProcessor.PROPOSAL.substring(document.getLength()))); + } + return false; + } + }.waitForCondition(display, 2000)); + } + + private static Table findCompletionSelectionControl(Widget control) { + if (control instanceof Table) { + return (Table)control; + } else if (control instanceof Composite) { + for (Widget child : ((Composite)control).getChildren()) { + Table res = findCompletionSelectionControl(child); + if (res != null) { + return res; + } + } + } + return null; + } } 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 e39bc2f3043..3395dc51364 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 @@ -286,15 +286,15 @@ class AsyncCompletionProposalPopup extends CompletionProposalPopup { computeAndPopulateProposals(fInvocationOffset, (List<ICompletionProposal> proposals) -> { ensureDocumentListenerInstalled(); + fFilteredProposals= proposals; if (!proposals.isEmpty() && completeCommonPrefix()) { hide(); } else { - fFilteredProposals= proposals; setProposals(proposals, false); displayProposals(); } }, true, false, true); - fFilteredProposals= new ArrayList<>(fComputedProposals); + fFilteredProposals= new ArrayList<>(fComputedProposals != null ? fComputedProposals : Collections.emptyList()); return getErrorMessage(); } |