From a7ba55f2b781544cd74927137025f2c00a398f69 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sun, 31 Oct 2021 01:53:11 +0200 Subject: fix(web): fix server-side content assist filtering --- .../refinery/language/ide/ProblemIdeModule.java | 8 +++- .../language/ide/contentassist/FuzzyMatcher.java | 44 ++++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 language-ide/src/main/java/tools/refinery/language/ide/contentassist/FuzzyMatcher.java (limited to 'language-ide') diff --git a/language-ide/src/main/java/tools/refinery/language/ide/ProblemIdeModule.java b/language-ide/src/main/java/tools/refinery/language/ide/ProblemIdeModule.java index 5327f7b4..3502c29f 100644 --- a/language-ide/src/main/java/tools/refinery/language/ide/ProblemIdeModule.java +++ b/language-ide/src/main/java/tools/refinery/language/ide/ProblemIdeModule.java @@ -3,16 +3,22 @@ */ package tools.refinery.language.ide; +import org.eclipse.xtext.ide.editor.contentassist.IPrefixMatcher; import org.eclipse.xtext.ide.editor.syntaxcoloring.ISemanticHighlightingCalculator; +import tools.refinery.language.ide.contentassist.FuzzyMatcher; import tools.refinery.language.ide.syntaxcoloring.ProblemSemanticHighlightingCalculator; /** * Use this class to register ide components. */ public class ProblemIdeModule extends AbstractProblemIdeModule { - public Class bindISemanticHighlightingCalculator() { return ProblemSemanticHighlightingCalculator.class; } + + @Override + public Class bindIPrefixMatcher() { + return FuzzyMatcher.class; + } } diff --git a/language-ide/src/main/java/tools/refinery/language/ide/contentassist/FuzzyMatcher.java b/language-ide/src/main/java/tools/refinery/language/ide/contentassist/FuzzyMatcher.java new file mode 100644 index 00000000..fe722ca1 --- /dev/null +++ b/language-ide/src/main/java/tools/refinery/language/ide/contentassist/FuzzyMatcher.java @@ -0,0 +1,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" (fzf-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; + } +} -- cgit v1.2.3-70-g09d2