aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language.ide/src/main/java/org/eclipse/viatra/solver/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2021-06-25 17:12:45 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2021-06-25 17:12:45 +0200
commitbaba88758a0ea5f671ab4a2aeacec374bed938c4 (patch)
tree1be30230a0959ce8d22986d91b1ed2460a328148 /org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language.ide/src/main/java/org/eclipse/viatra/solver/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
parentInitial commit (diff)
downloadrefinery-baba88758a0ea5f671ab4a2aeacec374bed938c4.tar.gz
refinery-baba88758a0ea5f671ab4a2aeacec374bed938c4.tar.zst
refinery-baba88758a0ea5f671ab4a2aeacec374bed938c4.zip
Add initial prototype
Diffstat (limited to 'org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language.ide/src/main/java/org/eclipse/viatra/solver/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java')
-rw-r--r--org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language.ide/src/main/java/org/eclipse/viatra/solver/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java138
1 files changed, 138 insertions, 0 deletions
diff --git a/org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language.ide/src/main/java/org/eclipse/viatra/solver/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java b/org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language.ide/src/main/java/org/eclipse/viatra/solver/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
new file mode 100644
index 00000000..f6a29457
--- /dev/null
+++ b/org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language.ide/src/main/java/org/eclipse/viatra/solver/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
@@ -0,0 +1,138 @@
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.model.problem.ClassDeclaration;
11import org.eclipse.viatra.solver.language.model.problem.Node;
12import org.eclipse.viatra.solver.language.model.problem.Parameter;
13import org.eclipse.viatra.solver.language.model.problem.PredicateDefinition;
14import org.eclipse.viatra.solver.language.model.problem.ReferenceDeclaration;
15import org.eclipse.viatra.solver.language.model.problem.Variable;
16import org.eclipse.viatra.solver.language.scoping.ProblemGlobalScopeProvider;
17import org.eclipse.xtext.ide.editor.syntaxcoloring.DefaultSemanticHighlightingCalculator;
18import org.eclipse.xtext.ide.editor.syntaxcoloring.IHighlightedPositionAcceptor;
19import org.eclipse.xtext.nodemodel.INode;
20import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
21import org.eclipse.xtext.service.OperationCanceledManager;
22import org.eclipse.xtext.util.CancelIndicator;
23import org.eclipse.xtext.util.SimpleAttributeResolver;
24
25import com.google.inject.Inject;
26
27public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighlightingCalculator {
28 private static final String BUILTIN_CLASS = "cm-keyword";
29 private static final String CLASS_CLASS = "problem-class";
30 private static final String ABSTRACT_CLASS = "problem-abstract";
31 private static final String REFERENCE_CLASS = "problem-reference";
32 private static final String CONTAINMENT_CLASS = "problem-containment";
33 private static final String PREDICATE_CLASS = "problem-predicate";
34 private static final String ERROR_CLASS = "problem-error";
35 private static final String NODE_CLASS = "problem-node";
36 private static final String PARAMETER_CLASS = "problem-parameter";
37 private static final String VARIABLE_CLASS = "problem-variable";
38
39 @Inject
40 private OperationCanceledManager operationCanceledManager;
41
42 @Override
43 protected boolean highlightElement(EObject object, IHighlightedPositionAcceptor acceptor,
44 CancelIndicator cancelIndicator) {
45 highlightName(object, acceptor, cancelIndicator);
46 highlightCrossReferences(object, acceptor, cancelIndicator);
47 return false;
48 }
49
50 protected void highlightName(EObject object, IHighlightedPositionAcceptor acceptor,
51 CancelIndicator cancelIndicator) {
52 String highlightClass = getHighlightClass(object);
53 if (highlightClass != null) {
54 EAttribute nameAttribute = SimpleAttributeResolver.NAME_RESOLVER.getAttribute(object);
55 if (nameAttribute != null) {
56 highlightFeature(acceptor, object, nameAttribute, highlightClass);
57 }
58 }
59 }
60
61 protected void highlightCrossReferences(EObject object, IHighlightedPositionAcceptor acceptor,
62 CancelIndicator cancelIndicator) {
63 for (EReference reference : object.eClass().getEAllReferences()) {
64 if (reference.isContainment()) {
65 continue;
66 }
67 operationCanceledManager.checkCanceled(cancelIndicator);
68 Object value = object.eGet(reference);
69 if (value instanceof EList) {
70 @SuppressWarnings("unchecked")
71 EList<? extends EObject> values = (EList<? extends EObject>) value;
72 List<INode> nodes = NodeModelUtils.findNodesForFeature(object, reference);
73 int size = Math.min(values.size(), nodes.size());
74 for (int i = 0; i < size; i++) {
75 EObject valueInList = values.get(i);
76 INode node = nodes.get(i);
77 String highlightClass = getHighlightClass(valueInList);
78 if (highlightClass != null) {
79 highlightNode(acceptor, node, highlightClass);
80 }
81 }
82 } else if (value instanceof EObject) {
83 EObject valueObj = (EObject) value;
84 String highlightClass = getHighlightClass(valueObj);
85 if (highlightClass != null) {
86 highlightFeature(acceptor, object, reference, highlightClass);
87 }
88 }
89 }
90 }
91
92 protected String getHighlightClass(EObject eObject) {
93 if (isBuiltIn(eObject)) {
94 return BUILTIN_CLASS;
95 }
96 if (eObject instanceof ClassDeclaration) {
97 ClassDeclaration classDeclaration = (ClassDeclaration) eObject;
98 if (classDeclaration.isAbstract()) {
99 return ABSTRACT_CLASS;
100 }
101 return CLASS_CLASS;
102 }
103 if (eObject instanceof ReferenceDeclaration) {
104 ReferenceDeclaration referenceDeclaration = (ReferenceDeclaration) eObject;
105 if (referenceDeclaration.isContainment()) {
106 return CONTAINMENT_CLASS;
107 }
108 return REFERENCE_CLASS;
109 }
110 if (eObject instanceof PredicateDefinition) {
111 PredicateDefinition predicateDefinition = (PredicateDefinition) eObject;
112 if (predicateDefinition.isError()) {
113 return ERROR_CLASS;
114 }
115 return PREDICATE_CLASS;
116 }
117 if (eObject instanceof Node) {
118 return NODE_CLASS;
119 }
120 if (eObject instanceof Parameter) {
121 return PARAMETER_CLASS;
122 }
123 if (eObject instanceof Variable) {
124 return VARIABLE_CLASS;
125 }
126 return null;
127 }
128
129 protected boolean isBuiltIn(EObject eObject) {
130 if (eObject != null) {
131 Resource eResource = eObject.eResource();
132 if (eResource != null) {
133 return ProblemGlobalScopeProvider.LIBRARY_URI.equals(eResource.getURI());
134 }
135 }
136 return false;
137 }
138}