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 04b8ee4b0f2..cc64d398d4e 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 @@ -1676,4 +1676,12 @@ public class CompletionTests extends CompletionTestBase { assertCompletionResults(fCursorOffset, expected, ID); assertDotReplacedWithArrow(); } + + // 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 0e776ed617a..cd0be417b6d 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 @@ -614,8 +614,10 @@ public class DOMCompletionProposalComputer extends ParsingBasedProposalComputer // Instead, emitting a semicolon is useful. boolean inUsingDeclaration = context.isInUsingDirective(); if (!inUsingDeclaration) { - repStringBuff.append('('); - repStringBuff.append(')'); + if (!context.isFollowedByOpeningParen()) { + repStringBuff.append('('); + repStringBuff.append(')'); + } } else if (!context.isFollowedBySemicolon()) { repStringBuff.append(';'); }