Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/MatchingRegionsTest.java35
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/CharOperation.java20
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

Back to the top