aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java')
-rw-r--r--subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java40
1 files changed, 27 insertions, 13 deletions
diff --git a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
index ae8c70e0..f64d4066 100644
--- a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
+++ b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
@@ -1,5 +1,5 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
@@ -38,9 +38,12 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli
38 @Inject 38 @Inject
39 private ProblemDesugarer desugarer; 39 private ProblemDesugarer desugarer;
40 40
41 @Inject
42 private TypeHashProvider typeHashProvider;
43
41 @Override 44 @Override
42 protected boolean highlightElement(EObject object, IHighlightedPositionAcceptor acceptor, 45 protected boolean highlightElement(EObject object, IHighlightedPositionAcceptor acceptor,
43 CancelIndicator cancelIndicator) { 46 CancelIndicator cancelIndicator) {
44 highlightName(object, acceptor); 47 highlightName(object, acceptor);
45 highlightCrossReferences(object, acceptor, cancelIndicator); 48 highlightCrossReferences(object, acceptor, cancelIndicator);
46 return false; 49 return false;
@@ -57,7 +60,7 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli
57 } 60 }
58 61
59 protected void highlightCrossReferences(EObject object, IHighlightedPositionAcceptor acceptor, 62 protected void highlightCrossReferences(EObject object, IHighlightedPositionAcceptor acceptor,
60 CancelIndicator cancelIndicator) { 63 CancelIndicator cancelIndicator) {
61 for (EReference reference : object.eClass().getEAllReferences()) { 64 for (EReference reference : object.eClass().getEAllReferences()) {
62 if (reference.isContainment()) { 65 if (reference.isContainment()) {
63 continue; 66 continue;
@@ -98,7 +101,7 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli
98 boolean isError = ProblemUtil.isError(eObject); 101 boolean isError = ProblemUtil.isError(eObject);
99 if (ProblemUtil.isBuiltIn(eObject)) { 102 if (ProblemUtil.isBuiltIn(eObject)) {
100 var className = isError ? ERROR_CLASS : BUILTIN_CLASS; 103 var className = isError ? ERROR_CLASS : BUILTIN_CLASS;
101 return new String[] { className }; 104 return new String[]{className};
102 } 105 }
103 return getUserDefinedElementHighlightClass(eObject, reference, isError); 106 return getUserDefinedElementHighlightClass(eObject, reference, isError);
104 } 107 }
@@ -113,21 +116,32 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli
113 && desugarer.isContainmentReference(referenceDeclaration)) { 116 && desugarer.isContainmentReference(referenceDeclaration)) {
114 classesBuilder.add(CONTAINMENT_CLASS); 117 classesBuilder.add(CONTAINMENT_CLASS);
115 } 118 }
116 if (isError) { 119 if (isError && reference != null) {
120 // References to error patterns should be highlighted as errors, but error pattern definitions shouldn't.
117 classesBuilder.add(ERROR_CLASS); 121 classesBuilder.add(ERROR_CLASS);
118 } 122 }
119 if (eObject instanceof Node node) { 123 if (eObject instanceof Node node) {
120 if (reference == ProblemPackage.Literals.VARIABLE_OR_NODE_EXPR__VARIABLE_OR_NODE) { 124 highlightNode(node, reference, classesBuilder);
121 classesBuilder.add(NODE_CLASS); 125 }
122 } 126 if (eObject instanceof Relation relation) {
123 if (ProblemUtil.isIndividualNode(node)) { 127 var typeHash = typeHashProvider.getTypeHash(relation);
124 classesBuilder.add(INDIVIDUAL_NODE_CLASS); 128 if (typeHash != null) {
125 } 129 classesBuilder.add("typeHash-" + typeHash);
126 if (ProblemUtil.isNewNode(node)) {
127 classesBuilder.add(NEW_NODE_CLASS);
128 } 130 }
129 } 131 }
130 List<String> classes = classesBuilder.build(); 132 List<String> classes = classesBuilder.build();
131 return classes.toArray(new String[0]); 133 return classes.toArray(new String[0]);
132 } 134 }
135
136 private static void highlightNode(Node node, EReference reference, ImmutableList.Builder<String> classesBuilder) {
137 if (reference == ProblemPackage.Literals.VARIABLE_OR_NODE_EXPR__VARIABLE_OR_NODE) {
138 classesBuilder.add(NODE_CLASS);
139 }
140 if (ProblemUtil.isIndividualNode(node)) {
141 classesBuilder.add(INDIVIDUAL_NODE_CLASS);
142 }
143 if (ProblemUtil.isNewNode(node)) {
144 classesBuilder.add(NEW_NODE_CLASS);
145 }
146 }
133} 147}