aboutsummaryrefslogtreecommitdiffstats
path: root/language-ide
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <marussy@mit.bme.hu>2021-10-31 19:41:24 +0100
committerLibravatar GitHub <noreply@github.com>2021-10-31 19:41:24 +0100
commit7918d78948de7f349f9948837caf76f2a514c96c (patch)
tree0f7c24a9e0046dffd719d6a66be4a1f73b7fa4c7 /language-ide
parentMerge pull request #7 from golej-marci/language-to-store (diff)
parentchore: bump dependency versions (diff)
downloadrefinery-7918d78948de7f349f9948837caf76f2a514c96c.tar.gz
refinery-7918d78948de7f349f9948837caf76f2a514c96c.tar.zst
refinery-7918d78948de7f349f9948837caf76f2a514c96c.zip
Merge pull request #8 from kris7t/cm6
Switch to CodeMirror 6 editor and WebSocket-based transport for Xtext
Diffstat (limited to 'language-ide')
-rw-r--r--language-ide/src/main/java/tools/refinery/language/ide/ProblemIdeModule.java8
-rw-r--r--language-ide/src/main/java/tools/refinery/language/ide/contentassist/FuzzyMatcher.java44
-rw-r--r--language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java51
3 files changed, 65 insertions, 38 deletions
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 @@
3 */ 3 */
4package tools.refinery.language.ide; 4package tools.refinery.language.ide;
5 5
6import org.eclipse.xtext.ide.editor.contentassist.IPrefixMatcher;
6import org.eclipse.xtext.ide.editor.syntaxcoloring.ISemanticHighlightingCalculator; 7import org.eclipse.xtext.ide.editor.syntaxcoloring.ISemanticHighlightingCalculator;
7 8
9import tools.refinery.language.ide.contentassist.FuzzyMatcher;
8import tools.refinery.language.ide.syntaxcoloring.ProblemSemanticHighlightingCalculator; 10import tools.refinery.language.ide.syntaxcoloring.ProblemSemanticHighlightingCalculator;
9 11
10/** 12/**
11 * Use this class to register ide components. 13 * Use this class to register ide components.
12 */ 14 */
13public class ProblemIdeModule extends AbstractProblemIdeModule { 15public class ProblemIdeModule extends AbstractProblemIdeModule {
14
15 public Class<? extends ISemanticHighlightingCalculator> bindISemanticHighlightingCalculator() { 16 public Class<? extends ISemanticHighlightingCalculator> bindISemanticHighlightingCalculator() {
16 return ProblemSemanticHighlightingCalculator.class; 17 return ProblemSemanticHighlightingCalculator.class;
17 } 18 }
19
20 @Override
21 public Class<? extends IPrefixMatcher> bindIPrefixMatcher() {
22 return FuzzyMatcher.class;
23 }
18} 24}
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 @@
1package tools.refinery.language.ide.contentassist;
2
3import org.eclipse.xtext.ide.editor.contentassist.IPrefixMatcher;
4
5import com.google.inject.Singleton;
6
7/**
8 * Implements the candidate matching algoritm used by CodeMirror 6.
9 *
10 * Using this class ensures that the same candidates will be returned when
11 * filtering content assist proposals on the server as on the client.
12 *
13 * The matching is "fuzzy" (<code>fzf</code>-like), i.e., the prefix characters
14 * may occur anywhere in the name, but must be in the same order as in the
15 * prefix.
16 *
17 * @author Kristóf Marussy
18 */
19@Singleton
20public class FuzzyMatcher implements IPrefixMatcher {
21 @Override
22 public boolean isCandidateMatchingPrefix(String name, String prefix) {
23 var nameIgnoreCase = name.toLowerCase();
24 var prefixIgnoreCase = prefix.toLowerCase();
25 int prefixLength = prefixIgnoreCase.length();
26 if (prefixLength == 0) {
27 return true;
28 }
29 int nameLength = nameIgnoreCase.length();
30 if (prefixLength > nameLength) {
31 return false;
32 }
33 int prefixIndex = 0;
34 for (int nameIndex = 0; nameIndex < nameLength; nameIndex++) {
35 if (nameIgnoreCase.charAt(nameIndex) == prefixIgnoreCase.charAt(prefixIndex)) {
36 prefixIndex++;
37 if (prefixIndex == prefixLength) {
38 return true;
39 }
40 }
41 }
42 return false;
43 }
44}
diff --git a/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java b/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
index 76a67f96..d9abf12d 100644
--- a/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
+++ b/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
@@ -17,30 +17,20 @@ import com.google.inject.Inject;
17 17
18import tools.refinery.language.model.ProblemUtil; 18import tools.refinery.language.model.ProblemUtil;
19import tools.refinery.language.model.problem.ClassDeclaration; 19import tools.refinery.language.model.problem.ClassDeclaration;
20import tools.refinery.language.model.problem.EnumDeclaration;
21import tools.refinery.language.model.problem.NamedElement; 20import tools.refinery.language.model.problem.NamedElement;
22import tools.refinery.language.model.problem.Node; 21import tools.refinery.language.model.problem.Node;
23import tools.refinery.language.model.problem.Parameter;
24import tools.refinery.language.model.problem.PredicateDefinition; 22import tools.refinery.language.model.problem.PredicateDefinition;
25import tools.refinery.language.model.problem.ProblemPackage; 23import tools.refinery.language.model.problem.ProblemPackage;
26import tools.refinery.language.model.problem.ReferenceDeclaration; 24import tools.refinery.language.model.problem.ReferenceDeclaration;
27import tools.refinery.language.model.problem.Variable;
28 25
29public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighlightingCalculator { 26public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighlightingCalculator {
30 private static final String BUILTIN_CLASS = "cm-keyword"; 27 private static final String BUILTIN_CLASS = "builtin";
31 private static final String CLASS_CLASS = "problem-class"; 28 private static final String ABSTRACT_CLASS = "abstract";
32 private static final String ABSTRACT_CLASS = "problem-abstract"; 29 private static final String CONTAINMENT_CLASS = "containment";
33 private static final String ENUM_CLASS = "problem-enum"; 30 private static final String ERROR_CLASS = "error";
34 private static final String REFERENCE_CLASS = "problem-reference"; 31 private static final String NODE_CLASS = "node";
35 private static final String CONTAINMENT_CLASS = "problem-containment"; 32 private static final String UNIQUE_NODE_CLASS = "unique";
36 private static final String PREDICATE_CLASS = "problem-predicate"; 33 private static final String NEW_NODE_CLASS = "new";
37 private static final String ERROR_CLASS = "problem-error";
38 private static final String NODE_CLASS = "problem-node";
39 private static final String UNIQUE_NODE_CLASS = "problem-unique-node";
40 private static final String NEW_NODE_CLASS = "problem-new-node";
41 private static final String PARAMETER_CLASS = "problem-parameter";
42 private static final String VARIABLE_CLASS = "problem-variable";
43 private static final String SINGLETON_VARIABLE_CLASS = "problem-singleton-variable";
44 34
45 @Inject 35 @Inject
46 private OperationCanceledManager operationCanceledManager; 36 private OperationCanceledManager operationCanceledManager;
@@ -57,7 +47,7 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli
57 if (!(object instanceof NamedElement)) { 47 if (!(object instanceof NamedElement)) {
58 return; 48 return;
59 } 49 }
60 String[] highlightClass = getHighlightClass(object); 50 String[] highlightClass = getHighlightClass(object, null);
61 if (highlightClass.length > 0) { 51 if (highlightClass.length > 0) {
62 highlightFeature(acceptor, object, ProblemPackage.Literals.NAMED_ELEMENT__NAME, highlightClass); 52 highlightFeature(acceptor, object, ProblemPackage.Literals.NAMED_ELEMENT__NAME, highlightClass);
63 } 53 }
@@ -80,7 +70,7 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli
80 70
81 protected void highlightSingleValue(EObject object, EReference reference, IHighlightedPositionAcceptor acceptor) { 71 protected void highlightSingleValue(EObject object, EReference reference, IHighlightedPositionAcceptor acceptor) {
82 EObject valueObj = (EObject) object.eGet(reference); 72 EObject valueObj = (EObject) object.eGet(reference);
83 String[] highlightClass = getHighlightClass(valueObj); 73 String[] highlightClass = getHighlightClass(valueObj, reference);
84 if (highlightClass.length > 0) { 74 if (highlightClass.length > 0) {
85 highlightFeature(acceptor, object, reference, highlightClass); 75 highlightFeature(acceptor, object, reference, highlightClass);
86 } 76 }
@@ -94,41 +84,37 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli
94 for (var i = 0; i < size; i++) { 84 for (var i = 0; i < size; i++) {
95 EObject valueInList = values.get(i); 85 EObject valueInList = values.get(i);
96 INode node = nodes.get(i); 86 INode node = nodes.get(i);
97 String[] highlightClass = getHighlightClass(valueInList); 87 String[] highlightClass = getHighlightClass(valueInList, reference);
98 if (highlightClass.length > 0) { 88 if (highlightClass.length > 0) {
99 highlightNode(acceptor, node, highlightClass); 89 highlightNode(acceptor, node, highlightClass);
100 } 90 }
101 } 91 }
102 } 92 }
103 93
104 protected String[] getHighlightClass(EObject eObject) { 94 protected String[] getHighlightClass(EObject eObject, EReference reference) {
105 if (ProblemUtil.isBuiltIn(eObject)) { 95 if (ProblemUtil.isBuiltIn(eObject)) {
106 return new String[] { BUILTIN_CLASS }; 96 return new String[] { BUILTIN_CLASS };
107 } 97 }
108 ImmutableList.Builder<String> classesBuilder = ImmutableList.builder(); 98 ImmutableList.Builder<String> classesBuilder = ImmutableList.builder();
109 if (eObject instanceof ClassDeclaration classDeclaration) { 99 if (eObject instanceof ClassDeclaration classDeclaration) {
110 classesBuilder.add(CLASS_CLASS);
111 if (classDeclaration.isAbstract()) { 100 if (classDeclaration.isAbstract()) {
112 classesBuilder.add(ABSTRACT_CLASS); 101 classesBuilder.add(ABSTRACT_CLASS);
113 } 102 }
114 } 103 }
115 if (eObject instanceof EnumDeclaration) {
116 classesBuilder.add(ENUM_CLASS);
117 }
118 if (eObject instanceof ReferenceDeclaration referenceDeclaration) { 104 if (eObject instanceof ReferenceDeclaration referenceDeclaration) {
119 classesBuilder.add(REFERENCE_CLASS);
120 if (referenceDeclaration.isContainment()) { 105 if (referenceDeclaration.isContainment()) {
121 classesBuilder.add(CONTAINMENT_CLASS); 106 classesBuilder.add(CONTAINMENT_CLASS);
122 } 107 }
123 } 108 }
124 if (eObject instanceof PredicateDefinition predicateDefinition) { 109 if (eObject instanceof PredicateDefinition predicateDefinition) {
125 classesBuilder.add(PREDICATE_CLASS);
126 if (predicateDefinition.isError()) { 110 if (predicateDefinition.isError()) {
127 classesBuilder.add(ERROR_CLASS); 111 classesBuilder.add(ERROR_CLASS);
128 } 112 }
129 } 113 }
130 if (eObject instanceof Node node) { 114 if (eObject instanceof Node node) {
131 classesBuilder.add(NODE_CLASS); 115 if (reference == ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__VARIABLE_OR_NODE) {
116 classesBuilder.add(NODE_CLASS);
117 }
132 if (ProblemUtil.isUniqueNode(node)) { 118 if (ProblemUtil.isUniqueNode(node)) {
133 classesBuilder.add(UNIQUE_NODE_CLASS); 119 classesBuilder.add(UNIQUE_NODE_CLASS);
134 } 120 }
@@ -136,15 +122,6 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli
136 classesBuilder.add(NEW_NODE_CLASS); 122 classesBuilder.add(NEW_NODE_CLASS);
137 } 123 }
138 } 124 }
139 if (eObject instanceof Parameter) {
140 classesBuilder.add(PARAMETER_CLASS);
141 }
142 if (eObject instanceof Variable variable) {
143 classesBuilder.add(VARIABLE_CLASS);
144 if (ProblemUtil.isSingletonVariable(variable)) {
145 classesBuilder.add(SINGLETON_VARIABLE_CLASS);
146 }
147 }
148 List<String> classes = classesBuilder.build(); 125 List<String> classes = classesBuilder.build();
149 return classes.toArray(new String[0]); 126 return classes.toArray(new String[0]);
150 } 127 }