aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java')
-rw-r--r--subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java52
1 files changed, 39 insertions, 13 deletions
diff --git a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java
index e194ee31..ea90a82e 100644
--- a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java
+++ b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java
@@ -5,39 +5,60 @@
5 */ 5 */
6package tools.refinery.language.ide.contentassist; 6package tools.refinery.language.ide.contentassist;
7 7
8import java.util.Objects; 8import com.google.inject.Inject;
9
10import org.eclipse.emf.ecore.EObject; 9import org.eclipse.emf.ecore.EObject;
11import org.eclipse.emf.ecore.util.EcoreUtil; 10import org.eclipse.emf.ecore.util.EcoreUtil;
12import org.eclipse.xtext.CrossReference; 11import org.eclipse.xtext.CrossReference;
13import org.eclipse.xtext.GrammarUtil; 12import org.eclipse.xtext.GrammarUtil;
14import org.eclipse.xtext.ide.editor.contentassist.ContentAssistContext; 13import org.eclipse.xtext.ide.editor.contentassist.ContentAssistContext;
15import org.eclipse.xtext.ide.editor.contentassist.ContentAssistEntry;
16import org.eclipse.xtext.ide.editor.contentassist.IdeCrossrefProposalProvider; 14import org.eclipse.xtext.ide.editor.contentassist.IdeCrossrefProposalProvider;
15import org.eclipse.xtext.naming.QualifiedName;
17import org.eclipse.xtext.nodemodel.util.NodeModelUtils; 16import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
18import org.eclipse.xtext.resource.IEObjectDescription; 17import org.eclipse.xtext.resource.IEObjectDescription;
19 18import org.eclipse.xtext.scoping.IScope;
20import com.google.inject.Inject;
21
22import tools.refinery.language.model.problem.Problem; 19import tools.refinery.language.model.problem.Problem;
20import tools.refinery.language.resource.ProblemResourceDescriptionStrategy;
23import tools.refinery.language.resource.ReferenceCounter; 21import tools.refinery.language.resource.ReferenceCounter;
24import tools.refinery.language.utils.ProblemUtil; 22import tools.refinery.language.utils.ProblemUtil;
25 23
24import java.util.ArrayList;
25import java.util.HashMap;
26import java.util.List;
27import java.util.Objects;
28
26public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider { 29public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider {
27 @Inject 30 @Inject
28 private ReferenceCounter referenceCounter; 31 private ReferenceCounter referenceCounter;
29 32
30 @Override 33 @Override
31 protected ContentAssistEntry createProposal(IEObjectDescription candidate, CrossReference crossRef, 34 protected Iterable<IEObjectDescription> queryScope(IScope scope, CrossReference crossReference,
32 ContentAssistContext context) { 35 ContentAssistContext context) {
33 if (!shouldCreateProposal(candidate, crossRef, context)) { 36 var eObjectDescriptionsByName = new HashMap<QualifiedName, List<IEObjectDescription>>();
34 return null; 37 for (var candidate : super.queryScope(scope, crossReference, context)) {
38 if (isExistingObject(candidate, crossReference, context)) {
39 // {@code getQualifiedName()} will refer to the full name for objects that are loaded from the global
40 // scope, but {@code getName()} returns the qualified name that we set in
41 // {@code ProblemResourceDescriptionStrategy}.
42 var qualifiedName = candidate.getName();
43 var candidateList = eObjectDescriptionsByName.computeIfAbsent(qualifiedName,
44 ignored -> new ArrayList<>());
45 candidateList.add(candidate);
46 }
35 } 47 }
36 return super.createProposal(candidate, crossRef, context); 48 var eObjectDescriptions = new ArrayList<IEObjectDescription>();
49 for (var candidates : eObjectDescriptionsByName.values()) {
50 if (candidates.size() == 1) {
51 var candidate = candidates.get(0);
52 if (shouldBeVisible(candidate)) {
53 eObjectDescriptions.add(candidate);
54 }
55 }
56 }
57 return eObjectDescriptions;
37 } 58 }
38 59
39 protected boolean shouldCreateProposal(IEObjectDescription candidate, CrossReference crossRef, 60 protected boolean isExistingObject(IEObjectDescription candidate, CrossReference crossRef,
40 ContentAssistContext context) { 61 ContentAssistContext context) {
41 var rootModel = context.getRootModel(); 62 var rootModel = context.getRootModel();
42 var eObjectOrProxy = candidate.getEObjectOrProxy(); 63 var eObjectOrProxy = candidate.getEObjectOrProxy();
43 if (!Objects.equals(rootModel.eResource(), eObjectOrProxy.eResource())) { 64 if (!Objects.equals(rootModel.eResource(), eObjectOrProxy.eResource())) {
@@ -60,6 +81,11 @@ public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider
60 return true; 81 return true;
61 } 82 }
62 83
84 protected boolean shouldBeVisible(IEObjectDescription candidate) {
85 var errorPredicate = candidate.getUserData(ProblemResourceDescriptionStrategy.ERROR_PREDICATE);
86 return !ProblemResourceDescriptionStrategy.ERROR_PREDICATE_TRUE.equals(errorPredicate);
87 }
88
63 protected EObject getCurrentValue(CrossReference crossRef, ContentAssistContext context) { 89 protected EObject getCurrentValue(CrossReference crossRef, ContentAssistContext context) {
64 var value = getCurrentValue(crossRef, context.getCurrentModel()); 90 var value = getCurrentValue(crossRef, context.getCurrentModel());
65 if (value != null) { 91 if (value != null) {