diff --git a/java/java-tests/testData/codeInsight/completion/normalSorting/DispreferUnderscoredCaseMatch.java b/java/java-tests/testData/codeInsight/completion/normalSorting/DispreferUnderscoredCaseMatch.java new file mode 100644 index 000000000000..21ba4e5aa742 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normalSorting/DispreferUnderscoredCaseMatch.java @@ -0,0 +1,5 @@ +class Zoo { + void zoo(String fooBar, String __foo_bar) { + foo + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionOrderingTest.groovy b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionOrderingTest.groovy index 46257504acf2..f44f25fd1adf 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionOrderingTest.groovy +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionOrderingTest.groovy @@ -443,6 +443,10 @@ interface TxANotAnno {} checkPreferredItems(0, 'fooBar', '_fooBar', 'FooBar') } + void testDispreferUnderscoredCaseMatch() { + checkPreferredItems(0, 'fooBar', '__foo_bar') + } + void testStatisticsMattersOnNextCompletion() { configureByFile(getTestName(false) + ".java") myFixture.completeBasic() diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CamelHumpMatcher.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CamelHumpMatcher.java index 73923b6e395c..9fc55743281d 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CamelHumpMatcher.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CamelHumpMatcher.java @@ -63,14 +63,26 @@ public class CamelHumpMatcher extends PrefixMatcher { @Override public boolean prefixMatches(@NotNull final String name) { if (name.startsWith("_") && - myPrefix.length() > 0 && Character.isLetter(myPrefix.charAt(0)) && - CodeInsightSettings.getInstance().COMPLETION_CASE_SENSITIVE == CodeInsightSettings.FIRST_LETTER) { + CodeInsightSettings.getInstance().COMPLETION_CASE_SENSITIVE == CodeInsightSettings.FIRST_LETTER && + firstLetterCaseDiffers(name)) { return false; } return myMatcher.matches(name); } + private boolean firstLetterCaseDiffers(String name) { + int nameFirst = skipUnderscores(name); + int prefixFirst = skipUnderscores(myPrefix); + return nameFirst < name.length() && + prefixFirst < myPrefix.length() && + caseDiffers(name.charAt(nameFirst), myPrefix.charAt(prefixFirst)); + } + + private static boolean caseDiffers(char c1, char c2) { + return Character.isLowerCase(c1) != Character.isLowerCase(c2) || Character.isUpperCase(c1) != Character.isUpperCase(c2); + } + @Override public boolean prefixMatches(@NotNull final LookupElement element) { return prefixMatchersInternal(element, !element.isCaseSensitive()); diff --git a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java index b99354a514ba..39f3698a7e89 100644 --- a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java +++ b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java @@ -23,6 +23,7 @@ import com.intellij.codeInsight.lookup.Lookup; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.testFramework.PsiTestUtil; +import com.jetbrains.python.documentation.PyDocumentationSettings; import com.jetbrains.python.documentation.docstrings.DocStringFormat; import com.jetbrains.python.fixtures.PyTestCase; import com.jetbrains.python.psi.LanguageLevel; @@ -1067,7 +1068,7 @@ public class PythonCompletionTest extends PyTestCase { "@six.add_metaclass(M)\n" + "class C(object):\n" + " def foo(self):\n" + - " C.bax()"); + " C.ba()"); assertNotNull(suggested); assertContainsElements(suggested, "baz"); @@ -1081,7 +1082,7 @@ public class PythonCompletionTest extends PyTestCase { "@a_m(M)\n" + "class C(object):\n" + " def foo(self):\n" + - " C.bax()"); + " C.ba()"); assertNotNull(suggested); assertContainsElements(suggested, "baz");