aboutsummaryrefslogtreecommitdiffstats
path: root/language
diff options
context:
space:
mode:
Diffstat (limited to 'language')
-rw-r--r--language/src/main/java/tools/refinery/language/resource/ReferenceCounter.java43
1 files changed, 43 insertions, 0 deletions
diff --git a/language/src/main/java/tools/refinery/language/resource/ReferenceCounter.java b/language/src/main/java/tools/refinery/language/resource/ReferenceCounter.java
new file mode 100644
index 00000000..56186bc9
--- /dev/null
+++ b/language/src/main/java/tools/refinery/language/resource/ReferenceCounter.java
@@ -0,0 +1,43 @@
1package tools.refinery.language.resource;
2
3import java.util.HashMap;
4import java.util.Map;
5
6import org.eclipse.emf.ecore.EObject;
7import org.eclipse.xtext.util.IResourceScopeCache;
8
9import com.google.inject.Inject;
10import com.google.inject.Singleton;
11
12import tools.refinery.language.model.problem.Problem;
13
14@Singleton
15public class ReferenceCounter {
16 @Inject
17 private IResourceScopeCache cache;
18
19 public Map<EObject, Integer> getReferenceCounts(Problem problem) {
20 var resource = problem.eResource();
21 if (resource == null) {
22 return doGetReferenceCounts(problem);
23 }
24 return cache.get(problem, resource, () -> doGetReferenceCounts(problem));
25 }
26
27 protected Map<EObject, Integer> doGetReferenceCounts(Problem problem) {
28 var map = new HashMap<EObject, Integer>();
29 countCrossReferences(problem, map);
30 var iterator = problem.eAllContents();
31 while (iterator.hasNext()) {
32 var eObject = iterator.next();
33 countCrossReferences(eObject, map);
34 }
35 return map;
36 }
37
38 protected void countCrossReferences(EObject eObject, Map<EObject, Integer> map) {
39 for (var referencedObject : eObject.eCrossReferences()) {
40 map.compute(referencedObject, (key, currentValue) -> currentValue == null ? 1 : currentValue + 1);
41 }
42 }
43}