summaryrefslogtreecommitdiffstats
path: root/subprojects/language-ide/src/main/java
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2024-06-30 20:23:02 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2024-06-30 20:37:27 +0200
commit57f9177f3717984b873c3c1d43c42472800e476a (patch)
tree266af6ab96daaed62e5fb0cb190765e5c899499f /subprojects/language-ide/src/main/java
parentrefactor(language): computed constraint symbol (diff)
downloadrefinery-57f9177f3717984b873c3c1d43c42472800e476a.tar.gz
refinery-57f9177f3717984b873c3c1d43c42472800e476a.tar.zst
refinery-57f9177f3717984b873c3c1d43c42472800e476a.zip
feat(language): computed value validation
Diffstat (limited to 'subprojects/language-ide/src/main/java')
-rw-r--r--subprojects/language-ide/src/main/java/tools/refinery/language/ide/contentassist/ProblemCrossrefProposalProvider.java6
-rw-r--r--subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java32
2 files changed, 23 insertions, 15 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 8dad8f8a..963e69c3 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
@@ -106,6 +106,12 @@ public class ProblemCrossrefProposalProvider extends IdeCrossrefProposalProvider
106 } 106 }
107 var errorPredicate = candidate.getUserData(ProblemResourceDescriptionStrategy.ERROR_PREDICATE); 107 var errorPredicate = candidate.getUserData(ProblemResourceDescriptionStrategy.ERROR_PREDICATE);
108 if (ProblemResourceDescriptionStrategy.ERROR_PREDICATE_TRUE.equals(errorPredicate)) { 108 if (ProblemResourceDescriptionStrategy.ERROR_PREDICATE_TRUE.equals(errorPredicate)) {
109 var definitionContext = EcoreUtil2.getContainerOfType(context.getCurrentModel(),
110 ParametricDefinition.class);
111 if (definitionContext instanceof RuleDefinition) {
112 var computedValue = candidate.getUserData(ProblemResourceDescriptionStrategy.COMPUTED_VALUE);
113 return ProblemResourceDescriptionStrategy.COMPUTED_VALUE_TRUE.equals(computedValue);
114 }
109 return false; 115 return false;
110 } 116 }
111 117
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 58d6748a..7f37ed66 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
@@ -51,7 +51,7 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli
51 if (!(object instanceof NamedElement)) { 51 if (!(object instanceof NamedElement)) {
52 return; 52 return;
53 } 53 }
54 String[] highlightClass = getHighlightClass(object, null); 54 String[] highlightClass = getHighlightClass(object, null, null);
55 if (highlightClass.length > 0) { 55 if (highlightClass.length > 0) {
56 highlightFeature(acceptor, object, ProblemPackage.Literals.NAMED_ELEMENT__NAME, highlightClass); 56 highlightFeature(acceptor, object, ProblemPackage.Literals.NAMED_ELEMENT__NAME, highlightClass);
57 } 57 }
@@ -72,40 +72,43 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli
72 } 72 }
73 } 73 }
74 74
75 protected void highlightSingleValue(EObject object, EReference reference, IHighlightedPositionAcceptor acceptor) { 75 protected void highlightSingleValue(EObject owner, EReference reference, IHighlightedPositionAcceptor acceptor) {
76 EObject valueObj = (EObject) object.eGet(reference); 76 EObject valueObj = (EObject) owner.eGet(reference);
77 String[] highlightClass = getHighlightClass(valueObj, reference); 77 String[] highlightClass = getHighlightClass(valueObj, owner, reference);
78 if (highlightClass.length > 0) { 78 if (highlightClass.length > 0) {
79 highlightFeature(acceptor, object, reference, highlightClass); 79 highlightFeature(acceptor, owner, reference, highlightClass);
80 } 80 }
81 } 81 }
82 82
83 protected void highlightManyValues(EObject object, EReference reference, IHighlightedPositionAcceptor acceptor) { 83 protected void highlightManyValues(EObject owner, EReference reference, IHighlightedPositionAcceptor acceptor) {
84 @SuppressWarnings("unchecked") 84 @SuppressWarnings("unchecked")
85 EList<? extends EObject> values = (EList<? extends EObject>) object.eGet(reference); 85 EList<? extends EObject> values = (EList<? extends EObject>) owner.eGet(reference);
86 List<INode> nodes = NodeModelUtils.findNodesForFeature(object, reference); 86 List<INode> nodes = NodeModelUtils.findNodesForFeature(owner, reference);
87 int size = Math.min(values.size(), nodes.size()); 87 int size = Math.min(values.size(), nodes.size());
88 for (var i = 0; i < size; i++) { 88 for (var i = 0; i < size; i++) {
89 EObject valueInList = values.get(i); 89 EObject valueInList = values.get(i);
90 INode node = nodes.get(i); 90 INode node = nodes.get(i);
91 String[] highlightClass = getHighlightClass(valueInList, reference); 91 String[] highlightClass = getHighlightClass(valueInList, owner, reference);
92 if (highlightClass.length > 0) { 92 if (highlightClass.length > 0) {
93 highlightNode(acceptor, node, highlightClass); 93 highlightNode(acceptor, node, highlightClass);
94 } 94 }
95 } 95 }
96 } 96 }
97 97
98 protected String[] getHighlightClass(EObject eObject, EReference reference) { 98 protected String[] getHighlightClass(EObject eObject, EObject owner, EReference reference) {
99 boolean isError = ProblemUtil.isError(eObject); 99 // References to error patterns should be highlighted as errors, but error pattern definitions and
100 // references to the computed values of error patterns shouldn't.
101 boolean isError = ProblemUtil.isError(eObject) && reference != null &&
102 !(owner instanceof Atom atom && atom.isComputed());
100 if (ProblemUtil.isBuiltIn(eObject) && !(eObject instanceof Problem)) { 103 if (ProblemUtil.isBuiltIn(eObject) && !(eObject instanceof Problem)) {
101 var className = isError ? ERROR_CLASS : BUILTIN_CLASS; 104 var className = isError ? ERROR_CLASS : BUILTIN_CLASS;
102 return new String[]{className}; 105 return new String[]{className};
103 } 106 }
104 return getUserDefinedElementHighlightClass(eObject, reference, isError); 107 return getUserDefinedElementHighlightClass(eObject, isError);
105 } 108 }
106 109
107 @NotNull 110 @NotNull
108 private String[] getUserDefinedElementHighlightClass(EObject eObject, EReference reference, boolean isError) { 111 private String[] getUserDefinedElementHighlightClass(EObject eObject, boolean isError) {
109 ImmutableList.Builder<String> classesBuilder = ImmutableList.builder(); 112 ImmutableList.Builder<String> classesBuilder = ImmutableList.builder();
110 if (eObject instanceof ClassDeclaration classDeclaration && classDeclaration.isAbstract()) { 113 if (eObject instanceof ClassDeclaration classDeclaration && classDeclaration.isAbstract()) {
111 classesBuilder.add(ABSTRACT_CLASS); 114 classesBuilder.add(ABSTRACT_CLASS);
@@ -120,8 +123,7 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli
120 && ProblemUtil.isContainmentReference(referenceDeclaration)) { 123 && ProblemUtil.isContainmentReference(referenceDeclaration)) {
121 classesBuilder.add(CONTAINMENT_CLASS); 124 classesBuilder.add(CONTAINMENT_CLASS);
122 } 125 }
123 if (isError && reference != null) { 126 if (isError) {
124 // References to error patterns should be highlighted as errors, but error pattern definitions shouldn't.
125 classesBuilder.add(ERROR_CLASS); 127 classesBuilder.add(ERROR_CLASS);
126 } 128 }
127 if (eObject instanceof Node node) { 129 if (eObject instanceof Node node) {