aboutsummaryrefslogtreecommitdiffstats
path: root/language-ide/src/main/java/org/eclipse/viatra/solver/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
diff options
context:
space:
mode:
Diffstat (limited to 'language-ide/src/main/java/org/eclipse/viatra/solver/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java')
-rw-r--r--language-ide/src/main/java/org/eclipse/viatra/solver/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java160
1 files changed, 160 insertions, 0 deletions
diff --git a/language-ide/src/main/java/org/eclipse/viatra/solver/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java b/language-ide/src/main/java/org/eclipse/viatra/solver/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
new file mode 100644
index 00000000..eee5070b
--- /dev/null
+++ b/language-ide/src/main/java/org/eclipse/viatra/solver/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
@@ -0,0 +1,160 @@
1package org.eclipse.viatra.solver.language.ide.syntaxcoloring;
2
3import java.util.List;
4
5import org.eclipse.emf.common.util.EList;
6import org.eclipse.emf.ecore.EAttribute;
7import org.eclipse.emf.ecore.EObject;
8import org.eclipse.emf.ecore.EReference;
9import org.eclipse.emf.ecore.resource.Resource;
10import org.eclipse.viatra.solver.language.ProblemUtil;
11import org.eclipse.viatra.solver.language.model.problem.ClassDeclaration;
12import org.eclipse.viatra.solver.language.model.problem.EnumDeclaration;
13import org.eclipse.viatra.solver.language.model.problem.Node;
14import org.eclipse.viatra.solver.language.model.problem.Parameter;
15import org.eclipse.viatra.solver.language.model.problem.PredicateDefinition;
16import org.eclipse.viatra.solver.language.model.problem.ReferenceDeclaration;
17import org.eclipse.viatra.solver.language.model.problem.Variable;
18import org.eclipse.viatra.solver.language.scoping.ProblemGlobalScopeProvider;
19import org.eclipse.xtext.ide.editor.syntaxcoloring.DefaultSemanticHighlightingCalculator;
20import org.eclipse.xtext.ide.editor.syntaxcoloring.IHighlightedPositionAcceptor;
21import org.eclipse.xtext.nodemodel.INode;
22import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
23import org.eclipse.xtext.service.OperationCanceledManager;
24import org.eclipse.xtext.util.CancelIndicator;
25import org.eclipse.xtext.util.SimpleAttributeResolver;
26
27import com.google.common.collect.ImmutableList;
28import com.google.inject.Inject;
29
30public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighlightingCalculator {
31 private static final String BUILTIN_CLASS = "cm-keyword";
32 private static final String CLASS_CLASS = "problem-class";
33 private static final String ABSTRACT_CLASS = "problem-abstract";
34 private static final String ENUM_CLASS = "problem-enum";
35 private static final String REFERENCE_CLASS = "problem-reference";
36 private static final String CONTAINMENT_CLASS = "problem-containment";
37 private static final String PREDICATE_CLASS = "problem-predicate";
38 private static final String ERROR_CLASS = "problem-error";
39 private static final String NODE_CLASS = "problem-node";
40 private static final String ENUM_NODE_CLASS = "problem-enum-node";
41 private static final String NEW_NODE_CLASS = "problem-new-node";
42 private static final String PARAMETER_CLASS = "problem-parameter";
43 private static final String VARIABLE_CLASS = "problem-variable";
44 private static final String SINGLETON_VARIABLE_CLASS = "problem-singleton-variable";
45
46 @Inject
47 private OperationCanceledManager operationCanceledManager;
48
49 @Override
50 protected boolean highlightElement(EObject object, IHighlightedPositionAcceptor acceptor,
51 CancelIndicator cancelIndicator) {
52 highlightName(object, acceptor, cancelIndicator);
53 highlightCrossReferences(object, acceptor, cancelIndicator);
54 return false;
55 }
56
57 protected void highlightName(EObject object, IHighlightedPositionAcceptor acceptor,
58 CancelIndicator cancelIndicator) {
59 String[] highlightClass = getHighlightClass(object);
60 if (highlightClass.length > 0) {
61 EAttribute nameAttribute = SimpleAttributeResolver.NAME_RESOLVER.getAttribute(object);
62 if (nameAttribute != null) {
63 highlightFeature(acceptor, object, nameAttribute, highlightClass);
64 }
65 }
66 }
67
68 protected void highlightCrossReferences(EObject object, IHighlightedPositionAcceptor acceptor,
69 CancelIndicator cancelIndicator) {
70 for (EReference reference : object.eClass().getEAllReferences()) {
71 if (reference.isContainment()) {
72 continue;
73 }
74 operationCanceledManager.checkCanceled(cancelIndicator);
75 if (reference.isMany()) {
76 @SuppressWarnings("unchecked")
77 EList<? extends EObject> values = (EList<? extends EObject>) object.eGet(reference);
78 List<INode> nodes = NodeModelUtils.findNodesForFeature(object, reference);
79 int size = Math.min(values.size(), nodes.size());
80 for (int i = 0; i < size; i++) {
81 EObject valueInList = values.get(i);
82 INode node = nodes.get(i);
83 String[] highlightClass = getHighlightClass(valueInList);
84 if (highlightClass.length > 0) {
85 highlightNode(acceptor, node, highlightClass);
86 }
87 }
88 } else {
89 EObject valueObj = (EObject) object.eGet(reference);
90 String[] highlightClass = getHighlightClass(valueObj);
91 if (highlightClass.length > 0) {
92 highlightFeature(acceptor, object, reference, highlightClass);
93 }
94 }
95 }
96 }
97
98 protected String[] getHighlightClass(EObject eObject) {
99 if (isBuiltIn(eObject)) {
100 return new String[] { BUILTIN_CLASS };
101 }
102 ImmutableList.Builder<String> classesBuilder = ImmutableList.builder();
103 if (eObject instanceof ClassDeclaration) {
104 classesBuilder.add(CLASS_CLASS);
105 ClassDeclaration classDeclaration = (ClassDeclaration) eObject;
106 if (classDeclaration.isAbstract()) {
107 classesBuilder.add(ABSTRACT_CLASS);
108 }
109 }
110 if (eObject instanceof EnumDeclaration) {
111 classesBuilder.add(ENUM_CLASS);
112 }
113 if (eObject instanceof ReferenceDeclaration) {
114 classesBuilder.add(REFERENCE_CLASS);
115 ReferenceDeclaration referenceDeclaration = (ReferenceDeclaration) eObject;
116 if (referenceDeclaration.isContainment()) {
117 classesBuilder.add(CONTAINMENT_CLASS);
118 }
119 }
120 if (eObject instanceof PredicateDefinition) {
121 classesBuilder.add(PREDICATE_CLASS);
122 PredicateDefinition predicateDefinition = (PredicateDefinition) eObject;
123 if (predicateDefinition.isError()) {
124 classesBuilder.add(ERROR_CLASS);
125 }
126 }
127 if (eObject instanceof Node) {
128 classesBuilder.add(NODE_CLASS);
129 Node node = (Node) eObject;
130 if (ProblemUtil.isEnumNode(node)) {
131 classesBuilder.add(ENUM_NODE_CLASS);
132 }
133 if (ProblemUtil.isNewNode(node)) {
134 classesBuilder.add(NEW_NODE_CLASS);
135 }
136 }
137 if (eObject instanceof Parameter) {
138 classesBuilder.add(PARAMETER_CLASS);
139 }
140 if (eObject instanceof Variable) {
141 classesBuilder.add(VARIABLE_CLASS);
142 Variable variable = (Variable) eObject;
143 if (ProblemUtil.isSingletonVariable(variable)) {
144 classesBuilder.add(SINGLETON_VARIABLE_CLASS);
145 }
146 }
147 List<String> classes = classesBuilder.build();
148 return classes.toArray(new String[0]);
149 }
150
151 protected boolean isBuiltIn(EObject eObject) {
152 if (eObject != null) {
153 Resource eResource = eObject.eResource();
154 if (eResource != null) {
155 return ProblemGlobalScopeProvider.BULTIN_LIBRARY_URI.equals(eResource.getURI());
156 }
157 }
158 return false;
159 }
160}