diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java index 6a58f911f53..3cb4f9e293f 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java @@ -1393,6 +1393,18 @@ public class CompletionTests extends AbstractContentAssistTest { final String[] expected= { "Helper", "Helper(void)", "Helper(const Helper &)" }; assertCompletionResults(fCursorOffset, expected, ID); } + + // struct Waldo { + // Waldo(int, int); + // }; + // + // int main() { + // Waldo waldo = Waldo(/*cursor*/) + // } + public void testConstructorCallWithEmptyParentheses_509731() throws Exception { + final String[] expected = { "Waldo(const Waldo &)", "Waldo(int, int)" }; + assertCompletionResults(fCursorOffset, expected, ID); + } // template struct vector { // typedef T value_type; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CContentAssistInvocationContext.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CContentAssistInvocationContext.java index 87a2abda2dc..0ca11f5bb78 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CContentAssistInvocationContext.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CContentAssistInvocationContext.java @@ -18,6 +18,7 @@ import java.util.Map; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; +import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextViewer; import org.eclipse.ui.IEditorPart; @@ -130,8 +131,20 @@ public class CContentAssistInvocationContext extends ContentAssistInvocationCont final int invocationOffset = getInvocationOffset(); final int parseOffset = getParseOffset(); final int bound = Math.max(-1, parseOffset - 1); - final CHeuristicScanner scanner = new CHeuristicScanner(getDocument()); - final int parenthesisOffset = scanner.findOpeningPeer(invocationOffset, bound, '(', ')'); + final IDocument document = getDocument(); + final CHeuristicScanner scanner = new CHeuristicScanner(document); + int start = invocationOffset; + try { + // The documentation of CHeuristicScanner.findOpeningPeer() says + // "Note that start must not point to the closing peer, but to the first + // character being searched." + // If we are completing in between two empty parentheses with no space between them, + // this condition won't be satisfied, so we start the search one character earlier. + if (document.getChar(start) == ')') + start -= 1; + } catch (BadLocationException e) { + } + final int parenthesisOffset = scanner.findOpeningPeer(start, bound, '(', ')'); return parenthesisOffset != CHeuristicScanner.NOT_FOUND; } };