aboutsummaryrefslogtreecommitdiffstats
path: root/language
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2021-11-04 17:41:52 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2021-11-04 17:41:52 +0100
commit432ff3aaee8d45025f309436db541d0ec1b76485 (patch)
tree0d49c583f71f9972c6f5050540ac50e78992eaf2 /language
parentfix(web): fix autocomplete prefix behavior (diff)
downloadrefinery-432ff3aaee8d45025f309436db541d0ec1b76485.tar.gz
refinery-432ff3aaee8d45025f309436db541d0ec1b76485.tar.zst
refinery-432ff3aaee8d45025f309436db541d0ec1b76485.zip
fix(language): hide current implicit proposal
Content assist proposals should not display the object that is only added to the model because the current context assist input refers to it (e.g., an implicit node or variable that is only referenced in the currently edited context).
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}