aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/language-ide
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2023-08-15 12:35:06 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2023-08-15 16:56:29 +0200
commitc4757c72887d0d83a51099c9f33d3e027f55a4e6 (patch)
tree0cf4a86036be9cca1fd940492001e973d174e4c7 /subprojects/language-ide
parentfix: concrete supertype translation (diff)
downloadrefinery-c4757c72887d0d83a51099c9f33d3e027f55a4e6.tar.gz
refinery-c4757c72887d0d83a51099c9f33d3e027f55a4e6.tar.zst
refinery-c4757c72887d0d83a51099c9f33d3e027f55a4e6.zip
refactor(language): invalid multiplicity trace
Also simplifies attributes and flags for now, as we don't translate them to abstractions.
Diffstat (limited to 'subprojects/language-ide')
-rw-r--r--subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java49
-rw-r--r--subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java13
2 files changed, 46 insertions, 16 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..ce5e7dad 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,57 @@
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 var qualifiedName = candidate.getQualifiedName();
40 var candidateList = eObjectDescriptionsByName.computeIfAbsent(qualifiedName,
41 ignored -> new ArrayList<>());
42 candidateList.add(candidate);
43 }
35 } 44 }
36 return super.createProposal(candidate, crossRef, context); 45 var eObjectDescriptions = new ArrayList<IEObjectDescription>();
46 for (var candidates : eObjectDescriptionsByName.values()) {
47 if (candidates.size() == 1) {
48 var candidate = candidates.get(0);
49 if (shouldBeVisible(candidate)) {
50 eObjectDescriptions.add(candidate);
51 }
52 }
53 }
54 return eObjectDescriptions;
37 } 55 }
38 56
39 protected boolean shouldCreateProposal(IEObjectDescription candidate, CrossReference crossRef, 57 protected boolean isExistingObject(IEObjectDescription candidate, CrossReference crossRef,
40 ContentAssistContext context) { 58 ContentAssistContext context) {
41 var rootModel = context.getRootModel(); 59 var rootModel = context.getRootModel();
42 var eObjectOrProxy = candidate.getEObjectOrProxy(); 60 var eObjectOrProxy = candidate.getEObjectOrProxy();
43 if (!Objects.equals(rootModel.eResource(), eObjectOrProxy.eResource())) { 61 if (!Objects.equals(rootModel.eResource(), eObjectOrProxy.eResource())) {
@@ -60,6 +78,11 @@ public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider
60 return true; 78 return true;
61 } 79 }
62 80
81 protected boolean shouldBeVisible(IEObjectDescription candidate) {
82 var errorPredicate = candidate.getUserData(ProblemResourceDescriptionStrategy.ERROR_PREDICATE);
83 return !ProblemResourceDescriptionStrategy.ERROR_PREDICATE_TRUE.equals(errorPredicate);
84 }
85
63 protected EObject getCurrentValue(CrossReference crossRef, ContentAssistContext context) { 86 protected EObject getCurrentValue(CrossReference crossRef, ContentAssistContext context) {
64 var value = getCurrentValue(crossRef, context.getCurrentModel()); 87 var value = getCurrentValue(crossRef, context.getCurrentModel());
65 if (value != null) { 88 if (value != null) {
diff --git a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
index e8f97d51..08747ec5 100644
--- a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
+++ b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
@@ -16,6 +16,7 @@ import org.eclipse.xtext.nodemodel.INode;
16import org.eclipse.xtext.nodemodel.util.NodeModelUtils; 16import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
17import org.eclipse.xtext.service.OperationCanceledManager; 17import org.eclipse.xtext.service.OperationCanceledManager;
18import org.eclipse.xtext.util.CancelIndicator; 18import org.eclipse.xtext.util.CancelIndicator;
19import org.jetbrains.annotations.NotNull;
19import tools.refinery.language.model.problem.*; 20import tools.refinery.language.model.problem.*;
20import tools.refinery.language.utils.ProblemDesugarer; 21import tools.refinery.language.utils.ProblemDesugarer;
21import tools.refinery.language.utils.ProblemUtil; 22import tools.refinery.language.utils.ProblemUtil;
@@ -94,9 +95,16 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli
94 } 95 }
95 96
96 protected String[] getHighlightClass(EObject eObject, EReference reference) { 97 protected String[] getHighlightClass(EObject eObject, EReference reference) {
98 boolean isError = eObject instanceof PredicateDefinition predicateDefinition && predicateDefinition.isError();
97 if (ProblemUtil.isBuiltIn(eObject)) { 99 if (ProblemUtil.isBuiltIn(eObject)) {
98 return new String[] { BUILTIN_CLASS }; 100 var className = isError ? ERROR_CLASS : BUILTIN_CLASS;
101 return new String[] { className };
99 } 102 }
103 return getUserDefinedElementHighlightClass(eObject, reference, isError);
104 }
105
106 @NotNull
107 private String[] getUserDefinedElementHighlightClass(EObject eObject, EReference reference, boolean isError) {
100 ImmutableList.Builder<String> classesBuilder = ImmutableList.builder(); 108 ImmutableList.Builder<String> classesBuilder = ImmutableList.builder();
101 if (eObject instanceof ClassDeclaration classDeclaration && classDeclaration.isAbstract()) { 109 if (eObject instanceof ClassDeclaration classDeclaration && classDeclaration.isAbstract()) {
102 classesBuilder.add(ABSTRACT_CLASS); 110 classesBuilder.add(ABSTRACT_CLASS);
@@ -105,8 +113,7 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli
105 && desugarer.isContainmentReference(referenceDeclaration)) { 113 && desugarer.isContainmentReference(referenceDeclaration)) {
106 classesBuilder.add(CONTAINMENT_CLASS); 114 classesBuilder.add(CONTAINMENT_CLASS);
107 } 115 }
108 if (eObject instanceof PredicateDefinition predicateDefinition 116 if (isError) {
109 && predicateDefinition.getKind() == PredicateKind.ERROR) {
110 classesBuilder.add(ERROR_CLASS); 117 classesBuilder.add(ERROR_CLASS);
111 } 118 }
112 if (eObject instanceof Node node) { 119 if (eObject instanceof Node node) {