aboutsummaryrefslogtreecommitdiffstats
path: root/language/src/main/java/org/eclipse/viatra/solver
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <marussy@mit.bme.hu>2021-06-30 01:55:43 +0200
committerLibravatar Kristóf Marussy <marussy@mit.bme.hu>2021-06-30 02:04:32 +0200
commitadf4509525300f05334638d5d108dfd72ab7e65b (patch)
treedcd9a3910d37844f2e94c57a5c11a34a2cd2fd01 /language/src/main/java/org/eclipse/viatra/solver
parentTop level editorconfig (diff)
downloadrefinery-adf4509525300f05334638d5d108dfd72ab7e65b.tar.gz
refinery-adf4509525300f05334638d5d108dfd72ab7e65b.tar.zst
refinery-adf4509525300f05334638d5d108dfd72ab7e65b.zip
Node scoping fixes
Diffstat (limited to 'language/src/main/java/org/eclipse/viatra/solver')
-rw-r--r--language/src/main/java/org/eclipse/viatra/solver/language/resource/NodeNameCollector.java140
-rw-r--r--language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemDerivedStateComputer.java72
2 files changed, 149 insertions, 63 deletions
diff --git a/language/src/main/java/org/eclipse/viatra/solver/language/resource/NodeNameCollector.java b/language/src/main/java/org/eclipse/viatra/solver/language/resource/NodeNameCollector.java
new file mode 100644
index 00000000..4dee5434
--- /dev/null
+++ b/language/src/main/java/org/eclipse/viatra/solver/language/resource/NodeNameCollector.java
@@ -0,0 +1,140 @@
1package org.eclipse.viatra.solver.language.resource;
2
3import java.util.HashSet;
4import java.util.List;
5import java.util.Set;
6import java.util.function.Predicate;
7
8import org.eclipse.emf.ecore.EObject;
9import org.eclipse.emf.ecore.EStructuralFeature;
10import org.eclipse.viatra.solver.language.model.problem.Argument;
11import org.eclipse.viatra.solver.language.model.problem.Assertion;
12import org.eclipse.viatra.solver.language.model.problem.AssertionArgument;
13import org.eclipse.viatra.solver.language.model.problem.Atom;
14import org.eclipse.viatra.solver.language.model.problem.Conjunction;
15import org.eclipse.viatra.solver.language.model.problem.EnumDeclaration;
16import org.eclipse.viatra.solver.language.model.problem.Literal;
17import org.eclipse.viatra.solver.language.model.problem.NegativeLiteral;
18import org.eclipse.viatra.solver.language.model.problem.Node;
19import org.eclipse.viatra.solver.language.model.problem.NodeAssertionArgument;
20import org.eclipse.viatra.solver.language.model.problem.NodeValueAssertion;
21import org.eclipse.viatra.solver.language.model.problem.PredicateDefinition;
22import org.eclipse.viatra.solver.language.model.problem.Problem;
23import org.eclipse.viatra.solver.language.model.problem.ProblemPackage;
24import org.eclipse.viatra.solver.language.model.problem.Statement;
25import org.eclipse.viatra.solver.language.model.problem.VariableOrNodeArgument;
26import org.eclipse.xtext.linking.impl.LinkingHelper;
27import org.eclipse.xtext.naming.IQualifiedNameConverter;
28import org.eclipse.xtext.naming.QualifiedName;
29import org.eclipse.xtext.nodemodel.INode;
30import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
31import org.eclipse.xtext.scoping.IScope;
32import org.eclipse.xtext.scoping.IScopeProvider;
33import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider;
34
35import com.google.inject.Inject;
36import com.google.inject.name.Named;
37
38public class NodeNameCollector {
39 @Inject
40 private LinkingHelper linkingHelper;
41
42 @Inject
43 private IQualifiedNameConverter qualifiedNameConverter;
44
45 @Inject
46 @Named(AbstractDeclarativeScopeProvider.NAMED_DELEGATE)
47 private IScopeProvider scopeProvider;
48
49 private final Set<String> nodeNames = new HashSet<>();
50 private final Set<String> existingNodeNames = new HashSet<>();
51
52 private IScope nodeScope;
53
54 public Set<String> getNodeNames() {
55 return nodeNames;
56 }
57
58 public void collectNodeNames(Problem problem) {
59 nodeScope = scopeProvider.getScope(problem, ProblemPackage.Literals.ASSERTION__ARGUMENTS);
60 collectEnumLiteralNames(problem);
61 for (Statement statement : problem.getStatements()) {
62 collectStatementNodeNames(statement);
63 }
64 }
65
66 protected void collectEnumLiteralNames(Problem problem) {
67 for (Statement statement : problem.getStatements()) {
68 if (statement instanceof EnumDeclaration) {
69 EnumDeclaration enumDeclaration = (EnumDeclaration) statement;
70 for (Node literal : enumDeclaration.getLiterals()) {
71 String name = literal.getName();
72 if (ProblemDerivedStateComputer.validId(name)) {
73 existingNodeNames.add(name);
74 }
75 }
76 }
77 }
78 }
79
80 protected void collectStatementNodeNames(Statement statement) {
81 if (statement instanceof Assertion) {
82 collectAssertionNodeNames((Assertion) statement);
83 } else if (statement instanceof NodeValueAssertion) {
84 collectNodeValueAssertionNodeNames((NodeValueAssertion) statement);
85 } else if (statement instanceof PredicateDefinition) {
86 collectPredicateDefinitionNodeNames((PredicateDefinition) statement);
87 }
88 }
89
90 protected void collectAssertionNodeNames(Assertion assertion) {
91 for (AssertionArgument argument : assertion.getArguments()) {
92 if (argument instanceof NodeAssertionArgument) {
93 addNodeNames(argument, ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE,
94 ProblemDerivedStateComputer::validNodeName);
95 }
96 }
97 }
98
99 protected void collectNodeValueAssertionNodeNames(NodeValueAssertion nodeValueAssertion) {
100 addNodeNames(nodeValueAssertion, ProblemPackage.Literals.NODE_VALUE_ASSERTION__NODE,
101 ProblemDerivedStateComputer::validNodeName);
102 }
103
104 protected void collectPredicateDefinitionNodeNames(PredicateDefinition predicateDefinition) {
105 for (Conjunction body : predicateDefinition.getBodies()) {
106 for (Literal literal : body.getLiterals()) {
107 Atom atom = null;
108 if (literal instanceof Atom) {
109 atom = (Atom) literal;
110 } else if (literal instanceof NegativeLiteral) {
111 NegativeLiteral negativeLiteral = (NegativeLiteral) literal;
112 atom = negativeLiteral.getAtom();
113 }
114 if (atom == null) {
115 continue;
116 }
117 for (Argument argument : atom.getArguments()) {
118 if (argument instanceof VariableOrNodeArgument) {
119 addNodeNames(argument, ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__VARIABLE_OR_NODE,
120 ProblemDerivedStateComputer::validQuotedId);
121 }
122 }
123 }
124 }
125 }
126
127 private void addNodeNames(EObject eObject, EStructuralFeature feature, Predicate<String> condition) {
128 List<INode> nodes = NodeModelUtils.findNodesForFeature(eObject, feature);
129 for (INode node : nodes) {
130 String nodeName = linkingHelper.getCrossRefNodeAsString(node, true);
131 if (!condition.test(nodeName)) {
132 continue;
133 }
134 QualifiedName qualifiedName = qualifiedNameConverter.toQualifiedName(nodeName);
135 if (!existingNodeNames.contains(nodeName) && nodeScope.getSingleElement(qualifiedName) == null) {
136 nodeNames.add(nodeName);
137 }
138 }
139 }
140} \ No newline at end of file
diff --git a/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemDerivedStateComputer.java b/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemDerivedStateComputer.java
index 42e53534..81236afd 100644
--- a/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemDerivedStateComputer.java
+++ b/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemDerivedStateComputer.java
@@ -5,18 +5,14 @@ import java.util.HashSet;
5import java.util.List; 5import java.util.List;
6import java.util.Map; 6import java.util.Map;
7import java.util.Set; 7import java.util.Set;
8import java.util.function.Predicate;
9import java.util.regex.Pattern; 8import java.util.regex.Pattern;
10 9
11import org.eclipse.emf.common.notify.impl.AdapterImpl; 10import org.eclipse.emf.common.notify.impl.AdapterImpl;
12import org.eclipse.emf.ecore.EObject; 11import org.eclipse.emf.ecore.EObject;
13import org.eclipse.emf.ecore.EStructuralFeature;
14import org.eclipse.emf.ecore.resource.Resource; 12import org.eclipse.emf.ecore.resource.Resource;
15import org.eclipse.emf.ecore.util.EcoreUtil; 13import org.eclipse.emf.ecore.util.EcoreUtil;
16import org.eclipse.viatra.solver.language.ProblemUtil; 14import org.eclipse.viatra.solver.language.ProblemUtil;
17import org.eclipse.viatra.solver.language.model.problem.Argument; 15import org.eclipse.viatra.solver.language.model.problem.Argument;
18import org.eclipse.viatra.solver.language.model.problem.Assertion;
19import org.eclipse.viatra.solver.language.model.problem.AssertionArgument;
20import org.eclipse.viatra.solver.language.model.problem.Atom; 16import org.eclipse.viatra.solver.language.model.problem.Atom;
21import org.eclipse.viatra.solver.language.model.problem.ClassDeclaration; 17import org.eclipse.viatra.solver.language.model.problem.ClassDeclaration;
22import org.eclipse.viatra.solver.language.model.problem.Conjunction; 18import org.eclipse.viatra.solver.language.model.problem.Conjunction;
@@ -25,8 +21,6 @@ import org.eclipse.viatra.solver.language.model.problem.ImplicitVariable;
25import org.eclipse.viatra.solver.language.model.problem.Literal; 21import org.eclipse.viatra.solver.language.model.problem.Literal;
26import org.eclipse.viatra.solver.language.model.problem.NegativeLiteral; 22import org.eclipse.viatra.solver.language.model.problem.NegativeLiteral;
27import org.eclipse.viatra.solver.language.model.problem.Node; 23import org.eclipse.viatra.solver.language.model.problem.Node;
28import org.eclipse.viatra.solver.language.model.problem.NodeAssertionArgument;
29import org.eclipse.viatra.solver.language.model.problem.NodeValueAssertion;
30import org.eclipse.viatra.solver.language.model.problem.Parameter; 24import org.eclipse.viatra.solver.language.model.problem.Parameter;
31import org.eclipse.viatra.solver.language.model.problem.PredicateDefinition; 25import org.eclipse.viatra.solver.language.model.problem.PredicateDefinition;
32import org.eclipse.viatra.solver.language.model.problem.Problem; 26import org.eclipse.viatra.solver.language.model.problem.Problem;
@@ -48,6 +42,7 @@ import org.eclipse.xtext.scoping.IScopeProvider;
48import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider; 42import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider;
49 43
50import com.google.inject.Inject; 44import com.google.inject.Inject;
45import com.google.inject.Provider;
51import com.google.inject.Singleton; 46import com.google.inject.Singleton;
52import com.google.inject.name.Named; 47import com.google.inject.name.Named;
53 48
@@ -73,6 +68,9 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
73 @Named(AbstractDeclarativeScopeProvider.NAMED_DELEGATE) 68 @Named(AbstractDeclarativeScopeProvider.NAMED_DELEGATE)
74 private IScopeProvider scopeProvider; 69 private IScopeProvider scopeProvider;
75 70
71 @Inject
72 private Provider<NodeNameCollector> nodeNameCollectorProvider;
73
76 @Override 74 @Override
77 public void installDerivedState(DerivedStateAwareResource resource, boolean preLinkingPhase) { 75 public void installDerivedState(DerivedStateAwareResource resource, boolean preLinkingPhase) {
78 Problem problem = getProblem(resource); 76 Problem problem = getProblem(resource);
@@ -121,46 +119,9 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
121 } 119 }
122 120
123 protected Set<String> installDerivedNodes(Problem problem) { 121 protected Set<String> installDerivedNodes(Problem problem) {
124 IScope nodeScope = scopeProvider.getScope(problem, ProblemPackage.Literals.ASSERTION__ARGUMENTS); 122 NodeNameCollector collector = nodeNameCollectorProvider.get();
125 Set<String> nodeNames = new HashSet<>(); 123 collector.collectNodeNames(problem);
126 for (Statement statement : problem.getStatements()) { 124 Set<String> nodeNames = collector.getNodeNames();
127 if (statement instanceof Assertion) {
128 Assertion assertion = (Assertion) statement;
129 for (AssertionArgument argument : assertion.getArguments()) {
130 if (argument instanceof NodeAssertionArgument) {
131 addNodeNames(nodeNames, nodeScope, argument,
132 ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE,
133 ProblemDerivedStateComputer::validNodeName);
134 }
135 }
136 } else if (statement instanceof NodeValueAssertion) {
137 addNodeNames(nodeNames, nodeScope, statement, ProblemPackage.Literals.NODE_VALUE_ASSERTION__NODE,
138 ProblemDerivedStateComputer::validNodeName);
139 } else if (statement instanceof PredicateDefinition) {
140 PredicateDefinition predicateDefinition = (PredicateDefinition) statement;
141 for (Conjunction body : predicateDefinition.getBodies()) {
142 for (Literal literal : body.getLiterals()) {
143 Atom atom = null;
144 if (literal instanceof Atom) {
145 atom = (Atom) literal;
146 } else if (literal instanceof NegativeLiteral) {
147 NegativeLiteral negativeLiteral = (NegativeLiteral) literal;
148 atom = negativeLiteral.getAtom();
149 }
150 if (atom == null) {
151 continue;
152 }
153 for (Argument argument : atom.getArguments()) {
154 if (argument instanceof VariableOrNodeArgument) {
155 addNodeNames(nodeNames, nodeScope, argument,
156 ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__VARIABLE_OR_NODE,
157 ProblemDerivedStateComputer::validQuotedId);
158 }
159 }
160 }
161 }
162 }
163 }
164 List<Node> grapNodes = problem.getNodes(); 125 List<Node> grapNodes = problem.getNodes();
165 for (String nodeName : nodeNames) { 126 for (String nodeName : nodeNames) {
166 Node graphNode = createNode(nodeName); 127 Node graphNode = createNode(nodeName);
@@ -169,21 +130,6 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
169 return nodeNames; 130 return nodeNames;
170 } 131 }
171 132
172 private void addNodeNames(Set<String> nodeNames, IScope nodeScope, EObject eObject, EStructuralFeature feature,
173 Predicate<String> condition) {
174 List<INode> nodes = NodeModelUtils.findNodesForFeature(eObject, feature);
175 for (INode node : nodes) {
176 String nodeName = linkingHelper.getCrossRefNodeAsString(node, true);
177 if (!condition.test(nodeName)) {
178 continue;
179 }
180 QualifiedName qualifiedName = qualifiedNameConverter.toQualifiedName(nodeName);
181 if (!nodeNames.contains(nodeName) && nodeScope.getSingleElement(qualifiedName) == null) {
182 nodeNames.add(nodeName);
183 }
184 }
185 }
186
187 protected Node createNode(String name) { 133 protected Node createNode(String name) {
188 Node node = ProblemFactory.eINSTANCE.createNode(); 134 Node node = ProblemFactory.eINSTANCE.createNode();
189 node.setName(name); 135 node.setName(name);
@@ -347,7 +293,7 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
347 return validId(name) || validQuotedId(name); 293 return validId(name) || validQuotedId(name);
348 } 294 }
349 295
350 public Adapter getOrInstallAdapter(Resource resource) { 296 protected Adapter getOrInstallAdapter(Resource resource) {
351 if (!(resource instanceof XtextResource)) { 297 if (!(resource instanceof XtextResource)) {
352 return new Adapter(); 298 return new Adapter();
353 } 299 }
@@ -363,7 +309,7 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
363 return adapter; 309 return adapter;
364 } 310 }
365 311
366 private static class Adapter extends AdapterImpl { 312 protected static class Adapter extends AdapterImpl {
367 public Map<ClassDeclaration, Node> newNodes = new HashMap<>(); 313 public Map<ClassDeclaration, Node> newNodes = new HashMap<>();
368 314
369 @Override 315 @Override