aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/language/src/main/java/tools/refinery/language/resource/state/NodeNameCollector.java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/language/src/main/java/tools/refinery/language/resource/state/NodeNameCollector.java')
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/resource/state/NodeNameCollector.java79
1 files changed, 79 insertions, 0 deletions
diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/state/NodeNameCollector.java b/subprojects/language/src/main/java/tools/refinery/language/resource/state/NodeNameCollector.java
new file mode 100644
index 00000000..de4a607c
--- /dev/null
+++ b/subprojects/language/src/main/java/tools/refinery/language/resource/state/NodeNameCollector.java
@@ -0,0 +1,79 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.resource.state;
7
8import com.google.common.collect.ImmutableSet;
9import com.google.inject.Inject;
10import com.google.inject.name.Named;
11import org.eclipse.emf.ecore.EObject;
12import org.eclipse.xtext.linking.impl.LinkingHelper;
13import org.eclipse.xtext.naming.IQualifiedNameConverter;
14import org.eclipse.xtext.nodemodel.INode;
15import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
16import org.eclipse.xtext.scoping.IScope;
17import org.eclipse.xtext.scoping.IScopeProvider;
18import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider;
19import tools.refinery.language.model.problem.*;
20import tools.refinery.language.naming.NamingUtil;
21
22import java.util.List;
23import java.util.Set;
24
25public class NodeNameCollector {
26 @Inject
27 private LinkingHelper linkingHelper;
28
29 @Inject
30 private IQualifiedNameConverter qualifiedNameConverter;
31
32 @Inject
33 @Named(AbstractDeclarativeScopeProvider.NAMED_DELEGATE)
34 private IScopeProvider scopeProvider;
35
36 private final ImmutableSet.Builder<String> nodeNames = ImmutableSet.builder();
37
38 private IScope nodeScope;
39
40 public Set<String> getNodeNames() {
41 return nodeNames.build();
42 }
43
44 public void collectNodeNames(Problem problem) {
45 nodeScope = scopeProvider.getScope(problem, ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE);
46 for (Statement statement : problem.getStatements()) {
47 collectStatementNodeNames(statement);
48 }
49 }
50
51 protected void collectStatementNodeNames(Statement statement) {
52 if (statement instanceof Assertion assertion) {
53 collectAssertionNodeNames(assertion);
54 }
55 }
56
57 protected void collectAssertionNodeNames(Assertion assertion) {
58 for (AssertionArgument argument : assertion.getArguments()) {
59 if (argument instanceof NodeAssertionArgument) {
60 collectNodeNames(argument);
61 }
62 }
63 }
64
65 private void collectNodeNames(EObject eObject) {
66 List<INode> nodes = NodeModelUtils.findNodesForFeature(eObject,
67 ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE);
68 for (INode node : nodes) {
69 var nodeName = linkingHelper.getCrossRefNodeAsString(node, true);
70 if (!NamingUtil.isValidId(nodeName)) {
71 continue;
72 }
73 var qualifiedName = qualifiedNameConverter.toQualifiedName(nodeName);
74 if (nodeScope.getSingleElement(qualifiedName) == null) {
75 nodeNames.add(nodeName);
76 }
77 }
78 }
79}