diff --git a/java/java-tests/testData/codeInsight/completion/normal/NoForceBraces.java b/java/java-tests/testData/codeInsight/completion/normal/NoForceBraces.java index a967eee64cf0..79a7d549a5d6 100644 --- a/java/java-tests/testData/codeInsight/completion/normal/NoForceBraces.java +++ b/java/java-tests/testData/codeInsight/completion/normal/NoForceBraces.java @@ -1,6 +1,8 @@ +import java.io.File; + public class Foo { void foo(boolean flag) { - if ('\\' == File.separach) + if ('\\' == File.separaCh) System.out.println(); } } diff --git a/platform/platform-tests/testSrc/com/intellij/psi/util/NameUtilTest.java b/platform/platform-tests/testSrc/com/intellij/psi/util/NameUtilTest.java index f4a13533c64b..5fc411f7df22 100644 --- a/platform/platform-tests/testSrc/com/intellij/psi/util/NameUtilTest.java +++ b/platform/platform-tests/testSrc/com/intellij/psi/util/NameUtilTest.java @@ -226,6 +226,12 @@ public class NameUtilTest extends UsefulTestCase { assertMatches("text*:sh", "textField:shouldChangeCharactersInRange:replacementString:"); } + public void testFileStructure() { + assertMatches("hint", "height:int"); + assertDoesntMatch("Hint", "Height:int"); + assertMatches("getColor", "getBackground():Color"); + } + public void testMiddleMatchingMinimumTwoConsecutiveLettersInWordMiddle() { assertMatches("*fo", "reformat"); assertMatches("*f", "reFormat"); @@ -254,7 +260,7 @@ public class NameUtilTest extends UsefulTestCase { assertMatches("*Git", "BlaGitBla"); assertFalse(firstLetterMatcher("*Git").matches("BlagitBla")); assertMatches("*git", "BlagitBla"); - assertMatches("*Git*", "AtpGenerationItem"); + assertDoesntMatch("*Git*", "AtpGenerationItem"); assertMatches("Collec*Util*", "CollectionUtils"); assertMatches("Collec*Util*", "CollectionUtilsTest"); assertTrue(caseInsensitiveMatcher("*us").matches("usage")); @@ -307,7 +313,7 @@ public class NameUtilTest extends UsefulTestCase { assertMatches("foo", "fxOo"); assertMatches("foo", "fXOo"); assertMatches("fOo", "foo"); - assertMatches("fOo", "FaOaOaXXXX"); + assertDoesntMatch("fOo", "FaOaOaXXXX"); assertMatches("ncdfoe", "NoClassDefFoundException"); assertMatches("fob", "FOO_BAR"); assertMatches("fo_b", "FOO_BAR"); @@ -330,7 +336,7 @@ public class NameUtilTest extends UsefulTestCase { public void testFinalSpace() { assertMatches("GrDebT ", "GroovyDebuggerTest"); - assertMatches("grdebT ", "GroovyDebuggerTest"); + assertDoesntMatch("grdebT ", "GroovyDebuggerTest"); assertDoesntMatch("grdebt ", "GroovyDebuggerTest"); assertMatches("Foo ", "Foo"); assertDoesntMatch("Foo ", "FooBar"); diff --git a/platform/util/src/com/intellij/psi/codeStyle/MinusculeMatcher.java b/platform/util/src/com/intellij/psi/codeStyle/MinusculeMatcher.java index 8f15d1bd3d13..d6a3fbd2b20a 100644 --- a/platform/util/src/com/intellij/psi/codeStyle/MinusculeMatcher.java +++ b/platform/util/src/com/intellij/psi/codeStyle/MinusculeMatcher.java @@ -33,10 +33,19 @@ import static com.intellij.psi.codeStyle.NameUtil.MatchingCaseSensitivity.*; public class MinusculeMatcher implements Matcher { private final char[] myPattern; private final NameUtil.MatchingCaseSensitivity myOptions; + private final boolean myHasHumps; public MinusculeMatcher(String pattern, NameUtil.MatchingCaseSensitivity options) { myOptions = options; myPattern = StringUtil.trimEnd(pattern, "* ").toCharArray(); + for (int i = 0; i < myPattern.length; i++) { + char c = myPattern[i]; + if (Character.isUpperCase(c)) { + myHasHumps = true; + return; + } + } + myHasHumps = false; } private static FList prependRange(FList ranges, int from, int length) { @@ -159,7 +168,7 @@ public class MinusculeMatcher implements Matcher { char p = myPattern[patternIndex]; while (true) { - nameIndex = space ? indexOfWordStart(name, p, nameIndex) : StringUtil.indexOfIgnoreCase(name, p, nameIndex + 1); + nameIndex = space ? indexOfWordStart(name, patternIndex, nameIndex) : StringUtil.indexOfIgnoreCase(name, p, nameIndex + 1); if (nameIndex < 0) { return null; } @@ -188,7 +197,7 @@ public class MinusculeMatcher implements Matcher { return null; } if (myPattern[patternIndex + i] != name.charAt(nameIndex + i)) { - int nextWordStart = indexOfWordStart(name, myPattern[patternIndex + i], nameIndex + i); + int nextWordStart = indexOfWordStart(name, patternIndex + i, nameIndex + i); FList ranges = matchWildcards(name, patternIndex + i, nextWordStart); if (ranges != null) { return prependRange(ranges, nameIndex, i); @@ -202,7 +211,7 @@ public class MinusculeMatcher implements Matcher { return i >= minFragment ? FList.emptyList().prepend(TextRange.from(nameIndex, i)) : null; } while (i >= minFragment) { - int nextWordStart = isWildcard(patternIndex + i) ? nameIndex + i : indexOfWordStart(name, myPattern[patternIndex + i], nameIndex + i); + int nextWordStart = isWildcard(patternIndex + i) ? nameIndex + i : indexOfWordStart(name, patternIndex + i, nameIndex + i); FList ranges = matchWildcards(name, patternIndex + i, nextWordStart); if (ranges != null) { return prependRange(ranges, nameIndex, i); @@ -225,11 +234,13 @@ public class MinusculeMatcher implements Matcher { return myPattern[patternIndex] == c; } - private static int indexOfWordStart(String name, char p, int startFrom) { + private int indexOfWordStart(String name, int patternIndex, int startFrom) { + char p = myPattern[patternIndex]; if (p == '.' || NameUtil.isWordSeparator(p)) { return StringUtil.indexOfIgnoreCase(name, p, startFrom + 1); } - if (startFrom >= name.length()) { + if (startFrom >= name.length() || + myHasHumps && Character.isLowerCase(p) && !(patternIndex > 0 && NameUtil.isWordSeparator(myPattern[patternIndex - 1]))) { return -1; } int nextWordStart = startFrom;