From 07ca5174d52599810a7d1b029749058b9dd1a5ba Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Wed, 11 Jan 2017 20:53:00 -0500 Subject: [PATCH] Bug 72391 - When completing a function, do not insert parentheses if they are already present Change-Id: Ia4beb5e7ee288c48f2dbde45b1f34a562b939cab --- .../text/contentassist2/CompletionTests.java | 8 ++++++++ .../CContentAssistInvocationContext.java | 16 ++++++++++++++++ .../DOMCompletionProposalComputer.java | 6 ++++-- 3 files changed, 28 insertions(+), 2 deletions(-) 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(';'); }