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 b9cdc2b6920..aa0f913e862 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 @@ -1734,4 +1734,12 @@ public class CompletionTests extends CompletionTestBase { final String[] expected = { "B", "A", "waldo" }; assertCompletionResults(fCursorOffset, expected, ID); } + + // void waldo(); + // int main() { + // wal/*cursor*/(); + // } + public void testExistingParens_72391() throws Exception { + assertCompletionResults(new String[] { "waldo" }); // expect no parens in replacement + } } 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 0ca11f5bb78..02590fa3572 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 @@ -195,6 +195,17 @@ public class CContentAssistInvocationContext extends ContentAssistInvocationCont return token == Symbols.TokenSEMICOLON; } }; + + private final Lazy followedByOpeningParen = new Lazy() { + @Override + protected Boolean calculateValue() { + final IDocument doc = getDocument(); + final int offset = getInvocationOffset(); + final CHeuristicScanner.TokenStream tokenStream = new CHeuristicScanner.TokenStream(doc, offset); + final int token = tokenStream.nextToken(); + return token == Symbols.TokenLPAREN; + } + }; private final Lazy functionParameterDelimiter = new Lazy() { @Override @@ -452,6 +463,11 @@ public class CContentAssistInvocationContext extends ContentAssistInvocationCont assertNotDisposed(); return followedBySemicolon.value(); } + + public boolean isFollowedByOpeningParen() { + assertNotDisposed(); + return followedByOpeningParen.value(); + } public String getFunctionParameterDelimiter() { assertNotDisposed(); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/DOMCompletionProposalComputer.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/DOMCompletionProposalComputer.java index 04b9904f1dc..152814a9621 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/DOMCompletionProposalComputer.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/DOMCompletionProposalComputer.java @@ -648,7 +648,7 @@ public class DOMCompletionProposalComputer extends ParsingBasedProposalComputer boolean inUsingDeclaration = cContext.isInUsingDirective(); - if (canBeCall) { + if (canBeCall && !cContext.isFollowedByOpeningParen()) { // If we might be calling the function in this context, assume we are // (since that's the most common case) and emit parentheses. repStringBuff.append('(');