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 1a4bbac2867d..a018f4dd6000 100644 --- a/platform/platform-tests/testSrc/com/intellij/psi/util/NameUtilTest.java +++ b/platform/platform-tests/testSrc/com/intellij/psi/util/NameUtilTest.java @@ -282,6 +282,11 @@ public class NameUtilTest extends UsefulTestCase { assertOrderedEquals(new NameUtil.MinusculeMatcher("doge*st", NameUtil.MatchingCaseSensitivity.NONE).matchingFragments(sample), TextRange.from(0, 4), TextRange.from(22, 2)); + sample = "_test"; + assertOrderedEquals(new NameUtil.MinusculeMatcher("_", NameUtil.MatchingCaseSensitivity.NONE).matchingFragments(sample), + TextRange.from(0, 1)); + assertOrderedEquals(new NameUtil.MinusculeMatcher("_t", NameUtil.MatchingCaseSensitivity.NONE).matchingFragments(sample), + TextRange.from(0, 2)); } public void testMatchingDegree() { diff --git a/platform/util/src/com/intellij/psi/codeStyle/NameUtil.java b/platform/util/src/com/intellij/psi/codeStyle/NameUtil.java index c20e0b586745..7eea21fb31ea 100644 --- a/platform/util/src/com/intellij/psi/codeStyle/NameUtil.java +++ b/platform/util/src/com/intellij/psi/codeStyle/NameUtil.java @@ -486,17 +486,21 @@ public class NameUtil { while (i > 0) { FList ranges = matchName(name, patternIndex + i, nextStart); if (ranges != null) { - TextRange head = ranges.getHead(); - if (head != null && head.getStartOffset() == nameIndex + i) { - return ranges.getTail().prepend(new TextRange(nameIndex, head.getEndOffset())); - } - return ranges.prepend(TextRange.from(nameIndex, i)); + return prependRange(ranges, nameIndex, i); } i--; } return null; } + private static FList prependRange(FList ranges, int from, int to) { + TextRange head = ranges.getHead(); + if (head != null && head.getStartOffset() == from + to) { + return ranges.getTail().prepend(new TextRange(from, head.getEndOffset())); + } + return ranges.prepend(TextRange.from(from, to)); + } + private boolean isWordSeparator(char c) { return mySeparatorFunction.fun(c); } @@ -513,7 +517,12 @@ public class NameUtil { return null; } - return matchName(name, patternIndex + 1, nextStart); + final FList ranges = matchName(name, patternIndex + 1, nextStart); + if (ranges != null) { + return prependRange(ranges, patternIndex, patternIndex + 1); + } + + return ranges; } return matchName(name, patternIndex, nextStart);