From 432ff3aaee8d45025f309436db541d0ec1b76485 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Thu, 4 Nov 2021 17:41:52 +0100 Subject: 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). --- .../language/resource/ReferenceCounter.java | 43 ++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 language/src/main/java/tools/refinery/language/resource/ReferenceCounter.java (limited to 'language') 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 @@ +package tools.refinery.language.resource; + +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.emf.ecore.EObject; +import org.eclipse.xtext.util.IResourceScopeCache; + +import com.google.inject.Inject; +import com.google.inject.Singleton; + +import tools.refinery.language.model.problem.Problem; + +@Singleton +public class ReferenceCounter { + @Inject + private IResourceScopeCache cache; + + public Map getReferenceCounts(Problem problem) { + var resource = problem.eResource(); + if (resource == null) { + return doGetReferenceCounts(problem); + } + return cache.get(problem, resource, () -> doGetReferenceCounts(problem)); + } + + protected Map doGetReferenceCounts(Problem problem) { + var map = new HashMap(); + countCrossReferences(problem, map); + var iterator = problem.eAllContents(); + while (iterator.hasNext()) { + var eObject = iterator.next(); + countCrossReferences(eObject, map); + } + return map; + } + + protected void countCrossReferences(EObject eObject, Map map) { + for (var referencedObject : eObject.eCrossReferences()) { + map.compute(referencedObject, (key, currentValue) -> currentValue == null ? 1 : currentValue + 1); + } + } +} -- cgit v1.2.3-54-g00ecf