aboutsummaryrefslogtreecommitdiffstats
path: root/language-ide/src/main/java/tools/refinery/language/ide/contentassist/FuzzyMatcher.java
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;
	}
}