diff options
-rw-r--r-- | org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/MatchingRegionsTest.java | 35 | ||||
-rw-r--r-- | org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/CharOperation.java | 20 |
2 files changed, 49 insertions, 6 deletions
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/MatchingRegionsTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/MatchingRegionsTest.java index c045fbfe07..87f70a3e2a 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/MatchingRegionsTest.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/MatchingRegionsTest.java @@ -1554,4 +1554,39 @@ public void testSubword2() { assertEquals("Unexpected regions length", 4, regions.length); assertEquals("Unexpected matching regions", "[add]Enlist[List]ener", printRegions(name, regions)); } +public void testSubword_backtrack() { + String name = "addListListener"; + int[] regions = SearchPattern.getMatchingRegions("addlisten", name, SearchPattern.R_SUBWORD_MATCH); + assertEquals("Unexpected matching regions", "[add]List[Listen]er", printRegions(name, regions)); +} +public void testSubword_backtrackAndFail() { + String name = "addListString"; + int[] regions = SearchPattern.getMatchingRegions("addlisten", name, SearchPattern.R_SUBWORD_MATCH); + assertEquals("Unexpected matching regions", null, printRegions(name, regions)); +} +public void testSubword_backtrackTwice() { + String name = "addListListenListener"; + int[] regions = SearchPattern.getMatchingRegions("addlistener", name, SearchPattern.R_SUBWORD_MATCH); + assertEquals("Unexpected matching regions", "[add]ListListen[Listener]", printRegions(name, regions)); +} +public void testSubword_backtrackWithin() { + String name = "addListListenerWordTest"; + int[] regions = SearchPattern.getMatchingRegions("addlistentest", name, SearchPattern.R_SUBWORD_MATCH); + assertEquals("Unexpected matching regions", "[add]List[Listen]erWord[Test]", printRegions(name, regions)); +} +public void testSubword_backtrackWithinAndFail() { + String name = "addListListenerWordTest"; + int[] regions = SearchPattern.getMatchingRegions("addlistentestnotfound", name, SearchPattern.R_SUBWORD_MATCH); + assertEquals("Unexpected matching regions", null, printRegions(name, regions)); +} +public void testSubword_backtrackStart() { + String name = "listListener"; + int[] regions = SearchPattern.getMatchingRegions("listener", name, SearchPattern.R_SUBWORD_MATCH); + assertEquals("Unexpected matching regions", "list[Listener]", printRegions(name, regions)); +} +public void testSubword_backtrackStartAndFail() { + String name = "listString"; + int[] regions = SearchPattern.getMatchingRegions("listener", name, SearchPattern.R_SUBWORD_MATCH); + assertEquals("Unexpected matching regions", null, printRegions(name, regions)); +} } diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/CharOperation.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/CharOperation.java index de9d9e79fe..51fab857c5 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/CharOperation.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/CharOperation.java @@ -813,6 +813,7 @@ public static final int[] getSubWordMatchingRegions(String pattern, String name) // Main loop is on pattern characters int iName = -1; + int iPatternWordStart = 0; for (int iPattern = 0; iPattern < pattern.length(); iPattern++) { iName++; if (iName == nameChars.length){ @@ -828,11 +829,6 @@ public static final int[] getSubWordMatchingRegions(String pattern, String name) continue; } - // lower case pattern also matches upper case name - if (ScannerHelper.toLowerCase(nameChar) == patternChar) { - continue; - } - // not matching, record previous segment and find next word match in name if (iName > segmentStart) { segments = Arrays.copyOf(segments, segments.length + 2); @@ -842,12 +838,24 @@ public static final int[] getSubWordMatchingRegions(String pattern, String name) int wordStart = indexOfWordStart(nameChars, iName, patternChar); if (wordStart < 0) { - // We have exhausted name (and not pattern), so it's not a match + // no matching word found, backtrack and try to find next occurrence of current word + int next = indexOfWordStart(nameChars, iName, pattern.charAt(iPatternWordStart)); + if (next > 0) { + wordStart = next; + iPattern = iPatternWordStart; + // last recorded segment was invalid -> drop it + segments = Arrays.copyOfRange(segments, 0, segments.length - 2); + } + } + + if (wordStart < 0) { + // We have exhausted name (and not pattern), so it's not a match return null; } segmentStart = wordStart; iName = wordStart; + iPatternWordStart = iPattern; } // we have exhausted pattern, record final segment |