diff options
author | Julian Honnen | 2020-02-19 10:06:10 +0000 |
---|---|---|
committer | Roland Grunberg | 2020-02-24 16:48:37 +0000 |
commit | 93b7413003d18d7935ee495d0d7167bdca4aa0e1 (patch) | |
tree | ef5de682e2fec5328e05d4a4f14646d40b1aadd5 | |
parent | f451606a372bf23d021449d82dc3e2fdc2c7b68f (diff) | |
download | eclipse.jdt.core-93b7413003d18d7935ee495d0d7167bdca4aa0e1.tar.gz eclipse.jdt.core-93b7413003d18d7935ee495d0d7167bdca4aa0e1.tar.xz eclipse.jdt.core-93b7413003d18d7935ee495d0d7167bdca4aa0e1.zip |
Bug 560309 - [content assist] backtracking for subword matchingX20200227-1900X20200227-0700X20200227-0130X20200226-0700X20200225-1900X20200225-0700X20200224-1900S4_15_0_RC1I20200226-1800I20200226-0600I20200225-1800I20200225-0600I20200224-1800
Subword matcher backtracks and tries to find the next occurence of the
last matched word on mismatch.
E.g.: "addlistener" should match addListListener
Change-Id: I83fe869982cbe3039cc737a6fe2f427bf0b18a0c
Signed-off-by: Julian Honnen <julian.honnen@vector.com>
-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 |