aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language/src/main/java/org/eclipse/viatra/solver/language/resource
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language/src/main/java/org/eclipse/viatra/solver/language/resource')
-rw-r--r--org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemDerivedStateComputer.java100
-rw-r--r--org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemLocationInFileProvider.java89
-rw-r--r--org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemResourceDescriptionStrategy.java5
3 files changed, 88 insertions, 106 deletions
diff --git a/org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemDerivedStateComputer.java b/org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemDerivedStateComputer.java
index c161de22..b885ce0e 100644
--- a/org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemDerivedStateComputer.java
+++ b/org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemDerivedStateComputer.java
@@ -3,9 +3,11 @@ package org.eclipse.viatra.solver.language.resource;
3import java.util.HashSet; 3import java.util.HashSet;
4import java.util.List; 4import java.util.List;
5import java.util.Set; 5import java.util.Set;
6import java.util.function.Predicate;
6import java.util.regex.Pattern; 7import java.util.regex.Pattern;
7 8
8import org.eclipse.emf.ecore.EObject; 9import org.eclipse.emf.ecore.EObject;
10import org.eclipse.emf.ecore.EStructuralFeature;
9import org.eclipse.viatra.solver.language.ProblemUtil; 11import org.eclipse.viatra.solver.language.ProblemUtil;
10import org.eclipse.viatra.solver.language.model.problem.Argument; 12import org.eclipse.viatra.solver.language.model.problem.Argument;
11import org.eclipse.viatra.solver.language.model.problem.Assertion; 13import org.eclipse.viatra.solver.language.model.problem.Assertion;
@@ -30,18 +32,21 @@ import org.eclipse.xtext.nodemodel.INode;
30import org.eclipse.xtext.nodemodel.util.NodeModelUtils; 32import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
31import org.eclipse.xtext.resource.DerivedStateAwareResource; 33import org.eclipse.xtext.resource.DerivedStateAwareResource;
32import org.eclipse.xtext.resource.IDerivedStateComputer; 34import org.eclipse.xtext.resource.IDerivedStateComputer;
33import org.eclipse.xtext.scoping.IGlobalScopeProvider;
34import org.eclipse.xtext.scoping.IScope; 35import org.eclipse.xtext.scoping.IScope;
36import org.eclipse.xtext.scoping.IScopeProvider;
37import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider;
35 38
36import com.google.common.base.Predicates;
37import com.google.inject.Inject; 39import com.google.inject.Inject;
38import com.google.inject.Singleton; 40import com.google.inject.Singleton;
41import com.google.inject.name.Named;
39 42
40@Singleton 43@Singleton
41public class ProblemDerivedStateComputer implements IDerivedStateComputer { 44public class ProblemDerivedStateComputer implements IDerivedStateComputer {
42 public static final String NEW_NODE = "new"; 45 public static final String NEW_NODE = "new";
43 46
44 private static final Pattern ID_REGEX = Pattern.compile("[_a-zA-Z][_0-9a-zA-Z]*|'(\\\\.|[^\\'])*'"); 47 private static final Pattern ID_REGEX = Pattern.compile("[_a-zA-Z][_0-9a-zA-Z]*");
48
49 private static final Pattern QUOTED_ID_REGEX = Pattern.compile("'(\\\\.|[^\\'])*'");
45 50
46 @Inject 51 @Inject
47 private LinkingHelper linkingHelper; 52 private LinkingHelper linkingHelper;
@@ -50,7 +55,8 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
50 private IQualifiedNameConverter qualifiedNameConverter; 55 private IQualifiedNameConverter qualifiedNameConverter;
51 56
52 @Inject 57 @Inject
53 private IGlobalScopeProvider scopeProvider; 58 @Named(AbstractDeclarativeScopeProvider.NAMED_DELEGATE)
59 private IScopeProvider scopeProvider;
54 60
55 @Override 61 @Override
56 public void installDerivedState(DerivedStateAwareResource resource, boolean preLinkingPhase) { 62 public void installDerivedState(DerivedStateAwareResource resource, boolean preLinkingPhase) {
@@ -65,11 +71,11 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
65 installNewNodes(problem); 71 installNewNodes(problem);
66 if (!preLinkingPhase) { 72 if (!preLinkingPhase) {
67 installDerivedNodes(problem); 73 installDerivedNodes(problem);
68 } 74 for (Statement statement : problem.getStatements()) {
69 for (Statement statement : problem.getStatements()) { 75 if (statement instanceof PredicateDefinition) {
70 if (statement instanceof PredicateDefinition) { 76 PredicateDefinition definition = (PredicateDefinition) statement;
71 PredicateDefinition definition = (PredicateDefinition) statement; 77 installDerivedPredicateDefinitionState(definition);
72 installDerivedPredicateDefinitionState(definition); 78 }
73 } 79 }
74 } 80 }
75 } 81 }
@@ -87,20 +93,30 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
87 } 93 }
88 94
89 protected void installDerivedNodes(Problem problem) { 95 protected void installDerivedNodes(Problem problem) {
90 IScope nodeScope = scopeProvider.getScope(problem.eResource(), ProblemPackage.Literals.ASSERTION__ARGUMENTS, 96 IScope nodeScope = scopeProvider.getScope(problem, ProblemPackage.Literals.ASSERTION__ARGUMENTS);
91 Predicates.alwaysTrue());
92 Set<String> nodeNames = new HashSet<>(); 97 Set<String> nodeNames = new HashSet<>();
93 for (Statement statement : problem.getStatements()) { 98 for (Statement statement : problem.getStatements()) {
94 if (statement instanceof Assertion) { 99 if (statement instanceof Assertion) {
95 Assertion assertion = (Assertion) statement; 100 addNodeNames(nodeNames, nodeScope, statement, ProblemPackage.Literals.ASSERTION__ARGUMENTS,
96 List<INode> nodes = NodeModelUtils.findNodesForFeature(assertion, 101 ProblemDerivedStateComputer::validNodeName);
97 ProblemPackage.Literals.ASSERTION__ARGUMENTS); 102 } else if (statement instanceof PredicateDefinition) {
98 for (INode node : nodes) { 103 PredicateDefinition predicateDefinition = (PredicateDefinition) statement;
99 String nodeName = linkingHelper.getCrossRefNodeAsString(node, true); 104 for (Conjunction body : predicateDefinition.getBodies()) {
100 if (validId(nodeName)) { 105 for (Literal literal : body.getLiterals()) {
101 QualifiedName qualifiedName = qualifiedNameConverter.toQualifiedName(nodeName); 106 Atom atom = null;
102 if (!nodeNames.contains(nodeName) && nodeScope.getSingleElement(qualifiedName) == null) { 107 if (literal instanceof Atom) {
103 nodeNames.add(nodeName); 108 atom = (Atom) literal;
109 } else if (literal instanceof NegativeLiteral) {
110 NegativeLiteral negativeLiteral = (NegativeLiteral) literal;
111 atom = negativeLiteral.getAtom();
112 }
113 if (atom == null) {
114 continue;
115 }
116 for (Argument argument : atom.getArguments()) {
117 addNodeNames(nodeNames, nodeScope, argument,
118 ProblemPackage.Literals.ARGUMENT__VARIABLE_OR_NODE,
119 ProblemDerivedStateComputer::validQuotedId);
104 } 120 }
105 } 121 }
106 } 122 }
@@ -113,6 +129,21 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
113 } 129 }
114 } 130 }
115 131
132 private void addNodeNames(Set<String> nodeNames, IScope nodeScope, EObject eObject, EStructuralFeature feature,
133 Predicate<String> condition) {
134 List<INode> nodes = NodeModelUtils.findNodesForFeature(eObject, feature);
135 for (INode node : nodes) {
136 String nodeName = linkingHelper.getCrossRefNodeAsString(node, true);
137 if (!condition.test(nodeName)) {
138 continue;
139 }
140 QualifiedName qualifiedName = qualifiedNameConverter.toQualifiedName(nodeName);
141 if (!nodeNames.contains(nodeName) && nodeScope.getSingleElement(qualifiedName) == null) {
142 nodeNames.add(nodeName);
143 }
144 }
145 }
146
116 protected Node createNode(String name) { 147 protected Node createNode(String name) {
117 Node node = ProblemFactory.eINSTANCE.createNode(); 148 Node node = ProblemFactory.eINSTANCE.createNode();
118 node.setName(name); 149 node.setName(name);
@@ -158,6 +189,7 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
158 189
159 protected void createSigletonVariablesAndCollectVariables(Atom atom, Set<String> knownVariables, 190 protected void createSigletonVariablesAndCollectVariables(Atom atom, Set<String> knownVariables,
160 Set<String> newVariables) { 191 Set<String> newVariables) {
192 IScope scope = scopeProvider.getScope(atom, ProblemPackage.Literals.ARGUMENT__VARIABLE_OR_NODE);
161 List<INode> nodes = NodeModelUtils.findNodesForFeature(atom, ProblemPackage.Literals.ATOM__ARGUMENTS); 193 List<INode> nodes = NodeModelUtils.findNodesForFeature(atom, ProblemPackage.Literals.ATOM__ARGUMENTS);
162 int nodesSize = nodes.size(); 194 int nodesSize = nodes.size();
163 List<Argument> arguments = atom.getArguments(); 195 List<Argument> arguments = atom.getArguments();
@@ -165,6 +197,13 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
165 for (int i = 0; i < nodesSize; i++) { 197 for (int i = 0; i < nodesSize; i++) {
166 INode node = nodes.get(i); 198 INode node = nodes.get(i);
167 String variableName = linkingHelper.getCrossRefNodeAsString(node, true); 199 String variableName = linkingHelper.getCrossRefNodeAsString(node, true);
200 if (!validId(variableName)) {
201 continue;
202 }
203 QualifiedName qualifiedName = qualifiedNameConverter.toQualifiedName(variableName);
204 if (scope.getSingleElement(qualifiedName) != null) {
205 continue;
206 }
168 if (ProblemUtil.isSingletonVariableName(variableName)) { 207 if (ProblemUtil.isSingletonVariableName(variableName)) {
169 if (i < argumentsSize) { 208 if (i < argumentsSize) {
170 createSingletonVariable(arguments.get(i), variableName); 209 createSingletonVariable(arguments.get(i), variableName);
@@ -223,9 +262,13 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
223 for (Conjunction body : definition.getBodies()) { 262 for (Conjunction body : definition.getBodies()) {
224 body.getImplicitVariables().clear(); 263 body.getImplicitVariables().clear();
225 for (Literal literal : body.getLiterals()) { 264 for (Literal literal : body.getLiterals()) {
265 if (literal instanceof Atom) {
266 discardDerivedAtomState((Atom) literal);
267 }
226 if (literal instanceof NegativeLiteral) { 268 if (literal instanceof NegativeLiteral) {
227 NegativeLiteral negativeLiteral = (NegativeLiteral) literal; 269 NegativeLiteral negativeLiteral = (NegativeLiteral) literal;
228 negativeLiteral.getImplicitVariables().clear(); 270 negativeLiteral.getImplicitVariables().clear();
271 discardDerivedAtomState(negativeLiteral.getAtom());
229 } 272 }
230 } 273 }
231 } 274 }
@@ -233,7 +276,24 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
233 } 276 }
234 } 277 }
235 278
279 protected void discardDerivedAtomState(Atom atom) {
280 if (atom == null) {
281 return;
282 }
283 for (Argument argument : atom.getArguments()) {
284 argument.setSingletonVariable(null);
285 }
286 }
287
236 protected static boolean validId(String name) { 288 protected static boolean validId(String name) {
237 return name != null && ID_REGEX.matcher(name).matches(); 289 return name != null && ID_REGEX.matcher(name).matches();
238 } 290 }
291
292 protected static boolean validQuotedId(String name) {
293 return name != null && QUOTED_ID_REGEX.matcher(name).matches();
294 }
295
296 protected static boolean validNodeName(String name) {
297 return validId(name) || validQuotedId(name);
298 }
239} 299}
diff --git a/org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemLocationInFileProvider.java b/org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemLocationInFileProvider.java
index d3976ec5..94dbdfee 100644
--- a/org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemLocationInFileProvider.java
+++ b/org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemLocationInFileProvider.java
@@ -1,21 +1,9 @@
1package org.eclipse.viatra.solver.language.resource; 1package org.eclipse.viatra.solver.language.resource;
2 2
3import java.util.Iterator;
4
5import org.eclipse.emf.ecore.EObject; 3import org.eclipse.emf.ecore.EObject;
6import org.eclipse.viatra.solver.language.ProblemUtil; 4import org.eclipse.viatra.solver.language.ProblemUtil;
7import org.eclipse.viatra.solver.language.model.problem.Argument;
8import org.eclipse.viatra.solver.language.model.problem.Assertion;
9import org.eclipse.viatra.solver.language.model.problem.Atom;
10import org.eclipse.viatra.solver.language.model.problem.Conjunction;
11import org.eclipse.viatra.solver.language.model.problem.ImplicitVariable; 5import org.eclipse.viatra.solver.language.model.problem.ImplicitVariable;
12import org.eclipse.viatra.solver.language.model.problem.Literal;
13import org.eclipse.viatra.solver.language.model.problem.NegativeLiteral;
14import org.eclipse.viatra.solver.language.model.problem.Node; 6import org.eclipse.viatra.solver.language.model.problem.Node;
15import org.eclipse.viatra.solver.language.model.problem.Problem;
16import org.eclipse.viatra.solver.language.model.problem.ProblemPackage;
17import org.eclipse.viatra.solver.language.model.problem.Statement;
18import org.eclipse.xtext.EcoreUtil2;
19import org.eclipse.xtext.resource.DefaultLocationInFileProvider; 7import org.eclipse.xtext.resource.DefaultLocationInFileProvider;
20import org.eclipse.xtext.util.ITextRegion; 8import org.eclipse.xtext.util.ITextRegion;
21 9
@@ -26,90 +14,19 @@ public class ProblemLocationInFileProvider extends DefaultLocationInFileProvider
26 return getNodeTextRegion((Node) obj, query); 14 return getNodeTextRegion((Node) obj, query);
27 } 15 }
28 if (obj instanceof ImplicitVariable) { 16 if (obj instanceof ImplicitVariable) {
29 return getVariableTextRegion((ImplicitVariable) obj, query); 17 return ITextRegion.EMPTY_REGION;
30 } 18 }
31 return super.doGetTextRegion(obj, query); 19 return super.doGetTextRegion(obj, query);
32 } 20 }
33 21
34 protected ITextRegion getNodeTextRegion(Node node, RegionDescription query) { 22 protected ITextRegion getNodeTextRegion(Node node, RegionDescription query) {
35 ITextRegion newNodeRegion = getNewNodeTextRegion(node, query); 23 if (ProblemUtil.isEnumLiteral(node)) {
36 if (newNodeRegion != null) { 24 return super.doGetTextRegion(node, query);
37 return newNodeRegion;
38 } 25 }
39 return getNodeFirstReferenceTextRegion(node, query);
40 }
41
42 protected ITextRegion getNewNodeTextRegion(Node node, RegionDescription query) {
43 if (ProblemUtil.isNewNode(node)) { 26 if (ProblemUtil.isNewNode(node)) {
44 EObject container = node.eContainer(); 27 EObject container = node.eContainer();
45 return doGetTextRegion(container, query); 28 return doGetTextRegion(container, query);
46 } 29 }
47 return null;
48 }
49
50 protected ITextRegion getNodeFirstReferenceTextRegion(Node node, RegionDescription query) {
51 Problem problem = EcoreUtil2.getContainerOfType(node, Problem.class);
52 if (problem == null) {
53 return ITextRegion.EMPTY_REGION;
54 }
55 for (Statement statement : problem.getStatements()) {
56 if (statement instanceof Assertion) {
57 Assertion assertion = (Assertion) statement;
58 int index = assertion.getArguments().indexOf(node);
59 if (index >= 0) {
60 return doGetLocationOfFeature(assertion, ProblemPackage.Literals.ASSERTION__ARGUMENTS, index,
61 query);
62 }
63 }
64 }
65 return ITextRegion.EMPTY_REGION;
66 }
67
68 protected ITextRegion getVariableTextRegion(ImplicitVariable variable, RegionDescription query) {
69 EObject container = variable.eContainer();
70 if (container instanceof Argument) {
71 return getArgumentTextRegion((Argument) container, query);
72 }
73 if (container instanceof Conjunction) {
74 return getFirstReferenceToVariableInConjunction(variable, (Conjunction) container, query);
75 }
76 if (container instanceof NegativeLiteral) {
77 return getFirstReferenceToVariableInNegativeLiteral(variable, (NegativeLiteral) container, query);
78 }
79 return ITextRegion.EMPTY_REGION;
80 }
81
82 protected ITextRegion getFirstReferenceToVariableInConjunction(ImplicitVariable variable, Conjunction conjunction,
83 RegionDescription query) {
84 Iterator<Literal> iterator = conjunction.getLiterals().iterator();
85 ITextRegion found = ITextRegion.EMPTY_REGION;
86 while (found == ITextRegion.EMPTY_REGION && iterator.hasNext()) {
87 Literal literal = iterator.next();
88 if (literal instanceof Atom) {
89 found = getFirstReferenceToVariableInAtom(variable, (Atom) literal, query);
90 } else if (literal instanceof NegativeLiteral) {
91 found = getFirstReferenceToVariableInNegativeLiteral(variable, (NegativeLiteral) literal, query);
92 }
93 }
94 return found;
95 }
96
97 protected ITextRegion getFirstReferenceToVariableInNegativeLiteral(ImplicitVariable variable,
98 NegativeLiteral literal, RegionDescription query) {
99 return getFirstReferenceToVariableInAtom(variable, literal.getAtom(), query);
100 }
101
102 protected ITextRegion getFirstReferenceToVariableInAtom(ImplicitVariable variable, Atom atom,
103 RegionDescription query) {
104 for (Argument argument : atom.getArguments()) {
105 if (argument.getVariable().equals(variable)) {
106 return getArgumentTextRegion(argument, query);
107 }
108 }
109 return ITextRegion.EMPTY_REGION; 30 return ITextRegion.EMPTY_REGION;
110 } 31 }
111
112 protected ITextRegion getArgumentTextRegion(Argument argument, RegionDescription query) {
113 return doGetLocationOfFeature(argument, ProblemPackage.Literals.ARGUMENT__VARIABLE, 0, query);
114 }
115} 32}
diff --git a/org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemResourceDescriptionStrategy.java b/org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemResourceDescriptionStrategy.java
index 95a9fe6b..edb25a1c 100644
--- a/org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemResourceDescriptionStrategy.java
+++ b/org.eclipse.viatra.solver.language.parent/org.eclipse.viatra.solver.language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemResourceDescriptionStrategy.java
@@ -1,7 +1,9 @@
1package org.eclipse.viatra.solver.language.resource; 1package org.eclipse.viatra.solver.language.resource;
2 2
3import org.eclipse.emf.ecore.EObject; 3import org.eclipse.emf.ecore.EObject;
4import org.eclipse.viatra.solver.language.ProblemUtil;
4import org.eclipse.viatra.solver.language.model.problem.NamedElement; 5import org.eclipse.viatra.solver.language.model.problem.NamedElement;
6import org.eclipse.viatra.solver.language.model.problem.Node;
5import org.eclipse.viatra.solver.language.model.problem.Problem; 7import org.eclipse.viatra.solver.language.model.problem.Problem;
6import org.eclipse.viatra.solver.language.model.problem.Variable; 8import org.eclipse.viatra.solver.language.model.problem.Variable;
7import org.eclipse.xtext.EcoreUtil2; 9import org.eclipse.xtext.EcoreUtil2;
@@ -73,6 +75,9 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti
73 } 75 }
74 76
75 protected boolean shouldExportSimpleName(EObject eObject) { 77 protected boolean shouldExportSimpleName(EObject eObject) {
78 if (eObject instanceof Node) {
79 return !ProblemUtil.isNewNode((Node) eObject);
80 }
76 return true; 81 return true;
77 } 82 }
78 83