diff options
Diffstat (limited to 'language/src/main/java/org/eclipse')
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 @@ | |||
1 | package org.eclipse.viatra.solver.language.resource; | ||
2 | |||
3 | import java.util.HashSet; | ||
4 | import java.util.List; | ||
5 | import java.util.Set; | ||
6 | import java.util.function.Predicate; | ||
7 | |||
8 | import org.eclipse.emf.ecore.EObject; | ||
9 | import org.eclipse.emf.ecore.EStructuralFeature; | ||
10 | import org.eclipse.viatra.solver.language.model.problem.Argument; | ||
11 | import org.eclipse.viatra.solver.language.model.problem.Assertion; | ||
12 | import org.eclipse.viatra.solver.language.model.problem.AssertionArgument; | ||
13 | import org.eclipse.viatra.solver.language.model.problem.Atom; | ||
14 | import org.eclipse.viatra.solver.language.model.problem.Conjunction; | ||
15 | import org.eclipse.viatra.solver.language.model.problem.EnumDeclaration; | ||
16 | import org.eclipse.viatra.solver.language.model.problem.Literal; | ||
17 | import org.eclipse.viatra.solver.language.model.problem.NegativeLiteral; | ||
18 | import org.eclipse.viatra.solver.language.model.problem.Node; | ||
19 | import org.eclipse.viatra.solver.language.model.problem.NodeAssertionArgument; | ||
20 | import org.eclipse.viatra.solver.language.model.problem.NodeValueAssertion; | ||
21 | import org.eclipse.viatra.solver.language.model.problem.PredicateDefinition; | ||
22 | import org.eclipse.viatra.solver.language.model.problem.Problem; | ||
23 | import org.eclipse.viatra.solver.language.model.problem.ProblemPackage; | ||
24 | import org.eclipse.viatra.solver.language.model.problem.Statement; | ||
25 | import org.eclipse.viatra.solver.language.model.problem.VariableOrNodeArgument; | ||
26 | import org.eclipse.xtext.linking.impl.LinkingHelper; | ||
27 | import org.eclipse.xtext.naming.IQualifiedNameConverter; | ||
28 | import org.eclipse.xtext.naming.QualifiedName; | ||
29 | import org.eclipse.xtext.nodemodel.INode; | ||
30 | import org.eclipse.xtext.nodemodel.util.NodeModelUtils; | ||
31 | import org.eclipse.xtext.scoping.IScope; | ||
32 | import org.eclipse.xtext.scoping.IScopeProvider; | ||
33 | import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider; | ||
34 | |||
35 | import com.google.inject.Inject; | ||
36 | import com.google.inject.name.Named; | ||
37 | |||
38 | public 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; | |||
5 | import java.util.List; | 5 | import java.util.List; |
6 | import java.util.Map; | 6 | import java.util.Map; |
7 | import java.util.Set; | 7 | import java.util.Set; |
8 | import java.util.function.Predicate; | ||
9 | import java.util.regex.Pattern; | 8 | import java.util.regex.Pattern; |
10 | 9 | ||
11 | import org.eclipse.emf.common.notify.impl.AdapterImpl; | 10 | import org.eclipse.emf.common.notify.impl.AdapterImpl; |
12 | import org.eclipse.emf.ecore.EObject; | 11 | import org.eclipse.emf.ecore.EObject; |
13 | import org.eclipse.emf.ecore.EStructuralFeature; | ||
14 | import org.eclipse.emf.ecore.resource.Resource; | 12 | import org.eclipse.emf.ecore.resource.Resource; |
15 | import org.eclipse.emf.ecore.util.EcoreUtil; | 13 | import org.eclipse.emf.ecore.util.EcoreUtil; |
16 | import org.eclipse.viatra.solver.language.ProblemUtil; | 14 | import org.eclipse.viatra.solver.language.ProblemUtil; |
17 | import org.eclipse.viatra.solver.language.model.problem.Argument; | 15 | import org.eclipse.viatra.solver.language.model.problem.Argument; |
18 | import org.eclipse.viatra.solver.language.model.problem.Assertion; | ||
19 | import org.eclipse.viatra.solver.language.model.problem.AssertionArgument; | ||
20 | import org.eclipse.viatra.solver.language.model.problem.Atom; | 16 | import org.eclipse.viatra.solver.language.model.problem.Atom; |
21 | import org.eclipse.viatra.solver.language.model.problem.ClassDeclaration; | 17 | import org.eclipse.viatra.solver.language.model.problem.ClassDeclaration; |
22 | import org.eclipse.viatra.solver.language.model.problem.Conjunction; | 18 | import org.eclipse.viatra.solver.language.model.problem.Conjunction; |
@@ -25,8 +21,6 @@ import org.eclipse.viatra.solver.language.model.problem.ImplicitVariable; | |||
25 | import org.eclipse.viatra.solver.language.model.problem.Literal; | 21 | import org.eclipse.viatra.solver.language.model.problem.Literal; |
26 | import org.eclipse.viatra.solver.language.model.problem.NegativeLiteral; | 22 | import org.eclipse.viatra.solver.language.model.problem.NegativeLiteral; |
27 | import org.eclipse.viatra.solver.language.model.problem.Node; | 23 | import org.eclipse.viatra.solver.language.model.problem.Node; |
28 | import org.eclipse.viatra.solver.language.model.problem.NodeAssertionArgument; | ||
29 | import org.eclipse.viatra.solver.language.model.problem.NodeValueAssertion; | ||
30 | import org.eclipse.viatra.solver.language.model.problem.Parameter; | 24 | import org.eclipse.viatra.solver.language.model.problem.Parameter; |
31 | import org.eclipse.viatra.solver.language.model.problem.PredicateDefinition; | 25 | import org.eclipse.viatra.solver.language.model.problem.PredicateDefinition; |
32 | import org.eclipse.viatra.solver.language.model.problem.Problem; | 26 | import org.eclipse.viatra.solver.language.model.problem.Problem; |
@@ -48,6 +42,7 @@ import org.eclipse.xtext.scoping.IScopeProvider; | |||
48 | import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider; | 42 | import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider; |
49 | 43 | ||
50 | import com.google.inject.Inject; | 44 | import com.google.inject.Inject; |
45 | import com.google.inject.Provider; | ||
51 | import com.google.inject.Singleton; | 46 | import com.google.inject.Singleton; |
52 | import com.google.inject.name.Named; | 47 | import 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 |