diff options
author | Kristóf Marussy <kristof@marussy.com> | 2024-06-30 20:23:02 +0200 |
---|---|---|
committer | Kristóf Marussy <kristof@marussy.com> | 2024-06-30 20:37:27 +0200 |
commit | 57f9177f3717984b873c3c1d43c42472800e476a (patch) | |
tree | 266af6ab96daaed62e5fb0cb190765e5c899499f /subprojects/language-ide/src/main/java | |
parent | refactor(language): computed constraint symbol (diff) | |
download | refinery-57f9177f3717984b873c3c1d43c42472800e476a.tar.gz refinery-57f9177f3717984b873c3c1d43c42472800e476a.tar.zst refinery-57f9177f3717984b873c3c1d43c42472800e476a.zip |
feat(language): computed value validation
Diffstat (limited to 'subprojects/language-ide/src/main/java')
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) { |