From f670acdd6ceaa0ff46d3117aa2c09700862531b4 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 2 Oct 2013 16:33:44 +0200 Subject: [PATCH] IDEA-114317 Can't word-complete inside a string literal --- .../completion/HippieCompletionTest.groovy | 18 +++++++++++ .../actions/HippieWordCompletionHandler.java | 31 ++++++++++++------- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/HippieCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/HippieCompletionTest.groovy index e1250ef62019..16ca708560a6 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/HippieCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/HippieCompletionTest.groovy @@ -95,6 +95,24 @@ comment3 ''' } + public void "test complete in string literal"() { + myFixture.configureByText "a.java", ''' +class Foo { + public Collection allInScope(@NotNull GlobalSearchScope scope) { + System.out.println("allInSco: " + scope); + } +} +''' + complete() + myFixture.checkResult ''' +class Foo { + public Collection allInScope(@NotNull GlobalSearchScope scope) { + System.out.println("allInScope: " + scope); + } +} +''' + } + private void complete() { myFixture.performEditorAction(IdeActions.ACTION_HIPPIE_COMPLETION) } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/actions/HippieWordCompletionHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/actions/HippieWordCompletionHandler.java index 1660195ddf65..2565b37467bf 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/actions/HippieWordCompletionHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/actions/HippieWordCompletionHandler.java @@ -34,7 +34,6 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiFile; -import com.intellij.util.text.CharArrayUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -279,18 +278,28 @@ public class HippieWordCompletionHandler implements CodeInsightActionHandler { while (!iterator.atEnd()) { int start = iterator.getStart(); int end = iterator.getEnd(); - while (start < end) { - int nextWs = StringUtil.indexOfAny(chars, WHITESPACE_CHARS, start, end); - if (nextWs < 0) { - if (isWordLike(chars, start, end) && !processor.processToken(start, end)) { - return; - } - break; - } - if (isWordLike(chars, start, end) && !processor.processToken(start, nextWs)) { + if (StringUtil.indexOfAny(chars, WHITESPACE_CHARS, start, end) < 0) { + //a single token without whitespace, consider it one word, even if it's an identifier with '-' inside + if (isWordLike(chars, start, end) && !processor.processToken(start, end)) { return; } - start = CharArrayUtil.shiftForward(chars, nextWs, WHITESPACE_CHARS); + iterator.advance(); + continue; + } + + // a token with whitespace inside (a string literal or comment) + // use the default java-identifier notion of word + while (start < end) { + int wordStart = start; + while (wordStart < end && !Character.isJavaIdentifierPart(chars.charAt(wordStart))) wordStart++; + + int wordEnd = wordStart; + while (wordEnd < end && Character.isJavaIdentifierPart(chars.charAt(wordEnd))) wordEnd++; + + if (!processor.processToken(wordStart, wordEnd)) { + return; + } + start = wordEnd + 1; } iterator.advance(); }