blob: fe722ca173876fb8b42033db71ef8f145ffd902f (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
package tools.refinery.language.ide.contentassist;
import org.eclipse.xtext.ide.editor.contentassist.IPrefixMatcher;
import com.google.inject.Singleton;
/**
* Implements the candidate matching algoritm used by CodeMirror 6.
*
* Using this class ensures that the same candidates will be returned when
* filtering content assist proposals on the server as on the client.
*
* The matching is "fuzzy" (<code>fzf</code>-like), i.e., the prefix characters
* may occur anywhere in the name, but must be in the same order as in the
* prefix.
*
* @author Kristóf Marussy
*/
@Singleton
public class FuzzyMatcher implements IPrefixMatcher {
@Override
public boolean isCandidateMatchingPrefix(String name, String prefix) {
var nameIgnoreCase = name.toLowerCase();
var prefixIgnoreCase = prefix.toLowerCase();
int prefixLength = prefixIgnoreCase.length();
if (prefixLength == 0) {
return true;
}
int nameLength = nameIgnoreCase.length();
if (prefixLength > nameLength) {
return false;
}
int prefixIndex = 0;
for (int nameIndex = 0; nameIndex < nameLength; nameIndex++) {
if (nameIgnoreCase.charAt(nameIndex) == prefixIgnoreCase.charAt(prefixIndex)) {
prefixIndex++;
if (prefixIndex == prefixLength) {
return true;
}
}
}
return false;
}
}
|